关于支付对接 和 401 Unauthorized: SIGN_ERROR处理过程
发布于 4 年前 作者 fangyi 756 次浏览 来自 分享

第一次对接微信支付,也是被这个问题搞了一天多,查看社区看到也是问的多,解决的几乎也没有人分享结果。

针对我自己情况我简单总结下问题,一是自我总结,二是希望能和其他人有参考。

背景介绍:

1、后端服务是nodejs 实现 ,官方只有java php 的SDK提供,没有nodejs 所以意味着整个过程都要自己实现。

 2、native 方式接入

对接前准备:

1、文档一定得看熟,看透,我觉得这次解决问题,主要利益于文档被看的几乎无死角,一个细节决定成败。

2、文档必须看透的部分:接入前准备

这一部分主要是生成证书,必须仔细的一步步操作正确,无数次手机验证码确认,过程略。。。。。

最后的输出是 本地生成一个压缩包,解压后

把证书使用说明.txt 仔细看三遍。

3、接口规则,很重要,对接的每个逻辑息息相关

对接之前,我把左边栏里的内容看了很多遍,一边看一边在自我总结对接逻辑 。 比如

这个错误返回,作用就很大,几乎没人能一下接入成功,必须得会看错误信息,这个微信大厂做的真是好,哪个字段,什么原因出错都有详细描述。。。所以接口规则里的每个字都不能错过。

其实对接难点是这些规则,规则中的难点是证书和密钥的区分和正确使用,重要的说三遍

其实对接难点是这些规则,规则中的难点是证书和密钥的区分和正确使用,重要的说三遍

其实对接难点是这些规则,规则中的难点是证书和密钥的区分和正确使用,重要的说三遍

这解释了什么是商户私钥、商户公钥 、平台公钥 、apiv3 秘钥,以及他们的获取途径。

3、文档必须看透的部分:开发指引,这一部分是上规则一个案例说明,再次让你了解规则。

开始动手

我一开始的想法直接找到Node SDK ,问过官方答复是没有,但是github 能搜到一些非官方的开发包,但我想了想,毕竟是关乎钱的事-支付,还是自己原生代码对接比较好。所以纠结了一下放弃了第三方的SDK。但是他们实现方式确实帮了我不少,感谢这些开源者和github 。 下面就记录代码与调试上几个重要方面。 

1、签名

签名必须借助官方一个工具,

使用方法, 这里说很清楚, 目前我只用到签名。文件选自己的 apiclient_key.pem

我把签名字符串复制到【明文】这里,签名得到结果和我程序里的结果相比较__,这一步来确保签名是正确的!__

方法:签名之前把内容打印出来,然后复制到工具里,生成签名,和自己程序签名比较。

nodejs 用到字符串模板的话注意一个问题,如下图示例,换行的必须顶行开始

2、其他主面,基本是代码程序

上一部分能过,后面就没有大问题了,我这里碰到有,POST JSON(data) 体,

const payload = JSON.stringify(data),data json 对象所以构造签名体,要转成字符串。但是在axios 发送时要发对象(data)

签名 = sign(…,payload)

axios.post(fullurl,<strong style="color: rgb(250, 157, 59);">data</strong>,config).then((response) =&gt; {

.....

}

payload 签名是用的,data发送时用的,我发送不小心也写成payload . 造成验签失败,应该是axios 对象会处理成字符串发过去,直接给字符串不知道给转成什么的,所以对象验的东西和你签名的东西不一样了。造成401错误。

3、其他问题,如下图,都比较好解决了。字面意思即可。

都没有问题就可以收到code_url,复制到草料网上,如下图

我在线生成手动二维码,描码—》支付 --》到帐 成功!困扰一天的支付终于解决了。

总结:到此主要针对 401问题解决思路,目前我还没有用到加解密,更换证书等功能。

另外,第三方开源,我看了下,wechatpay-axios-plugin的代码,很优秀的代码实现,代码实现逻辑很多参考这里实现。

-------------------------------------------------the end -------------------------------------------------------


1 回复

点赞鼓励!

回到顶部