PHP实现微信分享接口
最近公司做了一个页面,要微信分享,然后记录回执信息。看了看微信的开放文档,Bing了一下相关文章,发现大家贴的代码都大致类似,也没有什么技术难度,撰写此文为了记录一下内容,如能帮助到别人,则不胜荣幸。
框架:Laravel 5.5
前端代码
首先引入JS文件
<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.4.0.js"></script>
//注入配置信息
//配置信息$signPackage的生成逻辑在服务器端,安全原因。
wx.config({
appId: "{{ $signPackage['appId'] }}",
timestamp: "{{ $signPackage['timestamp'] }}",
nonceStr: "{{ $signPackage['nonceStr'] }}",
signature: "{{ $signPackage['signature'] }}",
jsApiList: [
"updateAppMessageShareData",
"updateTimelineShareData"
// 所有要调用的 API 都要加到这个列表中
]
});
PHP代码
微信开放文档JS-SDK说明文档:这是一个链接
依照文档解释,生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。正常情况下,jsapi_ticket的有效期为7200秒,通过access_token来获取。由于获取jsapi_ticket的api调用次数非常有限,频繁刷新jsapi_ticket会导致api调用受限,影响自身业务,开发者必须在自己的服务全局缓存jsapi_ticket (复制来的)。
首先使用appID和appSecret获取到access_token,写入缓存处理
/*
* 使用appID和appSecret,请求接口获取到access_token
* return String $access_token
*/
private function getAccessToken() {
$data = Redis::get("wx_access_token");
if ($data) {
$access_token = $data->access_token;
} else {
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appId&secret=$this->appSecret";
$res = json_decode($this->httpGet($url));
$access_token = $res->access_token;
if ($access_token) {
Redis::setEx("wx_access_token", 7100, $access_token);
}
}
return $access_token;
}
使用access_token再次请求,获取到jsapi_ticket。
/*
* 使用access_token,请求接口获取到jsapi_ticket
* return String $ticket
*/
private function getJsApiTicket() {
$data = Redis::get("wx_jsapi_ticket");
if ($data) {
$ticket = $data;
} else {
//这里是先调用获取access_token的方法
$accessToken = $this->getAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
$res = json_decode($this->httpGet($url));
$ticket = $res->ticket;
if ($ticket) {
Redis::setEx("wx_jsapi_ticket", 7100, $ticket);
}
}
return $ticket;
}
最后生成签名,签名算法在微信开放文档里已经写的很详细了。
签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。即signature=sha1(string1)。
注意事项
1.签名用的noncestr和timestamp必须与wx.config中的nonceStr和timestamp相同。
2.签名用的url必须是调用JS接口页面的完整URL。
3.出于安全考虑,开发者必须在服务器端实现签名的逻辑。
具体代码我就不贴了,建议大家不要只是简单的粘贴复制,哪怕照着手敲上去,也比复制强,帮助理解。
PS:稍微有些注意的地方,文档内有提示,有些接口即将弃用,请大家尽快迁移使用新的接口。
请注意,原有的 wx.onMenuShareTimeline、wx.onMenuShareAppMessage、wx.onMenuShareQQ、wx.onMenuShareQZone 接口,即将废弃。请尽快迁移使用客户端6.7.2及JSSDK 1.4.0以上版本支持的 wx.updateAppMessageShareData、wx.updateTimelineShareData接口。
本文内代码是我从其他道友发布的文章里摘下改造的,如有版权问题,请联系我,我会备注转载来源。在此之前,我将标注为原创 。谢谢。