linepay.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from fastapi import APIRouter
  2. from linepay import LinePayApi
  3. from fastapi.templating import Jinja2Templates
  4. # template
  5. templates = Jinja2Templates(directory="templates")
  6. router = APIRouter()
  7. LINE_PAY_CHANNEL_ID = "1656387996"
  8. SECRET_KEY = \
  9. "df2f77bd544240801a048bd4293afd8eeb7fff3cb7050e42c791db4b83ebadcd"
  10. HOST_NAME = "https://f516-42-74-70-95.ngrok.io"
  11. # Line Pay Config
  12. LINE_PAY_CHANNEL_ID = LINE_PAY_CHANNEL_ID
  13. LINE_PAY_CHANNEL_SECRET = SECRET_KEY
  14. # LINE_PAY_REQEST_BASE_URL = "https://{}".format(HOST_NAME)
  15. LINE_PAY_REQEST_BASE_URL = "https://f516-42-74-70-95.ngrok.io"
  16. line = LinePayApi(
  17. LINE_PAY_CHANNEL_ID, LINE_PAY_CHANNEL_SECRET, is_sandbox=True
  18. )
  19. # CACHE
  20. CACHE = {}
  21. # Request
  22. @router.post('/request')
  23. async def pay_request():
  24. order_id = "20211227011"
  25. amount = "1"
  26. currency = "TWD"
  27. request_options = {
  28. "amount": amount,
  29. "currency": currency,
  30. "orderId": order_id,
  31. "packages": [
  32. {
  33. "id": "NFT",
  34. "amount": 1,
  35. "products": [
  36. {
  37. "name": "NFT Box 1",
  38. "quantity": 1,
  39. "price": 1,
  40. "imageUrl": "https://i.imgur.com/3rFHRVz.jpg"
  41. }
  42. ]
  43. }
  44. ],
  45. "redirectUrls": {
  46. "confirmUrl": LINE_PAY_REQEST_BASE_URL + "/confirm/"
  47. # "cancelUrl": LINE_PAY_REQEST_BASE_URL + "/cancel/"
  48. }
  49. }
  50. response = line.request(request_options)
  51. transaction_id = int(response.get("info", {}).get("transactionId", 0))
  52. check_result = line.check_payment_status(transaction_id)
  53. response["transaction_id"] = transaction_id
  54. response["paymentStatusCheckReturnCode"] = check_result.get(
  55. "returnCode", None
  56. )
  57. response["paymentStatusCheckReturnMessage"] = check_result.get(
  58. "returnMessage", None
  59. )
  60. # return response
  61. return response
  62. # Confirm
  63. @router.get('/confirm/')
  64. async def pay_confirm(
  65. transactionId: int = "transactionId",
  66. ):
  67. CACHE["transaction_id"] = transactionId
  68. response = line.confirm(
  69. transactionId, float(CACHE.get("amount", 0)),
  70. CACHE.get("currency", "TWD"))
  71. check_result = line.check_payment_status(transactionId)
  72. payment_details = line.payment_details(transaction_id=transactionId)
  73. response["transaction_id"] = transactionId
  74. response["paymentStatusCheckReturnCode"] = check_result.get(
  75. "returnCode", None
  76. )
  77. response["paymentStatusCheckReturnMessage"] = check_result.get(
  78. "returnMessage", None
  79. )
  80. response["payment_details"] = payment_details
  81. if(response["paymentStatusCheckReturnCode"] == '0123'):
  82. # return response
  83. return "confirm.html", {"request": response}
  84. else:
  85. return "Not found"