1. 程式人生 > >微信小程式登入Java後臺介面(詳解,附示例程式碼)

微信小程式登入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 使用者在開放平臺的唯一識別符號

返回說明

  1. //正常返回的JSON資料包

  2. {

  3. "openid": "OPENID",

  4. "session_key": "SESSIONKEY",

  5. }

  6. //滿足UnionID返回條件時,返回的JSON資料包

  7. {

  8. "openid": "OPENID",

  9. "session_key": "SESSIONKEY",

  10. "unionid": "UNIONID"

  11. }

  12. //錯誤時返回JSON資料包(示例為Code無效)

  13. {

  14. "errcode": 40029,

  15. "errmsg": "invalid code"

  16. }

小程式登入示例程式碼

  1. //app.js

  2. App({

  3. onLaunch: function() {

  4. wx.login({

  5. success: function(res) {

  6. if (res.code) {

  7. //發起網路請求

  8. wx.request({

  9. url: 'https://test.com/onLogin',

  10. data: {

  11. code: res.code

  12. }

  13. })

  14. } else {

  15. console.log('登入失敗!' + res.errMsg)

  16. }

  17. }

  18. });

  19. }

  20. })

Java後臺介面示例程式碼

  1. package com.xx.action;  
  2. import java.util.Map;  
  3. import org.springframework.http.HttpMethod;  
  4. import org.springframework.http.HttpStatus;  
  5. import org.springframework.http.ResponseEntity;  
  6. import org.springframework.web.client.RestTemplate;  
  7. import com.google.gson.Gson;  
  8. import com.hp.bean.WeChatAppLoginReq;  
  9. import com.hp.bean.WeChatSession;  
  10. import com.opensymphony.xwork2.ActionSupport;  
  11. public class WeChatLogin extends ActionSupport{  
  12.     /** 
  13.      *author 李俊標 
  14.      *2018-4-19 
  15.          */  
  16.      private static final long serialVersionUID = 1L;  
  17.      private static final String APPID = "wx9xxxxxxxxxxx9b4";    
  18.      private static final String SECRET = "685742***************84xs859";    
  19.          private String code;  
  20.      public String getCode() {  
  21.         return code;  
  22.      }  
  23.      public void setCode(String code) {  
  24.         this.code = code;  
  25.      }  
  26.      //獲取憑證校檢介面  
  27.      public String login()    
  28.      {  
  29.          //微信的介面  
  30.          String url = "https://api.weixin.qq.com/sns/jscode2session?appid="+APPID+  
  31.                  "&secret="+SECRET+"&js_code="+ code +"&grant_type=authorization_code";  
  32.          RestTemplate restTemplate = new RestTemplate();  
  33.          //進行網路請求,訪問url介面  
  34.          ResponseEntity<String>  responseEntity = restTemplate.exchange(url, HttpMethod.GET, null, String.class);    
  35.          //根據返回值進行後續操作   
  36.          if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK)    
  37.             {  
  38.                 String sessionData = responseEntity.getBody();  
  39.                 Gson gson = new Gson();  
  40.                 //解析從微信伺服器獲得的openid和session_key;  
  41.                 WeChatSession weChatSession = gson.fromJson(sessionData,WeChatSession.class);  
  42.                 //獲取使用者的唯一標識  
  43.                 String openid = weChatSession.getOpenid();  
  44.                 //獲取會話祕鑰  
  45.                 String session_key = weChatSession.getSession_key();  
  46.                 //下面就可以寫自己的業務程式碼了  
  47.                 //最後要返回一個自定義的登入態,用來做後續資料傳輸的驗證  
  48.             }  
  49.          return null;   
  50.      }