php+微信分享(jsonp)
看到新浪的文章微信里可以自己设置分享参数,再看看自己文章。感觉low死了,所以看了看微信的文档写一个。
先上php:
class wxController extends Controller
{
public $appid='wx-------';
public $secret='--------';
function share(){
$data=[];
$callback = I('get.callback','callback');
//获取AccessToken
$actoken = $this->getAccessToken();
if($actoken===false){
$data['error']='get Access_Token false';
echo $callback.'('.json_encode($data).')';
exit;
}
$ticket = $this->getTicket($actoken);
if($ticket===false){
$data['error']='get Ticket false';
echo $callback.'('.json_encode($data).')';
exit;
}
$url = I('get.url');
$singStr = 'jsapi_ticket='.$ticket.'&noncestr='.NOW_TIME.'×tamp='.NOW_TIME.'&url='.$url;
$data['appid']=$this->appid;
$data['noncestr']=NOW_TIME;
$data['timestamp']=NOW_TIME;
$data['url']=$url;
$data['signature']=sha1($singStr);
echo $callback.'('.json_encode($data).')';
exit;
}
/**
* 获取 AccessToken
*/
protected function getAccessToken(){
$acctoken = F('wx_share_AccessToken');
if($acctoken){
return $acctoken;
}
$accesstoken = file_get_contents('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$this->appid.'&secret='.$this->secret.'');
$accesstokenArr=json_decode($accesstoken,true);
if(isset($accesstokenArr['errcode']) && $accesstokenArr['errcode']>0 ){
return false;
}
if(isset($accesstokenArr['access_token'])){
F('wx_share_AccessToken',$accesstokenArr['access_token'],7100);
}
return $accesstokenArr['access_token'];
}
/**
* 获取 AccessToken
*/
protected function getTicket($AccessToken){
$acctoken = F('wx_share_Ticket');
if($acctoken){
return $acctoken;
}
$accesstoken = file_get_contents('https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token='.$AccessToken.'&type=jsapi');
$accesstokenArr=json_decode($accesstoken,true);
if(isset($accesstokenArr['errcode']) && $accesstokenArr['errcode']>0 ){
return false;
}
if(isset($accesstokenArr['ticket'])){
F('wx_share_Ticket',$accesstokenArr['ticket'],7100);
}
return $accesstokenArr['ticket'];
}
}
再上js:
$(function(){
$.ajax({
type: "get",
async: false,
url: "http://******.com/api/wx/share?url="+encodeURIComponent(location.href.split('#')[0]),
dataType: "jsonp",
jsonp: "callback",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(一般默认为:callback)
jsonpCallback:"flightHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function(json){
console.log(json);
_wx_config(json);
},
error: function(){
alert('fail');
}
});
});
//设置分享参数
function initShare(option){
var settings = {
title: document.title,//分享标题
link: document.URL,//分享地址
imgUrl: '', //分享图标
desc:'',//分享描述
type: '', // 分享类型,music、video或link,不填默认为link
dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空
};
if (option) {
$.extend(settings, option);
}
window['shareInfo']=settings;
return settings;
}
//获取分享参数
function getShare(){
if(typeof(window['shareInfo'])=="undefined"){
initShare();
}
return window['shareInfo'];
}
//微信分享主函数
function _wx_config(n){
wx.config({
debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId: n.appid, // 必填,公众号的唯一标识
timestamp: n.timestamp, // 必填,生成签名的时间戳
nonceStr: n.timestamp+'', // 必填,生成签名的随机串
signature: n.signature,// 必填,签名,见附录1
jsApiList: ['onMenuShareTimeline',
'onMenuShareAppMessage',
'onMenuShareQQ',
'onMenuShareWeibo',
'onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
var w = getShare();
console.log(w);
wx.ready(function(){
//朋友圈
wx.onMenuShareTimeline({
title: w.title, // 分享标题
link: w.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: w.imgUrl, // 分享图标
success: function () {
console.log('用户点击了分享');
},
cancel: function () {
// 用户取消分享后执行的回调函数
console.log('用户取消分享后执行的回调函数');
}
});
//分享给朋友
wx.onMenuShareAppMessage({
title: w.title, // 分享标题
desc: w.desc, // 分享描述
link: w.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: w.imgUrl, // 分享图标
type: w.type, // 分享类型,music、video或link,不填默认为link
dataUrl:w.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空
success: function () {
// 用户确认分享后执行的回调函数
console.log('用户点击了分享');
},
cancel: function () {
// 用户取消分享后执行的回调函数
console.log('用户取消分享后执行的回调函数');
}
});
//分享到qq
wx.onMenuShareQQ({
title: w.title, // 分享标题
desc: w.desc, // 分享描述
link: w.link, // 分享链接,该链接域名或路径必须与当前页面对应的公众号JS安全域名一致
imgUrl: w.imgUrl, // 分享图标
success: function () {
// 用户确认分享后执行的回调函数
console.log('用户点击了分享');
},
cancel: function () {
// 用户取消分享后执行的回调函数
console.log('用户取消分享后执行的回调函数');
}
});
});
}
页面上:
引入微信的文件:http://res.wx.qq.com/open/js/jweixin-1.2.0.js
设置页面分享参数(非必须,如果不设置,js会默认读取页面参数):
initShare({
"title":'需要分享的标题',
"desc":'分享的说明',
"link":'http://******.com/'
})
当然如果,是异步获取数据的话。就把设置分享参数和获取签名的放在jsonp写在回调里,就可以了。
中间如果踩到坑的话,请注意看微信文档!
文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115