Nonce 为每次发出请求API服务前必须取得的参数之一,
而这个是需要在请求前要先请求的API,且其时效性只有60秒
好我知道这样讲有点混乱,
依照自己的解释简单来说 前置API动作
,
请求其他API前,必定要先取得这个,取得这个也很简单,提供商店代号
就行,
但要注意的是发出下一个请求的IP要一致
,但自己是觉得在同一台服务器是不用太担心
这里用范例程序来改,
因为 post_data 需要转译成 json,回应後直接解译,
不用每次都要写 json_encode 或 json_decode
程序码如下:
这里 url 是隐藏的,看起来应该不能把 API 网址直接打出来,各位需要的话再自行修改吧
$nonce_url = 'https://localhost/api/get_nonce';
function WebApi($url, $post_data) {
$ch=curl_init($url);
curl_setopt_array($ch, [
CURLOPT_HEADER => 0,
CURLOPT_NOBODY => 1,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_HTTPHEADER => ["Content-type: application/json; charset=utf-8"],
CURLOPT_POST=> 1,
CURLOPT_POSTFIELDS=> json_encode($post_data),
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_SSL_VERIFYHOST => 0,
CURLOPT_SSLVERSION => 6
]);
$result=curl_exec($ch);
curl_close($ch);
return json_decode($result, true);
}
$responce = WebApi($nonce_url, ['ShopNo' => "ITBON_001"]);
// Response 内容
// [ "Nonce" => "不是这个字串,是Encode 的内容" ]
官方提供四组杂凑值,分别为 a1, a2, b1, b2
(皆为 0~9,A-F 的十六进位字串),
依照 a 对 a,b 对 b 做 XOR运算,
再把两个结果组合起来,并把英文字母转大写
官方提供的是逐个算,而自己有发现两个好用的函数,
分别是 hexdec 跟 dechex,缺点是一次只能 4 个字元(bytes),
写法因人而异,这里提供我的写法,有兴趣的各位欢迎在调整。
$a1 = '1234567890ABCDEF';
$a2 = 'ABCDEF1234567890';
$b1 = '0987654321FEDCBA';
$b2 = 'FEDCBA0987654321';
function calcHashId($a1, $a2, $b1, $b2) {
$a = $b = '';
$length = strlen($a1);
for($i = 0; $i < $length; $i+=4) {
$a .= dechex(hexdec(substr($a1, $i, 4)) ^ hexdec(substr($a2, $i, 4)));
$b .= dechex(hexdec(substr($b1, $i, 4)) ^ hexdec(substr($b2, $i, 4)));
}
return strtoupper($a . $b);
}
calcHashID($a1, $a2, $b1, $b2);
// result: "B9F9B96AA4FDB57FF75BDF4AA69B9F9B";
第二点比较麻烦一些,一开始以为是依照 ASCII 的顺序,看到 a < B,就发现不太对劲,要处理的程序会多一些
而第三点只需要把内容为 array 的都排除,这点倒是还好
假设要传送的内容如下(文件范例为JSON,这里有改成PHP的阵列)
$data = [
"ShopNo" => "BA0026_001",
"OrderNo" => "A202109140001",
"Amount" => 16888,
"CurrencyID" => "TWD",
"PayType" => "A",
"ATMParam" => ["ExpireDate" => "20210921"],
"CardParam" => [],
"ConvStoreParam" => [],
"PrdtName" => "虚拟帐号订单",
"ReturnURL" => "https://127.0.0.1/Store/Return",
"BackendURL" => "https://127.0.0.1/AutoPush/PushSuccess"
];
输出 Sign (安全签章) 的程序如下
function generateSign($data, $nonce, $hash_id) {
$keys = array_keys($data);
foreach($keys as $key) {
$value = array_shift($data);
if (gettype($value) === 'array' || trim($value) === '') {
continue;
}
$upper_key = strtoupper($key);
$data[$upper_key] = "$key=$value";
}
ksort($data);
$body = implode('&', $data) . $nonce . $hash_id;
return strtoupper(hash('sha256', $body));
}
generateSign($data, 'test_nonce', 'test_hash_id');
// result: "1B97B8BD80C3B9DCA14343318BE30940247EEDD871F180F4C9230B6A5E5615AD"
hexdec
, dechex
写到後面才发现长度不太对,只支援 4 bytes (32 bit)
,Nonce 跟 Hash Id 要接在内文後面
在这四个选项中,开发信息安全管理系统(ISMS)是最合适,最关键的。ISMS从管理承诺和政策开始,这...
Amazon Elastic MapReduce(EMR)是可以在EC2 instance 或 Am...
挖,我居然真的完成这 30 天发文的活动,我觉得我好棒棒 XD。 统整 30 天的内容 给 Azur...
Q1. 什麽是 SSRF? SSRF (Server Side Request Forgery),也...
安装专案 composer global require laravel/installer //将...