Java获取微信小程序code获取openid、session_key、unionid,获取授权信息解密获取手机号

这篇具有很好参考价值的文章主要介绍了Java获取微信小程序code获取openid、session_key、unionid,获取授权信息解密获取手机号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

  在小程序的项目中,对小程序授权获取的code值进行解析是一个必要的操作,因为需要获取到其中的openid、session_key、unionid进行一个身份的验证。判断该用户是新用户或是其它操作(具体根据自己的业务需求修改就行)
  其中unionid需要主体账户绑定了小程序后才可以获取到。所以在没有绑定的时候,我们解析code是只能获取到openid和session_key两个参数的
	接下来我们开始操作一下,代码和详细操作如下👇

一、Java解析微信小程序code,获取openid、session_key、unionid

1、先写一个code解析的工具类

WechatUtils


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
// vo实体类参数
import com.entityVo.TestEntityVO ;
import com.utils.TestUtils;

import org.bouncycastle.util.encoders.Base64;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.util.TextUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.stereotype.Component;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.*;

@Slf4j(topic = "WechatUtils")
@Component
public class WechatUtil {
	private static final String appId = "*****";
	private static final String secret = "*x**x****";

	/**
	 * 获取小程序code换取openid、session_key
	 *
	 * @param code
	 * @return
	 */
	public static JSONObject getOpenId(String code) {

		String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId
				+ "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
		PrintWriter out = null;
		BufferedReader in = null;
		String line;
		StringBuffer stringBuffer = new StringBuffer();
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();

			// 设置通用的请求属性 设置请求格式
			//设置返回类型
			conn.setRequestProperty("contentType", "text/plain");
			//设置请求类型
			conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
			//设置超时时间
			conn.setConnectTimeout(1000);
			conn.setReadTimeout(1000);
			conn.setDoOutput(true);
			conn.connect();
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应    设置接收格式
			in = new BufferedReader(
					new InputStreamReader(conn.getInputStream(), "UTF-8"));
			while ((line = in.readLine()) != null) {
				stringBuffer.append(line);
			}
			JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString());
			return jsonObject;

		} catch (Exception e) {
			e.printStackTrace();
		}
		//使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return null;
	}
}

2、业务逻辑层的业务代码

(具体实体类自己根据自己的业务需求配置就行)
service

public interface WxOperationService{
	TestEntity getCodeInfo(TestEntityVO vo);
}

impl实现类

@Service
pulic class WxOperationServiceImpl implements WxOperationService{
	
	@Override
	public TestEntity getCodeInfo(TestEntityVO vo){
		TestEntity entity = new TestEntity;
		// 获取code数据
		JSONObject object = WechatUtils.getOpenId(vo.getCode())
		// json数据转换成字符串
		String openid = wx.get("openid").toString();
		String sessionkey = wx.get("session_key").toString();
		// 当主体账户绑定小程序后就可以获取到,未绑定无法获取
        String unionId="";
        if(!EmptyUtils.isEmpty(wx.get("unionid"))){
            unionId=wx.get("unionid").toString();
        }
        entity.setOpenId(openid);
        entity.setSessionKey(sessionkey);
        entity.setUnionId(unionid);
        // 是否需要获取手机号,true需要
        entity.setIsFlagPhone(true);
        System.out.println("openid:"+openid+",session_key:"+sessionkey+",unionid:"+unionid);
        // 返回参数
		return entity;
	}
}

👆这个代码已经可以解析出code信息,具体的业务流程自己去添加就ok


二、Java获取微信用户手机号

  在上面的代码中我们已经获取到了openid和session_key了,而code信息中是不能获取到用户的手机号码的,解析微信手机号的相关数据需要openid和session_key才行,所以在上面代码中,我将相关数据返回给了前端,前端将我传回的参数,还有第二次请求中的iv、encryptedData一起传回给后端,然后我们进行解密
接下来我们操作一下,代码如下👇

1、工具类中添加解密方法

还是我们之前的WechatUtils,在里面添加getPhone方法


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
// vo实体类参数
import com.entity.TestEntityVO;
import com.utils.TestUtils;

import org.bouncycastle.util.encoders.Base64;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.util.TextUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.springframework.stereotype.Component;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.AlgorithmParameters;
import java.security.Security;
import java.util.*;

