嗯 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] 论前端框架的好处及重要性~从自己刻到学习共通语言(上篇)
美国联邦储备局最新公布的议息结果「鹰味浓郁」,但整体符合市场预期。美国的加息步伐在会议之前还未清晰,...
散布图 结束完地图的内容後,这几天将会介绍先前没有绘制过的图表,之前使用长条图来表示各个行政区的人口...
承上篇 先从信仰者(使用者)的角度说起 最早期乖乖先驱者都是来自於大型机房,NOC等,会在这些地方工...
这个章节开始我们要重现 Chrome 浏览器离线时出现的小游戏「Dinosaur Game」,首先来...
标示超连结 < a>元素是用来标示超连结,常使用的属性为< href> &l...