vue中使用微信支付

今天是五一的第三天假,咱来聊聊微信支付吧,现在网上的微信支付的相关文章不是直接照搬官网就是互抄,如果刚接触微信支付时候去搜相关文章时你会发现很混乱,所以特此总结一篇微信支付的文章,写下自己踩过的坑,也给需要的人一些帮助,我的项目是在vue移动端的项目上,所以我会总结两种微信支付的方式(JSAPI:在微信浏览器上的微信支付,MWEB:在微信以外的浏览器上的支付)。

项目是用vue+ts的,如果项目上没有ts的就把一些类型声明去掉,下面就开始步入正题了。

1.如果你的下一个页面要进行微信支付,那就要在上一个页面提前判断是否在微信里面,如果在微信里面是要获取到code值才能进行JSAPI支付的。

 // 判断是否在微信浏览器  1为微信浏览器 2为其他  这个方法定义在外面,后面也会用到
  _isweixin() {
    return new Promise((resolve: any) => {
      const ua: any = window.navigator.userAgent.toLowerCase();
      //userAgent 属性是一个只读的字符串,声明了浏览器用于 HTTP 请求的用户代理头的值。
      if (ua.match(/MicroMessenger/i) == "micromessenger") {
        resolve(1);
      } else {
        resolve(2);
      }
    });
  }

注意:hostUrl是对应参数redirect_uri的,我刚开始踩坑的时候是redirect_uri域名与后台配置不一致,所以一定这个要跟配置网页授权域名的人拿,如果没有配置是拿不了code值,就没法进行第二步了,获取code的步骤在这里

//然后下面这个方法是跳转到需要微信支付的页面
 async _nextTournamentPackage({ bagId }: any) {
    const isweixin = await this._isweixin();
    if (isweixin === 1) {
     //这里我是外部引入,需要的话自己引入APPID,hostUrl
      const appid = APPID; 
      const redirecturi: any = encodeURIComponent(
        `${hostUrl}/#/package?data=${JSON.stringify(
          Object.assign({}, { bagId })
        )}`
      );
      window.location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirecturi}&response_type=code&scope=snsapi_base#wechat_redirect`;
    } else {
      this.$router.push({
        name: "package",
        query: { data: JSON.stringify(Object.assign({}, { bagId })) },
      });
    }
  }

2.第二步是拿到code值,后面就是要获取签名之类的,文档在这里,这个签名这些可以后台配置给你,也可以前端自己生成。具体看文档。

// wechatPay.ts文件
import { Vue } from "vue-property-decorator";
declare let WeixinJSBridge: any  // 解决 WeixinJSBridge 在TS编译会报错
export interface Res { // 微信需要传入的数据,数据格式定义
  appId?: string;
  timeStamp?: string;
  nonceStr?: string;
  package?: string;
  signType?: string;
  sign?: string;
}

export default class WechatPay extends Vue {
  public payType = ''
  public res: Res = {}  // 数据由后端返回
  /**
   * 微信JS支付,在点击支付时启用
   */
  public WeChartJSBridge(callback:any):void {
    if (typeof WeixinJSBridge === 'undefined') { // WeixinJSBridge 在TS编译会报错,因为该对象只在微信浏览器中存在,在文件头部声明 declare let WeixinJSBridge: any 即可
      if (document.addEventListener) {
        // 监听调用,可有可无
        document.addEventListener('WeixinJSBridgeReady', () => {
          this.onBridgeReady(this.res, callback)
        }, false)
      } 
        else if ((document as any).attachEvent) { // attachEvent()只在IE中有用,IE11已经不再支持
        (document as any).attachEvent('WeixinJSBridgeReady', this.onBridgeReady);
        (document as any).attachEvent('onWeixinJSBridgeReady', this.onBridgeReady);
      }
    } else {
      this.onBridgeReady(this.res, callback)
    }
  }
  public onBridgeReady(res: Res,callback:Function): void {
    WeixinJSBridge.invoke('getBrandWCPayRequest', {
      appId: res.appId,
      // 公众号名称,由商户传入
      timeStamp: res.timeStamp,
      // 时间戳,自1970年以来的秒数
      nonceStr: res.nonceStr,
      // 随机串
      package: res.package,
      signType: res.signType,
      // 微信签名方式:
      paySign: res.sign
      // 微信签名
    },
     (res: any) => {
        if (res.err_msg === 'get_brand_wcpay_request:ok') {
          // 使用以上方式判断前端返回,微信团队郑重提示:
          // res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。
            callback()
        }
        if (res.err_msg === 'get_brand_wcpay_request:cancel') {
            // 支付取消
            
        }
        
        if (res.err_msg === 'get_brand_wcpay_request:fail') {
            // 支付失败
        }
      })
  }
}
//这是跳转过来的package的页面
// 引入上面那个文件
import WechatPay from "@/utils/wechatPay";
// 确认人民币付款
  async confirmRmbPay() {
    const params: any = {
      id: '你请求接口传的id',
      payType: "wechatPay"
    };
    const isweixin = await this._isweixin();
    if (isweixin === 2) {
      alert("请在微信以外的浏览器里打开并支付!");
      // params.payScenes = "MWEB";
      // orderPay(params)
      //   .then((res: any) => {
      //     if (Number(res.code) === 0) {
      // 调用直接跳转后台返回给你的url地址,类似下面的地址
      //       //     window.location.href =
      //       // "weixin://wap/pay?prepayid=xxxxxxxxx&package=xxxxxx";
      //     } else {
      //       Toast.info(res.msg);
      //     }
      //   })
      //   .catch(() => {
      //     
      //   });
    } else {
      // 这个是在微信浏览器里的支付,获取code值后调用支付
      const search: any = window.location.search;
      const searchString = search.length > 0 ? search.substring(1) : "";
      const args = searchString.length > 0 ? searchString.split("&") : [];
      const items: any = {};
      for (let i = 0, length = args.length; i < length; i++) {
        const name = decodeURIComponent(args[i].split("=")[0]);
        const item = decodeURIComponent(args[i].split("=")[1]);
        items[name] = item;
      }
      if (!items["code"]) {
        Toast.info("生成订单错误");
        return;
      }
      params.code = items["code"];
      params.payScenes = "JSAPI";
      //orderOay是调用支付的接口,自己定义
      orderPay(params)
        .then((res: any) => {
          if (Number(res.code) === 0) {
            const wechatpay = new WechatPay();
            const payParams: any = {
              appId: APPID,
              timeStamp: res.result.timeStamp,
              nonceStr: res.result.nonceStr,
              package: `prepay_id=${res.result.prepayId}`,
              signType: "MD5",
              sign: res.result.paySign
            };
            wechatpay.res = Object.assign({}, payParams);
          //下面wechatpay.WeChartJSBridge里面是一个成功支付的回调,在里面你可以做回调成功的操作
            wechatpay.WeChartJSBridge(() => {
                return (window.location.href = `${hostUrl}/#/ordergroup2`)
            });
          } else {
            Toast.info(res.msg);
          }
        })
        .catch(() => {
        });
    }
  }

所有过程都结束了,如果喜欢的可以点个赞哦,谢谢各位,有不懂的欢迎私信!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,820评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,648评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,324评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,714评论 1 297
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,724评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,328评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,897评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,804评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,345评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,431评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,561评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,238评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,928评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,417评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,528评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,983评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,573评论 2 359

推荐阅读更多精彩内容