一、config加入配置信息
'token'=>'gh_566bafc976e4',//微信公众号查询
'wx_appid' => 'xxxxxxxxx',
'wx_key' => 'xxxxxxxx',二、再common.php加入以下代码//获取token
function get_token() {
$token=config("app.token");
session ( 'token', $token );
return $token;
}
// 获取access_token,自动带缓存功能
function get_access_token($token = '') {
empty ($token) && $token = get_token();
$model = Db::name("access_token");
$map['token'] = $token;
$info = $model->where($map)->find();
if(!$info)
{
$newaccess_token = getNowAccesstoken($token);
}
else
{
$nowtime = time();//现在时间
$time = $nowtime - $info['lasttime'];
$newaccess_token = $info['access_token'];
if($time >= 1800){
$newaccess_token = getNowAccesstoken($token);
if($newaccess_token == 0){//重新再 调用一次
$newaccess_token = getNowAccesstoken($token);
}
}
}
return $newaccess_token;
}
function getNowAccesstoken($token = ''){
$nowtime = time();//现在时间
empty ( $token ) && $token = get_token ();
$info = get_token_appinfo ($token);
if (empty ($info ['wx_appid'] ) || empty ($info['wx_appsecret'])) {
return 0;
}
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=' . $info ['wx_appid'] . '&secret=' . $info ['wx_appsecret'];
$ch1 = curl_init ();
$timeout = 5;
curl_setopt ( $ch1, CURLOPT_URL, $url );
curl_setopt ( $ch1, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch1, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYHOST, false );
$accesstxt = curl_exec ( $ch1 );
curl_close ( $ch1 );
$tempArr = json_decode ($accesstxt, true);
if (isset($tempArr['access_token'])) {
$model = Db::name("access_token");
$map['token'] = $token;
//保存新access_token到数据库,更新最后时间
$data = array(
'access_token'=>$tempArr ['access_token'],
'lasttime'=>$nowtime
);
$info=$model->where($map)->find();
if($info)
{
$model->where($map)->update($data);
}
else
{
$data['token'] = $token;
$model->where($map)->insert($data);
}
return $tempArr ['access_token'];
}else{
return 0;
}
}
// 获取jsapi_ticket,判断是不过期
function getJsapiTicket($token = '') {
empty ($token) && $token = get_token();
$model = Db::name("jsapi_ticket");
$map['token'] = $token;
$info = $model->where($map)->find();
if(!$info)
{
$new_jsapi_ticket = getNowJsapiTicket($token);
}
else
{
$nowtime = time();//现在时间
$time = $nowtime - $info['lasttime'];
$new_jsapi_ticket = $info['ticket'];
if($time>=1800){
$new_jsapi_ticket = getNowJsapiTicket($token);
if($new_jsapi_ticket == 0){//重新再 调用一次
$new_jsapi_ticket = getNowJsapiTicket($token);
}
}
}
return $new_jsapi_ticket;
}
//获取jsapi_ticket
function getNowJsapiTicket($token='')
{
empty ($token) && $token = get_token();
$access_token=get_access_token();
$url='https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=' .$access_token. '&type=jsapi';
$ch1 = curl_init ();
$timeout = 5;
curl_setopt ( $ch1, CURLOPT_URL, $url );
curl_setopt ( $ch1, CURLOPT_RETURNTRANSFER, 1 );
curl_setopt ( $ch1, CURLOPT_CONNECTTIMEOUT, $timeout );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt ( $ch1, CURLOPT_SSL_VERIFYHOST, false );
$accesstxt = curl_exec ( $ch1 );
curl_close ( $ch1 );
$tempArr = json_decode ($accesstxt, true);
$ext=$tempArr['errmsg'];
if ($ext=='ok') {
$model = Db::name("jsapi_ticket");
$map['token'] = $token;
$nowtime=time();
//保存新jsapi_ticket到数据库,更新最后时间
$data = array(
'ticket'=>$tempArr ['ticket'],
'lasttime'=>$nowtime
);
$info=$model->where($map)->find();
if($info)
{
$model->where($map)->update($data);
}
else
{
$data['token'] = $token;
$model->where($map)->insert($data);
}
return $tempArr['ticket'];
}
else
{
return 0;
}
}
// 获取公众号的信息
function get_token_appinfo() {
$data=[
'wx_appid'=>config("app.wx_appid"),
'wx_appsecret'=>config("app.wx_appsecret")
];
return $data;
}
//获取signature的值 获取签名值数组
function get_signature($url)
{
//$url='http://'.$_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
// $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "https://" : "http://";
// $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$ticket=getJsapiTicket();
$noncestr=createNonceStr();
$timestamp=time();
$string='jsapi_ticket='.$ticket.'&noncestr='.$noncestr.'×tamp='.$timestamp.'&url='.$url;
$signature = sha1($string);
$signPackage = array(
"appId" =>config('app.wx_appid'),
"nonceStr" =>$noncestr,
"timestamp" => $timestamp,
"url" => $url,
"signature" => $signature,
"rawString" => $string
);
write_log('signature','返回值:'.json_encode($signPackage));
return $signPackage;
}
//随机生成字符串
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;
}三、导入数据库DROP TABLE IF EXISTS `w_access_token`;
CREATE TABLE `w_access_token` (
`token` varchar(255) DEFAULT NULL,
`access_token` varchar(255) DEFAULT NULL,
`lasttime` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- ----------------------------
-- Table structure for w_jsapi_ticket
-- ----------------------------
DROP TABLE IF EXISTS `w_jsapi_ticket`;
CREATE TABLE `w_jsapi_ticket` (
`token` varchar(255) DEFAULT NULL,
`ticket` varchar(255) DEFAULT NULL,
`lasttime` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;四、调用public function userService(){
$signPackage=get_signature();
$this->view->assign('signPackage', $signPackage);
return $this->view->fetch();
}五、html页面代码<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title>分享按钮测试</title>
</head>
<script src="/static/plugins/AdminLTE-2.4/bower_components/jquery/dist/jquery.min.js"></script>
<body>
<script src="http://res.wx.qq.com/open/js/jweixin-1.5.0.js"></script>
<script>
// alert(location.href.split('#')[0]);
var baseUrl = "http://aya.sxitdlc.com/"; // 项目地址
var wxData = {
"imgUrl" : baseUrl + 'share.jpg', // 分享图标
"link" : baseUrl, // 分享地址
"title" : '微信分享接口-分享标题', // 分享标题
"desc" : '分享文案' // 分享文案
};
wx.config({
debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: '{$signPackage.appId}', // 必填,公众号的唯一标识
timestamp: '{$signPackage.timestamp}', // 必填,生成签名的时间戳
nonceStr: '{$signPackage.nonceStr}', // 必填,生成签名的随机串
signature: '{$signPackage.signature}',// 必填,签名,见附录1
jsApiList: ['checkJsApi', 'updateAppMessageShareData', 'updateTimelineShareData']
});
wx.ready(function () {
wx.updateAppMessageShareData({
title: wxData.title,
desc: wxData.desc,
link: wxData.link,
imgUrl: wxData.imgUrl,
success: function () {
}
});
wx.updateTimelineShareData({
title: wxData.title,
desc: wxData.desc,
link: wxData.link,
imgUrl: wxData.imgUrl,
type: 'link',
dataUrl: '',
success: function () {
}
});
});
</script>
</body>
</html>六、效果图:
