今天小编写微信分享接口。上网查了下,代码很多,但都不是很全!所以,小编特地真理了下.....
0、效果
1、有一个认证过的微信公众号。
2、把你要分享的网站IP地址加入微信白名单。
需要把网站域名加入js接口 目的是为了能调用微信的js
3、获取AppID AppSecret 俩个参数
4、后台接口写法:
使用TP 框架的写法:
public function wx_get_token() {
$token = S('access_token');
if (!$token) {
$appid='XXXXX'; // 你自己的微信appid
$appsecret='XXXXXX'; //你自己的微信appsecret
$res = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret);
$res = json_decode($res, true);
$token = $res['access_token'];
// 注意:这里需要将获取到的token缓存起来(或写到数据库中)
// 不能频繁的访问https://api.weixin.qq.com/cgi-bin/token,每日有次数限制
// 通过此接口返回的token的有效期目前为2小时。令牌失效后,JS-SDK也就不能用了。
// 因此,这里将token值缓存1小时,比2小时小。缓存失效后,再从接口获取新的token,这样
// 就可以避免token失效。
// S()是ThinkPhp的缓存函数,如果使用的是不ThinkPhp框架,可以使用你的缓存函数,或使用数据库来保存。
S('access_token', $token, 3600);
}
return $token;
}
//获取ticket
function wx_get_jsapi_ticket(){
$ticket = "";
do{
$ticket = S('wx_ticket');
if (!empty($ticket)) {
break;
}
$token = S('access_token');
if (empty($token)){
$this->wx_get_token();
}
$token = S('access_token');
if (empty($token)) {
//logErr("get access token error.");
break;
}
$url2 = sprintf("https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi",
$token);
$res = file_get_contents($url2);
$res = json_decode($res, true);
$ticket = $res['ticket'];
// 注意:这里需要将获取到的ticket缓存起来(或写到数据库中)
// ticket和token一样,不能频繁的访问接口来获取,在每次获取后,我们把它保存起来。
S('wx_ticket', $ticket, 3600);
}while(0);
return $ticket;
}
//获取16位随机编码
function getRandCode( $length = 16 ) {
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
$tmpstr ='';
for ( $i = 0; $i < $length; $i++ )
{
// 这里提供两种字符获取方式
// 第一种是使用 substr 截取$chars中的任意一位字符;
// 第二种是取字符数组 $chars 的任意元素
// $password .= substr($chars, mt_rand(0, strlen($chars) – 1), 1);
$tmpstr .= $chars[ mt_rand(0, strlen($chars) - 1) ];
}
return $tmpstr;
}
public function index(){
$ticket = $this-> wx_get_jsapi_ticket();
$timestamp =time();
$nonceStr = $this->getRandCode();
$url = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; // url 最好是动态获取
//按照微信的要求排序拼接组合
$signature = sprintf("jsapi_ticket=%s&noncestr=%s×tamp=%s&url=%s",$ticket, $nonceStr, $timestamp, $url);
// echo $signature."<br />";
$signature= sha1($signature); // $signature 这就是微信签名
$this->assign('timestamp',$timestamp);
$this->assign('noncestr',$nonceStr);
$this->assign('signature',$signature);
$this->display('Bqqy/index');
}
5、前台的 html 页面
第2步加入js接口 目的就是这个 :引入微信js <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"> </script>
<script>
wx.config({
debug: false, // 调试的bug的
appId: "XXXXX",
timestamp: '{$timestamp}',
nonceStr: '{$noncestr}',
signature: '{$signature}',
jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage'] // 功能列表,我们要使用JS-SDK的什么功能
});
wx.ready(function(){
// 获取“分享到朋友圈”按钮点击状态及自定义分享内容接口
wx.onMenuShareTimeline({
title: 'XXXXX ', // 分享标题
link: "XXXXX", //分享的url,以http或https开头
imgUrl: "XXXXX", // 分享图标
});
// 获取“分享给朋友”按钮点击状态及自定义分享内容接口
wx.onMenuShareAppMessage({
title: 'XXXXX ', // 分享标题
desc: "XXXXX ", // 分享描述
link: "XXXXX", //分享的url,以http或https开头
imgUrl: "XXXXX", // 分享图标
type: 'link', // 分享类型,music、video或link,不填默认为link
});
});
wx.error(function (res) {
alert(res.errMsg);//错误提示
});
</script>
6、一些错误的检查、修改
如何提示 : invalid signature // 签名失效
(1)确认签名算法正确,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 页面工具进行校验。
(2)确认config中nonceStr(js中驼峰标准大写S), timestamp与用以签名中的对应noncestr, timestamp一致。
(3)确认url是页面完整的url(请在当前页面alert(location.href.split('#')[0])确认),包括'http(s)://'部分,以及'?'后面的GET参数部分,但不包括'#'hash后面的部分。
(4)确认 config 中的 appid 与用来获取 jsapi_ticket 的 appid 一致。
(5)确保一定缓存access_token和jsapi_ticket。
(6)确保你获取用来签名的url是动态获取的,动态页面可参见实例代码中php的实现方式。如果是html的静态页面在前端通过ajax将url传到后台签名,前端需要用js获取当前页面除去'#'hash部分的链接(可用location.href.split('#')[0]获取,而且需要encodeURIComponent),因为页面一旦分享,微信客户端会在你的链接末尾加入其它参数,如果不是动态获取当前链接,将导致分享后的页面签名失败。
7、再有错误,具体在细说了......