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
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83682.shtml
英文地址,請注明出處:http://en.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不存在的…