jsapi 调起微信支付的的踩坑

问题:

公众微信号调起微信支付的时候,有的时候调起支付成功,有的时候调起支付失败。利用抓包工具抓取数据显示授权和调用后台的微信预支付订单接口都成功并且都返回正确的数据。但是调起支付的时候传入的data老是弹出{‘isTrusted:false’},正常的data应该是调用生成预支付订单的返回数据,即后台给返回的调起微信支付所需要的数据参数。我的代码:

<script src="./js/jquery.js"></script><script src="http://res2.wx.qq.com/open/js/jweixin-1.4.0.js"></script><script src="./js/commom.js"></script><script>    var code = GET(‘code‘);    var data = JSON.parse(window.localStorage.getItem(‘data‘));

weixinPayFor(data);

//微信生成预支付订单(微信端)    function weixinPayFor(data){        var required_parameter = {            totalprice:data.totalprice,            orderNo:data.orderNo,            code:code,            url:‘http://stg.keyidabj.com/mp/wx/cameraVipApp/payment.html‘,        };        postNet({            param: required_parameter,            action: "/getWeixinPayForPatriarch",            successFull: function successFull(data) {                // console.log(data);                var result = data.result;                if (typeof WeixinJSBridge == "undefined"){                    if( document.addEventListener ){                        document.addEventListener(‘WeixinJSBridgeReady‘, onBridgeReady, false);                    }else if (document.attachEvent){                        document.attachEvent(‘WeixinJSBridgeReady‘,onBridgeReady);                        document.attachEvent(‘onWeixinJSBridgeReady‘,onBridgeReady);                    }                }else{                    onBridgeReady(result);                }            },            failFull: function failFull(data){                $(‘.loading‘).hide();                $(‘.result-container‘).show();                $(‘.result-main i‘).hide();                $(‘.result-text‘).addClass(‘fail-text‘);                toastText(data.info);                let time = 5;                setInterval(function () {                    time--;                    if(time>0){                        $(‘.result-text‘).text(time+‘s后页面关闭‘);                    }else {                        window.history.go(-1);                    }                },1000)            }        });    }

