首先看一下官方文檔html
地址:微信小程序官方文檔API登陸接口java
咱們先對官方給的時序圖進行簡單的分析web
1.當小程序調用wx.login()時,會得到一個code(臨時登陸憑證),而後咱們須要用wx.request()將code發送到本身的服務器.spring
2.在服務器的接口中,調用登陸憑證校檢接口,將appid(小程序惟一標識)+appsecret(小程序的app secret)+code發送到微信接口服務.而後微信服務器會返回session_key(會話祕鑰)+openid(用戶的惟一標識).小程序
3.在服務器的接口中,已經獲得微信用戶的惟一標識openid,已經數據傳輸的session_key,接下來就寫業務邏輯了.微信小程序
4.返回給小程序自定義登陸態,小程序將它存入storage中.接下來的wx.request()的業務請求,都會攜帶自定義登陸態.api
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 |
參數 | 說明 |
---|---|
openid | 用戶惟一標識 |
session_key | 會話密鑰 |
參數 | 說明 |
---|---|
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; } }