微信小程序实现微信登录以及获取用户手机号
开发微信小程序如果要拿到用户信息都需要接入微信登录,这里把和微信对接的地方封装成对应的方法,使用时直接传参调用即可
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 {// 初始化ciphercipher = 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:包括敏感数据在内的完整用户信息的加密数据,前端调用传给后台
知道了所有参数的来源,就可以测试了
这里我就测试一下通过code获取sessionKey,openId
拿到微信的数据后就可以进行自己的业务操作了
这里说一下解密用户信息的方法,如果解析出来是用户名、头像等而不是手机号,那是因为前端传的加密数据的问题,解析用户信息和手机号都使用同样的方法即可
微信小程序实现微信登录以及获取用户手机号相关推荐
- 企业微信小程序_授权登录接口获取用户userid
文章目录 一.前置知识 1. 阅读 企业微信小程序开发文档 2. 企业微信小程序登录流程 3. 微信小程序区别 二.前端部分 2.1. 调用登录接口 2.2. 请求后端接口 2.3. 项目源码 三.后 ...
- 微信小程序开发——点击按钮获取用户授权没反应或反应很慢的解决方法
微信小程序开发--点击按钮获取用户授权没反应或反应很慢的解决方法 参考文章: (1)微信小程序开发--点击按钮获取用户授权没反应或反应很慢的解决方法 (2)https://www.cnblogs.co ...
- 微信小程序通过web-view网页授权获取用户公众号OpenID
小程序中实现网页授权获取微信公众号OpenID 1.准备工作 2.应用场景说明 3.实现步骤 结语 1.准备工作 第一步: 通过该地址https://mp.weixin.qq.com/debug/cg ...
- 微信小程序又双叕改获取用户头像昵称的规则了,微信小程序如何去最新获取头像昵称
就最近在写微信小程序项目的时候,发现微信又双叕更改获取用户头像昵称的规则了,我连wx.getUserProfile都还没用上,一直还停留在wx.getUserInfo的阶段,结果告诉我,又改规则了,一 ...
- 在微信小程序中,如果自动获取用户所在的省市地区?
可以通过微信小程序提供的API获取用户所在的省市地区信息.具体步骤如下: 在小程序中需要获取用户地理位置时,需要先在app.json中配置"permission"字段,并开启用户授 ...
- 微信小程序API----授权登录拿到用户头像昵称等信息
前端开发思路: 1.通过点击按钮,拿到code,传给后台,后台通过code换取session_key 和 openid 这个地方调取 wx.login 这个API 2.调取wx.getUserProf ...
- 微信小程序:如何通过授权获取用户绑定手机号
工具:微信开发者工具.thinkphp3.2框架 整理逻辑 调用接口wx.login()获取登录凭证(code) 通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥 ...
- 微信小程序如何进行登录授权和获取用户信息
微信小程序如何进行登录授权和获取用户信息
- 微信小程序之授权登录--项目需要
1.由于项目需要,需要实现自己的微信小程序 用微信授权登录. 2.参考此项目https://blog.csdn.net/weidong_y/article/details/79636386 3.其中的 ...
- 微信小程token_微信小程序开发之登录换取token
本文将带你了解微信小程序开发之登录换取token,希望本文对大家学微信有所帮助 前言:这次主要是介绍些业务逻辑,技术点倒是没有多少.不过在开发中,优秀的编程思路同样是非常值得学习的. 最近小程序可以说 ...
最新文章
- 导出swagger2生成的文档
- ​GNN教程:Weisfeiler-Leman算法!
- 数字图像处理--灰度图转伪彩色图
- 《团队-爬取豆瓣电影TOP250-设计文档》
- ioctl 详细说明
- torchvision.transforms
- Matter-JS Bodies 内置刚体模块
- 二叉树的遍历|前序、中序、后序、层序遍历
- windows主机防火墙启用ICMP入站
- 【线性代数之二】矩阵与行列式
- 【源码之下无秘密】ArrayList:在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
- 朴实无华!注意力机制神经网络解析
- 零基础小白,如何从零开始搭建网站?(详细步骤)
- 池化层(汇聚层)的通道变化
- app爬虫之Android模拟器与fildder的搭建
- 达内python第一次月考题目_第一次月考试卷分析
- 信息增益与信息增益率详解
- Opencv3.0--第二篇【双阈值二值化图像】
- graphpad prism8教程柱状图_一起来看看Graphpad Prism 8.0进阶篇吧!
- npm run build appeared(出现) Cannot find module ‘webpack/lib/ModuleFilenameHelpers‘