图 3-1: 各栏位资料范例
经过前一篇文章的示范,我们使用 Postman 的测试拿到了 Nonce 值。如上图,Nonce
是我们发送给丰支付 API 的请求中,其中一个栏位而已。其它例如 Version
是固定值,ShopNo
是官方配给给我们的店家代码,Sign
和 Message
则是另外两个我们要产生的栏位资料。
产生安全签章 Sign 的文件说明在第 17 页。
图 3-2: 文件条目,第五章节第四段。
安全签章是由资料栏位的网址编码查询字串 (URL-encoded query string)加上 Nonce 再加上 HashId 之後,再经过 SHA256 编码产生。
图 3-3: 文件条目,第五章节第四段第二条。
HashId 是由永丰技术客服给我们的四组杂凑值计算而成。这四组杂凑值各有代号,分别为 A1、A2、B1、B2 如下范例:
代号 | 杂凑值 |
---|---|
A1 | 4D9709D699CA40EE |
A2 | 5A4FEF83140C4E9E |
B1 | BC74301945134CB4 |
B2 | 961F67F8FCA44AB9 |
手册上是这样描述的:
图 3-4: API手册 - HashId 说明
使用 A1 与 A2 这一对杂凑值进行按位运算 (bitwise operation),采用「按位元或 」运算。B1 与 B2 也进行同样的运算,取得算出来的字串後,两者相加则为 HashId。
位元运算符的的说明在 PHP 官方手册这一段有详细说明,并有一个范例关於两个数值使用 XOR,如下:
<?php
echo 12 ^ 9; // Outputs '5' (int)
^
符号为位元运算符,将 12 及 9 以「按位元或」(XOR, Exclusive-Or) 进行运算。
使用 PHP 的朋友,永丰金技术客服已有提供 PHP 的范例函式可直接使用,或者可以使用笔者在稍候章节释出的非官方版本 SDK。
非使用 PHP 的朋友,实作上,则是将 A1 的字串 4D9709D699CA40EE 分成 4D, 96, 09, D6, 99, CA, 40, EE 八组 16 进位的 HEX 值
A2 的字串 5A4FEF83140C4E9E 分成的 5A, 4F, EF, 83, 14, 0C, 4E, 9E 八组 16 进位的 HEX 值。
B1 及 B2 也是一样。
代号 | 杂凑值 | 分组(HEX, 16 进位) |
---|---|---|
A1 | 4D9709D699CA40EE | 4D, 97, 09, D6, 99, CA, 40, EE |
A2 | 5A4FEF83140C4E9E | 5A, 4F, EF, 83, 14, 0C, 4E, 9E |
B1 | BC74301945134CB4 | BC, 74, 30, 19, 45, 13, 4C, B4 |
B2 | 961F67F8FCA44AB9 | 96, 1F, 67, F8, FC, A4, 4A, B9 |
接着将 HEX 转成 10 进位数字如下:
代号 | 杂凑值 | 分组(10 进位) |
---|---|---|
A1 | 4D9709D699CA40EE | 77, 151, 9, 214, 153, 202, 64, 238 |
A2 | 5A4FEF83140C4E9E | 90, 79, 239, 131, 20, 12, 78, 158 |
B1 | BC74301945134CB4 | 188, 116, 48, 25, 69, 19, 76, 180 |
B2 | 961F67F8FCA44AB9 | 150, 31, 103, 248, 252, 164, 74, 185 |
可使用的 PHP 原生函式为 base_convert
。
图 3-5: base_convert 用法说明
再跑回圈去计算 A1[0] ^ A2[0]
、A1[1] ^ A2[1]
以此类推。
例如:
<?php
echo 77 ^ 90; // Outputs '23' (int)
echo 151 ^ 79; // Outputs '216' (int)
- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
A1 | 77 | 151 | 9 | 214 | 153 | 202 | 64 | 238 |
A2 | 90 | 79 | 239 | 131 | 20 | 12 | 78 | 158 |
A1 ^ A2 | 23 | 216 | 230 | 85 | 141 | 198 | 14 | 112 |
- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
B1 | 188 | 116 | 48 | 25 | 69 | 19 | 76 | 180 |
B2 | 150 | 31 | 103 | 248 | 252 | 164 | 74 | 185 |
B1 ^ B2 | 42 | 107 | 87 | 225 | 185 | 183 | 6 | 13 |
最後再把结果转回 HEX 字串,组合起来即可。
- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Decimal | 23 | 216 | 230 | 85 | 141 | 198 | 14 | 112 |
HEX | 17 | d8 | e6 | 55 | 8d | c6 | 0e | 70 |
- | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|---|---|
Decimal | 42 | 107 | 87 | 225 | 185 | 183 | 6 | 13 |
HEX | 2a | 6b | 57 | e1 | b9 | b7 | 06 | 0d |
A1 与 A2 的结果字串与 B1 与 B2 的结果字串组合起来即为 HashId。
对了,别忘了把字串转为大写唷。结果:
17D8E6558DC60E702A6B57E1B9B7060D
本文更新於笔者的 TerryL 部落格,Day 3 - 安全签章: HashId 计算,有兴趣可前往阅读及讨论。
>>: [DAY 3] Browser-server model的演进
一般来说,ARM组合语言,目前大部分是称作嵌入式系统,大部分会说它是写到韧体里面的程序语言,就是硬体...
重点是要透过第一天的 Nonce 来算出 IV,果然金融机构的 API 就是复杂。要从计算的结果再计...
理想上 一个组织只要慎用选择人才 这些精挑细选而来的员工就会永远发光发热 BUT 有时候是你用人辜...
二维阵列的一维读入法 #include <math.h> #include <st...
今天要介绍的是grid()方法,这个方法就像表格式排版,控件是依据指定的索引位置, 放入表格中,很适...