function onBridgeReady(data){        WeixinJSBridge.invoke(            ‘getBrandWCPayRequest‘, {                "appId":data.appid,     //公众号名称,由商户传入                "timeStamp":data.timestamp,       //时间戳,自1970年以来的秒数                "nonceStr":data.nonce_str, //随机串                "package":data.packageStr,                "signType":data.signType,         //微信签名方式:                "paySign":data.paySign //微信签名            },            function(res){                if(res.err_msg == "get_brand_wcpay_request:ok"){                    $(‘.loading‘).hide();                    $(‘.result-container‘).show();                    $(‘.result-main i‘).addClass(‘success‘);                    $(‘.result-text‘).text(‘支付成功‘);                    $(‘.result-text‘).addClass(‘success-text‘);

}else if(res.err_msg == "get_brand_wcpay_request:cancel"){                    // toastText(‘支付取消啦‘);                    // errorAlert(‘您已取消支付‘);                    $(‘.loading‘).hide();                    $(‘.result-container‘).show();                    $(‘.result-main i‘).addClass(‘fail‘);                    $(‘.result-text‘).text(‘支付取消‘);                    $(‘.result-text‘).addClass(‘fail-text‘);                }else if(res.err_msg == "get_brand_wcpay_request:fail"){                    $(‘.loading‘).hide();                    $(‘.result-container‘).show();                    $(‘.result-main i‘).addClass(‘fail‘);                    $(‘.result-text‘).text(‘支付失败‘);                    $(‘.result-text‘).addClass(‘fail-text‘);                }            });    }

function backIndex(){        window.location.href=‘./index.html‘;    }</script>

原因:调起微信支付的时候,页面会加载微信的js,会在所有的script标签后面添加一行script用来加载微信的js,而我自己写的js代码没有在所有的js文件加载完成之后调用。即没有用$(function(){ }); 代码包裹起来我的逻辑。会导致加载此页面的时候从上往下执行。而调用微信预支付订单的接口是异步请求。如果异步请求返回的数据快于微信js加载。则正常走调起微信支付。如果微信js加载完成慢于调用微信预支付订单的接口返回数据。由于
if (typeof WeixinJSBridge == "undefined"){    if( document.addEventListener ){        document.addEventListener(‘WeixinJSBridgeReady‘, onBridgeReady, false);    }else if (document.attachEvent){        document.attachEvent(‘WeixinJSBridgeReady‘, onBridgeReady);        document.attachEvent(‘onWeixinJSBridgeReady‘, onBridgeReady);    }}else{    onBridgeReady(result);}

这段判断,此时WeixinJSBridge 未初始化完成,故值为undefined 走if语句,此时的onBridgeReady方法没有要求传参数,故取不到data数据,调起支付的参数全都找不到,故调起支付失败。

解决方法:1.修改if语句。将if语句修改为如下:
if (typeof WeixinJSBridge == "undefined"){    if( document.addEventListener ){        document.addEventListener(‘WeixinJSBridgeReady‘, function (){            onBridgeReady(result);        }, false);    }else if (document.attachEvent){        document.attachEvent(‘WeixinJSBridgeReady‘, function (){            onBridgeReady(result);        });        document.attachEvent(‘onWeixinJSBridgeReady‘, function (){            onBridgeReady(result);        });    }}else{    onBridgeReady(result);}当微信预支付订单调用完成且微信js未加载完成时,走if判断,此时页面会监听有没有WeixinJSBridgeReady,此时是没有,调起微信支付的时候将与支付订单返回的数据传给onBridgeReady函数作为参数。就仍可以调起微信支付。

方法2:将自己的js逻辑代码用$(function(){});包裹起来,即在所有的js代码加载完成之后执行$(function(){});里面的函数代码,也可以达到想要的效果。

总结:1.理解微信浏览器的运行机制,异步函数的运行机制。2.写代码要注意走查,每一步要清除是做什么的,代码如何在浏览器上运行。3.有目的性的排查问题,多思考,少些盲从的摸索会事半功倍。

原文地址:https://www.cnblogs.com/fsx77/p/10252114.html

时间: 2024-10-06 06:05:16

jsapi 调起微信支付的的踩坑的相关文章

非微信内置浏览器中的网页调起微信支付的方案研究

问题来源 之前在app中集成过微信支付,当时还写了一篇扫坑贴,此种微信支付方式为app支付,即在我们自己的应用中嵌入微信支付SDK,由Native代码调起微信支付. 后来由于业务需要在我们app的WebView中打开第三方店铺的网页,在第三方网页中有微信支付按钮,测试反馈说ios可以调起微信支付,而android不可以.后来网上看到说微信内置Webview和京东的网页也可以调起微信支付,微信自己没什么奇怪的,而京东可以的话,如果它跟微信没什么合作协议的话,那么其他app应该也可以在网页中调用微信

如何调通微信支付及微信发货通知接口(Js API)

微信支付提供了一个支付测试页面,微信支付正式使用需要测通支付.发货通知接口 .告警接口.维权接口.告警接口.维权接口非常简单.支付界面调通也相对简单,主要是发货通知接口稍微复杂一点.调通发货通知接口需要注意以下几点: (1) 微信支付文档中提到发货通知接口的PostData,这个其实不是一个form里的一项,其实 PostData的提法有点误导,理解为json串就可以了. (2)以下的写法是错误的: <form name="form2" target="_blank&q

Android通过Apk插件调起微信支付

App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微信支付的SDk的功效.操作实现中要将Apk文件安放在assets文件夹的目录下. 当安装好App之后,要将Apk文件保存到本地中 代码实现如下: private boolean saveApk() throws Exception { /** 首先默认个文件保存路径 */ sdcard = Envi

Android中微信支付的流程(从请求统一支付接口到真正调起微信支付)

在公司做一款电商类的软件,接入支付是必不可少的环节.继上一次集成支付宝以后,微信支付又开启了另一段痛苦的历程.由于以前没有做过微信支付,所以这次在做的过程中还是遇到很大的问题.而且,公司目前没有自己的后台,所有的接口都是外包来承接的,在遇到问题时,外包一般会说,这是封装好的,以前都没有问题.然后,你只能自己查找原因,废话不多说,简单记录一下集成微信的整个过程. 1.微信支付的签名问题(包括微信的分享) 虽然关于微信的签名是个老生常谈的问题了,但是在这里我还是想要简单的描述一下.首先,要得到一个签

iOS通俗易懂的微信支付接入和爬坑指南,十分钟轻松搞完

现在基本所有的App都会接入支付宝支付以及微信支付,也有很多第三方提供给你 SDK帮你接入,但是这种涉及到支付的东西还是自己服务器搞来的好一些,其实搞懂了 逻辑非常的简单,下面直接给大家说说下基本流程和接入需要注意的东西. 前期准备(这个东西一般来讲我们不需要来操心,但是还是稍微介绍下) 1.到微信开放平台注册账号点击打开链接 2.进入管理中心------移动应用------创建移动应用----根据页面完善应用资料 3.审核过后,通过应用详情页面,查看应用详情,查看AppID和AppSecret

微信支付趟过的坑

微信支付趟过的坑 标签: 微信支付 2015-01-21 15:49 25791人阅读 评论(30) 收藏 举报  分类: 微信公众号开发 版权声明:本文为博主原创文章,未经博主允许不得转载. 这段时间在做微信支付开发,在公司的公众号审批下来后,我这边的测试用例也已经开发完毕,于是拿着具体的数据来调试了,大段大段的代码就不贴了,demo里有,这里就说说调试过程中遇到的坑. 第一坑:redirect_url参数错误.因为我选择的的“JS API”支付,这种支付需要网页授权,先获取code,再拿co

Java实现JsApi方式的微信支付

要使用JsApi进行微信支付,首先要从微信获得一个prepay_id,然后通过调用微信的jsapi完成支付,JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回.由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分. 示例代码如下: functiononBridgeReady(){ WeixinJSBridge.

微信支付(公众号)爬坑记,包含 total_fee 失败和 JSAPI 签名验证失败等等

做商城类网站不免会需要做支付功能,目前在中国大陆通用的做法就是使用支付宝支付和微信支付,上一篇博文已经讲个支付宝支付. 这篇文章来讲一讲微信支付,微信支付的方式有很多种,本文主要讲 JSAPI 支付的前端部分. 各种配置不细讲. 后台需要生成各种签名后返回给前台调用. 前台调用,微信浏览器提供一个方法 WeixinJSBridge.invoke, 但是这个还需要加上 window 来执行不然会报错, 无法通过. 前端严格按照微信提供的 demo 来写一个字符都不能错,参数一次为:appId, t

微信支付 - 中的那些坑

前段时间准备做支付,申请开通了微信支付,然后简单的弄了几下就看到支付页面了, 但是现在,当需要投入到生产环境中时,问题就来了! 坑一:H5调起支付API报错, 缺少参数appId 缺少 appId $key0$ 这种的,这个奇葩的问题调试了整整一个下午,因为很确定参数是对的,可就是报错, 最后发现原因是:js使用gulp压缩之后变掉了,比如那个参数列表 本来是:{"appId":xxx .... 的,压缩后变成 {appId:xxx .....   莫名其妙的就把双引号去掉了!! 好的