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

最近在做一款微信小程序春霍,需要獲取用戶手機號逗堵,具體步驟如下:

流程圖:

1、首先刽漂,客戶端調用wx.login演训,回調數據了包含jscode,用于獲取openid(用戶唯一標識)和sessionkey(會話密鑰)贝咙。

2样悟、拿到jscode后,將其發(fā)送給服務端,服務端拿它與微信服務端做交互獲取openid和sessionkey窟她。具體獲取方法如下:

(1)需要寫一個HttpUrlConnection工具類:

<span style="font-size:18px;">public class MyHttpUrlConnection {  
    private final int mTimeout = 10000; // 超時時間  
    /** 
     * get訪問 
     */  
    public String[] requestJson(String url) {  
        return request(url);  
    }  
    private String[] request(String connurl) {  
        String[] resultStr = new String[]{"", ""};  
        StringBuilder resultData = 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)然后通過這個工具類與微信服務器建立連接陈症,獲取想要的數據:

<span style="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和secret都是自己開發(fā)者賬號里可以查詢到的,js_code是客戶端發(fā)過來的震糖,這樣在返回的數據中就可以獲取sessionkey录肯。

3、服務器A拿到sessionkey后吊说,生成一個隨機數我們叫3rdsession,以3rdSessionId為key,以sessionkey + openid為value緩存到redis或memcached中论咏;因為微信團隊不建議直接將sessionkey在網絡上傳輸,由開發(fā)者自行生成唯一鍵與sessionkey關聯颁井。其作用是: (1)厅贪、將3rdSessionId返回給客戶端,維護小程序登錄態(tài)雅宾。

(2)养涮、通過3rdSessionId找到用戶sessionkey和openid。

4眉抬、客戶端拿到3rdSessionId后緩存到storage贯吓,
5、通過wx.getUserIinfo可以獲取到用戶敏感數據encryptedData 吐辙。
6、客戶端將encryptedData蘸劈、3rdSessionId和偏移量一起發(fā)送到服務器A
7昏苏、服務器A根據3rdSessionId從緩存中獲取session_key
8、在服務器A使用AES解密encryptedData威沫,從而實現用戶敏感數據解密贤惯。

解密數據需要用到的參數有三個,分別是:
1棒掠、encryptedData(密文)
2孵构、iv(向量)
3、aesKey(密鑰)也就是sessionkey
在解密的時候要將上述三個變量做Base64解碼:

byte[] encrypData = UtilEngine.decode(encData);  
byte[] ivData = UtilEngine.decode(iv);  
byte[] sessionKey = UtilEngine.decode(session_key);   

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

<span style="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);  
}</span>   

這樣在返回的數據中就可以拿到用戶的手機號烟很。

本文作者:尚振偉
原文地址:微信小程序獲取用戶手機號詳解-實戰(zhàn)教程-小程序社區(qū)-微信小程序-微信小程序開發(fā)社區(qū)-小程序開發(fā)論壇-微信小程序聯盟

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末颈墅,一起剝皮案震驚了整個濱河市堕汞,隨后出現的幾起案子壹罚,更是在濱河造成了極大的恐慌,老刑警劉巖饶氏,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件芹橡,死亡現場離奇詭異毒坛,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門煎殷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屯伞,“玉大人,你說我怎么就攤上這事豪直×右。” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵顶伞,是天一觀的道長饵撑。 經常有香客問我,道長唆貌,這世上最難降的妖魔是什么滑潘? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮锨咙,結果婚禮上语卤,老公的妹妹穿的比我還像新娘。我一直安慰自己酪刀,他們只是感情好粹舵,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骂倘,像睡著了一般眼滤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上历涝,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天诅需,我揣著相機與錄音,去河邊找鬼荧库。 笑死堰塌,一個胖子當著我的面吹牛,可吹牛的內容都是我干的分衫。 我是一名探鬼主播场刑,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼蚪战!你這毒婦竟也來了牵现?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤邀桑,失蹤者是張志新(化名)和其女友劉穎施籍,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體概漱,經...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡丑慎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竿裂。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡玉吁,死狀恐怖,靈堂內的尸體忽然破棺而出腻异,到底是詐尸還是另有隱情进副,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布悔常,位于F島的核電站影斑,受9級特大地震影響,放射性物質發(fā)生泄漏机打。R本人自食惡果不足惜矫户,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望残邀。 院中可真熱鬧皆辽,春花似錦、人聲如沸芥挣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽空免。三九已至空另,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蹋砚,已是汗流浹背扼菠。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留都弹,地道東北人娇豫。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓匙姜,卻偏偏與公主長得像畅厢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氮昧,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容