PHP微信分享开发详解
分享一个php微信端开发的经验,有时候当一个项目或工程需要微信端分享之后做一系列事件那么我们就需要获取到微信分享这个动作,也就是说我们已经知道了当前这个东西已经被分享了,那么走微信默认的分享显然是不行的我们需要自己动手来配置微信分享,当用户分享时走的是我们预定好的程序那么我们就可以轻松实现分享之后所做的事情。
在页面端主要是一个js如下:
<scripttype="text/javascript"src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script>
wx.config({
debug:false,//开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
appId:'{$appid}',//必填,公众号的唯一标识
timestamp:{$timestamp},//必填,生成签名的时间戳
nonceStr:'{$nonceStr}',//必填,生成签名的随机串
signature:'{$signature}',//必填,签名,见附录1
jsApiList:['onMenuShareAppMessage','onMenuShareTimeline']//必填,需要使用的JS接口列表,所有JS接口列表见附录2
});
wx.ready(function(){
//分享给朋友
wx.onMenuShareAppMessage({
title:{$title},//分享标题此处$title可在控制器端传递也可在页面传递页面传递讲解在下面哦
desc:{$desc},//分享描述
link:{$link},//分享链接
imgUrl:{$imgurl},//分享图标
type:'',//分享类型,music、video或link,不填默认为link
dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空
success:function(){
alert('分享成功');
},
cancel:function(){
//用户取消分享后执行的回调函数
//alert('取消分享');
}
});
//分享到朋友圈
wx.onMenuShareTimeline({
title:{$title},//分享标题
desc:{$desc},//分享描述
link:{$link},//分享链接
imgUrl:{$imgurl},//分享图标
success:function(){
//用户确认分享后执行的回调函数
},
cancel:function(){
//用户取消分享后执行的回调函数
}
});
});
</script>
 
