[day4]API串接-安全签章Sign(一) 发现昨天上传失败,残念

噩耗~早上起床发现昨天上传没成功,铁人中断了!!不过还是继续写下去吧!
中秋节连假第二天,今天开始串接实测罗~

环境

python使用的环境如下,不过测试时有在不同版本中跑过,都能够运行

>python -V
Python 3.8.5

那就直接开始测试罗,以下测试都使用规格书中的参数

串接前需要准备的参数

需要特别加工的部份为Nonce、Sign以及Message。

项次 参数 说明
1 Version 目前请固定传值 1.0.0
2 ShopNo 按照取得的商店名称
3 APIService 填入永丰API功能名称
4 Nonce 向永丰API POST取得之60秒内有效的时间戳记。
5 Sign 交易讯息内文排序杂凑後加Nonce值加HashID再做Sha256运算转大写产生Sign字串。
6 Message 可还原的原始交易讯息内文 +HashID(32位元值 )+IV(16位元值三要素进行AES CBC 加密产生。

产生安全签章Sign的方法

建置需产出以下项目:
项目|说明 如何取得

项目 说明
APIService API 服务的名称。
Hash 产出运算值 (Hash ID) 以计算出安全签章及讯息加密用。
Nonce 由商户固定 IP 发动,使用 API 向 funBiz 取得60 秒内有效的时间戳记 。
HashID 由四组 Hash 值透过两两 XOR 位元运算再相加的 32 位元字串 。

hashID产出

规格书说明:
Hash ID 是透过位元运算(XOR)将四组 Hash 计算产出的,将 A1/A2 以 XOR 运算
所得的字串,再与 B1/B2 以 XOR 运算出来的字串,二个相加後将英文转换为大写,为
长度为 32 的字串。
https://ithelp.ithome.com.tw/upload/images/20210918/201409248QOgH9915c.png
程序如下:

A1 = "4D9709D699CA40EE"
A2 = "5A4FEF83140C4E9E"
B1 = "BC74301945134CB4"
B2 = "961F67F8FCA44AB9"
# XOR
OR1 = int(A1,base=16) ^ int(A2,base=16)
OR2 = int(B1,base=16) ^ int(B2,base=16)

hashID = ( format(OR1, 'X')  +format(OR2, 'X')  )
print("hashID => ",hashID)

结果

NjM3Njc0OTAxMDI1NzQuOTo3NzI1MDBlMWEyMzc3YTk2YWIxNjI0MGE3ZTJjN2VmMDIxYTkxZjlkZDhhMDE1NmVhZDY4MDcyYzUyODQ0ODA1

其中值得注意的是若下hex(OR1),产出的字串头尾会有0x 70,而format(OR1, 'X') 则不需要处理
hex(OR1) 头尾多出来的 0x & 70。

Nonce取得

商户透过POST 永丰提供的Nonce API,永丰会验证该Nonce值的时效性(60秒及取得来源(IP),以确保每次要求来源是一致。

  • 使用POSTMAN软件测试
    查询方式参考以下图片,如之前所提,在POSTMAN测试API,只要填入相对应的参数及设定,一键搞定测试。
    https://ithelp.ithome.com.tw/upload/images/20210918/20140924Z3v3c1vkUA.png

  • python串接测试

    • 安装 python套件 requests
    pip install requests
    
    • 执行
    Shop_No = {'ShopNo':"BA0026_001"}
    def getNonce(Shop_No):
        #print(Shop_No["ShopNo"])
        URL ="https://apisbx.sinopac.com/funBIZ/QPay.WebAPI/api/Nonce"
        res = requests.post(url = URL, json = Shop_No )
        print('status_code => ',res.status_code)
        # print('status_code',res.json())
        Nonce=res.json()["Nonce"]
        res.close()
        return Nonce
    print(getNonce(Shop_No))
    
    • 结果
      因为Nonce值具有时效性,所以POSTMAN和python产出的Nonce值不会一样!
    status_code =>  200 NjM3Njc0OTAxMDI1NzQuOTo3NzI1MDBlMWEyMzc3YTk2YWIxNjI0MGE3ZTJjN2VmMDIxYTkxZjlkZDhhMDE1NmVhZDY4MDcyYzUyODQ0ODA1
    

明天接着做Sign後半段的产制罗


<<:  [day3]进入程序开发阶段-测试前准备

>>:  VM 执行个体 (一)

资料表集合与文氏图

数学上,文氏图常用作集合论的表达工具,在做资料库查询的时候,其实也常常使用到这样的概念,交集、差集、...

用新技术加强您的内部稽核-将稽核软件引入组织的 7 个步骤

在 2000 年代初期,内部稽核团队的典型工作重点是完成对特定财务和运营领域的传统周期性稽核——这一...

【Day19】维持连线 ─ 工具实作篇(一)

哈罗~ 我们前几天提到, 可以利用网路监听、密码破解来取得使用权限, 今天我们要来介绍可以做远端控制...

更新android专案API版本

接下来要来讲些Android 的部分,因为种种因素所以必须处理一些android专案,但因为我没有正...

Raspberry pi 的影片拍摄- Python

开门见山 是code import picamera camera = picamera.PiCam...