微信小程式登入Java後臺介面(詳解,附示例程式碼)
首先看一下官方文件
我們先對官方給的時序圖進行簡單的分析
1.當小程式呼叫wx.login()時,會獲得一個code(臨時登入憑證),然後我們需要用wx.request()將code傳送到自己的伺服器.
2.在伺服器的介面中,呼叫登入憑證校檢介面,將appid(小程式唯一標識)+appsecret(小程式的app secret)+code傳送到微信介面服務.然後微信伺服器會返回session_key(會話祕鑰)+openid(使用者的唯一標識).
3.在伺服器的介面中,已經得到微信使用者的唯一標識openid,已經資料傳輸的session_key,接下來就寫業務邏輯了.
4.返回給小程式自定義登入態,小程式將它存入storage中.接下來的wx.request()的業務請求,都會攜帶自定義登入態.
5.在伺服器的介面中通過自定義登入態查詢openid和session_key,然後返回業務資料.
劃一下重點
在伺服器的介面中,需要進行一個http請求,將從小程式獲得的code和介面中儲存的appid和secret傳送給微信介面服務,然後就可以獲得session_key和openid.
介面地址
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
請求引數
引數 | 必填 | 說明 |
---|---|---|
appid | 是 | 小程式唯一標識 |
secret | 是 | 小程式的 app secret |
js_code | 是 | 登入時獲取的 code |
grant_type | 是 | 填寫為 authorization_code |
在不滿足UnionID下發條件的情況下,返回引數
引數 | 說明 |
---|---|
openid | 使用者唯一標識 |
session_key | 會話金鑰 |
在滿足UnionID下發條件的情況下,返回引數
引數 | 說明 |
---|---|
openid | 使用者唯一標識 |
session_key | 會話金鑰 |
unionid | 使用者在開放平臺的唯一識別符號 |
返回說明
-
//正常返回的JSON資料包
-
{
-
"openid": "OPENID",
-
"session_key": "SESSIONKEY",
-
}
-
//滿足UnionID返回條件時,返回的JSON資料包
-
{
-
"openid": "OPENID",
-
"session_key": "SESSIONKEY",
-
"unionid": "UNIONID"
-
}
-
//錯誤時返回JSON資料包(示例為Code無效)
-
{
-
"errcode": 40029,
-
"errmsg": "invalid code"
-
}
小程式登入示例程式碼
-
//app.js
-
App({
-
onLaunch: function() {
-
wx.login({
-
success: function(res) {
-
if (res.code) {
-
//發起網路請求
-
wx.request({
-
url: 'https://test.com/onLogin',
-
data: {
-
code: res.code
-
}
-
})
-
} else {
-
console.log('登入失敗!' + res.errMsg)
-
}
-
}
-
});
-
}
-
})
Java後臺介面示例程式碼
- package com.xx.action;
- import java.util.Map;
- import org.springframework.http.HttpMethod;
- import org.springframework.http.HttpStatus;
- import org.springframework.http.ResponseEntity;
- import org.springframework.web.client.RestTemplate;
- import com.google.gson.Gson;
- import com.hp.bean.WeChatAppLoginReq;
- import com.hp.bean.WeChatSession;
- import com.opensymphony.xwork2.ActionSupport;
- public class WeChatLogin extends ActionSupport{
- /**
- *author 李俊標
- *2018-4-19
- */
- private static final long serialVersionUID = 1L;
- private static final String APPID = "wx9xxxxxxxxxxx9b4";
- private static final String SECRET = "685742***************84xs859";
- private String code;
- public String getCode() {
- return code;
- }
- public void setCode(String code) {
- this.code = code;
- }
- //獲取憑證校檢介面
- public String login()
- {
- //微信的介面
- String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+APPID+
- "&secret="+SECRET+"&js_code="+ code +"&grant_type=authorization_code";
- RestTemplate restTemplate = new RestTemplate();
- //進行網路請求,訪問url介面
- ResponseEntity<String> responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
- //根據返回值進行後續操作
- if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK)
- {
- String sessionData = responseEntity.getBody();
- Gson gson = new Gson();
- //解析從微信伺服器獲得的openid和session_key;
- WeChatSession weChatSession = gson.fromJson(sessionData,WeChatSession.class);
- //獲取使用者的唯一標識
- String openid = weChatSession.getOpenid();
- //獲取會話祕鑰
- String session_key = weChatSession.getSession_key();
- //下面就可以寫自己的業務程式碼了
- //最後要返回一個自定義的登入態,用來做後續資料傳輸的驗證
- }
- return null;
- }