123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174 |
- from typing import Any, List, Optional
- from datetime import datetime
- from fastapi import APIRouter, Body, Depends, HTTPException, Form, status, Response
- from fastapi.encoders import jsonable_encoder
- from pydantic.networks import EmailStr
- from sqlalchemy.orm import Session
- from app import crud, models, schemas
- from app.api import deps
- from app.core.config import settings
- from app.core.ecpay_payment_sdk import ECPayPaymentSdk
- from app.utils import send_new_account_email
- router = APIRouter()
- @router.post("/ecpayTestPay", response_model=str)
- def ecpay(
- *,
- db: Session = Depends(deps.get_db),
- current_user: models.User = Depends(deps.get_current_active_user),
- amount: str=Form(...),
- ) -> Any:
- print(amount)
- order_params = {
- 'MerchantTradeNo': datetime.now().strftime("NO%Y%m%d%H%M%S"),
- 'StoreID': '3226141',
- 'MerchantTradeDate': datetime.now().strftime("%Y/%m/%d %H:%M:%S"),
- 'PaymentType': 'aio',
- 'TotalAmount': amount,
- 'TradeDesc': '訂單測試',
- 'ItemName': '商品1#商品2',
- 'ReturnURL': 'https://cloud.choozmo.com/api/v1/payment/ecpayTestReturn',
- 'ChoosePayment': 'ALL',
- 'ClientBackURL': 'http://dev.cloud.choozmo.com:5173/main/admin/test-ecpay',
- 'ItemURL': 'http://dev.cloud.choozmo.com:5173/main/admin/test-ecpay',
- 'Remark': '交易備註',
- 'ChooseSubPayment': '',
- 'OrderResultURL': 'http://dev.cloud.choozmo.com:5173/main/admin/test-ecpay',
- 'NeedExtraPaidInfo': 'Y',
- 'DeviceSource': '',
- 'IgnorePayment': '',
- 'PlatformID': '',
- 'InvoiceMark': 'N',
- 'CustomField1': '',
- 'CustomField2': '',
- 'CustomField3': '',
- 'CustomField4': '',
- 'EncryptType': 1,
- 'Language': '',
- }
- extend_params_1 = {
- 'ExpireDate': 7,
- 'PaymentInfoURL': 'https://www.ecpay.com.tw/payment_info_url.php',
- 'ClientRedirectURL': '',
- }
- extend_params_2 = {
- 'StoreExpireDate': 15,
- 'Desc_1': '',
- 'Desc_2': '',
- 'Desc_3': '',
- 'Desc_4': '',
- 'PaymentInfoURL': 'https://www.ecpay.com.tw/payment_info_url.php',
- 'ClientRedirectURL': '',
- }
- extend_params_3 = {
- 'BindingCard': 0,
- 'MerchantMemberID': '',
- }
- extend_params_4 = {
- 'Redeem': 'N',
- 'UnionPay': 0,
- }
- inv_params = {
- # 'RelateNumber': 'Tea0001', # 特店自訂編號
- # 'CustomerID': 'TEA_0000001', # 客戶編號
- # 'CustomerIdentifier': '53348111', # 統一編號
- # 'CustomerName': '客戶名稱',
- # 'CustomerAddr': '客戶地址',
- # 'CustomerPhone': '0912345678', # 客戶手機號碼
- # 'CustomerEmail': 'abc@ecpay.com.tw',
- # 'ClearanceMark': '2', # 通關方式
- # 'TaxType': '1', # 課稅類別
- # 'CarruerType': '', # 載具類別
- # 'CarruerNum': '', # 載具編號
- # 'Donation': '1', # 捐贈註記
- # 'LoveCode': '168001', # 捐贈碼
- # 'Print': '1',
- # 'InvoiceItemName': '測試商品1|測試商品2',
- # 'InvoiceItemCount': '2|3',
- # 'InvoiceItemWord': '個|包',
- # 'InvoiceItemPrice': '35|10',
- # 'InvoiceItemTaxType': '1|1',
- # 'InvoiceRemark': '測試商品1的說明|測試商品2的說明',
- # 'DelayDay': '0', # 延遲天數
- # 'InvType': '07', # 字軌類別
- }
- # 建立實體
- ecpay_payment_sdk = ECPayPaymentSdk(
- MerchantID='3002607',
- HashKey='pwFHCqoQZGmho4w6',
- HashIV='EkRm7iFT261dpevs'
- )
- # 合併延伸參數
- order_params.update(extend_params_1)
- order_params.update(extend_params_2)
- order_params.update(extend_params_3)
- order_params.update(extend_params_4)
- # 合併發票參數
- order_params.update(inv_params)
- try:
- # 產生綠界訂單所需參數
- final_order_params = ecpay_payment_sdk.create_order(order_params)
- # 產生 html 的 form 格式
- action_url = 'https://payment-stage.ecpay.com.tw/Cashier/AioCheckOut/V5' # 測試環境
- # action_url = 'https://payment.ecpay.com.tw/Cashier/AioCheckOut/V5' # 正式環境
- html = ecpay_payment_sdk.gen_html_post_form(action_url, final_order_params)
- print(html)
- return html
- except Exception as error:
- print('An exception happened: ' + str(error))
-
- @router.post("/ecpayTestReturn")
- def ecpay_return(
- *,
- MerchantID: Optional[str]=Form(None),
- MerchantTradeNo: Optional[str]=Form(None),
- StoreID: Optional[str]=Form(None),
- RtnCode: Optional[int]=Form(None),
- RtnMsg: Optional[str]=Form(None),
- TradeNo: Optional[str]=Form(None),
- TradeAmt: Optional[int]=Form(None),
- PaymentDate: Optional[str]=Form(None),
- PaymentType: Optional[str]=Form(None),
- PaymentTypeChargeFee: Optional[int]=Form(None),
- TradeDate: Optional[str]=Form(None),
- SimulatePaid: Optional[int]=Form(None),
- CustomField1: Optional[str]=Form(None),
- CustomField2: Optional[str]=Form(None),
- CustomField3: Optional[str]=Form(None),
- CustomField4: Optional[str]=Form(None),
- CheckMacValue: Optional[str]=Form(None),
- ) -> Any:
- print(f"\
- MerchantID: {MerchantID} \n\
- MerchantTradeNo: {MerchantTradeNo}\n\
- StoreID: {StoreID}\n\
- RtnCode: {RtnCode}\n\
- RtnMsg: {RtnMsg}\n\
- TradeNo: {TradeNo}\n\
- TradeAmt: {TradeAmt}\n\
- PaymentDate: {PaymentDate}\n\
- PaymentType: {PaymentType}\n\
- PaymentTypeChargeFee: {PaymentTypeChargeFee}\n\
- TradeDate: {TradeDate}\n\
- SimulatePaid: {SimulatePaid}\n\
- CustomField1: {CustomField1}\n\
- CustomField2: {CustomField2}\n\
- CustomField3: {CustomField3}\n\
- CustomField4: {CustomField4}\n\
- CheckMacValue: {CheckMacValue}\
- ")
- return Response(content='1', status_code=status.HTTP_200_OK)
|