java微信小程序授權(quán)微信登錄獲取手機(jī)號(hào)

1.調(diào)用微信登錄wx.login()獲取code蜕便,通過(guò)code調(diào)用后臺(tái)枷餐,獲取信息sessionId

    /**
     * 獲取微信小程序session_key
     *
     * @param jsonStr
     * @return
     */
    @RequestMapping(value = "/getSessionKey", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
    @ResponseBody
    public JSONObject getSessionKey(@RequestBody String jsonStr) {
        JSONObject result = new JSONObject();
        JSONObject object = JSON.parseObject(jsonStr);
        String code = object.getString("code");
        if (StringUtil.isBlank(code)) {
            return ApiResult.fail("參數(shù)為空");
        }
        // appid
        String appId ="" //公眾號(hào)appid
        // 微信密匙
        String appSecret ="" //密匙

        String res = SendHttps.sendGet("https://api.weixin.qq.com/sns/jscode2session", "appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code");
        net.sf.json.JSONObject resultObject = net.sf.json.JSONObject.fromObject(res);
        if (resultObject.containsKey("errcode")) {
            int errcode = resultObject.getInt("errcode");
            result.put("message","獲取access_token出錯(cuò)!錯(cuò)誤信息為:" + resultObject.get("errmsg").toString(), "" + errcode);
        } else {
            String sessionKey = resultObject.get("session_key").toString();
            String openId = resultObject.get("openid").toString();
            RedisClient.set(openId + "session_key", sessionKey, 600);
            result.put("sessionId", openId + "session_key");
        }
        return result;
    }

2.前臺(tái)通過(guò)js獲取到微信服務(wù)器返回的加密數(shù)據(jù),結(jié)合sessionId解密得到手機(jī)號(hào)且轨。官方連接:https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html

    /**
     * 微信小程序獲取手機(jī)號(hào)
     *
     * @param jsonStr
     * @return
     */
    @RequestMapping(value = "/getPhoneNumber", method = RequestMethod.POST, produces = "application/json;charset=utf-8")
    @ResponseBody
    public JSONObject getPhoneNumber(@RequestBody String jsonStr) {
        JSONObject object = JSON.parseObject(jsonStr);
        String encryptedData = object.getString("encryptedData");
        String iv = object.getString("iv");
        String sessionId = object.getString("sessionId");
        // 獲取session_key
        String session_key = RedisClient.get(sessionId);
        if (StringUtil.isEmpty(session_key)) {
            return ApiResult.fail("session已失效,請(qǐng)重試");
        }
        // 被加密的數(shù)據(jù)
        byte[] dataByte = Base64.decode(encryptedData);
        // 加密秘鑰
        byte[] keyByte = Base64.decode(session_key);
        // 偏移量
        byte[] ivByte = Base64.decode(iv);
        try {
            // 如果密鑰不足16位虚婿,那么就補(bǔ)足.  這個(gè)if 中的內(nèi)容很重要
            int base = 16;
            if (keyByte.length % base != 0) {
                int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
                byte[] temp = new byte[groups * base];
                Arrays.fill(temp, (byte) 0);
                System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
                keyByte = temp;
            }
            // 初始化
            Security.addProvider(new BouncyCastleProvider());
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
            AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
            parameters.init(new IvParameterSpec(ivByte));
            cipher.init(Cipher.DECRYPT_MODE, spec, parameters);// 初始化
            byte[] resultByte = cipher.doFinal(dataByte);
            if (null != resultByte && resultByte.length > 0) {
                String result = new String(resultByte, "UTF-8");
                return JSONObject.parseObject(result);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "獲取手機(jī)號(hào)失敗";
    }

3.后臺(tái)通過(guò)url請(qǐng)求

public class SendHttps {
    /**
     * 向指定URL發(fā)送GET方法的請(qǐng)求
     *
     * @param url   發(fā)送請(qǐng)求的URL
     * @param param 請(qǐng)求參數(shù)旋奢,請(qǐng)求參數(shù)應(yīng)該是 name1=value1&name2=value2 的形式。
     * @return URL 所代表遠(yuǎn)程資源的響應(yīng)結(jié)果
     */
    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            // 打開(kāi)和URL之間的連接
            URLConnection connection = realUrl.openConnection();
            // 設(shè)置通用的請(qǐng)求屬性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立實(shí)際的連接
            connection.connect();
            // 獲取所有響應(yīng)頭字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍歷所有的響應(yīng)頭字段
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            // 定義 BufferedReader輸入流來(lái)讀取URL的響應(yīng)
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream(), "utf-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("發(fā)送GET請(qǐng)求出現(xiàn)異常然痊!" + e);
            e.printStackTrace();
        }
        // 使用finally塊來(lái)關(guān)閉輸入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }
}

微信小程序獲取手機(jī)號(hào)流程

1.先調(diào)用微信登錄wx.login()獲取code至朗,通過(guò)code在后臺(tái)獲取session_key和openid(為了安全方面的原因,請(qǐng)不要直接使用這些信息作為你小程序的用戶標(biāo)識(shí)和session標(biāo)識(shí)回傳到小程序客戶端中去)

2.用戶點(diǎn)擊允許授權(quán)按鈕剧浸,將后臺(tái)獲取的session_key 和 js獲取的加密數(shù)據(jù)锹引,做為參數(shù)和自定義標(biāo)識(shí)傳給后臺(tái)

3.后臺(tái)接收到參數(shù)后,進(jìn)行加密數(shù)據(jù)解密算法唆香,最后取得手機(jī)號(hào)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫌变,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子躬它,更是在濱河造成了極大的恐慌腾啥,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倘待,居然都是意外死亡疮跑,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)凸舵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)祸挪,“玉大人,你說(shuō)我怎么就攤上這事贞间』咛酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵增热,是天一觀的道長(zhǎng)整以。 經(jīng)常有香客問(wèn)我,道長(zhǎng)峻仇,這世上最難降的妖魔是什么公黑? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮摄咆,結(jié)果婚禮上凡蚜,老公的妹妹穿的比我還像新娘。我一直安慰自己吭从,他們只是感情好朝蜘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著涩金,像睡著了一般谱醇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上步做,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天副渴,我揣著相機(jī)與錄音,去河邊找鬼全度。 笑死煮剧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的将鸵。 我是一名探鬼主播勉盅,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼咨堤!你這毒婦竟也來(lái)了菇篡?” 一聲冷哼從身側(cè)響起漩符,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤一喘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體凸克,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡议蟆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萎战。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片咐容。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蚂维,靈堂內(nèi)的尸體忽然破棺而出戳粒,到底是詐尸還是另有隱情,我是刑警寧澤虫啥,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布蔚约,位于F島的核電站,受9級(jí)特大地震影響涂籽,放射性物質(zhì)發(fā)生泄漏苹祟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一评雌、第九天 我趴在偏房一處隱蔽的房頂上張望树枫。 院中可真熱鬧,春花似錦景东、人聲如沸砂轻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舔清。三九已至,卻和暖如春曲初,著一層夾襖步出監(jiān)牢的瞬間体谒,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工臼婆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留抒痒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓颁褂,卻偏偏與公主長(zhǎng)得像故响,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子颁独,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容