微信小程序获取手机号,后端JAVA解密流程代码

下面是完整攻略:

背景知识

微信小程序提供了获取用户手机号的接口,但是在获取手机号前,需要用户进行授权。用户若同意授权,则小程序可以访问其手机号。在获取到用户的手机号后,需要在后端对该手机号进行解密,才能够得到用户的真实手机号,以供业务使用。下面是获取手机号的完整流程:

  1. 前端向后端请求微信用户手机号,在请求中需要携带用户授权后获得的加密数据。
  2. 后端接收到请求后,需要将接收到的加密数据进行解密,并得到用户的手机号。
  3. 后端将解密后的用户手机号返回给前端,前端可以通过该手机号来进行后续的业务逻辑。

解密流程

1. 获取sessionKey

由于微信加密手机号的算法使用了AES加密算法,因此在解密前需要用到AES算法所需要的参数:sessionKey。在用户登录小程序时,可以通过微信提供的登录接口获取到sessionKey。获取流程如下:

  1. 用户打开小程序,进入到登录界面。
  2. 用户点击登录按钮,小程序调用微信的登录接口,获取到用户的临时凭证code。
  3. 小程序将code发送给后端,后端通过微信提供的接口使用code换取sessionKey和openid。
  4. 后端将sessionKey和openid返回给小程序。

获取到sessionKey和openid后,就可以在后续的解密流程中使用sessionKey进行解密。

2. 解密手机号

微信加密手机号时使用了AES/CBC/PKCS7Padding算法,并使用sessionKey作为秘钥。解密流程如下:

  1. 对加密的数据进行Base64解码,得到加密后的数据字节数组。
  2. 对sessionKey进行Base64解码,得到对应的字节数组。
  3. 对加密后的数据字节数组和sessionKey字节数组进行解密,得到用户的手机号。

解密过程中需要用到解密算法,以下是解密算法的Java代码实现:

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESUtil {

    public static String decryptData(String encryptedData, String iv, String sessionKey) throws Exception {
        byte[] encrypted = Base64.getDecoder().decode(encryptedData);
        byte[] keyByte = Base64.getDecoder().decode(sessionKey);
        byte[] ivByte = Base64.getDecoder().decode(iv);

        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
        SecretKeySpec keySpec = new SecretKeySpec(keyByte, "AES");
        IvParameterSpec ivSpec = new IvParameterSpec(ivByte);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);

        byte[] decrypted = cipher.doFinal(encrypted);
        return new String(decrypted);
    }
}

解密过程中需要传入sessionKey、iv以及加密后的手机号作为参数,如下所示:

String sessionKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String iv = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String encryptedData = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
String phone = AESUtil.decryptData(encryptedData, iv, sessionKey);

解密完成后得到的就是用户的真实手机号。

示例说明

以下是示例说明:

示例1

前端页面代码:

<button @getPhoneNumber="getPhoneNumber">获取手机号</button>

前端JS代码:

methods: {
    getPhoneNumber(event) {
        if (event.mp.detail.errMsg === "getPhoneNumber:ok") {
            // 授权成功,向后端发送解密请求
            var requestUrl = "https://www.example.com/decrypt-phone";
            var requestData = {
                "encryptedData": event.mp.detail.encryptedData,
                "iv": event.mp.detail.iv
            };
            wx.request({
                url: requestUrl,
                method: "POST",
                data: requestData,
                success: function (res) {
                    console.log(res.data); // 输出用户手机号
                }
            });
        }
    }
}

后端Java代码:

@PostMapping("/decrypt-phone")
@ResponseBody
public String decryptPhone(@RequestBody Map<String, String> requestData) throws Exception {
    String sessionKey = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    String iv = requestData.get("iv");
    String encryptedData = requestData.get("encryptedData");
    String phone = AESUtil.decryptData(encryptedData, iv, sessionKey);
    return phone;
}

示例2

前端页面代码:

<button @getPhoneNumber="getPhoneNumber">获取手机号</button>

前端JS代码:

methods: {
    getPhoneNumber(event) {
        if (event.mp.detail.errMsg === "getPhoneNumber:ok") {
            // 授权成功,获取用户手机号
            console.log(event.mp.detail.purePhoneNumber); // 输出用户手机号
        }
    }
}

