签名计算规则
<h3>!!前情提示!!:</h3>
<p>请勿将你商户的 ID & Key 暴露给其他任何不相关的人,如造成不必要的损失,我司概不负责! </p>
<hr />
<h4>签名简要描述:</h4>
<ul>
<li>除sign字段外,所有参数按照字段名的ascii码从小到大排序后,使用QueryString的格式(即key1=value1&key2=value2…)拼接成字符串后,空值不传递,不参与签名组串。,再在前后追加上 商户KEY的值,然后转换成32位小写的MD5字符串。</li>
</ul>
<p><strong>注意事项:空值参数或者NULL不要参与签名!空值参数或者NULL不要参与签名!空值参数或者NULL不要参与签名</strong>!</p>
<p><strong>例子:</strong><br />
商户ID 值为: 10052</p>
<p>商户KEY 值为: 9aa3034b6beba7cf5bfcf6089218a673</p>
<h4>假设请求参数为:</h4>
<pre><code>{
&quot;userid&quot;: &quot;10052&quot;,
&quot;timestamp&quot;: 1735002156,
&quot;goodsid&quot;: &quot;720938&quot;,
&quot;buynum&quot;: 1,
&quot;attach&quot;: &quot;13088888888&quot;,
&quot;sign&quot;: &quot;82a4da7502872e7a128b510d10cad6ab&quot;
}</code></pre>
<h4>验签步骤:</h4>
<h5>第一步:拼接字符串如下</h5>
<pre><code>attach=13088888888&amp;buynum=1&amp;goodsid=720938&amp;timestamp=1735002156&amp;userid=10052</code></pre>
<h5>第二步:尾部追加上 商户key 的MD5源串如下(注意这是签名的拼接明文不是提交数据):</h5>
<p>> attach=13088888888&buynum=1&goodsid=720938&timestamp=1735002156&userid=100529aa3034b6beba7cf5bfcf6089218a673</p>
<h5>第三步:MD5后转成32位小写的签名值如下:</h5>
<p>921bfe2dcd4ecca574d8b8c76412ede5</p>
<p>PHP代码示例:</p>
<pre><code>/**
*$param是提交数据数组
*$token商户KEY
*/
public function getKkySign($param, $token)
{
ksort($param); //排序post参数
reset($param); //内部指针指向数组中的第一个元素
$signtext = &#039;&#039;;
foreach ($param as $key =&gt; $val) { //遍历POST参数
if ($val === &#039;&#039; || $key == &#039;sign&#039; || is_null($val)) {
continue; //跳过这些不签名
}
if (is_bool($val)) {
if ($val) {
$val = &#039;true&#039;;
} else {
$val = &#039;false&#039;;
}
}
if ($signtext) $signtext .= &#039;&amp;&#039;; //第一个字符串签名不加&amp; 其他加&amp;连接起来参数
if (is_array($val)) {
$signtext .= &quot;$key=&quot; . json_encode($val, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
} else {
$signtext .= &quot;$key=$val&quot;; //拼接为url参数形式
}
}
$newsign = md5($signtext . $token);
return $newsign;
}</code></pre>