我正在尝试为我的本地提供商使用 api 访问权限,因为 api 文档说我必须将带有哈希值的帖子参数也发送到 api 门路。Api 门方式返回我 010 错误,当我将该错误邮寄给他们时,他们说哈希值错误。正如 api 文档所说,我必须按 ascii 对所有输入参数进行排序以创建签名字符串,然后通过用户密钥转换带有hash_mac签名字符串。我混淆了"按ascii对所有输入参数进行排序"是什么意思。任何解释都非常感谢。
文件说——由HMACSHA1使用提供程序提供的密钥计算的哈希值。哈希值将通过以下方法生成:1.所有由客户填写的输入参数按ASCII排序为签名字符串。2. 签名字符串将由HMACSHA1使用提供的密钥进行加密按提供商。
用于生成哈希值的 API 示例代码
<?php
$signData = hash_hmac('sha1',
SignatureString,Secret Key, false);
$signData= strtoupper($signData);
echo urlencode($signData);
?>
用户输入参数
<form action="http://121.143.168.11/Payment/Payment/pay" method="post">
<input type="hidden" id="merchantID" name="merchantID" value="382987634198262"/>
<input type="hidden" id="invoiceNo" name="invoiceNo" value="0345"/>
<input type="hidden" id="productDesc" name="productDesc" value="TESTProduct"/>
<input type="hidden" id="amount" name="amount" value="000000010000"/>
<input type="hidden" id="currencyCode" name="currencyCode" value="104"/>
<input type="hidden" id="categoryCode" name="categoryCode" value="000012"/>
<input type="hidden" id="userDefined1" name="userDefined1" value="UserDefined1"/>
<input type="hidden" id="userDefined2" name="userDefined2" value="UserDefined2"/>
<input type="hidden" id="userDefined3" name="userDefined3" value="UserDefined3"/>
<input type="hidden" id="hashValue" name="hashValue" value="BA115F06B0629EC69EDBA33604301B891D5C9F8C"/>
/>
我的问题是如何为上述用户输入参数生成签名字符串。
谢谢
假设您通过 POST 提交此表单,并且 POST 变量不包含任何垃圾,并且我正确理解了"排序依据"指令:
$secret = 'XXXXXX';
ksort($_POST); // sort by input names alphabetically
$signature_source = '';
foreach ($_POST as $value) {
$signature_source .= $value;
}
$signature = hash_hmac('sha1', $signature_source, $secret, false);
无需对它应用urlencode()
,除非图片中还有其他我缺少的东西。
$_form_data = array(
'merchantID' => '400123456712345',
'invoiceNo' => '1234567890333',
'productDesc' => 'Test Product',
'amount' => '000000010000',
'currencyCode' => 840,
'userDefined1' => 'userDefined1',
'userDefined2' => 'userDefined2',
'userDefined3' => 'userDefined3',
);
function getPaymentHash($data)
{
asort($data, SORT_STRING); // sorting values by ASCII
$str = implode('', $data);
$signData = hash_hmac('sha1', $str, 'secret key', false);
$signData = strtoupper($signData);
return urlencode($signData);
}
$hashValue = getPaymentHash($_form_data);
祝你好运:)