1. 程式人生 > >ThinkPHP微信公眾號自定義分享

ThinkPHP微信公眾號自定義分享

步驟:

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.'&timestamp='.$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>