最近在做微信支付,调用微信的统一下单支付接口http://mch.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1时,老是返回“签名错误”,偶尔可以成功,不知道是怎么回事。我在日志中打印出生成的字符串和签名,然后用相同的数据在微信支付提供的在线支付调试工具生成签名,发现生成的签名结果一样!生成的最终xml也一样,但接口就是返回
<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[签名错误]]></return_msg> </xml>
POST给微信的xml内容:
<xml> <appid><![CDATA[wxe587fed28211bccb]]></appid> <body><![CDATA[Demo]]></body> <device_info><![CDATA[WEB]]></device_info> <fee_type><![CDATA[CNY]]></fee_type> <mch_id><![CDATA[1265056801]]></mch_id> <nonce_str><![CDATA[ejnshgum39igp6qwpvzwb5jbwk8yigqz]]></nonce_str> <notify_url><![CDATA[http://testpay.le1.com.cn/wechat/notify.htm]]></notify_url> <openid><![CDATA[opZb3wsfU6RUZGxgFZ6OXVbdVxcU]]></openid> <out_trade_no><![CDATA[1002_09745565EpuxTunUCD0AA72E]]></out_trade_no> <product_id><![CDATA[QWE789C1523QWE78]]></product_id> <sign><![CDATA[BF4BB39FFAFC4DF470C5A3F7784678BD]]></sign> <spbill_create_ip><![CDATA[172.16.12.171]]></spbill_create_ip> <total_fee><![CDATA[1]]></total_fee> <trade_type><![CDATA[NATIVE]]></trade_type> </xml>
首先 , 看到返回msg显示签名错误 , 第一反应官网提供的路径去生成了一下签名做比较 , 结果发现签名算法是没错的.
https://pay.weixin.qq.com/wiki/tools/signverify/
找了各种方法 , 百度谷歌搜索了一下午 , 发现很多同行都遇到了一样的问题 , 得到了以下解决方法
1、确认公众号的appSecret和商户号的API密钥没有搞混。
2、重置商户API密钥。(本人亲测是这样解决了问题,tx真是个坑,我严重鄙视。)
3、确认公众号授权的域名和目录是正确的。
4、参数body含有中文字符,改换英文签名成功,那么就转换字符编码试试。
$dat = iconv('UTF-8','ISO8859-1',array2xml($package));
然而 , 并没有解决问题 , 先吐槽一下微信支付这个巨坑 , 不是说它的api水平有多烂,但你至少说明白一点啊,每次看微信api都头痛。比阿里差的不是一个数量级的。调阿里api都是,优雅、简单、舒服,效率高。调微信api的感觉是,愤怒、头痛、恶心,想打人。
后续问题解决后会在该随笔追加解决方案 .
追加: 问题已解决 , 重置了三次商户密钥.(....................)