微信支付 jsapi支付,服务端踩过的那些坑

首先必须声明一点,相对于微信来说用户的unionid是唯一的,但是针对不同的appid来说,openid是不唯一的,openid的唯一型是指同一个appid下的用户的openid是唯一的,声明这点的原因是因为就博主做过的小程序支付、APP支付和jsapi支付来讲,APP支付时不需要使用openid的,所以如果在同一个项目中同时存在多种支付方式的时候最好使用同一个appid,否则就要在记录用户信息的时候加扩展的对应appid的openid记录,支付时对应appid选择相应的openid了;

一:统一下单的签名

微信实行的是双签名机制;1)预支付也就是统一下单的时候需要一次签名,2)预支付成功后再次签名并返给前端,前端拿签名调用微信的支付

1)后端预支付签名:

所需参数及参数名为下划线方式,非小写非驼峰法!!!

微信支付 jsapi支付,服务端踩过的那些坑

签名方式其实都一样的,先字典排序,后在排序后的参数后添加key,然后MD5加密,最后所有字符转为大写

微信支付 jsapi支付,服务端踩过的那些坑

之后就是将签名参数+签名放到一个数组里面之后转为XML发送给微信就好了

2)预支付成功后再次生成签名(主要是为了安全考虑,这个签名是为了给前端,前端拿签名去调微信的支付)

划重点就是这次的签名的参数名为驼峰法命名!!!

 

微信支付 jsapi支付,服务端踩过的那些坑

之后就是按照之前的签名方式生成签名并返回给前端就好了

二:关于vue.js的不同模式导致签名失败

这个必须说一些就是前端去生成签名的时候需要使用url地址,但是如果使用的是vue.js的Hash模式会导致url地址中带一个#号,这个#号是不能参与签名,微信支付文档是有说明的,所以需要前端更改模式为History模式,但是History会导致刷新的时候出现404的问题,那就需要后端配置更改nginx配置来将nginx的配置改为将404默认跳转到一个指定的url上了,

nginx配置如下: try_files $uri $uri/ index.html;

微信支付 jsapi支付,服务端踩过的那些坑

三:关于前端支付时当前URL未注册

这个是需要再商户后天进行配置的一个授权URL:https://jingyan.baidu.com/album/36d6ed1f89c1551bcf488387.html?picindex=3

四:关于公众号开启开发者模式的问题

更改公众号为开发者模式之后我们需要更改接口权限:

微信支付 jsapi支付,服务端踩过的那些坑

js安全域名是前端需要使用的安全域名,业务域名是后端使用得安全域名

微信支付 jsapi支付,服务端踩过的那些坑

这儿必须说明一下,这些域名的设置的时候需要下载一个安全验证的文件,文件的存放的地址就是你的域名的地址,否则是无法通过的哦!!

微信支付 jsapi支付,服务端踩过的那些坑

 

最后多嘴一句就是微信的access_token是分两种的1)微信授权登录的时候会需要用的的是唯一的2)微信的别的接口调用使用的普通的access_token,分别是不用的哦我就不多说了,自己查吧~~~