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

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
拿到微信的数据后就可以进行自己的业务操作了

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

微信小程序实现微信登录以及获取用户手机号相关推荐

  1. 企业微信小程序_授权登录接口获取用户userid

    文章目录 一.前置知识 1. 阅读 企业微信小程序开发文档 2. 企业微信小程序登录流程 3. 微信小程序区别 二.前端部分 2.1. 调用登录接口 2.2. 请求后端接口 2.3. 项目源码 三.后 ...

  2. 微信小程序开发——点击按钮获取用户授权没反应或反应很慢的解决方法

    微信小程序开发--点击按钮获取用户授权没反应或反应很慢的解决方法 参考文章: (1)微信小程序开发--点击按钮获取用户授权没反应或反应很慢的解决方法 (2)https://www.cnblogs.co ...

  3. 微信小程序通过web-view网页授权获取用户公众号OpenID

    小程序中实现网页授权获取微信公众号OpenID 1.准备工作 2.应用场景说明 3.实现步骤 结语 1.准备工作 第一步: 通过该地址https://mp.weixin.qq.com/debug/cg ...

  4. 微信小程序又双叕改获取用户头像昵称的规则了,微信小程序如何去最新获取头像昵称

    就最近在写微信小程序项目的时候,发现微信又双叕更改获取用户头像昵称的规则了,我连wx.getUserProfile都还没用上,一直还停留在wx.getUserInfo的阶段,结果告诉我,又改规则了,一 ...

  5. 在微信小程序中,如果自动获取用户所在的省市地区?

    可以通过微信小程序提供的API获取用户所在的省市地区信息.具体步骤如下: 在小程序中需要获取用户地理位置时,需要先在app.json中配置"permission"字段,并开启用户授 ...

  6. 微信小程序API----授权登录拿到用户头像昵称等信息

    前端开发思路: 1.通过点击按钮,拿到code,传给后台,后台通过code换取session_key 和 openid 这个地方调取 wx.login 这个API 2.调取wx.getUserProf ...

  7. 微信小程序:如何通过授权获取用户绑定手机号

    工具:微信开发者工具.thinkphp3.2框架 整理逻辑 调用接口wx.login()获取登录凭证(code) 通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥 ...

  8. 微信小程序如何进行登录授权和获取用户信息

    微信小程序如何进行登录授权和获取用户信息

  9. 微信小程序之授权登录--项目需要

    1.由于项目需要,需要实现自己的微信小程序 用微信授权登录. 2.参考此项目https://blog.csdn.net/weidong_y/article/details/79636386 3.其中的 ...

  10. 微信小程token_微信小程序开发之登录换取token

    本文将带你了解微信小程序开发之登录换取token,希望本文对大家学微信有所帮助 前言:这次主要是介绍些业务逻辑,技术点倒是没有多少.不过在开发中,优秀的编程思路同样是非常值得学习的. 最近小程序可以说 ...

最新文章

  1. 导出swagger2生成的文档
  2. ​GNN教程:Weisfeiler-Leman算法!
  3. 数字图像处理--灰度图转伪彩色图
  4. 《团队-爬取豆瓣电影TOP250-设计文档》
  5. ioctl 详细说明
  6. torchvision.transforms
  7. Matter-JS Bodies 内置刚体模块
  8. 二叉树的遍历|前序、中序、后序、层序遍历
  9. windows主机防火墙启用ICMP入站
  10. 【线性代数之二】矩阵与行列式
  11. 【源码之下无秘密】ArrayList:在内存只有10M的空间中申请一块5M的数组空间,会导致OOM吗?
  12. 朴实无华!注意力机制神经网络解析
  13. 零基础小白,如何从零开始搭建网站?(详细步骤)
  14. 池化层(汇聚层)的通道变化
  15. app爬虫之Android模拟器与fildder的搭建
  16. 达内python第一次月考题目_第一次月考试卷分析
  17. 信息增益与信息增益率详解
  18. Opencv3.0--第二篇【双阈值二值化图像】
  19. graphpad prism8教程柱状图_一起来看看Graphpad Prism 8.0进阶篇吧!
  20. npm run build appeared(出现) Cannot find module ‘webpack/lib/ModuleFilenameHelpers‘

热门文章

  1. unity2D动画和图片切割
  2. 如何用 ARKit 将太阳系装进 iPhone(二)
  3. Java面向对象之interface接口
  4. CVE-2020-1971: OpenSSL 拒绝服务漏洞通告
  5. 超超超级详细的java入门必备基础知识
  6. OpenGL学习04_点画模式(点画线)
  7. 用Java写微信红包实现模拟微信发红包
  8. SWPU NSS新生赛校外通道(部分WP)
  9. OC中用字典创建一个具有省市区的应用(简单的字典运用代码)
  10. 2022第十届深圳国际物联网展览会