零基礎的我剛接觸小程序寫出來這個功能的時候我的心理活動是
好 開始寫了
爲了方便我給你們解釋我給你們找了個圖:
第一步:我們看看上邊的說明書(獲取登錄憑證code)
這個code碼是使用小程序登錄接口完成後取的,這個wx.request()請求是爲了把code發送到後端,後端用code換區session_key和openid。
wx.login({
success: function (res) {
if (res.code) { //使用小程序登錄接口完成後端用戶登錄
wx.request({
url: app.d.hostUrl + 'getOpenid',//你自己api接口的路徑
data: {
code: res.code,
appid: "你的小程序AppID",
secret: "你的小程序secret",
},
success: function (res) {
//把openid保存到緩存裏
wx.setStorageSync("openid", res.openid);
wx.setStorageSync("session_key", res.session_key);
}
})
} else {
console.log('獲取用戶登錄態失敗!' + res.errMsg)
}
}
});
前端已經把獲取openid和session_key需要的參數傳給後端了,後端怎麼寫呢,嘻嘻,這樣寫:
//用code換session_key和openid
public function getOpenid(){
global $_GPC;//這是微擎框架 $_GPC想當於$_GET和$_POST
$code = $_GPC['code'];
$appid = $_GPC['appid'];
$secret = $_GPC['secret'];
$api = "https://api.weixin.qq.com/sns/jscode2session?appid={$appid}&secret={$secret}&js_code={$code}&grant_type=authorization_code";
$str = $this->httpGet($api);
return $str;
}
private function httpGet($url){
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_TIMEOUT, 500);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, true);
curl_setopt($curl, CURLOPT_URL, $url);
$res = curl_exec($curl);
curl_close($curl);
return $res;
}
這樣,前端success就能拿到openid和session_key了,現在,我們要在後端用session_key和openid來解密手機號碼了
第二步:我們來寫個解密手機號碼的接口,看說明書,我們現在要開始寫getPhoneNumber了,等會小程序端要調用,看代碼之前先給你們看看官方文檔
鏈接:開放數據校驗與解密
往下翻,點擊下載解壓後長下面這樣
然後,看demo,把裏面的固定參數換成我們自己的,簡化一下就是這面這點代碼,我是完全複製,順序都沒改:
public function getPhoneNumber(){
//這是解密手機號碼的接口,等會前端還要寫個請求訪問這個接口拿到手機號碼
global $_GPC;
require_once dirname(__FILE__) . '/mail/WXBizDataCrypt.php';
$appid = $_GPC['appid'];
$sessionKey = $_GPC['session_key'];
$encryptedData = $_GPC['encryptedData'];
$iv = $_GPC['iv'];
$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );
if ($errCode == 0) {
print($data . "\n");
} else {
print($errCode . "\n");
}
}
然後這裏面的wxBizDataCrypt.php和errorCode.php的路徑根據你的項目路徑改一下1:要在這個接口裏面改wxBizDataCrypt.php的路徑2:到wxBizDataCrypt.php文件改errorCode.php路徑。
第三步:寫完這個接口我們看一下上面的說明書,我們要開始調用了,調用這個接口同樣是寫一個請求,這個接口需要什麼呢,看裏面,他需要appid、session_key、encryptedData、iv。
那現在(wmxl)是不是要有一個按鈕觸發,點了那個按鈕就能獲取手機號碼了(我要寫的非常詳細)
<button bindgetphonenumber='getPhoneNumber'> 使用微信登錄 </button>
最後,手機號碼就獲取到了。
getPhoneNumber:function (e) {
var detail = e.detail;
wx.request({
url: app.d.hostUrl + 'getPhoneNumber', //解密手機號碼接口
data: {
"appid": app.d.appId,
"session_key": wx.getStorageSync('session_key'),
"encryptedData": detail.encryptedData,
"iv": detail.iv
},
success: function (res) {
console.log(res.data.phoneNumber);
wx.setStorageSync("phonenumber", res.data.phoneNumber);
}
})
},
有什麼不對的地方歡迎糾正。
此時,一位熱心網友離開現場去給你們買點桔子。