问题:

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

  1. <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'));
  2.  
  3. weixinPayFor(data);
  4.  
  5. //微信生成预支付订单(微信端)
    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)
    }
    });
    }
  6.  
  7. 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');
  8.  
  9. }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');
    }
    });
    }
  10.  
  11. function backIndex(){
    window.location.href='./index.html';
    }
    </script>
  12.  
  13. 原因:
    调起微信支付的时候,页面会加载微信的js,会在所有的script标签后面添加一行script用来加载微信的js,而我自己写的js代码没有在所有的js文件加载完成之后调用。即没有用$(function(){ }); 代码包裹起来我的逻辑。会导致加载此页面的时候从上往下执行。
    而调用微信预支付订单的接口是异步请求。如果异步请求返回的数据快于微信js加载。则正常走调起微信支付。如果微信js加载完成慢于调用微信预支付订单的接口返回数据。由于
  1. 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);
    }
  2.  
  3. 这段判断,此时WeixinJSBridge 未初始化完成,故值为undefined if语句,此时的onBridgeReady方法没有要求传参数,故取不到data数据,调起支付的参数全都找不到,故调起支付失败。
  4.  
  5. 解决方法:
    1.修改if语句。
    if语句修改为如下:
  1. 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.  
  3. 方法2
    将自己的js逻辑代码用$(function(){});包裹起来,即在所有的js代码加载完成之后执行$(function(){});里面的函数代码,也可以达到想要的效果。
  4.  
  5. 总结:
    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. 关于 diff 和patch

    参考: https://blog.csdn.net/zygblock/article/details/53384862 diff和patch是 版本控制 git 的不可缺少的工具 diff 是用来比较 ...

  2. [Redis] - redis实战1

    rememberMe>>>>:null Creating a new SqlSession SqlSession [org.apache.ibatis.session.defa ...

  3. 获取占用fd最大的前20个进程

    for x in `ps -eF| awk '{ print $2 }'`;do echo `ls /proc/$x/fd 2> /dev/null | wc -l` $x `cat /proc ...

  4. 实验一:c++简单程序设计(1)

    实验结论 编程练习2-28 switch版源码: #include <iostream> using namespace std; int main(void) { cout <&l ...

  5. Web API系列(三) 异常处理

    在上一篇教程中我为大家介绍了Web API中Filter的开发使用,其中讲到ExceptionFilter时留了一个坑:ExceptionFilter只能截获并处理Action执行过程中发生的异常,在 ...

  6. julia 安装

    https://julialang.org/downloads/ 下载安装程序,拖拽完成安装

  7. UML作业第三次

    一.学习小结 类之间的关系通过符号定义 : 使用.. 来代替 -- 可以得到点 线. 例如: @startuml Class01 <|-- Class02 Class03 *-- Class04 ...

  8. 基于apache的虚拟主机

    apche支持3种类型虚拟主机: 基于IP的虚拟主机 基于端口的虚拟主机 基于主机名的虚拟主机 配置两个站点虚拟主机: /data/web1 /data/web2 一.基于IP虚拟主机 添加一个IP: ...

  9. java,优先队列的用法

    像C++语言一样,java中,也有包装好的优先队列类PriorityQueue. 用法如下(模板代码): 工作安排问题: 问题描述:设有n件工作分配给n个人,将工作i分配给第j个人所需的费用为cij. ...

  10. 微信小程序 swiper轮播 自定义indicator-dots样式

    index.wxml <view class="swiperContainer"> <swiper bindchange="swiperChange&q ...