在微信中,用户手机号的获取通常是通过微信小程序的getPhoneNumber接口来实现的。这个接口允许用户在授权后,将加密的手机号数据传递给开发者。由于隐私保护,微信不会直接提供用户的明文手机号,而是提供一个加密的手机号字符串和相应的解密密钥。

以下是一个基于Java的示例,展示了如何接收并解密从微信小程序传递过来的加密手机号信息。

步骤 1: 微信小程序前端获取手机号

在微信小程序前端,我们需要调用getPhoneNumber接口来获取用户的手机号信息。这里不展开微信小程序的代码,但基本流程是:

  1. wxml中添加一个按钮,绑定点击事件到getPhoneNumber函数。
  2. 在对应的js文件中实现getPhoneNumber函数,调用微信的wx.getPhoneNumber API。
  3. 用户点击按钮并成功授权后,微信会返回一个加密的手机号数据和相应的解密密钥。

步骤 2: 后端Java代码解密手机号

后端Java代码需要完成以下任务:

  1. 接收前端传递的加密手机号数据和解密密钥。
  2. 使用微信提供的解密算法和密钥来解密手机号。
  3. 返回解密后的手机号。

以下是一个简化的Java示例,用于解密从微信小程序获取的加密手机号:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64; public class WeChatPhoneNumberDecrypter { private static final String ALGORITHM = "AES/CBC/PKCS5Padding"; public static String decryptPhoneNumber(String encryptedData, String sessionKey, String iv) throws Exception {
// Base64 解码
byte[] encryptedDataBytes = Base64.getDecoder().decode(encryptedData);
byte[] sessionKeyBytes = Base64.getDecoder().decode(sessionKey);
byte[] ivBytes = Base64.getDecoder().decode(iv); // 设置AES密钥和初始化向量
SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKeyBytes, "AES");
IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); // 创建Cipher实例并初始化
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec); // 解密
byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes); // 将解密后的字节转换为字符串
return new String(decryptedBytes, StandardCharsets.UTF_8);
} public static void main(String[] args) {
try {
// 这些值通常从微信小程序前端获取,并通过网络请求发送到后端
String encryptedData = "..."; // 加密的手机号数据,从微信小程序获取
String sessionKey = "..."; // 会话密钥,从微信小程序获取
String iv = "..."; // 初始化向量,从微信小程序获取 // 解密手机号
String decryptedPhoneNumber = decryptPhoneNumber(encryptedData, sessionKey, iv);
System.out.println("解密后的手机号: " + decryptedPhoneNumber);
} catch (Exception e) {
e.printStackTrace();
}
}
}

注意事项

  1. encryptedDatasessionKeyiv通常是由微信小程序前端在获取用户手机号后通过网络请求发送到后端的。这些值在每个请求中都是不同的。
  2. 确保我们的Java环境支持AES加密,并已正确配置。
  3. 解密后的数据是一个JSON字符串,其中包含了用户的手机号等信息。我们可能需要使用JSON解析库(如Jackson或Gson)来进一步处理这些数据。
  4. 出于安全考虑,务必确保我们的后端服务是安全的,以防止潜在的攻击和数据泄露。
  5. 由于微信的API和策略可能会发生变化,建议经常查看微信官方文档以获取最新信息。

