微信公众号支付

需求: 新旧收银台合并

问题: 当前页面的url未注册

  • 错误信息如下图: 网上搜索的问题答案无非就以下2种
1. 授权支付目录配置有误
  • 微信公众号支付已经在生产环境运行2年了
  • 检查授权域名目录配置是正确的
  • 如上图,配置授权目录为***.com.cn/m/insurance_unlogin/
  • 千万不要忘记授权目录后面的斜杠
2. appid配置错误
  • 只有一个appid,检查是正确的

问题分析

未合并收银台之前是可以成功调起支付的

怀疑步骤流程或接口请求数据不对,比对之后发现是一样的,前前后后弄了一天,郁闷了一天...唉声叹气之时,华哥将我分享出去的产品,再次分享出来,这时候神奇的事情发生了,微信支付成功,不会再出现当前页面URL未注册了.哈哈,赶紧研究下再次分享发生了什么

由于链接中携带测试环境及公司信息,故用以下网址演示

  • 比如我们打开优惠谷 http://youhuigu.cn
  • 点击微信右上角的分享,发送给朋友**(微信群或个人)**
  • 微信群打开链接,复制链接 http://youhuigu.cn/?from=groupmessage
  • 朋友打开链接,复制链接 http://youhuigu.cn/?from=singlemessage
  • 看见2次链接变化没有, 有search参数
  • 发送给群?from=groupmessage
  • 发送给朋友?from=singlemessage
  • 错误代码如下:
window.location.href = location.origin + location.pathname.replace('index.html', 'client.html') + '#insurance/cashier/index';

老框架跳转新框架的时候,由于页面发生变化,将index.html页面替换为client.html,同时也去掉了location.search(天坑呀),此处去掉location.search主要是因为携带了shareId,在新框架中用不着也无法解析,去掉了location.search也就意味着去掉了from=***message

解决问题

3. 不是来自微信分享(微信环境)

search中没有from=***message

  • 修正后代码
// 去掉shareId, from是来自微信分享, 没有微信公众号无法支付,报错URL未注册
var fromStr = '';
if (searchObj && searchObj.from) {
    fromStr = '?from=' + searchObj.from;
}
window.location.href = location.origin + location.pathname.replace('index.html', 'client.html') + fromStr + '#insurance/cashier/index';

总结

  • 这是微信公众号支付,当前页面URL未注册的第三种场景,若有不对之处,请留言更正
  • 微信公众号支付, 如果分享到微信的产品需要处理location.search,一定要注意from='***message'