问题:

公众微信号调起微信支付的时候,有的时候调起支付成功,有的时候调起支付失败。利用抓包工具抓取数据显示授权和调用后台的微信预支付订单接口都成功并且都返回正确的数据。但是调起支付的时候传入的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.有目的性的排查问题,多思考,少些盲从的摸索会事半功倍。

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

  1. 怎样调通微信支付及微信发货通知接口(Js API)

    怎样调通微信支付及微信发货通知接口(Js API) 微信支付提供了一个支付測试页面,微信支付正式使用须要測通支付.发货通知接口 .告警接口.维权接口.告警接口.维权接口非常easy.支付界面调通也相对 ...

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

    App对接微信调起微信支付需要在微信平台注册,鉴别的标识就是App的包名,所以将申请的包名单独打包成一个Apk文件,则在其他的App调起此Apk的时候同样可以起到调用微信支付的功能.这样就实现了调起微 ...

  3. 我的微信小程序入门踩坑之旅

    前言 更好的阅读体验请:我的微信小程序入门踩坑之旅 小程序出来也有一段日子了,刚出来时也留意了一下.不过赶上生病,加上公司里也有别的事,主要是自己犯懒,就一直没做.这星期一,赶紧趁着这股热乎劲,也不是 ...

  4. 亲历H5移动端游戏微信支付接入及那些坑(二)——获取Openid和授权

    第一篇中将一些坑说明,那么这篇开始正式进入接入步骤.具体的参数说明,我不会列出,毕竟微信官方文档都有,我想大家都看的懂,而且这接口也有可能微信会变动,所以不列出来,也是不想引起大家的误解,接入步骤只起 ...

  5. Java实现JsApi方式的微信支付

    要使用JsApi进行微信支付,首先要从微信获得一个prepay_id,然后通过调用微信的jsapi完成支付,JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支 ...

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

    做商城类网站不免会需要做支付功能,目前在中国大陆通用的做法就是使用支付宝支付和微信支付,上一篇博文已经讲个支付宝支付. 这篇文章来讲一讲微信支付,微信支付的方式有很多种,本文主要讲 JSAPI 支付的 ...

  7. 【微信小程序】调起微信支付完整demo

    微信小程序调用微信支付接口 https://blog.csdn.net/u012667477/article/details/80940578

  8. 亲历H5移动端游戏微信支付接入及那些坑(三)——支付接入

    终于到接入支付了,小小的一个微信支付,居然也写了3篇,好长,好累. 接入环境 对接入环境,前端的话,应该是以js为主吧,也有可能是,PHP,Java,C++,或者C#都可以.为什么在此特意提一下接入环 ...

  9. 亲历H5移动端游戏微信支付接入及那些坑(一)——支付方式与坑

    最近项目进入中后期,开始接入支付.要求是使用微信支付,呵呵,好笑的是不知老板从哪里听来的,居然和我说只要是熟手,接个微信支付两小时搞定,我只能再次呵呵.先不说支付处理逻辑,而且公司本来也没现成的接入模 ...

随机推荐

  1. 为 pip install 设置 socks5 代理

    参考 How to use pip with socks proxy? 为 pip install 设置 socks5 代理 设置方法: pip install pysocks pip install ...

  2. 将webcam设置为网站favicon

    今天在Twitter上看到用户davywtf将webcam设置为网站favicon. 在线示例: https://wybiral.github.io/code-art/projects/tiny-mi ...

  3. 数据结构与算法(C#)入门 --- 序

    注:本系列文章适合新手入门.博主也是摸着石头过河,难免有错误之处.还请谅解~ ~~~ 数据结构是什么? 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合 ...

  4. 使用java程序对oracle添加触发器时,报错:索引中丢失 IN 或 OUT 参数:: 1

    解决方法: 执行sql语句时,使用java.sql.Statement代替java.sql.PreparedStatement. java.sql.PreparedStatement ps = con ...

  5. 查看linux是ubuntu还是centos

    方式一: radhat或centos存在: /etc/redhat-release 这个文件[ 命令 cat /etc/redhat-release ] ubuntu存在 : /etc/lsb-rel ...

  6. Oracle 动态sql

    静态SQL是前置编译绑定,动态SQL是后期执行时才编译绑定. 场景: 动态SQL适用于表名及查询字段名未知的情况.在已知查询字段名及表名的情况下,使用动态SQL(字符串拼接方式)会增加硬解析的开销,在 ...

  7. 用Spark完成复杂TopN计算的两种逻辑

    如果有商品品类的数据pairRDD(categoryId,clickCount_orderCount_payCount),用Spark完成Top5,你会怎么做? 这里假设使用Java语言进行编写,那么 ...

  8. ranch 源码分析(完)

    接上 ranch 源码分析(三) 在上一次,根据ranch源码把大概流程理了一遍,下面我们将一些细节解释一下. ranch只是一个服务的框架,它提供了传输层协议代码(ranch_tcp 和ranch_ ...

  9. android -------- RecyclerView的可(多个Item水平,垂直)滚动列表的实现

    RecyclerView的可滚动的列表实现,视图相邻的视图在屏幕上部分或完全可见(水平3个item,第一个和第三个显示一部分,第二个完全显示) 效果如图: 基于RecyclerView完成的(自定义控 ...

  10. Linux重要命令总结

    tar命令后面最常跟的参数 -zxvf 是什么意思? z 表示 tar 包是被 gzip 压缩过的,所以解压时需要用 gunzip 解压 x 从 tar 包中把文件提取出来,单词extract的含义是 ...