php 微信JS-SDK封裝類

JSSDK使用步驟:javascript

步驟一:綁定域名php

步驟二:引入JS文件html

步驟三:經過config接口注入權限驗證配置前端

步驟四:經過ready接口處理成功驗證java

步驟五:經過error接口處理失敗驗證數據庫

具體步驟方法說明給查看官方給出的微信開發者文檔json

https://mp.weixin.qq.com/wiki/11/74ad127cc054f6b80759c40f77ec03db.htmlapi

全部須要使用JS-SDK的頁面必須先注入配置信息,不然將沒法調用微信

wx.config({

    debug: true, // 開啓調試模式,調用的全部api的返回值會在客戶端alert出來,若要查看傳入的參數,能夠在pc端打開,參數信息會經過log打出,僅在pc端時纔會打印。

    appId: '', // 必填,公衆號的惟一標識

    timestamp: , // 必填,生成簽名的時間戳

    nonceStr: '', // 必填,生成簽名的隨機串

    signature: '',// 必填,簽名

    jsApiList: [] // 必填,須要使用的JS接口列表

});

其中要保證能正常使用接口的一個重要條件就是獲取簽名,那麼簽名是什麼,有什麼用,怎麼獲取簽名就是今天我今天要講的重點了。微信開發

簽名,在咱們平常生活中常常用到,在一些覈實、審查信息,結案等時候須要某我的的親筆簽名,在網站開發中也同樣,簽名是否正確是可否調用微信接口的重要條件,能夠理解爲就是票據。

