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 相关文章推荐
IE Firefox 使用自定义标签的区别
Oct 15 Javascript
JS获取整个页面文档的实现代码
Dec 15 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
Sep 15 Javascript
使用javascript获取页面名称
Dec 23 Javascript
使用js画图之正弦曲线
Jan 12 Javascript
微信小程序checkbox组件使用详解
Jan 31 Javascript
10分钟彻底搞懂Http的强制缓存和协商缓存(小结)
Aug 30 Javascript
如何解决日期函数new Date()浏览器兼容性问题
Sep 11 Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 Javascript
JavaScript Blob对象原理及用法详解
Oct 14 Javascript
JS指定音频audio在某个时间点进行播放
Nov 28 Javascript
jQuery实现可以扩展的日历
Dec 01 jQuery
跟混乱的页面弹窗说再见
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
php部分常见问题总结
2008/03/27 PHP
php 计算两个时间戳相隔的时间的函数(小时)
2009/12/18 PHP
PHP全概率运算函数(优化版) Webgame开发必备
2011/07/04 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
PHP在网页中动态生成PDF文件详细教程
2014/07/05 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
PHP CURL中传递cookie的方法步骤
2019/05/09 PHP
jquery 获取json数据实现代码
2009/04/27 Javascript
javascript中关于break,continue的特殊用法与介绍
2012/05/24 Javascript
JS获取页面input控件中所有text控件并追加样式属性
2013/02/25 Javascript
jquery html动态生成select标签出问题的解决方法
2013/11/20 Javascript
基于jquery实现的文字向上跑动类似跑马灯的效果
2014/06/17 Javascript
用JavaScript实现页面重定向功能的教程
2015/06/04 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
vue 根据数组中某一项的值进行排序的方法
2018/08/30 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
react koa rematch 如何打造一套服务端渲染架子
2019/06/26 Javascript
JS中的算法与数据结构之字典(Dictionary)实例详解
2019/08/20 Javascript
[02:49]2014DOTA2电竞也是体育项目! 势要把荣誉带回中国!
2014/07/20 DOTA
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
pycharm恢复默认设置或者是替换pycharm的解释器实例
2018/10/29 Python
Python 20行简单实现有道在线翻译的详解
2019/05/15 Python
python内存动态分配过程详解
2019/07/15 Python
python实现字符串和数字拼接
2020/03/02 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
新电JAVA笔试题目
2014/08/31 面试题
关于工资低的辞职信
2014/01/14 职场文书
电焊工工作岗位职责
2014/02/06 职场文书
接待员岗位责任制
2014/02/10 职场文书
幼儿园毕业寄语
2014/04/03 职场文书
岗位工作说明书
2014/07/29 职场文书
利用Redis实现点赞功能的示例代码
2022/06/28 Redis