iT邦幫忙

2021 iThome 鐵人賽

DAY 21
1
永豐金融APIs

openAPI 對接實務系列 第 21

[day21]訊息查詢服務OrderPayQuery

  • 分享至 

  • xImage
  •  

大BUG?

不知道是什麼情況,我網頁上的顯示付款金額跟實際請求金額不一樣,我送出去的訂單,請求付款金額是40400,網頁上卻顯示404,然後我付款成功後把資訊送去訊息查詢服務OrderPayQuery複查,結果金額是正確的40400,這可有趣了,不知道有沒有人發現

https://ithelp.ithome.com.tw/upload/images/20211004/20140853ginJopsRjr.png
https://ithelp.ithome.com.tw/upload/images/20211004/201408539QwhGqOz1i.png
https://ithelp.ithome.com.tw/upload/images/20211004/20140853gzuQEKzmXm.png

訊息查詢服務OrderPayQuery服務說明

這個部份因為需要公網IP讓永豐系統打回來,所以拖到現在才寫;在向豐收款(FunBIZ)建立訂單成功後,還記得前面的BackendURL跟ReturnURL嗎,永豐系統會通過POST方式傳遞付款訂單是否正確成立的資訊,可以透過這串PayToken複查當初送出去的交易訂單請求

流程概括如下:

  1. 使用OrderCreate建立付款請求
  2. 接收OrderCreate自永豐回傳之付款資訊(信用卡、ATM付款資訊等)
  3. 付款完成後,永豐會從ReturnURL與BackendURL兩個網址傳送付款Token
    1. ReturnURL透過使用者的瀏覽器傳輸資料(Only信用卡)
    2. BackendURL透過直接呼叫商家的API傳輸資料
  4. 商家可以憑藉取得的PayToken進行付款狀態的查詢

簡單來說就是看到付款狀態顯示:PayOut就可以變更訂單狀態為待出貨了,小抱怨一下PayOut的中文解釋是付款結果,我一直在想付款結果的結果在哪裡,看了半天,確定其實就是付款成功的意思.....

實作接收PayToken並查詢狀態

把很久沒用的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"
  }
}

今天完成接收付款並複查付款資訊功能,明天準備整合進資料庫紀錄


上一篇
[day20]談購物流程設計
下一篇
[day22] 快速產生測試資料
系列文
openAPI 對接實務30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言