簽名生成規則以下:參與簽名的字段包括noncestr(隨機字符串), 有效的jsapi_ticket, timestamp(時間戳), url(當前網頁的URL,不包含#及其後面部分) 。對全部待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1。這裏須要注意的是全部參數名均爲小寫字符。對string1做sha1加密,字段名和字段值都採用原始值,不進行URL 轉義。


即signature=sha1(string1)。 示例:

  • noncestr=Wm3WZYTPz0wzccnW
  • jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg
  • timestamp=1414587457
  • url=http://mp.weixin.qq.com?params=value


步驟1. 對全部待簽名參數按照字段名的ASCII 碼從小到大排序(字典序)後,使用URL鍵值對的格式(即key1=value1&key2=value2…)拼接成字符串string1:

jsapi_ticket=sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg&noncestr=Wm3WZYTPz0wzccnW&timestamp=1414587457&url=http://mp.weixin.qq.com?params=value


對string1進行sha1簽名,獲得signature:

0f9de62fce790f9a083d5c99e95740ceb90c27ed
好了 咱們已經看到了 得到簽名須要4個參數,其中timestamp時間戳和url頁面完整url都很容易得到,如今就須要得到noncestr隨機字符串和jsapi_ticket。
生成簽名以前必須先了解一下jsapi_ticket,jsapi_ticket是公衆號用於調用微信JS接口的臨時票據。正常狀況下,jsapi_ticket的有效期爲7200秒,經過access_token來獲取.
好了說了這麼多 咱們直接來看一段代碼實例:


class jsControl{
    //$store_id是店鋪id用來去數據庫中查詢這個店鋪當前的微信公衆號信息,appid,appsecret等信息
/**
*@param int $store_id 店鋪id用於到數據庫中獲取店鋪微信公衆號的配置信息
*@return  返回config接口注入權限驗證配置信息
**/
  public function getJsConfigInfo($store_id = 0){
    if(!$this->checkIsInWeixin()){
        return [];
    }
    if(!$store_id){
        $store_id = intval($_SESSION['store_member_info_ID'] ?: ($_SESSION['route_store_id'] ?: ($_GET['store_id'] ?: $_SESSION['store_id'])));
    }
    if(empty($store_id)){
        return [];
    }
    $store_info  = Model()->table('store_wxinfo')->where(['store_id' => $store_id])->find();//查詢店鋪公衆號配置信息
    if(empty($store_info)){
        return [];
    }
    $tickets = $this->get_jsapi_ticket($store_info['store_id'], $store_info['appid'], $store_info['appsecret']);
    if(empty($tickets)){
        return [];
    }
    $nonceStr = $this->getNonceStr();
    $timestamp = TIMESTAMP;
    $url = $this->getSelfLink();
    $string1    = "jsapi_ticket={$tickets}&noncestr={$nonceStr}&timestamp={$timestamp}&url={$url}";
    $signature  = sha1($string1);
    return [
        'debug' => false,
        'appId' => $store_info['appid'],
        'timestamp' => $timestamp,
        'nonceStr' => $nonceStr,
        'signature' => $signature,
        'jsApiList' => ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone','startRecord','stopRecord','onVoiceRecordEnd','playVoice','pauseVoice','stopVoice','onVoicePlayEnd','uploadVoice','downloadVoice','chooseImage','previewImage','uploadImage','downloadImage','translateVoice','getNetworkType','openLocation','getLocation','hideOptionMenu','showOptionMenu','hideMenuItems','showMenuItems','hideAllNonBaseMenuItem','showAllNonBaseMenuItem','closeWindow','scanQRCode','chooseWXPay','openProductSpecificView','addCard','chooseCard','openCard']
    ];
   }


   public function getSelfLink(){
    $protocol   = strpos(strtolower($_SERVER['SERVER_PROTOCOL']), 'https') !== false ? 'https://' : 'http://';
    $host       = $protocol . $_SERVER['HTTP_HOST'];
    $url        = $host . $_SERVER['REQUEST_URI'];
    return $url;
   }
   public function getNonceStr(){
        $chars  = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        $str    = '';
        for ($i = 0; $i < 16; $i++) {
            $str .= $chars{mt_rand(0, strlen($chars) - 1)};
        }
        return $str;
   }
   public function _get_access_token($store_id,$appid,$appsecret){
        $token = rkcache("access_token_$store_id");
        if(!empty($token)){
            $token = unserialize($token);
        }else{
            $token = array();
        }
        if(empty($token) || time()-$token['create_time'] > 7200){
            $uri   = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
            $token = curl($uri);
            $token = json_decode($token,true);
            if(!isset($token['access_token']) || empty($token['access_token'])){
                return '';
            }
            $token['create_time']=time();
            wkcache("access_token_$store_id",serialize($token));
        }
        return $token['access_token'];
    }
    function get_jsapi_ticket($store_id,$appid,$appsecret) {
        $tickets = rkcache("jsapi_ticket_$store_id");
        if ($tickets) {
            $tickets = unserialize($tickets);
        }
        if (empty($tickets) || time() - $tickets['create_time'] >= 7200) {
            $access_token = $this->_get_access_token($store_id,$appid,$appsecret);
            if ('' == $access_token) {
                return '';
            }
            $uri     = 'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' . $access_token . '&type=jsapi';
            $tickets = curl($uri);
            $tickets = json_decode($tickets, true);
            if (empty($tickets['ticket'])) {
                return '';
            }
            $tickets['create_time'] = time();
            wkcache("jsapi_ticket_$store_id", serialize($tickets));
        }
        return $tickets['ticket'];
    }

   protected function checkIsInWeixin() {
      if (strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false) {
         return true;
      }
      return false;
   }

}

給出一個前端js調用的方法:

<script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script type="javascript/text" > 

var wx_data = <?php echo json_encode($output['jsapi_config']); ?>;
    var member_info = <?php echo json_encode($output['member_info']);?>;
    var goods_img = $("#goods_img").find("img").attr("src");
    wx.config(wx_data);
    if($.isEmptyObject(wx_data.appId)){
        alert('請在微信中打開分享');
    }
    var sharedata = {
        title    : "<?php  echo $output['goods_info'][0]['goods_name'];?>",
        desc     :'你的朋友:' + member_info.member_name + ' 給你分享了好商品,快來看看吧',
        imgUrl   : goods_img,
        link     :"<?php echo $output['link_url']; ?>",
        success: function(){
        },
        cancel: function(){
        }
    };
    wx.ready(function () {
        wx.onMenuShareAppMessage(sharedata);
        wx.onMenuShareTimeline(sharedata);
    });
</script>

總結一下:

經過config接口注入權限驗證配置:

var config_info = {};

config_info對象中須要的屬性有5個 :
1獲取qppid,2獲取生成簽名的時間戳(timestamp),3獲取生成簽名的隨機字符串(noncestr),4獲取簽名(signature),5調動的接口列表。


其中獲取簽名須要4個參數:1隨機字符串noncestr,2時間戳(timestamp),3調用票據jsapi_ticket,4當前頁面完整url


其中獲取調用票據jsapi_ticket須要一個攜帶access_token的請求獲取:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

因此完整的流程就是:庫中查詢appid,appsecret,而後獲取access_token,經過access_token獲取票據jsapi_ticket,獲得票據jsapi_ticket後生成簽名,而後完成全線驗證配置

 

 

原創做品,轉載請註明出處!

相關文章
相關標籤/搜索