微信官方文档: https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/getPhoneNumber.html.

废话不多说,直接上代码

WeChatPhoneDTO

@Data
public class WeChatPhoneDTO {//包括敏感数据在内的完整用户信息的加密数据private String encryptedData;//加密算法的初始向量private String iv;//会话密钥private String sessionKey;//用户openIdprivate String openId;
}

Controller

 @GetMapping("/phone")public ResponseResult getPhone(WeChatPhoneDTO weChatPhoneDTO) {ResponseResult phone = insuranceWeChatService.getPhone(weChatPhoneDTO);return phone;}

Serviceimpl

@Overridepublic ResponseResult getPhone(WeChatPhoneDTO weChatPhoneDTO) {AESForWeixinGetPhoneNumber aes=new AESForWeixinGetPhoneNumber(weChatPhoneDTO.getEncryptedData(),weChatPhoneDTO.getSessionKey(),weChatPhoneDTO.getIv());WeixinPhoneDecryptInfo info = aes.decrypt();if (info != null){if (!info.getWeixinWaterMark().getAppid().equals(Constant.APP_ID)){log.error("错误的appId{}",Constant.APP_ID);}//根据openId查询数据InsuranceMemberDO dto = insuranceMemberDao.getListByOpenId(weChatPhoneDTO.getOpenId());if (dto != null){if (dto.getPhone() == null || !dto.getPhone().equals(info.getPhoneNumber())){//如果数据库的电话和解码的电话不同,根据openId将手机号码保存进去Map<String,Object> map = new HashMap<>();map.put("phone",info.getPhoneNumber());map.put("openId",weChatPhoneDTO.getOpenId());insuranceMemberDao.updateByOpenId(map);}dto.setPhone(info.getPhoneNumber());}return new ResponseData<>(CommonCode.SUCCESS, dto);}return null;}

WeixinPhoneDecryptInfo

/*** @description: 微信手机号信息解密后的对象* @author: wrt*/
public class WeixinPhoneDecryptInfo {private String phoneNumber;private String purePhoneNumber;private int countryCode;private String watermark;private WeixinWaterMark weixinWaterMark;public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getPurePhoneNumber() {return purePhoneNumber;}public void setPurePhoneNumber(String purePhoneNumber) {this.purePhoneNumber = purePhoneNumber;}public int getCountryCode() {return countryCode;}public void setCountryCode(int countryCode) {this.countryCode = countryCode;}public String getWatermark() {return watermark;}public void setWatermark(String watermark) {this.watermark = watermark;this.weixinWaterMark = JSON.toJavaObject(JSON.parseObject(this.watermark),WeixinWaterMark.class);}public WeixinWaterMark getWeixinWaterMark(){return weixinWaterMark;}@Overridepublic String toString() {return "WeixinPhoneDecryptInfo{" +"phoneNumber='" + phoneNumber + '\'' +", purePhoneNumber='" + purePhoneNumber + '\'' +", countryCode=" + countryCode +", appid=" + weixinWaterMark.getAppid() +", timestamp=" + weixinWaterMark.getTimestamp() +'}';}
}

AESForWeixinGetPhoneNumber

public class AESForWeixinGetPhoneNumber {//加密方式private static String keyAlgorithm = "AES";//避免重复new生成多个BouncyCastleProvider对象,因为GC回收不了,会造成内存溢出//只在第一次调用decrypt()方法时才new 对象private static boolean initialized = false;//用于Base64解密private Base64.Decoder decoder = Base64.getDecoder();//待解密的数据private String originalContent;//会话密钥sessionKeyprivate String encryptKey;//加密算法的初始向量private String iv;public AESForWeixinGetPhoneNumber(String originalContent,String encryptKey,String iv) {this.originalContent = originalContent;this.encryptKey = encryptKey;this.iv = iv;}/*** AES解密* 填充模式AES/CBC/PKCS7Padding* 解密模式128** @return 解密后的信息对象*/public WeixinPhoneDecryptInfo decrypt() {initialize();try {//数据填充方式Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");Key sKeySpec = new SecretKeySpec(decoder.decode(this.encryptKey), keyAlgorithm);// 初始化cipher.init(Cipher.DECRYPT_MODE, sKeySpec, generateIV(decoder.decode(this.iv)));byte[]data = cipher.doFinal(decoder.decode(this.originalContent));String datastr = new String(data, StandardCharsets.UTF_8);return JSON.toJavaObject(JSON.parseObject(datastr),WeixinPhoneDecryptInfo.class);} catch (Exception e) {System.out.println(e.getMessage());return null;}}/**BouncyCastle作为安全提供,防止我们加密解密时候因为jdk内置的不支持改模式运行报错。**/private static void initialize() {if (initialized)return;Security.addProvider(new BouncyCastleProvider());initialized = true;}// 生成ivprivate static AlgorithmParameters generateIV(byte[] iv) throws NoSuchAlgorithmException, InvalidParameterSpecException {AlgorithmParameters params = AlgorithmParameters.getInstance(keyAlgorithm);params.init(new IvParameterSpec(iv));return params;}
}

java获取微信绑定的手机号码相关推荐

  1. uniapp微信小程序授权登录和获取微信绑定的手机号码

    uniapp微信小程序授权登录和获取微信绑定的手机号码 弹出授权的弹框 <view class="weixinOk" @tap="getUserProfile&qu ...

  2. 微信小程序——获取当前人微信绑定的手机号码

    做小程序项目时有一个需求,是点击某个按钮,之后要获取该微信绑定的手机号码, 1.第一步:写出页面 <!--index.wxml--> <view class="contai ...

  3. 获取微信绑定的手机号

    小程序中有很多地方都会用到注册用户信息的地方,用户需要填写手机号等,有了这个组件可以快速获取微信绑定手机号码,无须用户填写. 1.getPhoneNumber这个组件通过button来实现(别的标签无 ...

  4. 随机手机号码_微信绑定了手机号码怎么解绑

    新版微信绑定了手机号码怎么解绑,已经没法跟之前一样从正常菜单进行解绑操作了,而且同一手机号重新注册微信需要间隔3个月以上时间.下面就分步骤向大家介绍一下,通过微信安全中心申诉解绑手机号. 微信绑定了手 ...

  5. java获取微信accessToken

    java获取微信accessToken java获取微信accessToken GET请求 java获取微信accessToken package com.fengdi.lianmeng.task;i ...

  6. java获取微信小程序二维码

    java获取微信小程序二维码 近期正好遇到了,随手记录下 首先获取微信小程序二维码需要小程序的appid 以及secret 然后根据appid和secret去获取小程序的token 即 access_ ...

  7. java获取微信小程序二维码图片并保存到本地

    java获取微信小程序二维码保存到本地并返回图片,下次如果检查到本地有图片,那么就返回本地的图片,不再发起请求,否则重新发起请求并保存到本地,直接看代码吧. 获取access_token的方法可以参考 ...

  8. 微信小程序获取微信绑定授权手机号getPhoneNumber 全流程及出现手机号带*号问题详解

    微信小程序文档中给出如下示例 获取微信用户绑定的手机号,需先调用login接口. 因为需要用户主动触发才能发起获取手机号接口,所以该功能不由 API 来调用,需用 <button> 组件的 ...

  9. Java获取微信手机号

    Java获取微信手机号 导入maven <dependency><groupId>org.apache.commons</groupId><artifactI ...

最新文章

  1. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现
  2. 使用MyEclipse2017进行web开发
  3. 如何找出电脑里的流氓软件_啥拦截软件都挡不住?教你一键揪出乱弹窗的流氓软件...
  4. [转载] 深入了解Java ClassLoader、Bytecode 、ASM、cglib
  5. Docker container与宿主进程相互隔离的实现原理
  6. python字符串补空格输出_Python去除空格,Python中常见字符串去除空格的方法总结...
  7. 单选按钮必填会有红色选中提示吗_为什么单选按钮和复选框不能共存?
  8. (计算机组成原理)第一章计算机系统概述-第三节:计算机层次结构
  9. 阿里云获工信部CDN业务经营许可 云计算业内资质最全
  10. 集合框架和泛型练习题(含代码)
  11. 在PSP上玩《大旋风 Twin Hawk》
  12. MVS同时读取多个二维码
  13. 131多机型解码擦除工具
  14. 我在职场上的所表达出来的个性
  15. windows商店_Windows 10商店迎来重大改变,PC平台游戏计划公布
  16. UE4 虚幻发光材质避免黑色渐变
  17. 连续十日票房日冠,《人生大事》带热了电影大盘!它凭何突出重围?
  18. 在Ubuntu中使用Tomcat的小tips_codestorm_新浪博客
  19. 谷歌seo关键词怎么做?Google如何优化关键词
  20. 基于矩阵分解的CF算法实现(一):(Funk SVD)LFM

热门文章

  1. 推荐系统详解(三)近邻推荐
  2. CQUPT WEEKLY TRAINING (3)解题报告
  3. 中国软件网祝大家破五快乐
  4. 用ESP8266实现 手机控制车库门开关
  5. 广告监测系统如何进行广告舆情监测?
  6. java面试简历精通n_面试3年java程序员说精通spring源码 听完后觉得还是劝退好
  7. 信息二处的面上项目252项
  8. 曾国藩:物来顺应,未来不迎,当时不杂,既过不恋
  9. html往WPS粘贴格式乱,wps表格无法粘贴信息,原因是复制区域形状不同怎么解决?...
  10. MySQL三大日志——binlog、redoLog、undoLog详解