准备:
一:在公众号设置里面设置——JS接口安全域名,所填域名必须通过ICP备案的验证,把里面提供的一个MP_verify_xxxxxx.txt的文本上传到根目录。
二:在公众号基本配置里面获取开发者的AppID和AppSecret。
三:在安全中心里面设置IP白名单。
最后在需要分享的页面调用:
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.6.0.js"></script>
<script type="text/javascript">
$(function(){
var siteUrl = window.location.href;
$.post('/?m=WeixinShare&a=signature',{
url:siteUrl},function(res){
var res = eval('('+res+')');
wx.config(res);
});
wx.ready(function(){
wx.updateAppMessageShareData({
title: '<?php echo $title; ?>',
desc: '<?php echo $description; ?>',
link: siteUrl,
imgUrl: 'http://<?php echo $_SERVER['HTTP_HOST'].$thumb; ?>',
success: function(res){
}
})
wx.updateTimelineShareData({
title: '<?php echo $title; ?>',
link: siteUrl,
imgUrl: 'http://<?php echo $_SERVER['HTTP_HOST'].$thumb; ?>',
success: function(res){
}
})
});
});
</script>
lib里面写入方法:
<?php
if(!defined("Szflame")) exit("Access Denied");
class WeixinShareAction extends Action{
public $appId = 'wx............';
public $appSecret = '.........................';
# 请求是要请求 signature() 这个方法
public function signature(){
$url = $_REQUEST['url'];
$time = time();
$time = (string)$time;
#生成的随机字符串
$nonceStr = $this->nonceStr();
#制作签名的四个参数
$params = array('url'=>$url,'noncestr'=>$nonceStr,'jsapi_ticket'=>$this->getJsapi(),'timestamp'=>$time);
$link = $this->getSign($params);
$signature = sha1($link);
#前端config需要注入配置的参数
$data = json_encode(array('debug'=>false,
'appId'=>$this->appId,'timestamp'=>$time,
'nonceStr'=>$nonceStr,'signature'=>$signature,'jsApiList'=>array( "updateAppMessageShareData","updateTimelineShareData")));
echo $data;
}
#将取到的值以键值对方式拼接
public function getSign($params)
{
ksort($params);
$str = "";
foreach ($params as $k => $v){
$str .= $k . "=" . $v . "&";
}
$data = substr($str,0,-1);
return $data;
}
# 随机字符串的生成
public function nonceStr($length = 16)
{
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0;$i < $length;$i++){
$str.= substr($chars,mt_rand(0,strlen($chars)-1),1);
}
return $str;
}
#获取access_token 不是网页授权的access_token
//[获取access_token的方法](https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183)
public function signToken(){
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appId."&secret=".$this->appSecret."";
$data = $this->httpGet($url);
return $data['access_token'];
}
#这里的access_token做了存文件的处理 你也可以选择进行存库定时刷新 3-5分钟刷新一次(linux的定时任务)
public function getToken(){
$result = F('web_token.json');
if(empty($result))
{
$result['access_token'] = $this->signToken();
$result['expires']=time()-7000;
F('web_token.json',$result);
}
if (time() > $result['expires'] || empty($result['access_token'])){
$result['access_token'] = $this->signToken();
$result['expires']=time()+7000;
F('web_token.json',$result);
return $result['access_token'];
}else{
return $result['access_token'];
}
}
#这里的Ticket做了存文件的处理 你也可以选择进行存库定时刷新 3-5分钟刷新一次(linux的定时任务)
public function getTicket()
{
#获取access_token的链接https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
$token = $this->getToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$token."&type=jsapi";
$ticket = $this->httpGet($url);
return $ticket['ticket'];
}
public function getJsapi()
{
$result = F('ticket.json');
if(empty($result))
{
$result['access_token'] = $this->getTicket();
$result['expires']=time()-7000;
F('ticket.json',$result);
}
if (time() > $result['expires'] || empty($result['access_token'])){
$result['access_token'] = $this->getTicket();
$result['expires']=time()+7000;
F('ticket.json',$result);
return $result['access_token'];
}else{
return $result['access_token'];
}
}
public function httpGet($url){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
curl_close($ch);
return json_decode($output, true);
}
}
?>