@Slf4j(topic = "WechatUtils")
@Component
public class WechatUtil {
	private static final String appId = "*****";
	private static final String secret = "********";

	/**
	 * 获取小程序code换取openid、session_key
	 *
	 * @param code
	 * @return
	 */
	public static JSONObject getOpenId(String code) {

		String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + appId
				+ "&secret=" + secret + "&js_code=" + code + "&grant_type=authorization_code";
		PrintWriter out = null;
		BufferedReader in = null;
		String line;
		StringBuffer stringBuffer = new StringBuffer();
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();

			// 设置通用的请求属性 设置请求格式
			//设置返回类型
			conn.setRequestProperty("contentType", "text/plain");
			//设置请求类型
			conn.setRequestProperty("content-type", "application/x-www-form-urlencoded");
			//设置超时时间
			conn.setConnectTimeout(1000);
			conn.setReadTimeout(1000);
			conn.setDoOutput(true);
			conn.connect();
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应    设置接收格式
			in = new BufferedReader(
					new InputStreamReader(conn.getInputStream(), "UTF-8"));
			while ((line = in.readLine()) != null) {
				stringBuffer.append(line);
			}
			JSONObject jsonObject = JSONObject.parseObject(stringBuffer.toString());
			return jsonObject;

		} catch (Exception e) {
			e.printStackTrace();
		}
		//使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return null;
	}
}

