如何从签名字符串生成哈希值


how to generate hash value from signature string?

我正在尝试为我的本地提供商使用 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);

祝你好运:)