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

yizhihongxing

下面是完整攻略:

背景知识

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

  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日

相关文章

  • Java如何实现实体类转Map、Map转实体类

    实体类转Map和Map转实体类是Java编程中非常常见的操作,在开发中可以大大提高开发效率和代码质量。下面的攻略将会介绍Java中如何实现实体类转Map和Map转实体类。 实体类转Map 实体类转Map操作可以通过Java语言中的反射机制来实现。在java.lang.reflect包中有一些类可以帮助我们完成这项任务。主要的有Class、Field和Meth…

    Java 2023年5月26日
    00
  • Java的Struts框架报错“ControllerException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ControllerException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置Action,则可能会出现此。在这种情况下,需要检查配置文件以解决此问题。 类加载问题:如果类加载器无法加载所需的类,则可能会出现此。在这种情况下,需要检查类路径以解决此问题。 以下是两个实例: 例…

    Java 2023年5月5日
    00
  • java基于odbc连接oracle的实现方法

    Java基于ODBC连接Oracle的实现方法 ODBC ODBC(Open Database Connectivity)即开放数据库连接,是Microsoft为Windows平台上的软件和数据库产生的一种连接规范。该规范要求采用ODBC驱动程序作为中介层,支持一种面向SQL的API,使应用软件能通过ODBC来访问到数据。 ODBC适用于Windows系统中…

    Java 2023年5月20日
    00
  • 总结Java对象被序列化的两种方法

    下面就是“总结Java对象被序列化的两种方法”的完整攻略。 第一种方法:实现Serializable接口 Java提供了一个Serializable接口,如果想让一个对象可序列化,只需要在该类上实现Serializable接口即可。实现Serializable接口的类,系统会自动为其生成一个serialVersionUID值,它是序列化版本号,用于在反序列化…

    Java 2023年5月26日
    00
  • maven profile自动切换环境参数的2种方法详解

    什么是Maven profile Maven profile是指Maven中用于定义项目在不同环境下的不同配置的部分。比如通常我们在本地开发的时候,需要使用开发环境的数据库地址、账户和密码,而在不同的测试环境,这些配置参数又会有所不同。 为什么要使用Maven profile 在一些非常庞大的项目中,开发环境与测试环境差异很大,配置参数很多,如果每次从一个环…

    Java 2023年5月20日
    00
  • jsp实现针对excel及word文档的打印方法

    当我们需要在JSP页面中实现自定义打印Excel及Word文档的功能,主要需要以下步骤: 在JSP页面中定义需要打印的Excel或Word文档,通常是通过使用文件名标签或者使用input type=”file”>标签上传的方式获取文件。 例如: 将上传的文件保存在服务器端,通常是通过使用Apache POI库实现。 例如: //获取上传的Excel文件…

    Java 2023年6月15日
    00
  • Java源码解析阻塞队列ArrayBlockingQueue功能简介

    Java源码解析阻塞队列ArrayBlockingQueue功能简介 简介 ArrayBlockingQueue是java.util.concurrent包下一个基于数组的有界阻塞队列,它内部维护了一个定长数组用于存储队列元素,同时还提供了对队列元素的访问以及操作的方法,它是线程安全的,通过使用代码所提供的锁进行同步控制从而保证安全。 它所提供的基本特性如下…

    Java 2023年5月26日
    00
  • SpringBoot视图解析实现原理深入分析

    SpringBoot视图解析实现原理深入分析 SpringBoot是一个快速开发框架,它提供了很多便捷的功能,其中之一就是视图解析。在SpringBoot中,我们可以使用多种方式来实现视图解析,本文将详细讲解SpringBoot视图解析的实现原理,包括以下内容: 视图解析的概念 SpringBoot视图解析的实现原理 示例一:使用Thymeleaf视图解析器…

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