ThinkPHP微信公眾號自定義分享
阿新 • • 發佈:2018-12-15
步驟:
1、申請Appid、appSecret
2、獲取access_token
3、通過access_token獲取jsapi_ticket
4、生成簽名
5、拼接JS所需引數
6、控制器呼叫
7、引入JS檔案並呼叫JS
微信分享類
<?php class WxShare { private $appId; private $appSecret; /** * 建構函式 * @param $appid string 小程式的appid * @param $appSecret string 使用者在小程式登入後獲取的會話金鑰 */ public function __construct() { $this->appid = 'xxx'; $this->appSecret = 'xxx'; } /* * 獲取分享JSSDKACCESS_TOKEN * @author 董強 */ public function getAccessToken(){ //我們將access_token全域性快取,每次獲取的時候,先判斷是否過期,如果過期重新獲取再全域性快取 //獲取快取的access_token $access_token = cache('share_access_token'); //判斷快取的access_token是否存在和過期,如果不存在和過期則重新獲取. if($access_token !== null && $access_token){ return $access_token; }else{ //重新獲取access_token,並全域性快取 $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->appSecret); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); //獲取access_token $data = json_decode(curl_exec($curl),true); if($data != null && $data['access_token']){ //設定access_token的過期時間,有效期是7200s cache('share_access_token',$data['access_token'],7200); //返回access_token return $data['access_token']; }else{ exit('微信獲取access_token失敗'); } } } /* * 獲取jsapi_ticket * @author 董強 */ public function getJsApiTicket(){ //我們將jsapi_ticket全域性快取,每次獲取的時候,先判斷是否過期,如果過期重新獲取再全域性快取 //獲取快取的jsapi_ticket $jsapi_ticket = cache('share_jsapi_ticket'); //判斷快取的access_token是否存在和過期,如果不存在和過期則重新獲取. if($jsapi_ticket !== null && $jsapi_ticket){ return $jsapi_ticket; }else{ //獲取access_token $access_token = $this->getAccessToken(); //重新獲取jsapi_ticket,並全域性快取 $curl = curl_init(); curl_setopt($curl,CURLOPT_URL,'https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$access_token.'&type=jsapi'); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); //獲取jsapi_ticket $data = json_decode(curl_exec($curl),true); if($data != null && $data['ticket']){ //設定jsapi_ticket的過期時間,有效期是7200s cache('share_jsapi_ticket',$data['ticket'],7200); //返回jsapi_ticket return $data['ticket']; }else{ exit('微信獲取access_token失敗'); } } } /* * 生成簽名 * @author 董強 */ public function getSign(){ //獲取當前網址路徑 $url = 'https://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; //當前時間戳 $timestamp = strval(time()); //隨機字串 $noncestr = $this->createNoncestr(); $sign = 'jsapi_ticket='.$this->getJsApiTicket().'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url; //隨機時間戳與隨機字串需與簽名一致 $data = array( 'nonceStr' => $noncestr, 'timestamp' => $timestamp, 'sign' => sha1($sign), ); return $data; } /* * 拼接Config所需引數 * @author 董強 */ public function getConfig(){ //獲取簽名 $signature = $this->getSign(); $data = array( 'debug' => '', 'appId' => $this->appid, 'timestamp' => $signature['timestamp'], 'nonceStr' => $signature['nonceStr'], 'signature' => $signature['sign'], 'jsApiList' => 'updateAppMessageShareData', ); return $data; } /* * 生成隨機字串 * @author DongQiang */ private function createNoncestr($length = 32) { $chars = "abcdefghijklmnopqrstuvwxyz0123456789"; $str = ""; for ($i = 0; $i < $length; $i++) { $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); } return $str; } }
呼叫:
//微信分享
import('WxShare.WxShare');
$wxshare = new \WxShare();
$this->assign('share_config',$wxshare->getConfig());
前端:
<!-- 分享所需引數 --> <input type="hidden" id="debug" value="{$share_config.debug}"> <input type="hidden" id="appid" value="{$share_config.appId}"> <input type="hidden" id="timestamp" value="{$share_config.timestamp}"> <input type="hidden" id="nonceStr" value="{$share_config.nonceStr}"> <input type="hidden" id="signature" value="{$share_config.signature}"> <input type="hidden" id="jsApiList" value="{$share_config.jsApiList}"> <input type="hidden" id="title" value="{$info.title}"> <input type="hidden" id="describe" value="{$info.describe}"> <input type="hidden" id="img_url" value="{$info.img_url}"> <input type="hidden" id="url" value="{$url}"> <script> $(function(){ wx.config({ debug: $('#debug').val(), appId: $('#appid').val(), // 必填,公眾號的唯一標識 timestamp: $('#timestamp').val(), // 必填,生成簽名的時間戳 nonceStr: $('#nonceStr').val(), // 必填,生成簽名的隨機串 signature: $('#signature').val(),// 必填,簽名 jsApiList: ['updateAppMessageShareDatam','onMenuShareAppMessage'], // 必填,需要使用的JS介面列表 success:function(){ console.log("success"); } }); wx.ready(function(){ //需在使用者可能點選分享按鈕前就先呼叫 wx.error(function(res){ // config資訊驗證失敗會執行error函式,如簽名過期導致驗證失敗,具體錯誤資訊可以開啟config的debug模式檢視,也可以在返回的res引數中檢視,對於SPA可以在這裡更新簽名。 console.log(res); }); //新介面有BUG,暫不使用 /*wx.updateAppMessageShareData({ title: 'dsada', // 分享標題 desc: 'asdsad', // 分享描述 link: 'https://www.xxx.com/mobile/course/detail/id/78', // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致 imgUrl: '/public/uploads/video/79/thumb/d1fe173d08e959397adf34b1d77e88d7.jpg', // 分享圖示 }, function(res) { //這裡是回撥函式 }); */ wx.onMenuShareAppMessage({ title: $('#title').val(), // 分享標題 desc: $('#describe').val(), // 分享描述 link: 'https://www.xxx.com'+$('#url').val(), // 分享連結,該連結域名或路徑必須與當前頁面對應的公眾號JS安全域名一致 imgUrl: 'https://www.xxx.com/'+$('#img_url').val(), // 分享圖示 type: '', // 分享型別,music、video或link,不填預設為link dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空 success: function () { // 使用者點選了分享後執行的回撥函式 //alert('分享成功'); }, cancel: function () { // 使用者取消分享後執行的回撥函式 //alert('分享取消'); } }); }); }); </script>