用戶
 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

掃一掃,登錄網站

小程序社區 首頁 教程 實戰教程 查看內容

小程序如何獲取用戶綁定的手機號

Rolan 2020-9-11 13:36

獲取微信用戶綁定的手機號,需先調用wx.login接口。 因為需要用戶主動觸發才能發起獲取手機號接口,所以該功能不由 API 來調用,需用 button 組件的點擊來觸發 ... ... ...

小程序官方文檔中介紹:

獲取微信用戶綁定的手機號,需先調用wx.login接口。 因為需要用戶主動觸發才能發起獲取手機號接口,所以該功能不由 API 來調用,需用 button 組件的點擊來觸發。

注意:目前該接口針對非個人開發者,且完成了認證的小程序開放(不包含海外主體)。需謹慎使用,若用戶舉報較多或被發現在不必要場景下使用,微信有權永久回收該小程序的該接口權限。具體可參考小程序API

使用方法 需要將 button 組件 open-type 的值設置為 getPhoneNumber,當用戶點擊并同意之后,可以通過 bindgetphonenumber 事件回調獲取到微信服務器返回的加密數據, 然后在第三方服務端結合 session_key 以及 app_id 進行解密獲取手機號。

     
復制代碼

在使用組件之前先調用login

App({  
    onLaunch: function () {  
        wx.login({  
            success: function (res) {  
                if (res.code) {  
                    //發起網絡請求 
                    this.globalData.code = res.code;
                    console.log(res.code)  
                } else {  
                    console.log('獲取用戶登錄態失敗!' + res.errMsg)  
                }  
            }  
        });  
    },
    globalData: {}
})
復制代碼

getPhoneNumber中將返回用戶是否同意授權的數據,

const App = getApp();
Page({
    getPhoneNumber(e) {
        const { iv, encryptedData, errMsg } = e.detail;
        if (errMsg === 'getPhoneNumber:ok') {
            // 同意授權
            wx.request({
                url: '/GetPhone',
                data: {
                    code: App.globalData.code,
                    iv,
                    encryptedData
                },
                success: (res) => {
                    console.log(res);
                }
            })
        }
    }
})
復制代碼

后端需要根據前端傳遞的code,iv, encryptedData,結合小程序的appID,secret,先獲取session_key,然后在進行電話號碼解析。為了安全考慮,我們的appID和secret都是存放在后端的,所以獲取session_key和電話解析都放后端進行了,前端只需調用接口即可。

獲取session_key的地址

const APP_ID = '';
const SECRET = '';
const BASE_URL = 'https://api.weixin.qq.com';

const url = `${BASE_URL}/sns/jscode2session?appid=${APP_ID}&secret=${SECRET}&js_code=${res.code}&grant_type=authorization_code`;
復制代碼

電話號碼解析實例(java版)

import org.apache.shiro.codec.Base64;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;

@Controller

public class GetPhone {
    /*用戶手機號解析*/
    @RequestMapping("/getPhoneNumber")
    @ResponseBody
    public String getPhoneNumber(String encryptedData, String iv, String sessionKey) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidAlgorithmParameterException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {

        System.out.println(encryptedData + "-------" + iv + "-------" + sessionKey);

        byte[] encData = Base64.decode(encryptedData);
        byte[] keyByte = Base64.decode(iv);
        byte[] key = Base64.decode(sessionKey);

        AlgorithmParameterSpec ivSpec = new IvParameterSpec(keyByte);
        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        SecretKeySpec keySpec = new SecretKeySpec(key, "AES");
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);// 初始化
        byte[] resultByte = cipher.doFinal(encData);
        if (null != resultByte && resultByte.length > 0) {
            String result = new String(resultByte, "UTF-8");
            System.out.println(result);
            return result;
        }
        return null;
    }
復制代碼

注意:在回調中調用 wx.login 登錄,可能會刷新登錄態。此時服務器使用 code 換取的 sessionKey 不是加密時使用的 sessionKey,導致解密失敗。建議開發者提前進行 login;或者在回調中先使用 checkSession 進行登錄態檢查,避免 login 刷新登錄態。

最后提醒大家,進入一個未知的小程序時,彈出用戶授權詢問框時,謹慎授權。如下圖


作者:筱筱醬40023
來源:掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
鮮花
鮮花
雞蛋
雞蛋
分享至 : QQ空間
收藏
河北20选5大星走势图 赌场上水下水是什么意思 陕西体彩十一选五走势图一定牛 广西彩票网上购买快乐十分 排列三开机号 私募基金配资 飞鱼规则 股票趋势 秒速赛车开奖历史168 在线配资上上盈靠谱 南粤风采好彩1规则 美国股票指数期货 吉林快3遗漏 福建11选5一定牛 河北十一选五玩法介绍 一分彩快三计划 永高股份股票