计算API所需要的参数: 内文杂凑

嗯 API 所需要的参数内文杂凑 …
依照规格说明书的指示,需要以下的流程

(1) 先移除所有空值的参数,参数值前後不可有空白。
(2) 将剩余所有参数值依照「参数名称」由小至大排序。
(3) 如为多节点参数则不参与sign值演算

有点难懂 ?

直接看范例最快,就是把call API时的 JSON 由

{
    "ShopNo": "BA0026_001",
    "OrderNo": "A201804270001",
    "Amount": 50000,
    "CurrencyID": "TWD",
    "PayType": "A",
    "ATMParam": {"ExpireDate": "20180502"},
    "CardParam": {},
    "ConvStoreParam": {},
    "PrdtName": "ThisDummyOrderNo",
    "ReturnURL": "http://10.11.22.113:8803/QPay.ApiClient/Store/Return",
    "BackendURL": "http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess",
}

转换成如下的字串

'Amount=50000&BackendURL=http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess&CurrencyID=TWD&OrderNo=A201804270001&PayType=A&PrdtName=ThisDummyOrderNo&ReturnURL=http://10.11.22.113:8803/QPay.ApiClient/Store/Return&ShopNo=BA0026_001'

在此我们可以知道需要利用 Python 做到以下几件事情

(1)移除不必要的参数,像是

    "ATMParam": {"ExpireDate": "20180502"},
    "CardParam": {},
    "ConvStoreParam": {},

(2)送出去的参数需要先依 key 进行排序
虽然规格书中有提到此处的可以不用区分大小写(例: a > B) ,但传入参数前就全部依规格书使用首字大写的参数最单纯

# 等一下将 dict 格式转成 json 时会利到
import json
 
# 将 api 所需要的参数直接以内建的 dict 方式读入
send_message = {
    "ShopNo": "BA0026_001",
    "OrderNo": "A201804270001",
    "Amount": 50000,
    "CurrencyID": "TWD",
    "PayType": "A",
    "ATMParam": {"ExpireDate": "20180502"},
    "CardParam": {},
    "ConvStoreParam": {},
    "PrdtName": "ThisDummyOrderNo",
    "ReturnURL": "http://10.11.22.113:8803/QPay.ApiClient/Store/Return",
    "BackendURL": "http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess",
}

# 检查看看 CardParam 所对应的型别是?
print ( type(send_message["CardParam"]) )
## <class 'dict'>
## 由此我们可以知道,等一下要留下来不是 dict 的资料
## 说穿了就是要留下 str 与 int
## 不过为了简化程序码的逻辑,等一下就以 != dict 的方式来过滤资料


# 透过 Dictionary comprehension 一行就可以滤掉
send_message_filter = {
    k: send_message[k] for k in send_message if type(send_message[k]) != dict
}
# 上述的程序码与以下传统的 for 回圈是等价的
# 但就稍微冗长了点
send_message_filter = {}
for k in send_message:
    if type(send_message[k]) != dict:
        send_message_filter[k] = send_message[k]
    

# 将 key 进行排序,将此顺序存到另外一个 list 中
sorted_key =  sorted ( send_message_filter.keys() )

# 一样透过 Dictionary comprehension 得到一个排序好的新 dict
send_message_orderby_key = {k: send_message_filter[k] for k in sorted_key}
    
# 将 dict 转成 json (字串)
app_json = json.dumps(send_message_orderby_key)

# 印出来看看
print(app_json)
# {"Amount": 50000, "BackendURL": "http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess", "CurrencyID": "TWD", "OrderNo": "A201804270001", "PayType": "A", "PrdtName": "ThisDummyOrderNo", "ReturnURL": "http://10.11.22.113:8803/QPay.ApiClient/Store/Return", "ShopNo": "BA0026_001"}

# 透过内建的文字取代函数,就可以拿到最终的成果罗! 
api_json.replace(": ", "=").replace(" ", "").replace(",", "&").replace('"', "").replace("{", "" ).replace("}", "")
    

今天主要是复习 comprehension 的用法与内建 json 函数。

嗯 第四天了,还在 api 参数的准备中 … 真的不是我故意的啊…


<<:  [Day2] 论前端框架的好处及重要性~从自己刻到学习共通语言(上篇)

>>:  高层架构介绍

联储局加息步伐明朗化 炒股想胜算高最好买………

美国联邦储备局最新公布的议息结果「鹰味浓郁」,但整体符合市场预期。美国的加息步伐在会议之前还未清晰,...

D3JsDay22给我两个以上的变数,给你呈现资料的散布—散布图

散布图 结束完地图的内容後,这几天将会介绍先前没有绘制过的图表,之前使用长条图来表示各个行政区的人口...

Day5 回忆篇 那个关於乖乖的传说-2

承上篇 先从信仰者(使用者)的角度说起 最早期乖乖先驱者都是来自於大型机房,NOC等,会在这些地方工...

D21 - 「不断线的侏罗纪」:萃取 DNA

这个章节开始我们要重现 Chrome 浏览器离线时出现的小游戏「Dinosaur Game」,首先来...

Day11_HTML语法8

标示超连结 < a>元素是用来标示超连结,常使用的属性为< href> &l...