异步回调通知【2025.3.20更新】
<p>><strong>简要描述:</strong> </p>
<ul>
<li>平台对商户的业务请求处理完成后,会将处理的最终结果通过服务器主动通知至商户上传的订单回调地址。</li>
<li>通知服务通过HTTP POST方式请求商户服务,请求格式(Content-Type)为application/json。</li>
<li>通知机制:最多通知3次,第一次立即执行,第二次在首次发送后间隔3分钟,第三次在第二次发送后间隔5分钟。</li>
<li>签名方式:参考下面“签名说明”部分。</li>
<li>订单没有最终充值结果(status=success或failed),以及没有上传订单回调地址时,不会发起回调通知。</li>
</ul>
<p>><strong>异步回调推送参数:</strong> </p>
<table>
<thead>
<tr>
<th style="text-align: left;">参数名</th>
<th style="text-align: left;">描述</th>
<th style="text-align: left;">必选</th>
<th>类型</th>
<th>示例值</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: left;">orderno</td>
<td style="text-align: left;">订单编号</td>
<td style="text-align: left;">是</td>
<td>string</td>
<td>Api2020123012121232234</td>
</tr>
<tr>
<td style="text-align: left;">customer_order_no</td>
<td style="text-align: left;">合作商家订单号</td>
<td style="text-align: left;">是</td>
<td>string</td>
<td>2020123012121232234</td>
</tr>
<tr>
<td style="text-align: left;">card</td>
<td style="text-align: left;">-</td>
<td style="text-align: left;">json数组</td>
<td>卡密信息。<br/> card_type:卡密类型 1卡号+密码 2密码 3链接 4链接+卡券;<br/>card_no:card_type为1时为卡号,card_type为2时为空,card_type为3或4时为链接;card_password:密码,当card_type为2或4时为空,当card_type为4时为卡卷;card_rect:矩阵号/赠品</td>
</tr>
<tr>
<td style="text-align: left;">status</td>
<td style="text-align: left;">订单状态 success:成功; failed:失败</td>
<td style="text-align: left;">是</td>
<td>string</td>
<td>success</td>
</tr>
<tr>
<td style="text-align: left;">sign</td>
<td style="text-align: left;">接口签名,签名方式参考下面“签名说明”部分</td>
<td style="text-align: left;">是</td>
<td>string</td>
<td>d6df0b5aadf33d886102b617b4ab4da5</td>
</tr>
</tbody>
</table>
<p>><strong>签名说明:</strong></p>
<p>1、将除sign参数之外的所有参数包装成Dictionary<string,string>字典;(接口响应的签名直接使用result的内容从第3步操作开始)</p>
<p>2、将Dictionary<string,string>字典进行Json序列化</p>
<p>3、将Json字符串转化为字符数组charObjectArray,然后将charObjectArray进行Array.Sort()排序;</p>
<p>4、将排序后的charObjectArray转化为字符串string,然后在string后直接拼接应用密钥;</p>
<p>5、将第4步拼接了应用密钥的字符串进行md5(注意:待md5字符串最前面有个空格),最后将得到的值转化为小写字符串即得到sign签名值;
6、示例1直充示例:加密前参数orderno=B2C2208041455471000499115;customer_order_no=42ertdgsfsfsf;status=failed参数加密的密钥:538bdb67540d81fabaab1ef3d26f6257,md5加密前的字符串:"""""""""""",,0000011112222444445557899:::BC__aacddddeeeeeffffgilmnnooooorrrrrrssssssttttuu{}538bdb67540d81fabaab1ef3d26f6257。完全加密后的内容:a118bd1cfd00f92d5452121fb3d26c73</p>
<p>><strong>PHP接收回调示例:</strong></p>
<pre><code class="language-php">#接收回调函数
public function notify(){
$param=file_get_contents(&#039;php://input&#039;);
$userkey=&quot;995f731ba29dc9ffece09e4c346e3900&quot;;
$sign=$this-&gt;getSign($param,$userkey);
$returnSign=$param[&#039;sign&#039;];
if($sign==$returnSign){
//逻辑处理
return &#039;ok&#039;;
}else{
return &#039;fail&#039;;
}
}
#php签名方法
public function getSign($Parameters)
{
//签名步骤一:把字典json序列化
$json = json_encode( $Parameters, 320 );
//签名步骤二:转化为数组
$jsonArr = $this-&gt;mb_str_split( $json );
//签名步骤三:排序
sort( $jsonArr );
//签名步骤四:转化为字符串
$string = implode( &#039;&#039;, $jsonArr );
//签名步骤五:在string后加入secret
$string = $string . $this-&gt;AppSecret;
//签名步骤六:MD5加密
$result_ = strtolower( md5( $string ) );
return $result_;
}
#可将字符串中中文拆分成字符数组
public function mb_str_split($str){
return preg_split(&#039;/(?&lt;!^)(?!$)/u&#039;, $str );
}</code></pre>
<p>><strong>响应参数:</strong>
商户成功接受通知后请返回字符串success或ok,否则继续通知,直至通知机制完成。</p>