public static Map<String, Object> getPhoneNumber(TestEntityVO vo) {
		Map<String,Object> map=new HashMap<>();
		String openid= vo.getWechatOpenId();
		String session_key = vo.getSessionKey();
		if (!EmptyUtils.isEmpty(openid)) {

			if(EmptyUtils.isEmpty(session_key)){
				return null;
			}
			map.put("openid",openid);
			// 被加密的数据
			byte[] dataByte = Base64.decode(vo.getEncryptedData());
			// 加密秘钥
			byte[] keyByte = Base64.decode(session_key);
			// 偏移量
			byte[] ivByte = Base64.decode(vo.getIv());
			try {
				// 如果密钥不足16位,那么就补足. 这个if 中的内容很重要
				int base = 16;
				String result = null;
				if (keyByte.length % base != 0) {
					int groups = keyByte.length / base + (keyByte.length % base != 0 ? 1 : 0);
					byte[] temp = new byte[groups * base];
					Arrays.fill(temp, (byte) 0);
					System.arraycopy(keyByte, 0, temp, 0, keyByte.length);
					keyByte = temp;
				}
				// 初始化
				Security.addProvider(new BouncyCastleProvider());
				Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
				SecretKeySpec spec = new SecretKeySpec(keyByte, "AES");
				AlgorithmParameters parameters = AlgorithmParameters.getInstance("AES");
				parameters.init(new IvParameterSpec(ivByte));
				// 初始化
				cipher.init(Cipher.DECRYPT_MODE, spec, parameters);
				byte[] resultByte = cipher.doFinal(dataByte);
				if (null != resultByte && resultByte.length > 0) {
					result = new String(resultByte, "UTF-8");
					JSONObject jsonObject = JSONObject.parseObject(result);
					map.put("param",jsonObject);
					return map;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return null;
	}

2、业务逻辑层代码

service

public interface WxOperationService{
	TestEntity getCodeInfo(TestEntityVO vo);
	
	TestEntityDTO getCodeInfo(TestEntityVO vo);
}

impl实现类

@Override
	public TestEntityDTO getCodeInfo(TestEntityVO vo) throws CoBusinessException {
	TestEntityDTO dto = new TestEntityDTO ;
	Map<String, Object> map = WechatUtil.getPhoneNumber(param);
		if (EmptyUtils.isEmpty(map)) {
			throw new CoBusinessException(CoReturnFormat.WECHAT_ERROR);
		}
		String phone = "";
		Object phoneNumber = map.get("param");
		String jsonString = JSONObject.toJSONString(phoneNumber);
		JSONObject obj = JSONObject.parseObject(jsonString);
		if (!EmptyUtils.isEmpty(jsonString)) {
			phone = obj.get("phoneNumber").toString();
		}
		dto.setPhone(phone);
		return dto;
}

👆以上就是本次的笔记了,大家有需要用的自取,有用记得点个赞噢文章来源地址https://www.toymoban.com/news/detail-597932.html

到了这里,关于Java获取微信小程序code获取openid、session_key、unionid,获取授权信息解密获取手机号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序如何通过code拿到用户的openid?

    微信有一个静默登录,当进入小程序,页面加载完之后就会默认登录拿到code,这时候我们只需要将拿到的code去调后端的登录接口即可拿到用户的openid,openid在后续的开发中可能经常要用到,可以将其放到storage中,随用随拿

    2024年02月16日
    浏览(55)
  • uniapp开发微信小程序登录获取openid并解决code无效问题:invalid code

    场景: 实现微信支付的时候需要获取到openid,openid需要在登录的时候用登录返回的code获取 1.登录获取 code ,用code获取 openid 解决方法: 报错code无效:invalid code: 1.先在微信小程序管理平台找到APPID,这里的 https://mp.weixin.qq.com/wxamp/devprofile ; 2.检查项目的project.config.json的APP

    2024年02月11日
    浏览(55)
  • 微信小程序获取openid,微信小程序获取手机号

    工具类

    2024年02月16日
    浏览(53)
  • 微信小程序获取openId

    在微信小程序中,我们无法直接从客户端获取用户的openid,因为openid是保存在微信服务器上的。但是,我们可以通过微信提供的登录接口,使用用户授权登录的方式获取用户的openid。 具体步骤如下: 1. 在小程序中引入`wx.login`方法,调用该方法会返回一个`code`,这个`code`用于

    2024年02月15日
    浏览(47)
  • 微信小程序获取openid流程

    调用wx.login(OBJECT) 获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。 返回数据信息: { errMsg: 调用结果 code: 用户登录凭证(有效期五分钟)。开发者需要在开发

    2024年02月14日
    浏览(43)
  • Java后台实现网站微信扫码登录功能,获取用户openid,及微信用户信息(小程序码方案),关联微信小程序(个人主体小程序也可以)

    目录 前言 下面展示操作流程 注册微信小程序 通过后台获取小程序码 前端处理 时序图理解 方案实现步骤 前言 很多业务场景之下我们需要实现  微信扫码登录  的需求,如: 同步网站与小程序的用户数据 。 需要获取用户微信相关基本信息,如头像、id等 实例:小程序上的

    2024年02月02日
    浏览(54)
  • 【微信小程序】通过云函数获取用户openid

    1.pages同级目录下新建新文件夹,命名为cloudFunctions(其他名字也可以)。 2.project.config.json中添加以下内容,值为上一步创建的文件夹名字。编译一次后上一步创建的文件夹前图标就带“云”了。 3.app.js内的App中添加 1.右击cloudFunctions文件夹,点击【新建Node.js云函数】,命名为

    2024年02月10日
    浏览(56)
  • 微信小程序----API、获取openid、消息订阅

    https://www.w3xue.com/mobile/wxminiapp/hpm41q8p.html 基础: API,全称Application Programming Interface,即应用程序编程接口。 API 是一些预先定义函数,目的是用来提供应用程序与开发人员基于某软件或者某硬件得以访问一组例程的能力,并且无需访问源码或无需理解内部工作机制细节。 API

    2024年02月09日
    浏览(43)
  • uniapp写微信小程序,获取openId、unionId

    appId,secret   可以从微信公众平台获取,(点击右上角头像,向下滑,可以找到) 注意:这个一般写了app.vue里有个onlanch函数,否则有可能在进入小程序时获取不到openid 微信接口路径为 “https://api.weixin.qq.com/sns/jscode2session” 获取unionId的前提条件:微信开放平台绑定你的小程

    2024年02月13日
    浏览(52)
  • 微信小程序如何获取微信号的唯一标识(openid)

    1.获取微信登录凭证 2.登录凭证传回后端获取openid,前端直接调用接口获取openid正式上线代码审核过不去。 3.后端代码(直接返回的openid中含有secret,可发布,但是会提醒你存在安全漏洞,所以对openid进行截取拼接) 3.获取AppSecret和AppID 登录微信公众平台 开发——开发管理——开发

    2024年02月08日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包