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 相关文章推荐
Extjs学习笔记之七 布局
Jan 08 Javascript
chrome原生方法之数组
Nov 30 Javascript
jQuery实现仿路边灯箱广告图片轮播效果
Apr 15 Javascript
JQuery实现的图文自动轮播效果插件
Jun 19 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
Mar 07 Javascript
纯JS代码实现气泡效果
May 04 Javascript
AngularJS Ajax详解及示例代码
Aug 17 Javascript
微信小程序request请求后台接口php的实例详解
Sep 20 Javascript
vue 指定组件缓存实例详解
Apr 01 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 Javascript
通过实例解析javascript Date对象属性及方法
Nov 04 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
ThinkPHP3.1新特性之内容解析输出详解
2014/06/19 PHP
PHP处理二进制数据的实现方法
2016/06/13 PHP
javascript学习基础笔记之DOM对象操作
2011/11/03 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
js限制input标签中只能输入中文
2015/06/26 Javascript
jQuery中serializeArray()与serialize()的区别实例分析
2015/12/09 Javascript
jQuery使用each方法与for语句遍历数组示例
2016/06/16 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
浅谈vue-router2路由参数注意的问题
2017/11/08 Javascript
详解vue-cli项目中怎么使用mock数据
2018/05/29 Javascript
vue-cli2.0转3.0之项目搭建的详细步骤
2018/12/11 Javascript
详解CommonJS和ES6模块循环加载处理的区别
2018/12/26 Javascript
mpvue性能优化实战技巧(小结)
2019/04/17 Javascript
JS实现容器模块左右拖动效果
2020/01/14 Javascript
[56:00]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第一局
2016/03/05 DOTA
Python的Flask框架中web表单的教程
2015/04/20 Python
Python使用win32 COM实现Excel的写入与保存功能示例
2018/05/03 Python
python3 打开外部程序及关闭的示例
2018/11/06 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
python进程和线程用法知识点总结
2019/05/28 Python
Python3使用 GitLab API 进行批量合并分支
2020/10/15 Python
html5本地存储_动力节点Java学院整理
2017/07/12 HTML / CSS
西班牙床垫网上商店:Colchones.es
2018/05/06 全球购物
美国羽绒床上用品第一品牌:Pacific Coast
2018/08/25 全球购物
医院总经理岗位职责
2014/02/04 职场文书
培训协议书范本
2014/04/22 职场文书
森林防火宣传标语
2014/06/27 职场文书
在职党员进社区活动总结
2014/07/05 职场文书
中共广东省委常委会党的群众路线教育实践活动整改方案
2014/09/23 职场文书
淘宝客服专员岗位职责
2015/04/07 职场文书
活动总结模板大全
2015/05/11 职场文书
《开国大典》教学反思
2016/02/16 职场文书
python playwright 自动等待和断言详解
2021/11/27 Python
MySQL池化框架学习接池自定义
2022/07/23 MySQL