前言:
在做小程序的開發時需要獲取用戶的openId用來做唯一標識,來獲取對應用戶的相關數據
官方的文檔說明上有四個必須傳的參數
其中appId和appSecret可在自己的微信公眾號平台上獲取,同時這些也是屬於私密信息,應該妥善保管的,因為微信手機客戶端是很容易反編譯獲取到這些信息的,所以在前端的ajax請求將這些參數傳到后台是不可取的,最好的方式是將這兩個參數在后台傳入,然后發送請求至官方接口
1.Http請求工具類

package com.btw.util; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.PrintWriter; import java.io.Reader; import java.net.HttpURLConnection; import java.net.ProtocolException; import java.net.URL; import java.util.Map; public class HttpUtil { /** * 請求類型: GET */ public final static String GET = "GET"; /** * 請求類型: POST */ public final static String POST = "POST"; /** * 模擬Http Get請求 * @param urlStr * 請求路徑 * @param paramMap * 請求參數 * @return * @throws Exception */ public static String get(String urlStr, Map<String, String> paramMap) throws Exception{ urlStr = urlStr + "?" + getParamString(paramMap); HttpURLConnection conn = null; try{ //創建URL對象 URL url = new URL(urlStr); //獲取URL連接 conn = (HttpURLConnection) url.openConnection(); //設置通用的請求屬性 setHttpUrlConnection(conn, GET); //建立實際的連接 conn.connect(); //獲取響應的內容 return readResponseContent(conn.getInputStream()); }finally{ if(null!=conn) conn.disconnect(); } } /** * 模擬Http Post請求 * @param urlStr * 請求路徑 * @param paramMap * 請求參數 * @return * @throws Exception */ public static String post(String urlStr, Map<String, String> paramMap) throws Exception{ HttpURLConnection conn = null; PrintWriter writer = null; try{ //創建URL對象 URL url = new URL(urlStr); //獲取請求參數 String param = getParamString(paramMap); //獲取URL連接 conn = (HttpURLConnection) url.openConnection(); //設置通用請求屬性 setHttpUrlConnection(conn, POST); //建立實際的連接 conn.connect(); //將請求參數寫入請求字符流中 writer = new PrintWriter(conn.getOutputStream()); writer.print(param); writer.flush(); //讀取響應的內容 return readResponseContent(conn.getInputStream()); }finally{ if(null!=conn) conn.disconnect(); if(null!=writer) writer.close(); } } /** * 讀取響應字節流並將之轉為字符串 * @param in * 要讀取的字節流 * @return * @throws IOException */ private static String readResponseContent(InputStream in) throws IOException{ Reader reader = null; StringBuilder content = new StringBuilder(); try{ reader = new InputStreamReader(in); char[] buffer = new char[1024]; int head = 0; while( (head=reader.read(buffer))>0 ){ content.append(new String(buffer, 0, head)); } return content.toString(); }finally{ if(null!=in) in.close(); if(null!=reader) reader.close(); } } /** * 設置Http連接屬性 * @param conn * http連接 * @return * @throws ProtocolException * @throws Exception */ private static void setHttpUrlConnection(HttpURLConnection conn, String requestMethod) throws ProtocolException{ conn.setRequestMethod(requestMethod); conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("Accept-Language", "zh-CN"); conn.setRequestProperty("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)"); conn.setRequestProperty("Proxy-Connection", "Keep-Alive"); if(null!=requestMethod && POST.equals(requestMethod)){ conn.setDoOutput(true); conn.setDoInput(true); } } /** * 將參數轉為路徑字符串 * @param paramMap * 參數 * @return */ private static String getParamString(Map<String, String> paramMap){ if(null==paramMap || paramMap.isEmpty()){ return ""; } StringBuilder builder = new StringBuilder(); for(String key : paramMap.keySet() ){ builder.append("&") .append(key).append("=").append(paramMap.get(key)); } return builder.deleteCharAt(0).toString(); } }
其中請求參數已經封裝成map的形式,非常方便
2.請求接口
在這個接口我們只需要接收一個code的參數,然后用String類型接收Util類返回的數據即可,其中的url為官方接口地址

package com.btw.controller; import com.btw.util.AppConstant; import com.btw.util.HttpUtil; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/system") public class SecretController { @RequestMapping(value = "/getOpenId",method = RequestMethod.GET) public String getOpenid(HttpServletRequest request,HttpServletResponse response, @RequestParam String code){ Map<String,String> paramMap=new HashMap<>(); paramMap.put("appid", AppConstant.AppId); paramMap.put("secret",AppConstant.AppSecret); paramMap.put("js_code",code); paramMap.put("grant_type","authorization_code"); String url="https://api.weixin.qq.com/sns/jscode2session"; String res=null; try { res=HttpUtil.post(url,paramMap); } catch (Exception e) { e.printStackTrace(); } return res; } }
3.前端Ajax請求