1. 程式人生 > >微信分享 php 實現

微信分享 php 實現

繫結域名& 引入js

https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 參考文件步驟1,步驟2

設定ip白名單

基本配置->ip白名單將伺服器Ip配置好即可

生成分享配置

將下面程式碼加入專案

<?php
class WxShare
{
    private $appId;
    private $appSecret;


    public function __construct($appId = '自己的appid', $appSecret = '自己的appSecret'
)
{
$this->appId = $appId; $this->appSecret = $appSecret; } public function getSignPackage() { //接收到前端的轉義url轉義回來 $url = $_POST; $durl = $url['url']; $durl = urldecode($durl); $jsapiTicket = $this->getJsApiTicket(); var_dump($jsapiTicket
); $timestamp = time(); $nonceStr = $this->createNonceStr(); // 這裡引數的順序要按照 key 值 ASCII 碼升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$durl"; $signature = sha1($string); $signPackage = [ "appId"
=> $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ]; // var_dump($signPackage);die; return $signPackage; } public function curlGet($url) { $curl = curl_init(); // 啟動一個CURL會話 curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, 0); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); // 跳過證書檢查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true); // 從證書中檢查SSL加密演算法是否存在 $tmpInfo = curl_exec($curl); //返回api的json物件 //關閉URL請求 curl_close($curl); return $tmpInfo; //返回json物件 } public function curlPost($url, $data) { $curl = curl_init(); // 啟動一個CURL會話 curl_setopt($curl, CURLOPT_URL, $url); // 要訪問的地址 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 對認證證書來源的檢查 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); // 從證書中檢查SSL加密演算法是否存在 curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模擬使用者使用的瀏覽器 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自動跳轉 curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自動設定Referer curl_setopt($curl, CURLOPT_POST, 1); // 傳送一個常規的Post請求 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的資料包 curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 設定超時限制防止死迴圈 curl_setopt($curl, CURLOPT_HEADER, 0); // 顯示返回的Header區域內容 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 獲取的資訊以檔案流的形式返回 $tmpInfo = curl_exec($curl); // 執行操作 if (curl_errno($curl)) { echo 'Errno'.curl_error($curl);//捕抓異常 } curl_close($curl); // 關閉CURL會話 return $tmpInfo; // 返回資料,json格式 } private function createNonceStr($length = 16) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } private function getJsApiTicket() { // jsapi_ticket 應該全域性儲存與更新,以下程式碼以寫入到檔案中做示例 $data = json_decode(file_get_contents("jssdk/jsapi_ticket.json")); if ( empty($data) || $data->expire_time < time()) { $accessToken = $this->getAccessToken(); //定義傳遞的引數陣列 $params['type'] = 'jsapi'; $params['access_token'] = $accessToken; $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $params['access_token'] . "&type=" . $params['type'] . ""; $res = json_decode($this->curlGet($url)); $ticket = isset($res->ticket) ? $res->ticket : NULL; if ($ticket) { $res->expire_time = time() + 7000; $res->jsapi_ticket = $ticket; $fp = fopen("jssdk/jsapi_ticket.json", "w"); fwrite($fp, json_encode($res)); fclose($fp); } } else { $ticket = $data->jsapi_ticket; } return $ticket; } private function getAccessToken() { // access_token 應該全域性儲存與更新,以下程式碼以寫入到檔案中做示例 $data = json_decode(file_get_contents("jssdk/access_token.json")); if ( empty($data) || $data->expire_time < time()) { //定義傳遞的引數陣列 $params['grant_type'] = 'client_credential'; $params['appid'] = $this->appId; $params['secret'] = $this->appSecret; $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" . $params['grant_type'] . "&appid=" . $params['appid'] . "&secret=" . $params['secret'] . ""; $res = json_decode($this->curlPost($url, $params)); $access_token = isset($res->access_token) ? $res->access_token : NULL; if ($access_token) { $res->expire_time = time() + 7000; $res->access_token = $access_token; $fp = fopen("jssdk/access_token.json", "w"); fwrite($fp, json_encode($res)); fclose($fp); } } else { $access_token = $data->access_token; } return $access_token; } }

呼叫上述程式碼中的getSignPackage方法生成配置資訊

前臺獲取配置資訊

將下列程式碼加入需要分享頁面的js中

$(function(){
        jQuery.post("獲取配置的url地址", {"url": encodeURIComponent(window.location.href.split('#')[0]),"t": new Date().getTime()}, function (result) {
            var result = JSON.parse(result)
            var shareUrl = result.url;
            wx.config({
                debug: false, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
                appId: result.appId, // 必填,公眾號的唯一標識
                timestamp: result.timestamp, // 必填,生成簽名的時間戳
                nonceStr: result.nonceStr, // 必填,生成簽名的隨機串
                signature: result.signature,// 必填,簽名,見附錄1
                jsApiList: ['onMenuShareAppMessage','onMenuShareTimeline','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'], // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
                success:function(){
                    console.log("success");

                }
            })
        });

        wx.ready(function(){
            wx.error(function(res){
                // config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。
                console.log(res);
            });


            var s_title = '分享標題';
            var s_desc = '分享描述';
            var img_url = '分享圖片地址';

            wx.onMenuShareAppMessage({
                title: s_title, // 分享標題
                desc: s_desc, // 分享描述
                link: '', // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
                imgUrl: img_url, // 分享圖示
                type: 'link', // 分享型別,music、video或link,不填預設為link
                dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空
                success: function () {
                    // 使用者點選了分享後執行的回撥函式
                }
            });

            wx.onMenuShareTimeline({
                title: s_title, // 分享標題
                link: '', // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致
                imgUrl: img_url, // 分享圖示
                success: function () {
                    // 使用者點選了分享後執行的回撥函式
                }
            });



        });



    })

結束

程式碼已經放上只需要將自己的配置資訊一一對應,即可實現微信分享功能