企業(yè)微信開發(fā)h5應(yīng)用,實(shí)現(xiàn)網(wǎng)頁授權(quán),和基本分享

1、應(yīng)用框架為Vue、history模式

2、注意:

2-1、微信jssdk應(yīng)用:通過命令配置依賴包"weixin-js-sdk": "^1.2.0"會報(bào)錯(cuò)_wx.onMenuShareWechat is not a function,解決方法:去掉命令安裝的jssdk的包,在index.html中引入CDN鏈接
index.html

  <!-- 引入微信js-sdk -->
  <script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

2-2、企業(yè)微信中調(diào)用wx.config方法 appId傳的參數(shù)值是企業(yè)微信的corpID

wx.config({
  beta: true,// 必須這么寫,否則wx.invoke調(diào)用形式的jsapi會有問題
  debug: wxOpt.debug, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時(shí)才會打印。
  appId: localStorage.getItem('corpId'), // 必填,企業(yè)微信的corpID
  timestamp: sign.timestamp, // 必填,生成簽名的時(shí)間戳
  nonceStr: sign.nonceStr, // 必填,生成簽名的隨機(jī)串
  signature: sign.signature,// 必填,簽名,見 附錄-JS-SDK使用權(quán)限簽名算法
  jsApiList: wxOpt.jsApis // 必填,需要使用的JS接口列表,凡是要調(diào)用的接口都需要傳進(jìn)來
});

2-3、獲取簽名需要的頁面url不需要做另外處理(安卓和ios都是去當(dāng)前頁url,微信公眾號ios必須取落地頁的url)

export function getWxSign(cb) {
  if (localStorage.getItem('appid')) {
    // 根據(jù)微信要求獲取簽名的算法要在服務(wù)器端實(shí)現(xiàn)。由后端給出接口,前端傳遞 隨機(jī)字符串、分享鏈接、時(shí)間戳、公眾號code名稱
    // 公眾號的code是為了尋找到當(dāng)前的公眾號的token從而獲取簽名
    // 后端會處理token,因?yàn)閠oken是2小時(shí)就過期,謹(jǐn)記如果過期就再請求一次刷新token
    if (localStorage.getItem('userAgent') === 'corpWechat') {
      // 企業(yè)微信
      // 企業(yè)微信邏輯 安卓和ios上獲取簽名的地址一致
      let signLink = document.location.href.split('#')[0]
      signLink = encodeURIComponent(signLink).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+')
      get(`/api/wechat/cp/portal/${localStorage.getItem('agentId')}/jsSign?url=${signLink}`, {}, {}, handleJsSignErr).then(rsp => {
        let sign = rsp.data;
        // if (cb && typeof cb === "function") {
        console.log('signature: ', sign)
        wx.config({
          beta: true,// 必須這么寫,否則wx.invoke調(diào)用形式的jsapi會有問題
          debug: wxOpt.debug, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時(shí)才會打印。
          appId: localStorage.getItem('corpId'), // 必填,企業(yè)微信的corpID
          timestamp: sign.timestamp, // 必填,生成簽名的時(shí)間戳
          nonceStr: sign.nonceStr, // 必填,生成簽名的隨機(jī)串
          signature: sign.signature,// 必填,簽名,見 附錄-JS-SDK使用權(quán)限簽名算法
          jsApiList: wxOpt.jsApis // 必填,需要使用的JS接口列表,凡是要調(diào)用的接口都需要傳進(jìn)來
        });
        wx.ready(() => {
          setTimeout(() => {
            if (cb && typeof cb === "function") {
              console.log("ready");
              cb(wx);
            }
          });
        }, 500);
        wx.error(function(res) {
          console.log('config err: ', res);
        });
      });
    } else {
      // 微信
      var u = navigator.userAgent;
      var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios終端
      let signLink
      if (isiOS) {
        signLink = window.entryUrl
      } else {
        signLink = document.location.href.split('#')[0]
      }
      signLink = encodeURIComponent(signLink).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+')
      get(`/wechat/server/response/get_js_sign?url=${signLink}`, { appid: localStorage.getItem('appid') }, {}, handleJsSignErr).then(rsp => {
        let sign = rsp.data;
        // if (cb && typeof cb === "function") {
        console.log('signature2: ', sign)
        wx.config({
          debug: wxOpt.debug, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時(shí)才會打印。
          appId: localStorage.getItem('appid'), // 必填,公眾號的唯一標(biāo)識
          timestamp: sign.timestamp, // 必填,生成簽名的時(shí)間戳
          nonceStr: sign.nonceStr, // 必填,生成簽名的隨機(jī)串
          signature: sign.signature, // 必填,簽名,見附錄1
          jsApiList: wxOpt.jsApis2, // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2
          jsApiList: [
            'onMenuShareAppMessage',
            'onMenuShareTimeline',
            'showOptionMenu',
            "showMenuItems",
            "showAllNonBaseMenuItem",
            "hideAllNonBaseMenuItem"
        ]
        });
        wx.ready(() => {
          setTimeout(() => {
            if (cb && typeof cb === "function") {
              console.log("ready");
              cb(wx);
            }
          });
        }, 500);
        wx.error(function(res) {
          console.log('config err: ', res);
        });
      });
    }
  }
}

3、分享接口應(yīng)用場景

3-1、獲取“轉(zhuǎn)發(fā)”、“微信”、“分享到朋友圈”按鈕點(diǎn)擊狀態(tài)及自定義分享內(nèi)容接口 【具體作用:控制頁面左上角菜單按鈕的顯示】
效果如下:


image.png

3-2、自定義轉(zhuǎn)發(fā)到會話、自定義轉(zhuǎn)發(fā)到微信【應(yīng)用場景:頁面自定義按鈕,點(diǎn)擊調(diào)用該方法調(diào)取微信會話列表,或者企業(yè)微信的會話列表;具體作用:選擇好友即可分享】
效果如下:
點(diǎn)擊按鈕:


image.png

自定義轉(zhuǎn)發(fā)到會話的效果:


image.png

自定義轉(zhuǎn)發(fā)到微信的效果:
image.png

3-3、將H5頁面通過個(gè)人群發(fā)發(fā)送給客戶和將H5頁面通過群發(fā)助手發(fā)送給客戶群
點(diǎn)擊的按鈕:
image.png

將H5頁面通過個(gè)人群發(fā)發(fā)送給客戶效果:


image.png

將H5頁面通過群發(fā)助手發(fā)送給客戶群效果:
image.png

4、wx.config方法的調(diào)用:

所有需要使用JS-SDK的頁面必須先注入配置信息,否則將無法調(diào)用(同一個(gè)url僅需調(diào)用一次,對于變化url的SPA(single-page application)的web app可在每次url變化時(shí)進(jìn)行調(diào)用)。

5、wx.ready方法的調(diào)用:

config信息驗(yàn)證后會執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個(gè)客戶端的異步操作,所以如果需要在頁面加載時(shí)就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時(shí)才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容