ThinkPHP微信公众号自定义分享

步骤:

1、申请Appid、appSecret

2、获取access_token

3、通过access_token获取jsapi_ticket

4、生成签名

5、拼接JS所需参数

6、控制器调用

7、引入JS文件并调用JS

微信分享类

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());

前端:












 

你可能感兴趣的:(thinkphp5)