[day5]API串接-安全签章Sign(二)

安全签章计算(Sigh)

在产出安全签章前必须完成以下任务,要先取得 Nonce、Hash ID、讯息内文,才可计算出安全签章,
产生前请注意以下事项:

  1. 先移除所有空值的参数,参数值前後不可有空白。
  2. 将剩余所有参数值依照「参数名称」由小至大排序(不分大小写即 A<B and a<B),组成如 param1=value1&param2=value2 的字串。
  3. 如为多节点参数则不参与 sign 值演算。
  4. 最後使用 SHA256 进行计算
    讯息杂凑=内文杂凑 + Nonce + Hash ID
    https://ithelp.ithome.com.tw/upload/images/20210919/20140924BJV97By4Sa.png
  • 产出内文杂凑
    依规格书上的范例来做示范,
    原始JSON内容,如下:
{
 "ShopNo": "BA0026_001",
 "OrderNo": "A201804270001",
 "Amount": 50000,
 "CurrencyID": "TWD",
 "PayType": "A",
 "ATMParam": { "ExpireDate": "20180502" },
 "CardParam": { },
"ConvStoreParam": { },
 "PrdtName": "虚拟帐号订单",
 "ReturnURL": "http://10.11.22.113:8803/QPay.ApiClient/Store/Return",
 "BackendURL": "http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess"
}

使用python的json套件,安装如下:

pip install import json

程序如下,值得注意的地方是json.dumps,在处理中文时,会转换为ascii,要加入参数ensure_ascii=False,才会与范例一致。

send_message_ori = {
    "ShopNo": "BA0026_001",
    "OrderNo": "A201804270001",
    "Amount": 50000,
    "CurrencyID": "TWD",
    "PayType": "A",
    "ATMParam": {"ExpireDate": "20180502"},
    "CardParam": {},
    "ConvStoreParam": {},
    "PrdtName": "虚拟帐号订单",
    "ReturnURL": "http://10.11.22.113:8803/QPay.ApiClient/Store/Return",
    "BackendURL": "http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess",
}
send_message={k: v for k, v in send_message_ori.items() if v and type(v)!=dict }
send_message = {k: send_message[k] for k in sorted ( send_message.keys())}
type(json.dumps(send_message))
send_message_str=json.dumps(send_message, ensure_ascii=False)
send_message_ContentHash=send_message_str.replace('": "', "=").replace('": ', "=").replace('", "', "&").replace(', "', "&")[2:][:-2]
print(send_message_ContentHash)

结果

Amount=50000&BackendURL=http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess&CurrencyID=TWD&OrderNo=A201804270001&PayType=A&PrdtName=虚拟帐号订单&ReturnURL=http://10.11.22.113:8803/QPay.ApiClient/Store/Return&ShopNo=BA0026_001
  • 讯息杂凑组合
    按照说明组出讯息杂凑
NonceValue='NjM2NjA0MzI4ODIyODguMzo3NzI0ZDg4ZmI5Nzc2YzQ1MTNhYzg2MTk3NDBlYTRhNGU0N2IxM2Q2M2JkMTIwOGU5YzZhMGFmNGY5MjA5YzVm'
send_message_TextHash=send_message_ContentHash+NonceValue+hashID
print(send_message_TextHash)

结果如下

Amount=50000&BackendURL=http://10.11.22.113:8803/QPay.ApiClient/AutoPush/PushSuccess&CurrencyID=TWD&OrderNo=A201804270001&PayType=A&PrdtName=虚拟帐号订单&ReturnURL=http://10.11.22.113:8803/QPay.ApiClient/Store/Return&ShopNo=BA0026_001NjM2NjA0MzI4ODIyODguMzo3NzI0ZDg4ZmI5Nzc2YzQ1MTNhYzg2MTk3NDBlYTRhNGU0N2IxM2Q2M2JkMTIwOGU5YzZhMGFmNGY5MjA5YzVm17D8E6558DC60E702A6B57E1B9B7060D
  • sign产出
    将讯息杂凑进行SHA256且转为大写。
    先安装python hashlib套件
pip install import hashlib

执行如下

s2 = hashlib.sha256()
s2.update(send_message_TextHash.encode('utf-8'))
SignValue = s2.hexdigest().upper()
print(SignValue)

这篇的重点-安全签章就完成罗~

A3EAEE3B361B7E7E9B0F6422B954ECA5D54CEC6EAB0880CB484AA6FDA4154331

下一步就是 Message的产制罗

虽然这次铁人赛在非我预期的情况下中断了~但如第一篇说的,
头洗下去就继续吧!当作给自己的一个交待罗~

keep going!!


<<:  Annotation Processor 雏形实作

>>:  Day12 数据图表化 - 如何建立 Visualize

JS 28 - 客制化滚动卷轴:样式多,支援度也广!

大家好! 我们今天要实作的自订滚动卷轴,不仅能自订方向、选择更多样式,甚至支援度比 CSS 更广。 ...

Day 29--savedInstanceState状态保存,读取Google Sheet

由下图可知 onSaveInstanceState()是当生命周期进入onStop()时会被呼叫的c...

Vue.js 从零开:v-bind:is 动态元件

如果要控制元件出现或是消失,依照之前讨论的章节,会使用到v-if、v-show的指令来完成,但当你的...

Day 09:Python基本介绍02 | 变数、资料型态

⚠行前通知 考量到有些人可能还没学过Python,然後我的主题又是定为从HTML到Python爬虫的...