main.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import uuid
  2. import os
  3. import logging
  4. from typing import Optional
  5. from fastapi import FastAPI
  6. from fastapi.params import Depends
  7. from fastapi.templating import Jinja2Templates
  8. from dotenv import load_dotenv
  9. from os.path import join, dirname
  10. from linepay import LinePayApi
  11. from starlette.responses import HTMLResponse
  12. from sqlalchemy.orm import Session
  13. from fastapi.encoders import jsonable_encoder
  14. from .database import get_db_session
  15. from .crud import create_order, get_order, get_orders
  16. from .schemas import order_info_linepay as orderSechmas
  17. # dotenv
  18. dotenv_path = join(dirname(__file__),'./env/.env')
  19. # dotenv_path = join(dirname(__file__),'./env/test.env') ## sandbox
  20. load_dotenv(dotenv_path)
  21. # logger (TBD)
  22. # template
  23. templates = Jinja2Templates(directory="templates")
  24. # Line Pay Config
  25. LINE_PAY_CHANNEL_ID = os.environ.get("LINE_PAY_CHANNEL_ID")
  26. LINE_PAY_CHANNEL_SECRET = os.environ.get("LINE_PAY_CHANNEL_SECRET")
  27. LINE_PAY_REQEST_BASE_URL = "https://{}".format(os.environ.get("HOST_NAME"))
  28. line = LinePayApi(LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=False)
  29. # line = LinePayApi(LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=True)
  30. # CACHE
  31. CACHE = {}
  32. # Fastapi
  33. app = FastAPI()
  34. @app.get('/')
  35. def hellow():
  36. return {"Hello" : "World"}
  37. ## Request
  38. @app.post('/request', response_class=HTMLResponse)
  39. async def pay_request(userinfo: schemas.UserInfo, db: Session = Depends(get_db)):
  40. order_id = str(uuid.uuid4())
  41. amount = 1200
  42. currency = "TWD"
  43. CACHE["order_id"] = order_id
  44. CACHE["amount"] = amount
  45. CACHE["currency"] = currency
  46. request_options ={
  47. "amount" : amount,
  48. "currency" : currency,
  49. "orderId" : order_id,
  50. "packages" : [
  51. {
  52. "id" : "早鳥方案",
  53. "amount" : 1200,
  54. "products" :[
  55. {
  56. # "id" : "Id_早鳥方案",
  57. "name" : "早鳥方案",
  58. "quantity" : 1,
  59. "price" : 1200,
  60. "imageUrl" : "https://kb.rspca.org.au/wp-content/uploads/2018/11/golder-retriever-puppy.jpeg"
  61. }
  62. ]
  63. }
  64. ],
  65. "redirectUrls" : {
  66. "confirmUrl" : LINE_PAY_REQEST_BASE_URL + "/confirm/",
  67. "cancelUrl" : LINE_PAY_REQEST_BASE_URL + "/cancel/"
  68. }
  69. }
  70. response = line.request(request_options)
  71. transaction_id = int(response.get("info",{}).get("transactionId",0))
  72. check_result = line.check_payment_status(transaction_id)
  73. response["transaction_id"] = transaction_id
  74. response["paymentStatusCheckReturnCode"] = check_result.get("returnCode", None)
  75. response["paymentStatusCheckReturnMessage"] = check_result.get("returnMessage", None)
  76. return templates.TemplateResponse("request.html", {"request":response})
  77. # return response
  78. ## Confirm
  79. @app.get('/confirm/')
  80. async def pay_confirm(transactionId: int, orderId: Optional[str] = None):
  81. CACHE["transaction_id"] = transactionId
  82. response = line.confirm(transactionId,float(CACHE.get("amount",0)),CACHE.get("currency","TWD"))
  83. check_result = line.check_payment_status(transactionId)
  84. payment_details = line.payment_details(transaction_id=transactionId)
  85. response["transaction_id"] = transactionId
  86. response["paymentStatusCheckReturnCode"] = check_result.get("returnCode", None)
  87. response["paymentStatusCheckReturnMessage"] = check_result.get("returnMessage",None)
  88. response["payment_details"] = payment_details
  89. return templates.TemplateResponse("confirm.html", {"request":response})
  90. # return {"transactionId" : str(transactionId), "orderId" : orderId}
  91. ## Capture
  92. ## Refund
  93. ## Payment Details API
  94. @app.get('/payments')
  95. async def pay_payments(orderId : str):
  96. payment_details = line.payment_details(order_id=orderId)
  97. return payment_details
  98. ## Pay Preapproved API