微信支付 API V3 趟坑的日常:"code":"SIGN_ERROR","detail":{"issue":"sign not match"}
项目中用到微信支付,但公众号上已有一个第三方的项目配置过v2版,报文用XML格式的那个旧的支付密钥。没找到接口维护人拿不到旧密钥。
为了不影响已有产品,改写V3接口。本觉得V3用JSON应该是收到拿来,数据方便编辑维护多了。没想到还是埋着不少坑。
腾讯官方的技术支持已经不指望也不想吐槽了,概括四字:依托答辩
没多想,找到文档按部就班开始写了
https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml
一开始还挺顺的,觉得接口参数还简化了不少。直到测试提交,下单生成 prepay_id
大意了,来活了。
报错。
{"code":"INVALID_REQUEST","message":"Http头缺少Accept或User-Agent"}
哦,网上搜一下,行~按你要求构造个header补上呗
curl请求的header,定义上
$headers = [
'Accept: application/json',
'Content-Type: application/json',
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
还是错!
{"code":"SIGN_ERROR","message":"Http头Authorization值格式错误,请参考《微信支付商户REST API签名规则》"}
牛B!都是对header的要求,就不能说明放一块,错误提示放一起,非得像有关部门一样踢一脚说半句。
随即发现这 Authorization 坑有点深.. 过程略过.. 大概知道就是把 V2的签名部分挪到了header里
构造数据、签名、加密、编码一通操作下来
报错
{
"code":"SIGN_ERROR",
"detail":{
"detail":{
"issue":"sign not match"
},
"field":"signature",
...
"message":"Authorization不合法"}
忽略掉过程 N个小时 各种无意义的试错
官方文档牛啤!给的演示代码省略了那么多关键步骤!让开发者自己脑补和发掘隐藏BUG!
要自己解决证书文件换行问题;
openssl_sign(): supplied key param cannot be coerced into a private key
要在文档角落找到获得 serial_no
的方法;
要自己猜接口的数据长度单位是字
还是字节
;
卡在最后一个错误节点,终于错误提示不在变动,仅仅是告知
{"code":"SIGN_ERROR","detail":{"detail":{"issue":"sign not match"} ..."message":"签名错误,请检查后再试"}
像玩悬赏解谜游戏一样,找到隐藏的链接 而且我们还提供签名/验签/加密/解密工具(点击下载)
验证自己生成的签名和用工具验证的签名,我™直接傻了,没有不同啊?!
好家伙,卡在那发呆...又回去检查每个步骤,逐行逐字的看。甚至声明了顺序无关的地方都处女座一样把参数按顺序重排,还是错,直到我看见..
又看了看自己的签名数据
我把 post
改成大写 POST
试试...
我草你大爷的!!!大写这么重要的事情怎么不早说?!
