微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码基础库 2.21.2 :前
一、前言
- 大部分微信小程序开发者都会有这样的需求:获取小程序用户的手机号码。
- 但是,因为小程序用户的手机号码属于重要信息,为了安全,所以需要如下一系列较为复杂的方法和步骤。
- 我前期主要通过小程序云的方法获取用户手机号码,后面因为微信政策变更,小程序云不再提供免费版本,最低每月也要收费19元。
- 所以,我才转用方法二和方法三。否则方法一小程序云的方法是最简单的。
微信小程序开发笔记 进阶篇④——getPhoneNumber 获取用户手机号码(小程序云)
微信小程序开发笔记 进阶篇⑤——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之前)
微信小程序开发笔记 进阶篇⑥——getPhoneNumber 获取用户手机号码(基础库 2.21.2 之后)
- 首先确保基础库版本在2.21.2之前
二、前端代码wxml
- 必须要有这个button,并且用户点击了,才能有下一步
<button type="default" open-type="getPhoneNumber" bindgetphonenumber="getPhoneNumber" class="weui-vcode-btn" wx:else>获取手机号</button>
三、前端代码js
- 定义一个code全局变量
var code = ""
- 该界面onShow的时候,调用
wx.login
函数获取code - 这边这里有个风险,这个code存在有效期,到你用的时候可能会过期
onShow() {
wx.login({
success: function (res) {
console.log("wx.login success", res)
if (res.code) {
code = res.code
} else {
_this.showToast('失败!' res.errMsg)
}
},
fail: function (res) {
console.log('wx.login fail' res)
}
})
},
bindgetphonenumber="getPhoneNumber"
按钮的回调函数
getPhoneNumber(e) {
var _this = this
console.log("getPhoneNumber", e)
keyueliSdk.getPhoneNumber({
code: code,
encryptedData: e.detail.encryptedData,
iv: e.detail.iv,
appId: app.globalData.appId,
},
(res) => {
console.log("getPhoneNumber", "success", res)
_this.setData({
mobile: res.data.data.phoneNumber
})
},
(res) => {
console.log("getPhoneNumber", "fail", res)
})
},
keyueliSdk.js
接口工具类
//获取用户手机号码
const getPhoneNumber = (data, success, fail) => {
console.log("getPhoneNumber", data)
request(
endpoint "/v1/app/user/getPhoneNumber", {
// 'content-type': 'application/x-www-form-urlencoded'
'content-type': 'application/json'
},
data,
"POST",
success, fail
)
}
module.exports = {
getPhoneNumber: getPhoneNumber,
}
四、后端java
controller.java
@ApiOperation("查询用户手机号码")
@PostMapping("/getPhoneNumber")
public AjaxResult getPhoneNumber(@ApiParam() @RequestBody AppCode appCode)
{
log.info(appCode.toString());
return AjaxResult.success(loginService.getPhoneNumber(appCode));
}
loginService.java
public JSONObject getPhoneNumber(AppCode appCode){
if(!WXUtils.checkAppId(appCode.getAppId())){
log.error("appId异常: " appCode.toString());
throw new CustomException("AppId 异常");
}
JSONObject codeData = WXUtils.codeAnalysis(appCode.getCode(), appCode.getAppId());
if(ObjectUtil.isNull(codeData)){
log.error("code异常: " appCode.toString());
throw new CustomException("code 异常");
}
String sessionKey = codeData.getString("session_key");
String openId = codeData.getString("openid");
String unionId = codeData.getString("unionid");
JSONObject decryptObject = WXUtils.decrypt(appCode.getAppId(), appCode.getEncryptedData(), sessionKey, appCode.getIv());
if(ObjectUtil.isNull(decryptObject)){
log.error("encryptedData异常: " appCode.toString());
throw new CustomException("encryptedData 异常");
}
log.info(decryptObject.toJSONString());
return decryptObject;
}
WXUtils.java
/**
* 解密数据
* @return
* @throws Exception
*/
public static JSONObject decrypt(String appId, String encryptedData, String sessionKey, String iv){
try {
byte[] resultByte = AESUtils.decrypt(Base64.decodeBase64(encryptedData),Base64.decodeBase64(sessionKey),Base64.decodeBase64(iv));
if(null != resultByte && resultByte.length > 0){
String result = new String(WxPKCS7Encoder.decode(resultByte));
JSONObject jsonObject = JSONObject.parseObject(result);
String decryptAppId = jsonObject.getJSONObject("watermark").getString("appid");
if(!appId.equals(decryptAppId)){
return null;
}
return jsonObject;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取session_key
* @return
* @throws Exception
*/
public static JSONObject codeAnalysis(String code, String appId) {
try {
String objectStr = HttpUtil.get(String.format("https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
appId, getAppSecret(appId), code));
log.info(objectStr);
JSONObject jsonObject = JSON.parseObject(objectStr);
return jsonObject;
}catch (Exception e){
e.printStackTrace();
log.error("微信code解析异常", e.getMessage());
}
return null;
}
AESUtils.java
/**
* AES解密
*
* @param content
* 密文
* @return
* @throws InvalidAlgorithmParameterException
* @throws NoSuchProviderException
*/
public static byte[] decrypt(byte[] content, byte[] keyByte, byte[] ivByte) throws InvalidAlgorithmParameterException {
initialize();
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
Key sKeySpec = new SecretKeySpec(keyByte, "AES");
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(ivByte));// 初始化
byte[] result = cipher.doFinal(content);
return result;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
五、程序流程
注册界面 后端服务器 onShow函数,wx.login获取用户code 按钮点击,getPhoneNumber获取encryptedData和iv https post请求,code/encryptedData/iv/appId等4个参数 拿code和appId通过auth.code2Session获取session_key 密文:Base64_Decode(encryptedData) 秘钥:Base64_Decode(session_key) 初始向量:Base64_Decode(iv) AES-128-CBC 解密,返回phoneNumber 注册界面 后端服务器
六、参考
觉得好,就一键三连呗(点赞 收藏 关注)
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfijgb
系列文章
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01