后端Java代码:“

不需要后端Java代码,因为前端直接获取了用户的手机号。但是由于前端无法获得加密的手机号,因此需要在前端中向后端发送解密请求,根据示例1中的方式进行解密处理。

以上就是关于“微信小程序获取手机号,后端JAVA解密流程代码”的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:微信小程序获取手机号,后端JAVA解密流程代码 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • ASP连接SQL2005数据库连接代码

    要连接SQL Server 2005数据库,可以使用以下四种方式: 使用SQL Server Management Studio(SSMS):在SSMS中,您可以轻松地打开数据库,并使用查询编辑器中提供的标准SQL语言编写查询。SSMS还包括一个用于管理数据库和服务器设置的多种选项。 使用ODBC驱动程序:这是一个基础的数据库驱动程序,用于通过SQL语言连接…

    Java 2023年6月15日
    00
  • java遍历properties文件操作指南

    Java遍历Properties文件操作指南 概述 Properties文件是Java中用于存储配置信息的一种简单而常用的文件格式,以键值对(key-value)的形式保存数据,扩展名为.properties。在Java中,我们可以使用Properties类来读取、写入和操作Properties文件。在本篇攻略中,我们将介绍如何使用Java遍历Propert…

    Java 2023年5月26日
    00
  • JDBC数据库连接过程及驱动加载与设计模式详解

    下面是对于“JDBC数据库连接过程及驱动加载与设计模式详解”的完整攻略: JDBC数据库连接过程 JDBC是JavaEE标准中定义的用于操作各种关系型数据库的API。使用JDBC连接到数据库的过程如下: 加载数据库驱动:使用Class.forName(driver)加载对应数据库的驱动类,其中driver是JDBC提供的数据库驱动类名。例如,连接MySQL数…

    Java 2023年5月20日
    00
  • cemtos 7 linux 安装与卸载 tomcat 7的教程

    CentOS 7 Linux安装Tomcat 7教程 步骤一:安装Java 在CentOS 7中,我们可以使用yum来安装Java。在命令行终端中运行以下命令来安装: sudo yum install java-1.8.0-openjdk-devel 该命令将在系统中安装OpenJDK 1.8。 步骤二:下载Tomcat 7 您可以从Tomcat官方网站 h…

    Java 2023年5月19日
    00
  • Java中的IllegalStateException是什么?

    Java中的IllegalStateException 在Java编程中,当我们的应用程序处于不适合执行给定操作的状态时,会抛出IllegalStateException。 通俗一点讲,即在方法调用之前或之后进行检查,如果当前对象状态无法支持这种方法调用,则抛出IllegalStateException异常。 何时会抛出IllegalStateExcepti…

    Java 2023年4月27日
    00
  • SpringBoot整合Apache Pulsar教程示例

    我们一起来讲解一下“SpringBoot整合Apache Pulsar教程示例”的完整攻略。 1. 环境搭建 首先我们需要搭建 Apache Pulsar 的环境。可以参考官方文档进行安装和配置,也可以使用 Docker 进行安装。在安装成功后,我们可以使用 pulsar-admin 工具进行管理。 2. SpringBoot 项目配置 首先添加 Apach…

    Java 2023年6月2日
    00
  • 使用Java实现大小写转换实例代码

    使用Java实现大小写转换可以通过常用的String类提供的方法来实现,下面是实现的完整攻略: 1. 使用toUpperCase和toLowerCase方法 Java中String类提供了两个方法来实现大小写转换,分别是toUpperCase方法和toLowerCase方法。 toUpperCase方法:将字符串中的所有字符转换为大写字母; toLowerC…

    Java 2023年5月23日
    00
  • JAVA如何获取工程下的文件

    在Java中,我们可以使用相对路径或绝对路径的方式来获取工程下的文件。以下是详细的攻略: 使用相对路径获取工程下的文件 使用 File 对象的相对路径构造方法 可以通过创建 File 对象并传递相对路径来获取工程下的文件。如下所示,获取工程根目录下的 test.txt 文件: File file = new File("test.txt"…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部