不知道是什麼情況,我網頁上的顯示付款金額跟實際請求金額不一樣,我送出去的訂單,請求付款金額是40400,網頁上卻顯示404,然後我付款成功後把資訊送去訊息查詢服務OrderPayQuery複查,結果金額是正確的40400,這可有趣了,不知道有沒有人發現
這個部份因為需要公網IP讓永豐系統打回來,所以拖到現在才寫;在向豐收款(FunBIZ)建立訂單成功後,還記得前面的BackendURL跟ReturnURL嗎,永豐系統會通過POST方式傳遞付款訂單是否正確成立的資訊,可以透過這串PayToken複查當初送出去的交易訂單請求
流程概括如下:
簡單來說就是看到付款狀態顯示:PayOut就可以變更訂單狀態為待出貨了,小抱怨一下PayOut的中文解釋是付款結果,我一直在想付款結果的結果在哪裡,看了半天,確定其實就是付款成功的意思.....
把很久沒用的GenApi.py挖出來
一樣,所有資料的傳送過程,一樣要經過計算AES-CBC、取得Nonce等的流程,詳細可以往回翻,準備好解密的所有流程
def loadcfg():
Hash = SimpleNamespace(A1 = os.environ['A1'], A2 = os.environ['A2'], B1 = os.environ['B1'], B2 = os.environ['B2'])
cfg = SimpleNamespace(Version = os.environ ['Version'], ShopNo = os.environ['ShopNo'], HashID = HashID(Hash), \
Api_URL = os.environ['Api_URL'], Nonce_URL = os.environ['Nonce_URL'], BackendURL = os.environ['BackendURL'], \
ReturnURL = os.environ['ReturnURL'])
def OrderPayQuery(ShopNo=os.environ['ShopNo'], PayToken=None):
if(not ShopNo or not PayToken):return None
nonce = GetNonce(cfg)
msg = json.dumps({"ShopNo":ShopNo, "PayToken":PayToken}, indent=4)
sign = GetRespSign(msg=msg, nonce=nonce, HashID=cfg.HashID)
iv = GenIV(nonce)
emsg = AES_CBC_Encrpt(cfg.HashID, iv, msg)
payload = GenRequest(cfg, "OrderPayQuery", sign, nonce, emsg)
resp = APIPm.sendreq(url=cfg.Api_URL, data=payload)
funbiz_msg = Response_Decrypt(resp, cfg.HashID)
return funbiz_msg
接收PayToken,修改Server.py,新增backendURL與order-summary兩個route,這兩個實作的功能是一樣的,前者給永豐雲呼叫,後者是信用卡付款完成後的頁面跳轉
@app.route('/funBIZ_backend', methods=['POST'])
def funBIZ_route():
# app.logger.debug(f"headers:{dict(request.headers)}")
content = request.json
# app.logger.debug(f"content:{content}")
if(content['ShopNo'] == os.environ['ShopNo']):
resp = FunBizApi.OrderPayQuery(PayToken=content['PayToken'])
app.logger.debug(f"OrderPayQuery:{resp}")
return jsonify({'Status':'S'})
else:
return jsonify({'Status':'F'})
@app.route('/order-summary', methods=['POST'])
def order_summary_route():
# app.logger.debug(f"headers:{dict(request.headers)}")
content = request.form
# app.logger.debug(f"content:{content}")
if(content.get('ShopNo') == os.environ['ShopNo']):
resp = FunBizApi.OrderPayQuery(PayToken=content.get('PayToken'))
app.logger.debug(f"OrderPayQuery:{resp}")
return jsonify({'order-summary':'S'})
永豐系統通過POST與JSON格式傳送PayToken,以下為傳遞過來的範例資料:
{
"ShopNo":"BA0026_001",
"PayToken":"da1547c3d0d1649af5049125b0880c0e227f31e107cbf4f0995bed28d0f066c1"
}
通過訊息查詢服務OrderPayQuery進行付款狀態複查,可以解密得到:
{
"ShopNo":"NA0249_001",
"PayToken":"301707c1aa38db8c724b844a18fb14fe92457dc25874d0882cf44def3c3a8f2d",
"Date":"202110040028",
"Status":"S",
"Description":"S0000 – 處理成功",
"TSResultContent": {
"APType":"PayOut",
"TSNo":"NA024900000538",
"OrderNo":"2021100400003",
"ShopNo":"NA0249_001",
"PayType":"C",
"Amount":"40400",
"Status":"S",
"Description":"",
"Param1":"",
"Param2":"",
"Param3":"",
"LeftCCNo":"",
"RightCCNo":"",
"CCExpDate":"",
"CCToken":"",
"PayDate":"202110040028"
}
}
今天完成接收付款並複查付款資訊功能,明天準備整合進資料庫紀錄