微信支付付款至零钱——如何生成正确的签名sign
欢迎观看——xpx分享
如果你觉得分享的不错,麻烦阅览到最后点个赞哈,谢谢。
注意以下几点
- 首先整理好您的请求参数格式;
- 对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串;
- 连接密钥key;
- 生成sign并转成大写;
第一点:整理好 请求参数格式
$SendMessageData = array(
'mch_appid'=>wx8888888888888888,
'mchid'=>1900000109,
'nonce_str'=>strtoupper(self::GetRandStr(32)),//随机生成32位随机数再转大写
'openid'=>oxTWIuGaIt6gTKsQRLau2M0yL16E,
'partner_trade_no'=>10000098201411111234567890,
'check_name'=>'FORCE_CHECK',
're_user_name'=>王小王,
'amount'=>100,#代表1元 最小单位分
'desc'=>节日快乐,
);
/**
* 随机生成数
*/
function GetRandStr($length){
$str='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$len=strlen($str)-1;
$randstr='';
for($i=0;$i<$length;$i++){
$num=mt_rand(0,$len);
$randstr .= $str[$num];
}
return $randstr;
}
第二点:对参数按照key=value的格式,并按照参数名ASCII字典序排序生成字符串
$ASCIIData = $this->ASCII($SendMessageData);
//数组转xml 字典排序
function ASCII($params = array()){
//ksort()对数组按照键名进行升序排序
ksort($params);
//reset()内部指针指向数组中的第一个元素
reset($params);
$sign = '';//初始化
foreach ($params AS $key => $val) { //遍历POST参数
if ($val == ''||$key == 'sign'||$key == 'param') continue; //跳过这些不签名
if ($sign) $sign .= '&'; //第一个字符串签名不加& 其他加&连接起来参数
$sign .= "$key=$val"; //拼接为url参数形式
}
return $sign;
}
第三四点:连接密钥key再转成大写字母 (在ASCIIData最后拼接上key得到$signParam字符串)
注意:密钥的长度为32个字节。
◆ key设置路径:微信商户平台(pay.weixin.qq.com)–>账户中心–>账户设置–>API安全–>设置API密钥
$signParam = $ASCIIData."&key=192006250b4c09247ec02edce69f6a2d"//注:key为商户平台设置的密钥key
$sign = strtoupper(md5($signParam));//注:MD5签名方式
//最终得到最终发送的数据:
<xml>
<mch_appid>wxe062425f740c30d8</mch_appid>
<mchid>10000098</mchid>
<nonce_str>3PG2J4ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>
<partner_trade_no>100000982014120919616</partner_trade_no>
<openid>ohO4Gt7wVPxIT1A9GjFaMYMiZY1s</openid>
<check_name>FORCE_CHECK</check_name>
<re_user_name>张三</re_user_name>
<amount>100</amount>
<desc>节日快乐!</desc>
<spbill_create_ip>10.2.3.10</spbill_create_ip>
<sign>C97BDBACF37622775366F38B629F45E3</sign>
</xml>
### 微信支付官方文档有详细的解释,也可以查看下方链接
[1]:https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2
- 如果觉得分享的不错,麻烦点个赞,祝各位大吉大利!