微信小程序獲取用戶手機号詳解 - 新聞資訊 - 雲南小程序開發|雲南軟件開發|雲南網站建設-昆明融晨信息技術有限公司

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不(bù)管是(shì)網站,軟件還是(shì)小程序,都要(yào / yāo)直接或間接能爲(wéi / wèi)您産生價值,我們在(zài)追求其視覺表現的(de)同時(shí),更側重于(yú)功能的(de)便捷,營銷的(de)便利,運營的(de)高效,讓網站成爲(wéi / wèi)營銷工具,讓軟件能切實提升企業内部管理水平和(hé / huò)效率。優秀的(de)程序爲(wéi / wèi)後期升級提供便捷的(de)支持!

您當前位置>首頁 » 新聞資訊 » 小程序相關 >

微信小程序獲取用戶手機号詳解

發表時(shí)間:2021-3-31

發布人(rén):融晨科技

浏覽次數:100

最近在(zài)做一款微信小程序,需要(yào / yāo)獲取用戶手機号,具體步驟如下:
流程圖:

1、首先,客戶端調用wx.login,回調數據了(le/liǎo)包含jscode,用于(yú)獲取openid(用戶唯一标識)和(hé / huò)sessionkey(會話密鑰)。 2、拿到(dào)jscode後,将其發送給服務端,服務端拿它與微信服務端做交互獲取openid和(hé / huò)sessionkey。具體獲取方法如下:
(1)、需要(yào / yāo)寫一個(gè)HttpUrlConnection工具類:

"font-size:18px;">public class MyHttpUrlConnection {  
private final int mTimeout = 10000; // 超時(shí)時(shí)間
/**
* get訪問
*/

public String[] requestJson(String url) {
return request(url);
}
private String[] request(String connurl) {
String[] resultStr = new String[]{"", ""};
StringBuilder resultData = https://www.wxapp-union.com/new StringBuilder("");
HttpURLConnection conn = null;
try {
URL url = new URL(connurl);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setUseCaches(false);
conn.setConnectTimeout(mTimeout);
conn.connect();
int resultCode = conn.getResponseCode();
InputStreamReader in;
if (resultCode == 200) {
in = new InputStreamReader(conn.getInputStream());
BufferedReader buffer = new BufferedReader(in);
String inputLine;
while ((inputLine = buffer.readLine()) != null) {
resultData.append(inputLine);
resultData.append("\n");
}
buffer.close();
in.close();
}
resultStr[0] = resultData.toString();
resultStr[1] = resultCode + "";
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
return resultStr;
}
}


(2)、然後通過這(zhè)個(gè)工具類與微信服務器建立連接,獲取想要(yào / yāo)的(de)數據:

"font-size:18px;">  
String url = "https://api.weixin.qq.com/sns/jscode2session?appid=""&secret=""&js_code="
+ jsCode + "&grant_type=authorization_code";
String res[] = connection.requestJson(url);
System.out.println(res[0]);
JSONObject object = JSON.parseObject(res[0]);
String openId = object.getString("openid");
String session_key = object.getString("session_key");span>


其中appid和(hé / huò)secret都是(shì)自己開發者賬号裏可以(yǐ)查詢到(dào)的(de),js_code是(shì)客戶端發過來(lái)的(de),這(zhè)樣在(zài)返回的(de)數據中就(jiù)可以(yǐ)獲取sessionkey。

3、服務器A拿到(dào)sessionkey後,生成一個(gè)随機數我們叫3rdsession,以(yǐ)3rdSessionId爲(wéi / wèi)key,以(yǐ)sessionkey + openid爲(wéi / wèi)value緩存到(dào)redis或memcached中;因爲(wéi / wèi)微信團隊不(bù)建議直接将sessionkey在(zài)網絡上(shàng)傳輸,由開發者自行生成唯一鍵與sessionkey關聯。其作用是(shì): (1)、将3rdSessionId返回給客戶端,維護小程序登錄态。 (2)、通過3rdSessionId找到(dào)用戶sessionkey和(hé / huò)openid。
4、客戶端拿到(dào)3rdSessionId後緩存到(dào)storage,
5、通過wx.getUserIinfo可以(yǐ)獲取到(dào)用戶敏感數據encryptedData 。
6、客戶端将encryptedData、3rdSessionId和(hé / huò)偏移量一起發送到(dào)服務器A
7、服務器A根據3rdSessionId從緩存中獲取session_key
8、在(zài)服務器A使用AES解密encryptedData,從而(ér)實現用戶敏感數據解密。

解密數據需要(yào / yāo)用到(dào)的(de)參數有三個(gè),分别是(shì):
1、encryptedData(密文)
2、iv(向量)
3、aesKey(密鑰)也(yě)就(jiù)是(shì)sessionkey
在(zài)解密的(de)時(shí)候要(yào / yāo)将上(shàng)述三個(gè)變量做Base64解碼:

byte[] encrypData = https://www.wxapp-union.com/UtilEngine.decode(encData);  
byte[] ivData = https://www.wxapp-union.com/UtilEngine.decode(iv);
byte[] sessionKey = UtilEngine.decode(session_key);

然後使用AES解密方法進行解密:

"font-size:18px;">public static byte[] decrypt(byte[] key, byte[] iv, byte[] encData)  
throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException,
InvalidKeyException, BadPaddingException, IllegalBlockSizeException
{
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 cipher.doFinal(encData);
}

這(zhè)樣在(zài)返回的(de)數據中就(jiù)可以(yǐ)拿到(dào)用戶的(de)手機号。

相關案例查看更多