Java解析微信获取手机号信息的更多相关文章

  1. (部署新java程序,程序报错,需copy的一个包)——java使用siger 获取服务器硬件信息

    mcat-siger.sh  查看是否安装siger rsync -aPuv /usr/lib64/libsigar-amd64-linux.so $i:/usr/lib64/ java使用siger ...

  2. Java解析word,获取文档中图片位置

    前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...

  3. SoringCloud(四) - 微信获取用户信息

    1.项目介绍 2.微信公众平台 和 微信开放文档 2.1 微信公众平台 2.1.1 网址链接 https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?ac ...

  4. java解析XML获取城市代码

    运行前先导入dom4j架包,由于我们公司用的代理服务器所以下面我设置了代理ip,不需要的可直接忽略 package com.chengshidaima.tools; import java.io.Bu ...

  5. 微信获取用户信息的两个接口和两个ACCESS_TOKEN

    有一段时间没有搞微信开发了 ,今天突然要改一下程序! 回头一看 微信的帮助文档太tm的稀烂的,太难懂了,这做个笔记以后看着方便 微信有2个ACCESS_TOKEN, 1,基础接口的token 获取接口 ...

  6. java使用siger 获取服务器硬件信息(CPU 内存 网络 io等)

    通过使用第三方开源jar包sigar.jar我们可以获得本地的信息 1.下载sigar.jar sigar官方主页 sigar-1.6.4.zip 2.按照主页上的说明解压包后将相应的文件copy到j ...

  7. JAVA代码中获取JVM信息

    一.JAVA中获取JVM的信息 原理,利用JavaSDK自带的ManagementFactory类来获取. 二.获取信息 1.获取进程ID @Test public void test1() { Ru ...

  8. java 根据ip获取地区信息(淘宝和新浪)

    package com.test; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStr ...

  9. java、JavaScript获取微信用户信息登录优化方案

    1.获取微信用户信息要调用微信的好几个接口,再加上自己系统的接口就会变的很慢,影响用户体验,之前走过的弯路我就不赘述了,直接说新的方案. 2.第一步都是向微信发起获取用户code请求: 请求接口:ht ...

  10. Java实践-远程调用Shell脚本并获取输出信息

    1.添加依赖 <dependency> <groupId>ch.ethz.ganymed</groupId> <artifactId>ganymed-s ...

随机推荐

  1. 使用 DISM 安全清理 C 盘 WinSxS 文件夹空间

    本文将介绍如何使用系统内置 DISM 工具进行安全清理 C 盘空间,清理 WinSxS 文件夹里面的可回收删除的程序包空间 开始之前,先使用管理员权限打开 CMD 或 PowerShell 命令行窗口 ...

  2. Win10下小米路由器4A百兆版刷Openwrt固件【图片详细版】

    将原来的小米路由器换成了华为,早就听闻刷软路由可以实现去广告,解锁灰色歌单等诸多骚操作.就来榨取这个小米4A的剩余价值来着的. 注意 1. 必须使用路由模式,中继模式是打不开telnet的 更新固件 ...

  3. 2.生产环境k8s-1.28.2集群小版本升级到1.28.5

    环境:https://www.cnblogs.com/yangmeichong/p/17956335 # 流程:先升级master,再升级node # 1.备份组件参考:https://kuberne ...

  4. Java数字转中文数字——支持:Integer、BigDecimal

    1.效果 public static void main(String[] args) { System.out.println(int2chineseNum(3456)); System.out.p ...

  5. C语言,实现数字谱到简谱的转换

    C语言,实现数字谱到简谱的转换 前言:本文初编辑于2024年4月28日 CSDN:https://blog.csdn.net/rvdgdsva 博客园:https://www.cnblogs.com/ ...

  6. Go-Zero自定义goctl实战:定制化模板,加速你的微服务开发效率(四)

    前言 上一篇文章带你实现了Go-Zero和goctl:解锁微服务开发的神器,快速上手指南,本文将继续深入探讨Go-Zero的强大之处,并介绍如何使用goctl工具实现模板定制化,并根据实际项目业务需求 ...

  7. C语言简答题

    C语言的历史: c语言是在20世纪70年代初美国贝尔实验室开发的一种高级编程语言,由B语言发展来,最初是为了Unix操作系统开发的.在80年代中期,由ISO和ANSI C对它进行了一系列的标准化, 9 ...

  8. git安装和git命令:全局设置用户名邮箱配置

    在网上下载并安装git:https://git-scm.com/downloads在开始菜单里面找到 "Git --> Git Bash",如下 运行Git Bash: 如果 ...

  9. uni-app移动端开发中ios/安卓--坑和经验总结

    1. ios new时间对象,需要用逗号隔开传日期的方式, 不支持 new Date('2019-03-01 08:00:00') 格式: 支持以下两种方式: 2. ios个别版本对fixed的属性的 ...

  10. Linux(一):Linux操作系统

    Linux(一):Linux操作系统 对于我们编程人员来讲,linux对于我们几乎已经是像windows对于普通用户一样,好像和同行交流说不会linux就像说不会用计算机一样羞耻.这里打算从头开始温故 ...