当wx.config配置好后程序才会接着走下面的分享,此处调试可将false改成true若配置好那么正常弹出ok等信息若未配置好那么此处改成true也不会有任何弹出效果
wx.config需要控制器传来四个参数即appId、timestamp、nonceStr、signature;控制器代码如下:
<?php
$jssdk=new\Home\Util\JSSDK(C('APPID'),C('SECRET'));//此处C里面的东西为你所使用的公众号的appid和secret,这俩个东西可在微信公众平台获取到不详细解释找不到追加评论(讲解)JSSDK文件代码在下
$signPackage=$jssdk->GetSignPackage();
$this->assign('appid',$signPackage["appId"]);
$this->assign('timestamp',$signPackage["timestamp"]);
$this->assign('nonceStr',$signPackage["nonceStr"]);
$this->assign('signature',$signPackage["signature"]);
在这里就配置好了wx.config,还可以接着穿title等信息在这里举个例子
$this->assign('title',$title);
JSSDK文件代码:
<?php
namespaceHome\Util;
useThink\Controller;
classJSSDK{
private$appId;
private$appSecret;
publicfunction__construct($appId,$appSecret){
$this->appId=$appId;
$this->appSecret=$appSecret;
}
publicfunctiongetSignPackage(){
$jsapiTicket=$this->getJsApiTicket();
//注意URL一定要动态获取,不能hardcode.
$protocol=(!empty($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off'||$_SERVER['SERVER_PORT']==443)?"https://":"http://";
$url="$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$timestamp=time();
$nonceStr=$this->createNonceStr();
//这里参数的顺序要按照key值ASCII码升序排序
$string="jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url";
$signature=sha1($string);
$signPackage=array(
"appId"=>$this->appId,
"nonceStr"=>$nonceStr,
"timestamp"=>$timestamp,
"url"=>$url,
"signature"=>$signature,
"rawString"=>$string
);
return$signPackage;
}
privatefunctioncreateNonceStr($length=16){
$chars="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str="";
for($i=0;$i<$length;$i++){
$str.=substr($chars,mt_rand(0,strlen($chars)-1),1);
}
return$str;
}
publicfunctiongetJsApiTicket(){
//jsapi_ticket应该全局存储与更新,以下代码以写入到文件中做示例
$data=json_decode($this->get_php_file("jsapi_ticket.php"));
if($data->expire_time<time()){
$accessToken=$this->getAccessToken();
//如果是企业号用以下URL获取ticket
//$url="https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";
$url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=$accessToken&type=jsapi";
$res=json_decode($this->httpGet($url));
$ticket=$res->ticket;
//var_dump($url);
if($ticket){
$data->expire_time=time()+7000;
$data->jsapi_ticket=$ticket;
$this->set_php_file("jsapi_ticket.php",json_encode($data));
}
}else{
$ticket=$data->jsapi_ticket;
}
return$ticket;
}
publicfunctiongetAccessToken(){
//access_token应该全局存储与更新,以下代码以写入到文件中做示例
$data=json_decode($this->get_php_file("access_token.php"));
if($data->expire_time<time()){
//如果是企业号用以下URL获取access_token
//$url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$this->appId&corpsecret=$this->appSecret";
$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
$res=$this->getJson($url);
$access_token=$res['access_token'];
//var_dump($res);
if($access_token){
$data->expire_time=time()+7000;
$data->access_token=$access_token;
$this->set_php_file("access_token.php",json_encode($data));
}
}else{
$access_token=$data->access_token;
}
return$access_token;
//$aa=$access_token;
//var_dump($aa);
}
//获取access_token
publicfunctiongetJson($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);
//var_dump(json_decode($output,true));
returnjson_decode($output,true);
}
//获取ticket
privatefunctionhttpGet($url){
$curl=curl_init();
curl_setopt($curl,CURLOPT_URL,$url);
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
//curl_setopt($curl,CURLOPT_TIMEOUT,500);
//为保证第三方服务器与微信服务器之间数据传输的安全性,所有微信接口采用https方式调用,必须使用下面2行代码打开ssl安全校验。
//如果在部署过程中代码在此处验证失败,请到http://curl.haxx.se/ca/cacert.pem下载新的证书判别文件。
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,FALSE);
$res=curl_exec($curl);
//var_dump($res);
curl_close($curl);
return$res;
}
privatefunctionget_php_file($filename){
returntrim(substr(file_get_contents($filename),15));
//echotrim(substr(file_get_contents($filename),15));die;
//$aa=trim(substr(file_get_contents($filename),15));
}
privatefunctionset_php_file($filename,$content){
$fp=fopen($filename,"w");
fwrite($fp,"<?phpexit();?>".$content);
fclose($fp);
}
}
讲到这里微信分享就告一段落了但是有瑕疵哦如果我们想动态传递参数怎么办 也就是说当页面信息wx.config配置好后我们突然又想重新赋值给$title等变量信息怎么办?
我们可以这样 讲分享写在一个方法里面如下(大致代码):
<script>
varzl=function(title,link,imgurl,desc){
wx.ready(function(){
//分享给朋友
wx.onMenuShareAppMessage({
title:title,//分享标题
desc:desc,//分享描述
link:link,//分享链接
imgUrl:imgurl,//分享图标
type:'',//分享类型,music、video或link,不填默认为link
dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空
success:function(){
alert('分享成功');
},
cancel:function(){
//用户取消分享后执行的回调函数
//alert('取消分享');
}
});
//分享到朋友圈
wx.onMenuShareTimeline({
title:title,//分享标题
desc:desc,//分享描述
link:link,//分享链接
imgUrl:imgurl,//分享图标
success:function(){
//用户确认分享后执行的回调函数
},
cancel:function(){
//用户取消分享后执行的回调函数
//alert('已取消分享');
}
});
});
};
</script>
解释一下啊从控制器进入页面已经配置好了分享内的title等信息 那么在配置好之后我又想在页面重新给title值那么就是这个方法了页面复制代码如下
<script> zl(title,link,imgurl,desc); </script>
easy吧小伙伴们如想详细了解微信端此功能和其他功能可参考手册
链接地址:https://mp.weixin.qq.com/wiki/14/9f9c82c1af308e3b14ba9b973f99a8ba.html(分享功能在手册中的微信网页开发-->微信JS-SDK右面就可以看到了)
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。