公众号获取用户手机号_小程序中如何获取微信用户绑定的手机号
小程序官方文檔中介紹:
獲取微信用戶綁定的手機號,需先調用wx.login接口。
因為需要用戶主動觸發才能發起獲取手機號接口,所以該功能不由 API 來調用,需用 button 組件的點擊來觸發。
注意:目前該接口針對非個人開發者,且完成了認證的小程序開放(不包含海外主體)。需謹慎使用,若用戶舉報較多或被發現在不必要場景下使用,微信有權永久回收該小程序的該接口權限。具體可參考小程序官方文檔
使用方法
需要將 button 組件 open-type 的值設置為 getPhoneNumber,當用戶點擊并同意之后,可以通過 bindgetphonenumber 事件回調獲取到微信服務器返回的加密數據, 然后在第三方服務端結合 session_key 以及 app_id 進行解密獲取手機號。
<button?open-type="getPhoneNumber"?bindgetphonenumber="getPhoneNumber">獲取手機號button>在使用組件之前先調用login
App({??????onLaunch:?function?()?{??
????????wx.login({??
????????????success:?function?(res)?{??
????????????????if?(res.code)?{??
????????????????????this.globalData.code?=?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?{
????????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 刷新登錄態。
最后提醒大家,進入一個未知的小程序時,彈出用戶授權詢問框時,謹慎授權。
如下圖所示。
總結
以上是生活随笔為你收集整理的公众号获取用户手机号_小程序中如何获取微信用户绑定的手机号的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python下载图片、已知url_pyt
- 下一篇: java epoll select_春招