首页
话题
消息
手册
我的

记录我做微信公众号支付遇到的各种问题和解决方法

发布于 2019-07-08 字数 3553 浏览 913 评论 0

开发微信支付,按照微信官方的文档一步一步走,你都不一定会支付成功,可能你会遇到各种问题,但是却几乎搜索不到任何文档来解决,这里记录下我做微信支付遇到的各种问题,也许你也遇到了这个问题,或许对你会有所帮助。

记录我做微信公众号支付遇到的各种问题和解决方法

支付路径配置

微信支付要求所有所有需要调用支付接口的 URL 地址都需要配置到商户平台,已网页里面的反斜杠结尾,如果你是使用前端分离来开发应用,#后面的内容也算,例如我现在的配置

记录我做微信公众号支付遇到的各种问题和解决方法

如果你没有配置对,在 Android 上没有任何提示,调支付的时候一闪而过,直接执行 fail 回调,而在 IOS 上会有当前页面的 URL 未注册的提示:

记录我做微信公众号支付遇到的各种问题和解决方法

在开启调试模式下,IOS 就人性化很多了。

JSSDK:”errMsg”:”config:invalid signature”

从上面的提示可以看出是前面错误,这里有一个隐藏的坑,在我们生成的签名的时候,需要当前访问的 URL,微信文档建议采用动态获取,但是我们是前后端分离开发模式,如果获取当前的 URL 就是 API 访问的 URL,而不是前端访问的地址,刚开始我是直接固定这个地址,放到线上测试也没有问题。

但是当我分享网页给其他人,他们访问我分享的网页就会出现 “errMsg”:”config:invalid signature” :

记录我做微信公众号支付遇到的各种问题和解决方法

根本原因就是微信在我们分享的网页后面多加了一个参数,而我们生成前面的 URL 并没有这个参数:

// 原始 URL
http://domain.com/mobile/#/pages/index/view
// 分享后的 URL
http://domain.com/mobile/?from=singlemessage#/pages/index/view

解决方法有两种,我们手动去掉这个多余的参数:

// 去除微信分享自带的多余的参数
this.cur_url = location.href.replace(/\?(.+?)#/, '#');
if(!(this.cur_url==location.href)){
  location.href = this.cur_url;
}

推荐使用这个方法,因为这里多加的参数会影响到上面的支付路径配置,而一个公众号支付路径配置只有5个,如果你像我这样支付路径有多个,那么还要考虑额外的参数的情况下,支付路径会不够用到时候就无法支付了。

另外一种方法是我们在生成参数的时候,由前端把当前的 URL 传给后端,然后在生成 JSSDK 注入参数:

// 获取配置信息
getSetting(cb=()=>{}){
  this.wjPost(this, 'getSetting', {
    cur_url: location.href.split('#')[0],
  }, (res)=>{
    if(res.success){
      uni.setStorageSync('setting', res.data);
      cb(res);
    }
  });
},

就这个错误,在百度上搜索解决方案,都是千篇一律的答案:

  1. APPID 和 APPSECRET 填错
  2. 超过了每日的 access_token 获取上限
  3. 查看微信公共号状态是否不正常
  4. 确认 config 中 nonceStr
  5. 确认 url 是页面完整的 url
  6. 配置 curl 是否使用 ssl 的带证书(https协议)访问开关
  7. 将网站所在服务器 IP 地址加入白名单

就上面第五点提到了点子上,但是却没说具体的原因,到底如何处理自己靠自己。

总结

暂时就遇到这两个问题,后期如果遇到新的问题我也会更新到这个文档,做微信支付你遇到了那些坑,欢迎大家留言评论。

如果你对这篇文章有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助。

扫码二维码加入Web技术交流群

您暂时不能评论!

管理员开启了需要登录才能够评论,你可以免费注册一个本站的账号。

还没有评论!

目前还没有任何评论,快来抢沙发吧!