微信小程序用戶授權(quán)獲取手機號(getPhoneNumber)
前言
小程序有一個獲取用戶很便捷的api,就是通過getPhoneNumber獲取用戶的已經(jīng)綁定微信的手機號碼。有一點要大家注意,現(xiàn)在微信和注重用戶體驗,有些方法都是需要用戶主動去觸發(fā)才能調(diào)用的,比如getPhoneNumber。
實現(xiàn)思路:
1、通過wx.login獲取code,從而獲取到用戶的openID和sessionKey
2、通過getPhoneNumber獲取encryptedData,iv
3、通過參數(shù)【encryptedData】 、【iv】 、【sessionKey】 請求后臺解密獲取用戶手機號
直接上干貨:
1、用戶點擊獲取用戶手機號碼按鈕
<button class='pop_btn' plain="true" open-type='getPhoneNumber' bindgetphonenumber="getPhoneNumber">獲取用戶手機號</button>
2、彈出授權(quán)圖片:

3、通過解密獲取手機號碼

直接上代碼:
wxlogin: function() { //獲取用戶的openID和sessionKey
var that = this;
wx.login({
//獲取code 使用wx.login得到的登陸憑證,用于換取openid
success: (res) = >{
wx.request({
method: "GET",
url: 'https://xxxwx/wxlogin.do',
data: {
code: res.code,
appId: "appIdSbcx",
appKey: "appKeySbcx"
},
header: {
'content-type': 'application/json' // 默認值
},
success: (res) = >{
console.log(res);
that.setData({
sessionKey: res.data.session_key
});
}
});
}
});
}
getPhoneNumber: function(e) { //點擊獲取手機號碼按鈕
var that = this;
wx.checkSession({
success: function() {
console.log(e.detail.errMsg)
console.log(e.detail.iv)
console.log(e.detail.encryptedData)
var ency = e.detail.encryptedData;
var iv = e.detail.iv;
var sessionk = that.data.sessionKey;
if (e.detail.errMsg == 'getPhoneNumber:fail user deny') {
that.setData({
modalstatus: true
});
} else { //同意授權(quán)
wx.request({
method: "GET",
url: 'https://xxx/wx/deciphering.do',
data: {
encrypdata: ency,
ivdata: iv,
sessionkey: sessionk
},
header: {
'content-type': 'application/json' // 默認值
},
success: (res) = >{
console.log("解密成功~~~~~~~將解密的號碼保存到本地~~~~~~~~");
console.log(res);
var phone = res.data.phoneNumber;
console.log(phone);
},
fail: function(res) {
console.log("解密失敗~~~~~~~~~~~~~");
console.log(res);
}
});
}
},
fail: function() {
console.log("session_key 已經(jīng)失效,需要重新執(zhí)行登錄流程");
that.wxlogin(); //重新登錄
}
});
}
后臺代碼:
/**
* 解密并且獲取用戶手機號碼
* @param encrypdata
* @param ivdata
* @param sessionkey
* @param request
* @return
* @throws Exception
*/
@RequestMapping(value = "deciphering", method = RequestMethod.GET)
public @ResponseBody String deciphering(String encrypdata,
String ivdata, String sessionkey,
HttpServletRequest request) {
byte[] encrypData = Base64.decode(encrypdata);
byte[] ivData = Base64.decode(ivdata);
byte[] sessionKey = Base64.decode(sessionkey);
String str="";
try {
str = decrypt(sessionKey,ivData,encrypData);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(str);
return str;
}
public static String decrypt(byte[] key, byte[] iv, byte[] encData) throws Exception {
AlgorithmParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
//解析解密后的字符串
return new String(cipher.doFinal(encData),"UTF-8");
}
總結(jié)
到此這篇關(guān)于微信小程序用戶授權(quán)獲取手機號的文章就介紹到這了,更多相關(guān)小程序授權(quán)獲取手機號內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS實現(xiàn)登錄頁面記住密碼和enter鍵登錄方法推薦
下面小編就為大家?guī)硪黄狫S實現(xiàn)登錄頁面記住密碼和enter鍵登錄方法推薦。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。2016-05-05
解決iframe嵌套第三方網(wǎng)址不能訪問的各種報錯
在一些場景下,我們的網(wǎng)站需要通過iframe標簽嵌入第三方廠家的頁面,這時候就得通過iframe標簽去引入需要嵌入網(wǎng)頁的網(wǎng)址了,這篇文章主要給大家介紹了關(guān)于解決iframe嵌套第三方網(wǎng)址不能訪問的各種報錯,需要的朋友可以參考下2024-09-09
JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(三):鏈表
這篇文章主要介紹了JavaScript中數(shù)據(jù)結(jié)構(gòu)與算法(三):鏈表,本文分別講解了單鏈表與雙鏈表以及增加節(jié)和刪除節(jié)的代碼實例,需要的朋友可以參考下2015-06-06
JavaScript數(shù)據(jù)操作_淺談原始值和引用值的操作本質(zhì)
下面小編就為大家?guī)硪黄狫avaScript數(shù)據(jù)操作_淺談原始值和引用值的操作本質(zhì)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08
javascript游戲開發(fā)之《三國志曹操傳》零部件開發(fā)(一)讓靜態(tài)人物動起來
首先來說,讓一個游戲賦有可玩性必須要動靜結(jié)合,我將要在下面告訴大家如何運用Javascript將靜態(tài)圖片變?yōu)閯討B(tài)圖片,感興趣的朋友可以了解下,便當鞏固js知識了2013-01-01
javascript如何在foreach循環(huán)完成之后執(zhí)行一個回調(diào)函數(shù)
forEach()是前端開發(fā)中操作數(shù)組的一種方法,主要功能是遍歷數(shù)組,其實就是 for 循環(huán)的升級版,下面這篇文章主要給大家介紹了關(guān)于javascript如何在foreach循環(huán)完成之后執(zhí)行一個回調(diào)函數(shù)的相關(guān)資料,需要的朋友可以參考下2023-11-11

