Vue开发Html5微信公众号的步骤


Posted in Javascript onApril 11, 2019

一、调起微信支付

在微信浏览器里面打开H5网页中执行JS调起支付,WeixinJSBridge内置对象在其他浏览器中无效。
具体参考官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6

(1)大致流程:

Vue开发Html5微信公众号的步骤

(2)调用代码示例:

mounted(){
      if (typeof WeixinJSBridge == "undefined") {
        if (document.addEventListener) {
          document.addEventListener(
            "WeixinJSBridgeReady",
            this.onBridgeReady,
            false
          );
        } else if (document.attachEvent) {
          document.attachEvent(
            "WeixinJSBridgeReady",
            this.onBridgeReady
          );
          document.attachEvent(
            "onWeixinJSBridgeReady",
            this.onBridgeReady
          );
        }
      } else {
        this.onBridgeReady();
      }
}
methods:{
  // 调起微信支付
    onBridgeReady() {
      const pay_params = this.payInfo; //创建支付返回的签名信息
      WeixinJSBridge.invoke(
        "getBrandWCPayRequest",
        {
          appId: pay_params.appId, //公众号名称,由商户传入
          timeStamp: pay_params.timeStamp, //时间戳,自1970年以来的秒数
          nonceStr: pay_params.nonceStr, //随机串
          package: pay_params.package,
          signType: pay_params.signType, //微信签名方式:
          paySign: pay_params.paySign //微信签名
        },
        res => {
          if (res.err_msg == "get_brand_wcpay_request:ok") {
            // 校验支付
            alert('支付成功');
            
            //do something...
            
          }else if(res.err_msg == "get_brand_wcpay_request:cancel"||res.err_msg == "get_brand_wcpay_request:fail"){
            alert('支付失败');
          }
        }
      );
    },
}

二、实现Web签名+截图网页+上传截图

web签名使用 jsignature 实现,由于jsignature 基于Jquery实现,需要引入Jquery。
签名完成后,使用 html2canvas 实现网页全屏截图。
截图成功后,由于Canvas的 toDataURL方法会根据签名的复杂程度返回不同长短的Base64,过长的Base64传到后台会增加服务器负担,所以需要转成平时input type=file上传的图片格式

代码示例:

import jSignature from "jSignature"; 
  import html2canvas from 'html2canvas';
  
  mounted() {
    //通过setTimeout把代码丢到初始化最后执行
    this.Timer = setTimeout(() => {
      // Signature 签名Dom容器
      this.$SignDom = $("#Signature").jSignature({
        height: "100%",//占容器100%
        width: "100%"
      });
    }, 0);
  },
  methods:{
    //清空签名
    resetSign() {
      this.$SignDom && this.$SignDom.jSignature("reset");
    },
      // 获取签名
    async getSign() {
      if (!this.$SignDom) return;
      
      if (!this.$SignDom.jSignature("getData", "native").length) {
        alert("请填写您的签名!");
        return;
      }
      // jSignature - 获取签名Base64(注意:该Base64指签名那一块,不是整个页面)
      
      // let datapair = this.$SignDom.jSignature("getData", "image");
      // let SignSrc = "data:" + datapair[0] + "," + datapair[1];
      
      // html2canvas截取整个页面
      const HTML_CANVAS = await html2canvas(document.getElementById('app'));
      let SignSrc = HTML_CANVAS.toDataURL();
      
       // Base64 转 Blob 实现提交图片
      let uploadImg = this.dataURLtoFile(SignSrc);
      
      let param = new FormData(); //创建form对象
      param.append("file", uploadImg,'signImage.png'); 
      
      // send request...
    },
     // Base64转Blob上传图片
    dataURLtoFile(dataurl) {
      var arr = dataurl.split(","),
        mime = arr[0].match(/:(.*?);/)[1],
        bstr = atob(arr[1]),
        n = bstr.length,
        u8arr = new Uint8Array(n);
      while (n--) {
        u8arr[n] = bstr.charCodeAt(n);
      }
      return new Blob([u8arr],{
        type: mime,
      });
    }

  },
  destroyed() {
    //清理setTimeout
    this.Timer && clearTimeout(this.Timer);
  }

三、如何在npm run dev下,手机打开H5公众号测试

(1) 修改package.json,在dev 后面加上--host your IP

示例:

"scripts": {
  "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 192.167.1.99",
 },

(2) dev跑起来之后,通过文件传输助手发给手机,在手机打开http://your IP:8080/即可

(3) 打开后就可以在手机上测试支付或wx-js-sdk等功能啦!

Javascript 相关文章推荐
jQuery 使用手册(六)
Sep 23 Javascript
百度移动版的url编码解码示例
Apr 29 Javascript
jquery.idTabs 选项卡使用示例代码
Sep 03 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
Oct 28 Javascript
微信JSAPI支付操作需要注意的细节
Jan 10 Javascript
JavaScript实现简单生成随机颜色的方法
Sep 21 Javascript
基于复选框demo(分享)
Sep 27 Javascript
vue 中滚动条始终定位在底部的方法
Sep 03 Javascript
Vue动态路由缓存不相互影响的解决办法
Feb 19 Javascript
微信小程序一周时间表功能实现
Oct 17 Javascript
JS面试题中深拷贝的实现讲解
May 07 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
May 15 Javascript
跟混乱的页面弹窗说再见
Apr 11 #Javascript
vue实现todolist功能、todolist组件拆分及todolist的删除功能
Apr 11 #Javascript
vue实现todolist基本功能以及数据存储功能实例详解
Apr 11 #Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
Apr 11 #Javascript
使用Vue父子组件通信实现todolist的功能示例代码
Apr 11 #Javascript
详解jQuery设置内容和属性
Apr 11 #jQuery
js作用域和作用域链及预解析
Apr 11 #Javascript
You might like
Windows下PHP5和Apache的安装与配置
2006/09/05 PHP
php实现的遍历文件夹下所有文件,编辑删除
2010/01/05 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
php中判断数组相等的方法以及数组运算符介绍
2015/03/30 PHP
PHP4和PHP5版本下解析XML文档的操作方法实例分析
2017/05/20 PHP
使用PHP开发留言板功能
2019/11/19 PHP
js用图作提交按钮或超连接
2008/03/26 Javascript
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
Extjs中ComboBox加载并赋初值的实现方法
2012/03/22 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
JS去除字符串两端空格的简单实例
2013/12/27 Javascript
使用js判断控件是否获得焦点
2014/01/03 Javascript
原生js实现网页顶部自动下拉/收缩广告效果
2017/01/20 Javascript
easyui-datagrid开发实践(总结)
2017/08/02 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
Vue 动态路由的实现及 Springsecurity 按钮级别的权限控制
2019/09/05 Javascript
[01:34:42]NAVI vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python3访问sina首页中文的处理方法
2014/02/24 Python
python操作日期和时间的方法
2014/03/11 Python
python装饰器初探(推荐)
2016/07/21 Python
Python中运算符"=="和"is"的详解
2016/10/08 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
Django 项目通过加载不同env文件来区分不同环境
2020/02/17 Python
jupyter notebook 添加kernel permission denied的操作
2020/04/21 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
python3爬虫中多线程的优势总结
2020/11/24 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
优衣库澳大利亚官网:UNIQLO澳大利亚
2017/01/18 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
点菜员岗位职责范本
2014/02/14 职场文书
成都人事代理协议书
2014/10/25 职场文书
傲慢与偏见电影观后感
2015/06/10 职场文书
开学第一周总结
2015/07/16 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
《窃读记》教学反思
2016/02/18 职场文书