[day21]讯息查询服务OrderPayQuery

大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"
  }
}

今天完成接收付款并复查付款资讯功能,明天准备整合进资料库纪录


<<:  Grid 展开 Detail - day18

>>:  第六章 之五

[DAY30]完赛心得

没想到30天这麽快就过去了,感觉离刚发还没有过多久,这30天我们学会LineBot的基本回复讯息,制...

【DAY 22】为什麽每天可以有这麽多问题? Microsoft Power Virtual Agents 智慧虚拟助理帮帮我~

哈罗大家好~ 昨天介绍了 Microsoft Power Virtual Agents 智慧虚拟助理...

EP 16: The MenuItem of ListView binds Command in ViewModel - Way 1

Hello, 各位 iT邦帮忙 的粉丝们大家好~~~ 本篇是 Re: 从零开始用 Xamarin 技...

企划实现(8)

立案流程 第五步: 完成以上步骤後就会有以下8份文件公司名称预查核定书、公司章程、董事愿任核定书、股...

[Day27] 在 Codecademy 学 React ~ 用 useEffect 为游戏加上计时功能吧!

前言 想了想还是决定把 useEffect 走完XD 不然有讲 useState 没讲 useEff...