zoukankan      html  css  js  c++  java
  • H5与企业微信jssdk集成

    H5与企业微信jssdk集成

    一、公众号设置

    注册企业微信,在应用与小程序栏目中,设置可信域名,配置公众号菜单。可信域名不得不说下,在最初开发时,认为设置并验证后,微信认证接口会实现跨域请求,其实并没有。所以全在H5端还得配合服务端完成票据获取等操作。

    二、开发步骤

    1. 获取accesstoken
      接口地址 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET , 获取到的token的有效时间为2小时
      H5不能直接访问,需要服务端通过代理访问

      //author herbert QQ:464884492
      getAccessToken() {
      // 判断是否缓存有
      return new Promise((resolve, reject) => {
      var access_token = localStorage.getItem("accessToken");
      var expires = localStorage.getItem("expires_accessToken");
      if (expires > new Date().getTime() - 2000) {
      resolve(access_token);
      return;
      }
      let accessTokenUrl = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + this.groupId + "&corpsecret=" + this.secretId;
      
      // fetch(accessTokenUrl, { method: "GET" })
      fetch(this.porxyUrl, {
      method: "POST",
      body: JSON.stringify({
      method: "GET",
      url: accessTokenUrl
      })
      }).then(resp => {
      return resp.json()
      }).then(data => {
      if (data.errcode == 0) {
      //保存本次获取的accessToken
      localStorage.setItem("accessToken", data.access_token);
      localStorage.setItem("expires_accessToken", new Date().getTime() + data.expires_in * 1000);
      resolve(data.access_token);
      }
      }).catch(data => {
      reject();
      })
      });
      },
      View Code
    1. 获取ticket

      使用上一步骤获取到的access_token获取ticket,接口地址https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=ACCESS_TOKEN
      H5不能直接访问,需要服务端通过代理访问

      //author herbert QQ:464884492
      getTicket() {
      return new Promise((resolve, reject) => {
      var ticket = localStorage.getItem("ticket");
      var expires = localStorage.getItem("expires_ticket");
      if (expires > new Date().getTime() - 2000) {
      resolve(ticket);
      return;
      }
      let ticketUrl = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=" + localStorage.getItem("accessToken");
      
      //fetch(ticketUrl, { method: "GET" })
      fetch(this.porxyUrl, {
      method: "POST",
      body: JSON.stringify({
      method: "GET",
      url: ticketUrl
      })
      }).then(resp => {
      return resp.json()
      }).then(data => {
      if (data.errcode == 0) {
      //保存本次获取的accessToken
      localStorage.setItem("ticket", data.ticket);
      localStorage.setItem("expires_ticket", new Date().getTime() + data.expires_in * 1000);
      resolve(data.ticket);
      }
      }).catch(data => {
      reject();
      })
      });
      },
      View Code
    1. 生成签名
      文档地址 https://work.weixin.qq.com/api/doc#90000/90136/90506
      需要将参数构造如下格式JSAPITICKET&noncestr=NONCESTR×tamp=TIMESTAMP&url=URL,然后做SHA1算法获取字符串哈希值。其中NONCESTR是一个随机字符串,URL不能包含#以及后边的部分

      //author herbert QQ:464884492
      getSignature(timestamp, ticket) {
      let url = window.location.href.split("#")[0];
      let jsapi_ticket = "jsapi_ticket=" + ticket + "&noncestr=" + timestamp + "×tamp=" + timestamp.substr(0, 10) + "&url=" + url;
      this.printStatuInfo("签名原始信息:" + jsapi_ticket);
      let sha1Str = new jsSHA(decodeURIComponent(jsapi_ticket), "TEXT");
      return sha1Str.getHash("SHA-1", "HEX");
      }
      View Code
    1. 初始微信配置信息
      根据前边几个步骤获取的参数,初始微信配置信息

      //author herbert QQ:464884492
      wx.config({
      beta: true,// 必须这么写,否则wx.invoke调用形式的jsapi会有问题
      debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
      appId: wxUtils.groupId, // 必填,企业微信的corpID
      timestamp: timestamp.substr(0, 10), // 必填,生成签名的时间戳
      nonceStr: timestamp, // 必填,生成签名的随机串
      signature: sig,// 必填,签名,见附录1
      jsApiList: ["scanQRCode"] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
      });
      View Code
    1. 调用api
      初始完成后,需要立即调用api需要在 wx.ready函数中注册回调函数,如果是不立即调用可以忽略。以下为调用微信扫一扫功能

      //author herbert QQ:464884492
      wx.scanQRCode({
      desc: 'scanQRCode desc',
      needResult: 1, // 默认为0,扫描结果由企业微信处理,1则直接返回扫描结果,
      scanType: ["qrCode", "barCode"], // 可以指定扫二维码还是一维码,默认二者都有
      success: function (res) {
      // 回调
      wxUtils.printStatuInfo("扫描信息:" + JSON.stringify(res));
      lblCostTime.innerText = "单次扫码总共花费:【" + (new Date().getTime() - timeStar) + "】ms";
      },
      error: function (res) {
      if (res.errMsg.indexOf('function_not_exist') > 0) {
      alert('版本过低请升级')
      }
      }
      });
      View Code

    三、总结

    H5集成微信JSSDK功能虽然简单,但是该有的步骤一个都不能少。在最初开发中遇到了以下几个问题:

    1. 获取token与ticket存在跨域问题,需要配置一个代理完成

    2. 有时生成的签名与官方有差别,官方提供了一个测试地址https://work.weixin.qq.com/api/jsapisign

    有喜欢聊技术朋友也欢迎入群,若二维码失效可加我微信回复**前端**

  • 相关阅读:
    Win Form 项目中app.config读取和修改 [ZT]
    实现全站统一的Page_PreInit()等事件
    DateTime的所有格式化输出
    大三下的半学期快过去了。。
    SQL Server 中易混淆的数据类型
    解决RD2作业在IE和Fire Fox中CSS效果不同的问题~
    AJAX也广告?
    App_Code目录下的全局类
    怀疑我不是那种材料。。
    用了几天Asp.Net 2.0遇到的几个小问题
  • 原文地址:https://www.cnblogs.com/yfrs/p/weixinh5.html
Copyright © 2011-2022 走看看