微信小程序获取手机号,后端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日

相关文章

  • Spring+SpringMVC+MyBatis整合详细教程(SSM)

    以下是关于“Spring+SpringMVC+MyBatis整合详细教程(SSM)”的完整攻略,其中包含两个示例。 1. 前言 Spring+SpringMVC+MyBatis整合(简称SSM)是一种常用的Java Web开发框架,它将Spring、SpringMVC和MyBatis三个框架整合在一起,提供了一种灵活的方式来开发Web应用程序。本攻略将详细讲…

    Java 2023年5月16日
    00
  • Java Spring的使用注解开发详解

    Java Spring的使用注解开发详解 Java Spring是一个开源框架,它帮助Java开发人员开发企业级应用程序。Spring框架有多种模块,其中最流行的是Spring Core,它是Spring框架的核心部分,提供了依赖注入(DI)和面向切面编程(AOP)等重要功能。本文将详细讲解如何使用注解开发Java Spring应用程序。 环境准备 在开始使…

    Java 2023年5月19日
    00
  • Spring使用xml方式整合第三方框架流程详解

    Spring框架是一个非常流行的Java框架,通过使用Spring框架,我们可以更加容易地开发和管理Java应用程序。它提供了各种功能和模块,使得我们可以使用各种第三方框架和库来构建复杂的应用程序。同时,Spring框架也提供了与第三方框架的整合工具,以简化整合流程。 本文将主要介绍如何使用Spring的xml方式来整合第三方框架的流程和步骤。 引入第三方框…

    Java 2023年5月19日
    00
  • Java实现纪元秒和本地日期时间互换的方法【经典实例】

    Java实现纪元秒和本地日期时间互换的方法【经典实例】 什么是纪元秒? 纪元秒是指从“1970年1月1日 00:00:00 UTC”开始计算至某一时刻之间的秒数。 纪元秒与本地日期时间的相互转换 Java提供了从纪元秒到本地日期时间和从本地日期时间到纪元秒的转换方法。这些方法都属于Java API中的java.time包。 从纪元秒到本地日期时间 Java中…

    Java 2023年5月20日
    00
  • Java如何利用策略模式替代if/else语句

    策略模式是一种常用的设计模式,可以用于消除过多的if/else语句。下面让我详细讲解Java中如何利用策略模式替代if/else语句的完整攻略: 1. 策略模式简介 策略模式是一种对象行为型模式,它定义了一系列算法,将每个算法封装起来并使它们可以相互替换。策略模式能够让算法独立于使用它们的客户端而变化。 2. 如何使用策略模式替代if/else语句 2.1 …

    Java 2023年5月26日
    00
  • 深入解析Spring Boot 的SPI机制详情

    深入解析Spring Boot 的SPI机制详情 在Spring Boot中,SPI是一种Java的扩展机制,它让应用程序可以在运行时动态加载一个类或多个类实现的接口,并执行相应的操作。下面我们将深入探究Spring Boot的SPI机制的实现细节。 什么是SPI机制 SPI,全称为Service Provider Interface,是一种Java的扩展机…

    Java 2023年5月20日
    00
  • Java执行cmd命令的举例与注意事项

    Java执行cmd命令的举例与注意事项 在Java程序中,执行cmd命令是常见的需求之一。本攻略将介绍如何在Java中执行cmd命令,并列出注意事项。 执行cmd命令的方法 Java中可以通过Runtime.getRuntime().exec()方法来执行cmd命令。该方法返回一个Process对象,通过该对象可以获得命令的执行结果。下面是执行cmd命令的模…

    Java 2023年5月27日
    00
  • MyBatis-Plus中最简单的查询操作教程(Lambda)

    当你正在使用MyBatis-Plus来进行数据库操作时,最简单的操作之一是进行查询操作。MyBatis-Plus提供了两种形式的查询操作:Wrapper和Lambda。其中,Wrapper是MyBatis-Plus最初提供的查询方式。但是,在使用Wrapper时,我们需要手动构建一些查询条件,这对于一些较为复杂的查询来说,会使代码变得十分冗长。因此,为了解决…

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