PHP實現微信分享接口

PHP實現微信分享接口

最近公司做了一個頁面,要微信分享,然後記錄回執信息。看了看微信的開放文檔,Bing了一下相關文章,發現大家貼的代碼都大致類似,也沒有什麼技術難度,撰寫此文爲了記錄一下內容,如能幫助到別人,則不勝榮幸。
框架:Laravel 5.5

前端代碼

首先引入JS文件

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

//注入配置信息
//配置信息$signPackage的生成邏輯在服務器端,安全原因。
wx.config({
    appId: "{{ $signPackage['appId'] }}",
    timestamp: "{{ $signPackage['timestamp'] }}",
    nonceStr: "{{ $signPackage['nonceStr'] }}",
    signature: "{{ $signPackage['signature'] }}",
    jsApiList: [
        "updateAppMessageShareData",
        "updateTimelineShareData"
        // 所有要調用的 API 都要加到這個列表中
    ]
});

PHP代碼

微信開放文檔JS-SDK說明文檔:這是一個鏈接

依照文檔解釋,生成簽名之前必須先了解一下jsapi_ticket,jsapi_ticket是公衆號用於調用微信JS接口的臨時票據。正常情況下,jsapi_ticket的有效期爲7200秒,通過access_token來獲取。由於獲取jsapi_ticket的api調用次數非常有限,頻繁刷新jsapi_ticket會導致api調用受限,影響自身業務,開發者必須在自己的服務全局緩存jsapi_ticket (複製來的)。

首先使用appID和appSecret獲取到access_token,寫入緩存處理

    /*
     * 使用appID和appSecret,請求接口獲取到access_token
     * return String $access_token
     */
    private function getAccessToken() {
        $data = Redis::get("wx_access_token");
        if ($data) {
            $access_token = $data->access_token;
        } else {
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
            $res = json_decode($this->httpGet($url));
            $access_token = $res->access_token;

            if ($access_token) {
                Redis::setEx("wx_access_token", 7100, $access_token);
            }
        }
        return $access_token;
    }

使用access_token再次請求,獲取到jsapi_ticket。

    /*
     * 使用access_token,請求接口獲取到jsapi_ticket
     * return String $ticket
     */
    private function getJsApiTicket() {
        $data = Redis::get("wx_jsapi_ticket");

        if ($data) {
            $ticket = $data;
        } else {
            //這裏是先調用獲取access_token的方法
            $accessToken = $this->getAccessToken();

            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
            $res = json_decode($this->httpGet($url));
            $ticket = $res->ticket;

            if ($ticket) {
                Redis::setEx("wx_jsapi_ticket", 7100, $ticket);
            }
        }

        return $ticket;
    }

最後生成簽名,簽名算法在微信開放文檔裏已經寫的很詳細了。

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

注意事項
1.簽名用的noncestr和timestamp必須與wx.config中的nonceStr和timestamp相同。
2.簽名用的url必須是調用JS接口頁面的完整URL。
3.出於安全考慮,開發者必須在服務器端實現簽名的邏輯。

具體代碼我就不貼了,建議大家不要只是簡單的粘貼複製,哪怕照着手敲上去,也比複製強,幫助理解。

PS:稍微有些注意的地方,文檔內有提示,有些接口即將啓用,請大家儘快遷移使用新的接口。

請注意,原有的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即將廢棄。請儘快遷移使用客戶端6.7.2及JSSDK 1.4.0以上版本支持的 wx.updateAppMessageShareData、wx.updateTimelineShareData接口。

本文內代碼是我從其他道友發佈的文章裏摘下改造的,如有版權問題,請聯繫我,我會備註轉載來源。在此之前,我將標註爲原創 。謝謝。

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