IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 微信小程序实现微信登录以及获取用户手机号 -> 正文阅读

[移动开发]微信小程序实现微信登录以及获取用户手机号

开发微信小程序如果要拿到用户信息都需要接入微信登录,这里把和微信对接的地方封装成对应的方法,使用时直接传参调用即可

1.需要导入的jar包

		<!--alibaba json工具-->
		<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

2.封装好接收数据实体类

package com.lcp.fitness.dto;

import lombok.Data;

/**
 * @author : fitnessCode
 * @data : 2021/11/8 10:16
 * @description : 微信code返回信息
 */
@Data
public class Jscode2Session {

    /**
     * 微信用户的唯一标识
     */
    private String openid;

    /**
     * 会话密钥
     */
    private String session_key;

    /**
     * 用户在微信开放平台的唯一标识符。本字段在满足一定条件的情况下才返回。
     */
    private String unionid;
}

package com.lcp.fitness.dto;

import lombok.Data;

/**
 * @author : fitnessCode
 * @data : 2021/11/8 10:07
 * @description : 解析微信手机号
 */
@Data
public class PhoneNumberDto {

    /**
     * 用户绑定的手机号(国外手机号会有区号)
     */
    private String phoneNumber;

    /**
     * 没有区号的手机号
     */
    private String purePhoneNumber;

    /**
     * 区号
     */
    private String countryCode;

    /**
     * appId时间戳(验证使用)
     */
    private String watermark;
}

3.封装工具类

package com.lcp.fitness.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.lcp.fitness.dto.Jscode2Session;
import com.lcp.fitness.dto.PhoneNumberDto;
import org.springframework.web.client.RestTemplate;

/**
 * @author : chijian
 * @data : 2021/11/8 10:07
 * @description : 微信相关工具类
 */
public class WeixinUtil {

    private static final String url = "https://api.weixin.qq.com/sns/jscode2session";

    public static Jscode2Session getCode(String appId, String appSecret, String code) {
        //HTTP请求工具类
        RestTemplate restTemplate = new RestTemplate();
        //微信返回内容
        Jscode2Session jscode2Session = null;
        String str = restTemplate.getForObject(url + "?appid=" + appId + "&secret=" + appSecret + "&js_code=" + code + "&grant_type=authorization_code", String.class);
        jscode2Session = JSONObject.parseObject(str, new TypeReference<Jscode2Session>() {
        });
        return jscode2Session;
    }

    public static PhoneNumberDto getPhone(String iv, String encryptedData, String sessionKey) {
        String s = null;
        try {
            //解密微信绑定手机号
            s = AES.decryptData(encryptedData, sessionKey, Iv);
        } catch (Exception e) {
            e.printStackTrace();
        }
        PhoneNumberDto phoneNumberDto = JSON.parseObject(s, PhoneNumberDto.class);
        return phoneNumberDto;
    }
}


package com.lcp.fitness.utils;



import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Base64;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.security.Security;

/**
 * 微信解析工具类
 */
public class AES {

    public static void main(String[] args) {
        String result = decryptData(
                "sDXrUftQyBSyY7M4Ro4Xvjl8amI2agPjUWkcJXTJx6qsqaeetGdE7bp7P7V95aU7TS6O6l9cSznKhw5dhvkjSE+2vH19SntKxvfNtWUJigVKgzB28ACPjROC/4tidR4mMjJO81HX9pMCjusMVdYy0YzlYvvtCgTUNIOHNByMSB5fJ+vXIMnw==",
                "9y9P6RqKVZiWg==",
                "Yi1SGcsMg=="
        );
        System.out.println("result = " + result);
    }

    public static String decryptData(String encryptDataB64, String sessionKeyB64, String ivB64) {
        return new String(
                decryptOfDiyIV(
                        Base64.decode(encryptDataB64),
                        Base64.decode(sessionKeyB64),
                        Base64.decode(ivB64)
                )
        );
    }

    private static final String KEY_ALGORITHM = "AES";
    private static final String ALGORITHM_STR = "AES/CBC/PKCS7Padding";
    private static Key key;
    private static Cipher cipher;

    private static void init(byte[] keyBytes) {
        // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
        int base = 16;
        if (keyBytes.length % base != 0) {
            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
            byte[] temp = new byte[groups * base];
            Arrays.fill(temp, (byte) 0);
            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
            keyBytes = temp;
        }
        // 初始化
        Security.addProvider(new BouncyCastleProvider());
        // 转化成JAVA的密钥格式
        key = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
        try {
            // 初始化cipher
            cipher = Cipher.getInstance(ALGORITHM_STR, "BC");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 解密方法
     *
     * @param encryptedData 要解密的字符串
     * @param keyBytes      解密密钥
     * @param ivs           自定义对称解密算法初始向量 iv
     * @return 解密后的字节数组
     */
    private static byte[] decryptOfDiyIV(byte[] encryptedData, byte[] keyBytes, byte[] ivs) {
        byte[] encryptedText = null;
        init(keyBytes);
        try {
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(ivs));
            encryptedText = cipher.doFinal(encryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return encryptedText;
    }

}

4.测试及说明

微信官方文档地址
先说一下上面用到的几个参数

1.appId:微信小程序id,申请了小程序登录后台即可查看
2.appSecret:秘钥,同样在后台查看,需要小程序管理员权限才可查看,及时保存
3.code:前端通过wx.login(Object object)方法调用,后端只需接收(只能使用一次)
4.sessionKey:使用code从微信服务器获取,后面会使用,后端最好使用redis保存一下
5.iv:加密算法的初始向量,前端调用传给后端
6.encryptedData:包括敏感数据在内的完整用户信息的加密数据,前端调用传给后台

微信小程序AppID及AppSecret获取
知道了所有参数的来源,就可以测试了

这里我就测试一下通过code获取sessionKey,openId
拿到微信的数据后就可以进行自己的业务操作了

在这里插入图片描述

这里说一下解密用户信息的方法,如果解析出来是用户名、头像等而不是手机号,那是因为前端传的加密数据的问题,解析用户信息和手机号都使用同样的方法即可

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-09 19:40:29  更:2021-11-09 19:41:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 3:38:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码