2025 Java 微信小程序根据code获取openid,二次code获取手机号【工具类】拿来就用

一、controller调用 


/*** 登录** @author jiaketao* @since 2024-04-10*/
@RestController
@RequestMapping("/login")
public class LoginController {/*** 【小程序】登录获取session_key和openid** @param code 前端传code* @return*/@GetMapping("/getWXSessionKey")public 自己的业务返回体 getWXSessionKey(String code) {//根据前端传来的code,调用微信的接口获取到当前用户的openidJSONObject jsonObject = WeChatLoginUtils.getWXSessionKey(code);String openId = jsonObject.getString("openid");//自己的业务逻辑...    }/*** 【小程序】获取手机号** @param code 第二次的code* @return*/@GetMapping("/getWXPhoneInfo")public String getWXPhoneInfo(String code) throws IOException {return  WeChatLoginUtils.getWXPhoneInfo(code).getJSONObject("phone_info").getString("phoneNumber");}}

二、封装的工具类

 1、微信登录核心工具类:WeChatLoginUtils

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;import java.io.IOException;/*** 微信小程序登录工具类** @author jiaketao* @since 2024-04-10*/
public class WeChatLoginUtils {/*** 1.获取session_key** @param code 微信小程序的第一个code* @return*/public static JSONObject getWXSessionKey(String code) {String urlResult = HttpRequestUrlUtil.httpGet("https://api.weixin.qq.com/sns/jscode2session?appid=" + WxConstUtils.WX_OPEN_APPLET_APPID + "&secret=" + WxConstUtils.WX_OPEN_APPLET_SECRET + "&js_code=" + code + "&grant_type=authorization_code");// 转为jsonJSONObject jsonObject = JSON.parseObject(urlResult);return jsonObject;}/*** 2.获取access_token** @return*/public static JSONObject getWXAccessToken() {String urlResult = HttpRequestUrlUtil.httpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + WxConstUtils.WX_OPEN_APPLET_APPID + "&secret=" + WxConstUtils.WX_OPEN_APPLET_SECRET);// 转为jsonJSONObject jsonObject = JSON.parseObject(urlResult);return jsonObject;}/*** 获取手机号** @param code 微信小程序的第2个code* @return*/public static JSONObject getWXPhoneInfo(String code) throws IOException {// 调用 2.获取access_tokenString access_token = getWXAccessToken().getString("access_token");String getPhoneNumberUrl = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=" + access_token;JSONObject json = new JSONObject();json.put("code", code);// post请求json = HttpRequestUrlUtil.postResponse(getPhoneNumberUrl, json);return json;}}

2、配置文件:WxConstUtils

import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** 微信登录支付相关字段工具类** @author zhaoyan* @since 2024-04-10*/
@Component
public class WxConstUtils implements InitializingBean {// 小程序 appidpublic static String WX_OPEN_APPLET_APPID;// 小程序 secret密钥public static String WX_OPEN_APPLET_SECRET;// 商户号public static String WX_OPEN_MCHID;// 密钥keypublic static String WX_OPEN_KEY;//从配置文件获取以上内容的配置值// 小程序appid@Value("${wx.open.applet.app_id}")private String appletAppId;//小程序 secret密钥@Value("${wx.open.applet.secret}")private String appletSecret;// 商户号@Value("${wx.open.mch_id}")private String mchId;// 密钥key@Value("${wx.open_key}")private String key;@Overridepublic void afterPropertiesSet() throws Exception {WX_OPEN_APPLET_APPID = appletAppId;WX_OPEN_APPLET_SECRET = appletSecret;WX_OPEN_MCHID = mchId;WX_OPEN_KEY = key;}
}

3、http请求工具类:HttpRequestUrlUtil

import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;/*** http请求** @author jiaketao* @since 2024-04-10*/
public class HttpRequestUrlUtil {/*** post请求** @param url* @param object* @return*/public static String httpPost(String url, JSONObject object) {String result = "";// 使用CloseableHttpClient和CloseableHttpResponse保证httpcient被关闭CloseableHttpClient httpClient;CloseableHttpResponse response;HttpPost httpPost;UrlEncodedFormEntity entity;try {httpClient = HttpClients.custom().build();List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();Set<String> keySets = object.keySet();Iterator<String> keys = keySets.iterator();while (keys.hasNext()) {String key = keys.next();nameValuePairs.add(new BasicNameValuePair(key, object.getString(key)));}entity = new UrlEncodedFormEntity(nameValuePairs, "utf-8");httpPost = new HttpPost(url);httpPost.setEntity(entity);//设置超时时间RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(10000).build();httpPost.setConfig(requestConfig);response = httpClient.execute(httpPost);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {result = EntityUtils.toString(response.getEntity());}} catch (ClientProtocolException e) {} catch (IOException e) {} catch (Exception e) {} finally {}return result;}/*** get请求** @param url* @return*/public static String httpGet(String url) {String result = "";// 使用CloseableHttpClient和CloseableHttpResponse保证httpcient被关闭CloseableHttpClient httpClient = null;CloseableHttpResponse response = null;try {httpClient = HttpClients.custom().build();response = httpClient.execute(new HttpGet(url));if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {result = EntityUtils.toString(response.getEntity());}} catch (ClientProtocolException e) {} catch (IOException e) {} catch (Exception e) {} finally {}return result;}/*** post请求封装 参数为?a=1&b=2&c=3** @param path 接口地址* @param Info 参数* @return* @throws IOException*/public static JSONObject postResponse(String path, String Info) throws IOException {//1, 得到URL对象URL url = new URL(path);//2, 打开连接HttpURLConnection conn = (HttpURLConnection) url.openConnection();//3, 设置提交类型conn.setRequestMethod("POST");//4, 设置允许写出数据,默认是不允许 falseconn.setDoOutput(true);conn.setDoInput(true);//当前的连接可以从服务器读取内容, 默认是true//5, 获取向服务器写出数据的流OutputStream os = conn.getOutputStream();//参数是键值队  , 不以"?"开始os.write(Info.getBytes());//os.write("googleTokenKey=&username=admin&password=5df5c29ae86331e1b5b526ad90d767e4".getBytes());os.flush();//6, 获取响应的数据//得到服务器写回的响应数据BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "utf-8"));String str = br.readLine();JSONObject json = JSONObject.parseObject(str);System.out.println("响应内容为:  " + json);return json;}/*** post请求封装 参数为{"a":1,"b":2,"c":3}** @param path 接口地址* @param Info 参数* @return* @throws IOException*/public static JSONObject postResponse(String path, JSONObject Info) throws IOException {HttpClient client = new DefaultHttpClient();HttpPost post = new HttpPost(path);post.setHeader("Content-Type", "application/json");post.addHeader("Authorization", "Basic YWRtaW46");String result = "";try {StringEntity s = new StringEntity(Info.toString(), "utf-8");s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));post.setEntity(s);// 发送请求HttpResponse httpResponse = client.execute(post);// 获取响应输入流InputStream inStream = httpResponse.getEntity().getContent();BufferedReader reader = new BufferedReader(new InputStreamReader(inStream, "utf-8"));StringBuilder strber = new StringBuilder();String line = null;while ((line = reader.readLine()) != null)strber.append(line + "\n");inStream.close();result = strber.toString();System.out.println(result);if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {System.out.println("请求服务器成功,做相应处理");} else {System.out.println("请求服务端失败");}} catch (Exception e) {System.out.println("请求异常");throw new RuntimeException(e);}return JSONObject.parseObject(result);}
}

三、maven依赖:pom.xml

<!--  导入Json格式化依赖 -->
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version>
</dependency><!--  导入Apache HttpClient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.14</version>
</dependency><!-- Spring Boot Starter (包含 Spring Core, Spring Beans, Spring Context 等) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId><version>2.7.18</version> <!-- 或使用最新版本 -->
</dependency><!-- 如果需要 @Value 注解读取配置文件 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-config</artifactId><version>2.7.18</version>
</dependency>

四、配置文件:application.properties

#wechat  Config
wx.open.applet.app_id=自己的appid
wx.open.applet.secret=自己的secret密钥
#wx.open.applet.sub_app_id=
wx.open.mch_id=
wx.open_key=
wx.open.sub_mch_id=

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/diannao/83682.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件架构风格系列(3):管道 - 过滤器架构

文章目录 前言一、从生活场景到架构原理&#xff0c;看懂管道 - 过滤器的核心逻辑&#xff08;一&#xff09;什么是管道 - 过滤器架构&#xff1f;&#xff08;二&#xff09;核心组件拆解 二、架构设计图&#xff1a;一图看懂管道 - 过滤器架构全貌三、Java 示例代码&#xf…

【VIM】vim 常用命令

文章目录 插入模式光标移动拷贝/粘贴/删除/撤销块操作分屏代码缩进命令组合使用其他PowerVim 前言&#xff1a;本文内容大部分摘抄自酷壳和博客园   –   CoolShell – 陈皓   博客园 – 易先讯 插入模式 a → 在光标后插入o → 在当前行后插入一个新行O → 在当前行前插…

polarctf-web-[简单rce]

考点&#xff1a; (1)RCE(eval函数) (2)执行函数(passthru函数) (3)/顶级(根)目录查看 (4)sort排序查看函数 题目来源&#xff1a;Polarctf-web-[简单rce] 解题&#xff1a; 代码审计 <?php/*​PolarD&N CTF​*/highlight_file(__FILE__);function no($txt){ # …

HarmonyOs开发之———使用HTTP访问网络资源

谢谢关注&#xff01;&#xff01; 前言&#xff1a;上一篇文章主要介绍HarmonyOs开发之———Video组件的使用:HarmonyOs开发之———Video组件的使用_华为 video标签查看-CSDN博客 HarmonyOS 网络开发入门&#xff1a;使用 HTTP 访问网络资源 HarmonyOS 作为新一代智能终端…

Vue 图片预览功能(含缩略图)

众所周知&#xff0c;常见的组件库如Element、Ant Design&#xff0c;自带的图片预览功能都没有缩略图&#xff0c;所以 需要单独封装一个图片预览的服务。 第三方库&#xff1a;v-viewer 安装&#xff1a; npm install v-viewer viewerjs 若使用报错&#xff0c;可安装指定…

手写tomcat:基本功能实现(4)

逻辑架构 HTTP 请求与 Socket&#xff1a; 左侧的 “HTTP 请求” 箭头指向 “socket”&#xff0c;表示客户端发送的 HTTP 请求通过 socket 传输到服务器。Socket 负责接收请求&#xff0c;并提取出其中的 请求路径&#xff08;如 /first&#xff09;和 请求方法&#xff08;如…

jvm安全点(一)openjdk17 c++源码垃圾回收安全点信号函数处理线程阻塞

1. 信号处理入口​​ ​​JVM_HANDLE_XXX_SIGNAL​​ 是 JVM 处理信号的统一入口&#xff0c;负责处理 SIGSEGV、SIGBUS 等信号。​​javaSignalHandler​​ 是实际注册到操作系统的信号处理函数&#xff0c;直接调用 JVM_HANDLE_XXX_SIGNAL。 ​​2. 安全点轮询页的识别​​ …

微信小程序:封装表格组件并引用

一、效果 封装表格组件,在父页面中展示表格组件并显示数据 二、表格组件 1、创建页面 创建一个components文件夹,专门用于存储组件的文件夹 创建Table表格组件 2、视图层 (1)表头数据 这里会从父组件中传递表头数据,这里为columns,后续会讲解数据由来 循环表头数组,…

【FMC216】基于 VITA57.1 的 2 路 TLK2711 发送、2 路 TLK2711 接收 FMC 子卡模块

产品概述 FMC216 是一款基于 VITA57.1 标准规范的 2 路 TLK2711 接收、2 路 TLK2711 发送 FMC 子卡模块。该板卡支持 2 路 TLK2711 数据的收发&#xff0c;支持线速率 1.6Gbps&#xff0c;经过 TLK2711 高速串行收发器&#xff0c;可以将 1.6Gbps 的高速串行数据解串为 16 位并…

K8S Gateway API 快速开始、胎教级教程

假设有如下三个节点的 K8S 集群&#xff1a; ​​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、Gateway 是什么 背景和目的 入口&#xff08;Ingress&#xff09;目前已停止更新。新的功能正在集成至网关 API 中。在 Kubernetes …

时序数据库IoTDB分布式架构解析与运维指南

一、IoTDB分布式架构概述 分布式系统由一组独立的计算机组成&#xff0c;通过网络通信&#xff0c;对外表现为一个统一的整体。IoTDB的原生分布式架构将服务分为两个核心部分&#xff1a; ‌ConfigNode&#xff08;CN&#xff09;‌&#xff1a;管理节点&#xff0c;负责管理…

Ubuntu 20.04 LTS 中部署 网页 + Node.js 应用 + Nginx 跨域配置 的详细步骤

Ubuntu 20.04 LTS 中部署 网页 Node.js 应用 Nginx 跨域配置 的详细步骤 一、准备工作1、连接服务器2、更新系统 二、安装 Node.js 环境1、安装 Node.js 官方 PPA&#xff08;用于获取最新稳定版&#xff09;&#xff1a;2、安装 Node.js 和 npm&#xff08;LTS 长期支持版本…

3DVR制作的工具或平台

3DVR&#xff08;三维虚拟现实&#xff09;是利用三维图像技术和虚拟现实技术&#xff0c;将真实场景进行三维扫描并转换成计算机可识别的三维模型&#xff0c;使用户能够在虚拟空间中自由漫游&#xff0c;体验身临其境的感觉。3DVR技术结合了全景拍摄和虚拟现实&#xff0c;提…

垂直智能体:企业AI落地的正确打开方式

在当前AI浪潮中&#xff0c;许多企业急于跟进&#xff0c;推出自己的AI智能体解决方案。然而&#xff0c;市场上大量出现的"万能型"智能体却鲜有真正解决实际问题的产品。本文将探讨为何企业应该专注于开发垂直领域智能体&#xff0c;而非追求表面上的全能&#xff0…

软件工程各种图总结

目录 1.数据流图 2.N-S盒图 3.程序流程图 4.UML图 UML用例图 UML状态图 UML时序图 5.E-R图 首先要先了解整个软件生命周期&#xff1a; 通常包含以下五个阶段&#xff1a;需求分析-》设计-》编码 -》测试-》运行和维护。 软件工程中应用到的图全部有&#xff1a;系统…

王者荣耀游戏测试场景题

如何测试一个新英雄&#xff1a;方法论与实践维度 测试一个新英雄不仅仅是“打打打”&#xff0c;而是一套完整的测试流程&#xff0c;包括设计文档验证、功能验证、数值验证、性能验证、交互验证等。可以从以下多个角度展开&#xff1a; &#x1f50d; 1. 方法论维度 ✅ 测试…

第四天的尝试

目录 一、每日一言 二、练习题 三、效果展示 四、下次题目 五、总结 一、每日一言 很抱歉的说一下&#xff0c;我昨天看白色巨塔电视剧&#xff0c;看的入迷了&#xff0c;同时也看出一些道理&#xff0c;学到东西&#xff1b; 但是把昨天的写事情给忘记了&#xff0c;今天…

多模态大语言模型arxiv论文略读(七十八)

AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ➡️ 论文标题&#xff1a;AID: Adapting Image2Video Diffusion Models for Instruction-guided Video Prediction ➡️ 论文作者&#xff1a;Zhen Xing, Qi Dai, Zejia Weng, Zuxuan W…

优化 Spring Boot 应用启动性能的实践指南

1. 引言 Spring Boot 以其“开箱即用”的特性深受开发者喜爱,但随着项目复杂度的增加,应用的启动时间也可能会变得较长。对于云原生、Serverless 等场景而言,快速启动是一个非常关键的指标。 2. 分析启动过程 2.1 启动阶段概述 Spring Boot 的启动流程主要包括以下几个阶…

Ubuntu下配置VScode出现#include错误请更新includePath的解决方法

首先Ubuntu新手小白一定要先安装g&#xff0c;安装方法是&#xff1a; 在桌面右键打开终端&#xff0c;输入&#xff1a;sudo apt-get install g 安装好g之后&#xff0c;在vscode终端输入&#xff1a;g -v -E -x c - 输出这些路径&#xff0c;复制 如果还存在显示cout不存在的…