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接口。
本文內代碼是我從其他道友發佈的文章裏摘下改造的,如有版權問題,請聯繫我,我會備註轉載來源。在此之前,我將標註爲原創 。謝謝。