步骤:
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>
---------------------
作者:叫我董坤坤
来源:优快云
原文:https://blog.youkuaiyun.com/qq_25628455/article/details/83031145
版权声明:本文为博主原创文章,转载请附上博文链接!