首先看一下官方文檔
地址:微信小程序官方文檔API登錄接口
我們先對官方給的時序圖進行簡單的分析
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;
}
}