收藏
回答

普通商户(直连)开发jsapi支付时,前端唤起微信收银台,用户支付并确定后页面闪退了,怎么回事

场景:打开公司公众号 - 充值水电费 - 选择金额并点击立即充值 - 前端请求后端toPay接口 - 后端toPay接口组装参数调用微信统一下单接口(https://api.mch.weixin.qq.com/pay/unifiedorder),最后获得返回值响应给前端 - 前端收到返回值在js中调用

WeixinJSBridge.invoke(

    'getBrandWCPayRequest', {

        "appId": obj.appid,     //公众号ID,由商户传入

        "timeStamp": timeStamp.toString(),         //时间戳,自1970年以来的秒数

        "nonceStr": nonceStr, //随机串

        "package": packageId,

        "signType": "MD5",         //微信签名方式:

        "paySign": sign //微信签名

    },

    function (res) {

alert("会回调吗????")

//支付回调函数

        if (res.err_msg == "get_brand_wcpay_request:ok") {

            // 使用以上方式判断前端返回,微信团队郑重提示:

            //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。

            WeixinJSBridge.call('closeWindow');

        }

    });

问题:用手机测试时,支付完成点击确定,整个窗口立即关闭,并没有想象中的执行alert。问某群,一个人说都2023年了,还有这个问题,说的很轻松,我想,这是个很简单的问题,求解答,该怎么做,让用户支付点击确定时回到原先充值页面(说点金计划的注意我说的商户类型)


解决:我找到问题了,罪魁祸首是微信的缓存导致的一系列奇奇怪怪的问题!!!其他浏览器没事是因为我在Network中勾选了Disable cache禁用缓存了

1、普通商户付款成功的回调关闭界面(也有人说闪退)是因为这段代码WeixinJSBridge.call('closeWindow'); 造成的。而注释掉没有效果是因为手机端的微信缓存了旧代码,导致新的代码并没有运行到。(一个jsapi的支付流程中,会有两个回调,一个是请求微信下单时告诉微信支付成功后回调后台某个接口,另一个回调是html页面WeixinJSBridge.invoke这段js代码的回调。以上我说的回调都是指html页面的js回调)

2、在微信内置浏览器alert 是可以出弹窗的,网上说alert失效也是缓存问题,因为缓存中根本没有alert这段代码。但是WeixinJSBridge.invoke的回调函数这个位置比较特殊,这个位置使用alert效果不好,因为用户输入支付密码后会展示支付成功的页面,这个时候在原来页面已经执行alert,当用户在微信的支付成功页面点击最下方的确定时,回到原来页面就不会看到alert的弹窗了。

3、手机端的微信(苹果的)缓存,要到微信的通用-存储空间 去清理相关缓存,直接杀进程,甚至重启手机缓存都是存在的

4、微信的缓存的原理不知道是怎样的,有时候缓存了,有时候又不缓存(我在idea里修改代码按ctrl+f9 重构下,手机微信里重新访问就有新的代码效果了,而有时候怎么重构怎么重启怎么修改更新都不行,这很容易误导人啊)

5、别人说微信开发者工具首页 - 点击打开公众号网页项目 ,然后在最上面输入url 调试相当于调试微信内置浏览器,不知道是不是这样,有知道的麻烦告知

6、手机想看下调试信息,可以在你想看的页面上加入以下代码,但功能没有谷歌强大

<script src="https://unpkg.com/vconsole@latest/dist/vconsole.min.js"></script>

<script>

  // VConsole will be exported to `window.VConsole` by default.

  var vConsole = new window.VConsole();

</script>

7、感谢所有参与回答的开发者

最后一次编辑于  2023-07-22
回答关注问题邀请回答
收藏

3 个回答

  • Memory
    Memory
    2023-07-18

    你怎么证明你是普通商户的?

    2023-07-18
    有用 1
    回复 4
    • orison          🕷
      orison 🕷
      2023-07-19
      问了技术客服,给了商户号给他查,他说的。另外,普通商户和服务商所登录的平台也不一样,里面的菜单也不一样。而服务商登录进去后台一眼就能看到点金计划
      2023-07-19
      回复
    • Memory
      Memory
      2023-07-19回复orison 🕷
      普通商户号开了某些功能后会变特约商户的,普通商户是一个统称
      2023-07-19
      回复
    • orison          🕷
      orison 🕷
      2023-07-19
      我找到问题了,谢谢回答
      2023-07-19
      回复
    • orison          🕷
      orison 🕷
      2023-07-19回复Memory
      昨天也问了公司这方面的负责人,她说不是特约商户
      2023-07-19
      回复
  • 大山
    大山
    2023-07-18

    商户是不是普通商户给出商户后台的截图才知道,你自己说是普通商户我们看不到不确定。我这里开发以来直连商户没有遇到过此问题,只有服务商的特约商户调用此接口支付,并且不配置点金计划,点击确认是退出的状态,再去确认一下商户是普通商户还是服务商的特约商户。

    2023-07-18
    有用
    回复 3
    • orison          🕷
      orison 🕷
      2023-07-19
      后来我重新写了一份支付代码,把这段WeixinJSBridge.call('closeWindow');注释掉就可以了。但发现另一个问题,html中引入的外部js在微信内置浏览器中失效了,其他浏览器就没问题
      2023-07-19
      回复
    • 大山
      大山
      2023-07-19回复orison 🕷
      你这个失效怎么理解?js 加载失败?
      2023-07-19
      回复
    • orison          🕷
      orison 🕷
      2023-07-19回复大山
      我找到问题了。罪魁祸首是微信的缓存。这个缓存直接杀进程甚至重启手机都没法清掉。后来去微信的通用设置里面找到缓存去清理才行
      2023-07-19
      回复
  • 布衣
    布衣
    2023-07-18

    把这一句删掉试试

    2023-07-18
    有用
    回复 2
    • orison          🕷
      orison 🕷
      2023-07-18
      alert都没执行,跟这句话没关系。alert在取消支付时回调到。支付成功就没回调,而是关闭了整个页面(退出到公众号主页了)
      2023-07-18
      回复
    • orison          🕷
      orison 🕷
      2023-07-19
      确实跟这句话有关。我重新写了一份支付代码,然后把这段话删了就可以了。但是又发现了另一个问题。那就是之前老是排查不到问题,可能是跟微信内置浏览器有关,我现在发现最新微信版本的微信内置浏览器,如果引入的是外部js,是无效的。我都懵逼了
      2023-07-19
      回复
登录 后发表内容