场景:打开公司公众号 - 充值水电费 - 选择金额并点击立即充值 - 前端请求后端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、感谢所有参与回答的开发者
你怎么证明你是普通商户的?
商户是不是普通商户给出商户后台的截图才知道,你自己说是普通商户我们看不到不确定。我这里开发以来直连商户没有遇到过此问题,只有服务商的特约商户调用此接口支付,并且不配置点金计划,点击确认是退出的状态,再去确认一下商户是普通商户还是服务商的特约商户。
把这一句删掉试试