溫州甌海區(qū)php實(shí)現(xiàn)微信sdk分享接口
閱讀 34737 · 發(fā)布日期 2020-08-24 17:26 · 溫州優(yōu)光網(wǎng)絡(luò)科技有限公司|建站|APP小程序制作|做網(wǎng)站SEO推廣優(yōu)化
【摘要】
軟件開發(fā)工具包(外語(yǔ)首字母縮寫:SDK、外語(yǔ)全稱:Software Development Kit)一般都是一些軟件工程師為特定的軟件包、軟件框架、硬件平臺(tái)、操作系統(tǒng)等建立應(yīng)用軟件時(shí)的開發(fā)工具的集合。本文主要和大家分享php實(shí)現(xiàn)微信sdk分享接口,希望能幫助到大家。 【溫州小程序開發(fā),溫州微信公眾號(hào),平陽(yáng)做網(wǎng)站,平陽(yáng)網(wǎng)站建設(shè)公司,平陽(yáng)小程序商城制作,昆陽(yáng)萬(wàn)全做網(wǎng)站,鰲江水頭小程序,蕭江騰蛟微信公眾號(hào),山門順溪南雁海西南麂鳳臥麻步懷溪網(wǎng)絡(luò)網(wǎng)店服務(wù),政采云網(wǎng)店管理服務(wù)】...
軟件開發(fā)工具包(外語(yǔ)首字母縮寫:SDK、外語(yǔ)全稱:Software Development Kit)一般都是一些軟件工程師為特定的軟件包、軟件框架、硬件平臺(tái)、操作系統(tǒng)等建立應(yīng)用軟件時(shí)的開發(fā)工具的集合。
本文主要和大家分享php實(shí)現(xiàn)微信sdk分享接口,希望能幫助到大家。
private $appId;
private $appSecret;
/* * 這里為威獅碼的公眾號(hào)的openid和appsecret,如果配置到其他的子商家會(huì)出現(xiàn)需要關(guān)注威獅碼公眾號(hào), * 則需要獲取數(shù)據(jù)庫(kù)的vender表里面的openid和appsecret * */ public function __construct($appId = '
自己的appid'
, $appSecret = '
自己的appSecret'
) {
$this->appId = $appId;
$this->appSecret = $appSecret;
}
public function getSignPackage(Request $request) {
//接收到前端的轉(zhuǎn)義url轉(zhuǎn)義回來(lái) $url = $_POST;
$durl = $url['
url'
];
$durl = urldecode($durl);
$jsapiTicket = $this->getJsApiTicket();
$timestamp = time();
$nonceStr = $this->createNonceStr();
// 這里參數(shù)的順序要按照 key 值 ASCII 碼升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$durl";
$signature = sha1($string);
$signPackage = [ "appId" => $this->appId, "nonceStr" => $nonceStr, "timestamp" => $timestamp, "url" => $url, "signature" => $signature, "rawString" => $string ];
// var_dump($signPackage);
die;
throw new SuccessMessage(['
msg'
=> $signPackage]);
}
private function createNonceStr($length = 16) {
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
$str = "";
for ($i = 0;
$i $i++) {
$str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
}
return $str;
}
private function getJsApiTicket() {
// jsapi_ticket 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫入到文件中做示例 $data = json_decode(file_get_contents("jssdk/jsapi_ticket.json"));
if ($data->expire_time $accessToken = $this->getAccessToken();
//定義傳遞的參數(shù)數(shù)組 $params['
type'
] = '
jsapi'
;
$params['
access_token'
] = $accessToken;
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=" . $params['
access_token'
] . "&type=" . $params['
type'
] . "";
$res = json_decode(curl_get($url, $params));
$ticket = isset($res->ticket) ? $res->ticket : NULL;
if ($ticket) {
$res->expire_time = time() + 7000;
$res->jsapi_ticket = $ticket;
$fp = fopen("jssdk/jsapi_ticket.json", "w");
fwrite($fp, json_encode($res));
fclose($fp);
}
}
else {
$ticket = $data->jsapi_ticket;
}
return $ticket;
}
private function getAccessToken() {
// access_token 應(yīng)該全局存儲(chǔ)與更新,以下代碼以寫入到文件中做示例 $data = json_decode(file_get_contents("jssdk/access_token.json"));
if ($data->expire_time //定義傳遞的參數(shù)數(shù)組 $params['
grant_type'
] = '
client_credential'
;
$params['
appid'
] = $this->appId;
$params['
secret'
] = $this->appSecret;
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=" . $params['
grant_type'
] . "&appid=" . $params['
appid'
] . "&secret=" . $params['
secret'
] . "";
$res = json_decode(curl_post($url, $params));
$access_token = isset($res->access_token) ? $res->access_token : NULL;
if ($access_token) {
$res->expire_time = time() + 7000;
$res->access_token = $access_token;
$fp = fopen("jssdk/access_token.json", "w");
fwrite($fp, json_encode($res));
fclose($fp);
}
}
else {
$access_token = $data->access_token;
}
return $access_token;
}
前端代碼核對(duì)官方步驟,確認(rèn)簽名算法。
確認(rèn)簽名算法正確,可用 http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign 頁(yè)面工具進(jìn)行校驗(yàn)。
確認(rèn)config中nonceStr(js中駝峰標(biāo)準(zhǔn)大寫S), timestamp與用以簽名中的對(duì)應(yīng)noncestr, timestamp一致。
確認(rèn)url是頁(yè)面完整的url(請(qǐng)?jiān)诋?dāng)前頁(yè)面alert(location.href.split('
#'
)[0])確認(rèn)),包括'
http(s)://'
部分,以及'
?'
后面的GET參數(shù)部分,但不包括'
#'
hash后面的部分。
確認(rèn) config 中的 appid 與用來(lái)獲取 jsapi_ticket 的 appid 一致。
確保一定緩存access_token和jsapi_ticket。
確保你獲取用來(lái)簽名的url是動(dòng)態(tài)獲取的,動(dòng)態(tài)頁(yè)面可參見實(shí)例代碼中php的實(shí)現(xiàn)方式。
如果是html的靜態(tài)頁(yè)面在前端通過ajax將url傳到后臺(tái)簽名,前端需要用js獲取當(dāng)前頁(yè)面除去'
#'
hash部分的鏈接(可用location.href.split('
#'
)[0]獲取,而且需要encodeURIComponent,后臺(tái)decodeURIComponent解碼),因?yàn)轫?yè)面一旦分享,微信客戶端會(huì)在你的鏈接末尾加入其它參數(shù),如果不是動(dòng)態(tài)獲取當(dāng)前鏈接,將導(dǎo)致分享后的頁(yè)面簽名失敗。
簽名是正確,上面的步驟還沒能解決你的問題(invalid signature)那就用是url的問題,注意:
微信公眾號(hào)必須配置了你調(diào)試的安全域名(可以配置二級(jí)域名:
xxx.com,而不用配置多個(gè)a.xxx.com/b.xxx.com等)。
原因:
微信分享時(shí)候會(huì)給你當(dāng)前頁(yè)面添加多個(gè)參數(shù),你sha1時(shí)候必須保證url地址是微信給你加了參數(shù)之后的地址,這樣才不會(huì)報(bào)config:
invalid signature.解決方案:
sha1之前url必須是解碼之后的正常的肉眼直接能識(shí)別的url,如果你用的是靜態(tài)頁(yè)面,在你配置wx.config之前,先通過encodeURIComponent(location.href.split('
#'
)[0])把當(dāng)前url編碼傳遞到后臺(tái),后臺(tái)通過decodeURIComponent解碼,核心代碼如下:
前臺(tái)html頁(yè)面,編碼傳遞url:
jQuery.post("/xxx", {
"url": encodeURIComponent(window.location.href.split('
#'
)[0]),"t": new Date().getTime()}
, function (result) {
if (result.errno != 0) {
alert("您當(dāng)前的網(wǎng)絡(luò)不穩(wěn)定請(qǐng)稍后再試!");
return;
}
var shareUrl = result.data.url;
wx.config({
debug: true, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會(huì)在客戶端alert出來(lái),若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會(huì)通過log打出,僅在pc端時(shí)才會(huì)打印。
appId: '
xxx'
, // 必填,公眾號(hào)的唯一標(biāo)識(shí) timestamp: result.data.timestamp, // 必填,生成簽名的時(shí)間戳 nonceStr: result.data.nonceStr, // 必填,生成簽名的隨機(jī)串 signature: result.data.signature,// 必填,簽名,見附錄1 jsApiList: ['
onMenuShareAppMessage'
,'
onMenuShareTimeline'
,'
onMenuShareQQ'
,'
onMenuShareWeibo'
,'
onMenuShareQZone'
] // 必填,需要使用的JS接口列表,所有JS接口列表見附錄2 }
);
以上就是php實(shí)現(xiàn)微信sdk分享接口的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!
微信
分享相關(guān)標(biāo)簽:
php 接口 分享本文原創(chuàng)發(fā)布php中文網(wǎng),轉(zhuǎn)載請(qǐng)注明出處,感謝您的尊重!
上一篇:
微信掃碼支付的Asp.Net MVC開發(fā)
下一篇:
微信如何獲取openid相關(guān)文章相關(guān)視頻修改微信號(hào)有什么影響嗎?微信中共享實(shí)時(shí)位置什么意思數(shù)據(jù)庫(kù)設(shè)計(jì)的基本原則是什么?微信小程序調(diào)用圖片安全APIphp實(shí)現(xiàn)微信sdk分享接口PHP開發(fā)基礎(chǔ)教程之簡(jiǎn)介PHP新手入門之簡(jiǎn)介PHP開發(fā)基礎(chǔ)教程之環(huán)境搭建php學(xué)習(xí)路線介紹php環(huán)境配置 [溫州做微信公眾號(hào)]
為您推薦
- 微信公眾號(hào)里“JS接口域名”實(shí)現(xiàn)分享功能 2020-08-24
- 微信支付驗(yàn)證或簽名失敗是什么原因?附三種解決方案 2020-08-24
- android微信登陸、分享做了一段時(shí)間了發(fā)現(xiàn)的一些坑 2020-08-24
- 最新整理出的微信分享后端接口實(shí)現(xiàn)的大致流程 2020-08-24
- 微信公眾號(hào)開發(fā):商戶如何給用戶發(fā)紅包實(shí)例講解 2020-08-24
- 長(zhǎng)見識(shí)了,原來(lái)微信瀏覽器內(nèi)可以直接啟動(dòng)外部瀏覽器 2020-08-24
- 怎么創(chuàng)建微信公眾號(hào)自定義菜單欄?這里給出了權(quán)威解答 2020-08-24
- 微信公眾號(hào)開發(fā),實(shí)現(xiàn)倒計(jì)時(shí)的一個(gè)功能(純代碼) 2020-08-24