微信端分享接口

    微信JS-SDK是微信公衆平臺面向網頁開發者提供的基於微信內的網頁開發工具包。
    通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,爲微信用戶提供更優質的網頁體驗。
    本文介紹微信分享的功能:
    一、前臺HTML頁面使用步驟:
      1.綁定域名:在微信公衆號平臺的“公衆號設置”--->“功能設置”--->“JS接口安全域名”
      2.引入js:<script src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
      3.通過config接口注入權限配置
         wx.config({
             debug: false, //開啓調試模式,調用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數,可以在pc端打開,參數信息會通過log打出,僅在pc端時纔會打印。
             appId: data.data.appId, //公衆號的唯一標識
             timestamp: data.data.timeStamp, //生成簽名的時間戳
             nonceStr: data.data.nonceStr, //生成簽名的隨機串
             signature: data.data.signature,//簽名
             jsApiList: [
                 'onMenuShareAppMessage'
             ]
         });
        備註:
           config信息驗證後會執行ready方法,所有接口調用都必須在config接口獲得結果之後,config是一個客戶端的異步操作,
         所以如果需要在頁面加載時就調用相關接口,則須把相關接口放在ready函數中調用來確保正確執行。對於用戶觸發時才調用的接口,
         則可以直接調用,不需要放在ready函數中。
             html的靜態頁面在前端通過ajax將url傳到後臺簽名,前端需要用js獲取當前頁面除去'#'hash部分的鏈接(可用location.href.split('#')[0]獲取,
          而且需要encodeURIComponent),因爲頁面一旦分享,微信客戶端會在你的鏈接末尾加入其它參數,如果不是動態獲取當前鏈接,將導致分享後的頁面簽名失敗。
          即前臺處理:encodeURIComponent(location.href.split('#')[0])

      4.通過ready接口處理成功驗證
        wx.ready(function(){
       
        })
      5.通過error接口處理失敗驗證
        wx.error(function(res){
      // config信息驗證失敗會執行error函數,如簽名過期導致驗證失敗,具體錯誤信息可以打開config的debug模式查看,也可以在返回的res參數中查看,對於SPA可以在這裏更新簽名。
     });
      6.分享接口的使用
        分享內容的接口必須在config中定義
        //獲取“分享給朋友”按鈕點擊狀態及自定義分享內容接口、
      wx.onMenuShareAppMessage({
               title: '油錢包—開啓任性加油時代', //分享標題
               desc: '你還在實體卡儲值加油嗎?油錢包開啓了“儲油”新時代,儲油鎖價,再也不擔心油價上漲了。', //分享描述
               link: 'http://leovir.com/wegas/weixin/weixin/xuanchuan.html', //分享鏈接
               imgUrl:'http://leovir.com/wegas/weixin/images/banner2.png', //分享圖標
               success: function () {
                   // 用戶確認分享後執行的回調函數
               },
               cancel: function () {
                   // 用戶取消分享後執行的回調函數
               }
          });
         
          //分享到朋友圈
          wx.onMenuShareTimeline({
         title: '油錢包—開啓任性加油時代', // 分享標題
         link: 'http://leovir.com/wegas/weixin/weixin/xuanchuan.html', // 分享鏈接
         imgUrl: 'http://leovir.com/wegas/weixin/images/banner2.png', // 分享圖標
         success: function () {
             // 用戶確認分享後執行的回調函數
         },
         cancel: function () {
             // 用戶取消分享後執行的回調函數
         }
      });
     
      //“分享到QQ”按鈕點擊狀態及自定義分享內容接口
      wx.onMenuShareQQ({
          title: '油錢包—開啓任性加油時代', //分享標題
                desc: '你還在實體卡儲值加油嗎?油錢包開啓了“儲油”新時代,儲油鎖價,再也不擔心油價上漲了。', //分享描述
                link: 'http://leovir.com/wegas/weixin/weixin/xuanchuan.html', //分享鏈接
                imgUrl:'http://leovir.com/wegas/weixin/images/banner2.png', //分享圖標
          success: function () {
             // 用戶確認分享後執行的回調函數
          },
          cancel: function () {
             // 用戶取消分享後執行的回調函數
          }
      });
      
      //“分享到騰訊微博”按鈕點擊狀態及自定義分享內容接口
      wx.onMenuShareWeibo({
          title: '油錢包—開啓任性加油時代', //分享標題
                desc: '你還在實體卡儲值加油嗎?油錢包開啓了“儲油”新時代,儲油鎖價,再也不擔心油價上漲了。', //分享描述
                link: 'http://leovir.com/wegas/weixin/weixin/xuanchuan.html', //分享鏈接
                imgUrl:'http://leovir.com/wegas/weixin/images/banner2.png', //分享圖標
          success: function () {
             // 用戶確認分享後執行的回調函數
          },
          cancel: function () {
              // 用戶取消分享後執行的回調函數
          }
      });
     
       //獲取“分享到QQ空間”按鈕點擊狀態及自定義分享內容接口
      wx.onMenuShareQZone({
          ttitle: '油錢包—開啓任性加油時代', //分享標題
                desc: '你還在實體卡儲值加油嗎?油錢包開啓了“儲油”新時代,儲油鎖價,再也不擔心油價上漲了。', //分享描述
                link: 'http://leovir.com/wegas/weixin/weixin/xuanchuan.html', //分享鏈接
                imgUrl:'http://leovir.com/wegas/weixin/images/banner2.png', //分享圖標
          success: function () {
             // 用戶確認分享後執行的回調函數
          },
          cancel: function () {
              // 用戶取消分享後執行的回調函數
          }
      });
     
  二、後臺簽名的生成
      jsapi_ticket是公衆號用於調用微信JS接口的臨時票據。正常情況下,jsapi_ticket的有效期爲7200秒,通過access_token來獲取。
      由於獲取jsapi_ticket的api調用次數非常有限,頻繁刷新jsapi_ticket會導致api調用受限,影響自身業務,開發者必須在自己的服務全局緩存jsapi_ticket 。
      access_token是公衆號的全局唯一票據,公衆號調用各接口時都需使用access_token。開發者需要進行妥善保存。
      access_token的存儲至少要保留512個字符空間。
      access_token的有效期目前爲2個小時,需定時刷新,重複獲取將導致上次獲取的access_token失效。
     
    1.參考以下文檔獲取access_token(有效期7200秒,開發者必須在自己的服務全局緩存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html
          公衆號可以使用AppID和AppSecret調用本接口來獲取access_token。AppID和AppSecret可在微信公衆平臺官網-開發者中心頁中獲得(需要已經成爲開發者,且帳號沒有異常狀態)。
       注意調用所有微信接口時均需使用https協議。
       http請求方式: GET
     https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
     (參數說明:secret第三方用戶唯一憑證密鑰,即appsecret;appid第三方用戶唯一憑證;grant_type獲取access_token填寫client_credential)
     正常情況下,微信會返回下述JSON數據包給公衆號:{"access_token":"ACCESS_TOKEN","expires_in":7200}
        2.用第一步拿到的access_token 採用http GET方式請求獲得jsapi_ticket(有效期7200秒,開發者必須在自己的服務全局緩存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
      返回json: 獲得jsapi_ticket之後,就可以生成JS-SDK權限驗證的簽名了。
      {
     "errcode":0,
     "errmsg":"ok",
     "ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
     "expires_in":7200
     }
    3.獲取簽名:
      簽名算法
     簽名生成規則如下:
      參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。
        a.對所有待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)後,
        b.使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。
        c.這裏需要注意的是所有參數名均爲小寫字符。
        d.對string1作sha1加密

          MessageDigest md = MessageDigest.getInstance("SHA-1");
          // 對拼接後的字符串進行 sha1 加密
               byte[] digest = md.digest(signature.getBytes());
               signature = byteToStr(digest);
              
              
               //自定義方法:將字節數組轉換爲十六進制字符串
               private static String byteToStr(byte[] byteArray) {
              String strDigest = "";
              for (int i = 0; i < byteArray.length; i++) {
                  strDigest += byteToHexStr(byteArray[i]);
              }
              return strDigest;
         }
        
         //將字節轉換爲十六進制字符串
         private static String byteToHexStr(byte mByte) {
             char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
                     'B', 'C', 'D', 'E', 'F' };
             char[] tempArr = new char[2];
             tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
             tempArr[1] = Digit[mByte & 0X0F];
             String s = new String(tempArr);
             return s;
         }
  
      注意:前臺頁面請求後臺時對Url進行了編碼,後臺需要進行解碼java.net.URLDecoder.decode(url,"UTF-8");否則簽名生成失效

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章