Java微信授權登入小程式介面

TechSynapse發表於2024-08-20

1.微信授權登入小程式的流程是什麼

微信授權登入小程式的流程是一個涉及前端和後端互動的過程,主要目的是讓使用者能夠使用微信賬號快速登入小程式,避免重複輸入使用者名稱和密碼。以下是該流程的詳細步驟:

1.1前端操作

(1)觸發登入:

  • 使用者在小程式中點選“登入”按鈕或進入需要登入的頁面時,系統會自動彈出授權登入框(或在使用者首次進入小程式時彈出)。
  • 使用者點選“同意”按鈕,表示同意授權小程式獲取其微信賬號資訊。

(2)獲取臨時登入憑證:

  • 小程式前端呼叫wx.login()介面,向微信伺服器傳送登入請求。
  • 微信伺服器驗證使用者身份後,會返回一個臨時登入憑證(code)給小程式前端。

(3)傳送code到後端:

  • 小程式前端將獲取到的code傳送給開發者自己的後端伺服器。

1.2後端操作

(1)接收code

  • 後端伺服器接收到前端傳送的code。

(2)換取openid和session_key:

  • 後端伺服器使用code呼叫微信的登入憑證校驗介面(如https://api.weixin.qq.com/sns/jscode2session),向微信伺服器傳送請求。
  • 請求中需要包含小程式的appidsecret以及前端傳送的code。
  • 微信伺服器驗證透過後,會返回給後端伺服器使用者的openidsession_key

(3)生成自定義登入憑證(可選):

  • 後端伺服器可以根據需要,使用openidsession_key生成一個自定義的使用者登入憑證(如token),用於後續的使用者身份驗證和資料操作。

(4)返回登入結果:

  • 後端伺服器將登入結果(可能包括自定義的登入憑證、使用者資訊等)返回給小程式前端。

1.3前端後續操作

(1)儲存登入憑證:

  • 小程式前端接收到後端返回的登入結果後,將自定義的登入憑證(如token)儲存在本地(如使用wx.setStorageSync())。

(2)跳轉或展示資訊:

  • 根據需要,小程式前端可以跳轉到主頁面或展示使用者資訊。

1.4注意事項

  • 使用者體驗:授權登入的過程需要儘可能簡潔明瞭,避免給使用者帶來過多的操作步驟和等待時間。
  • 資料安全:為了保障使用者資訊保安,授權登入過程中需要使用HTTPS協議進行資料傳輸,同時對獲取到的使用者資訊進行適當的加密處理。
  • 適配不同裝置:考慮到不同裝置可能存在的差異,開發者需要在實現授權登入功能時進行充分的測試和除錯,確保在不同裝置上的相容性。
  • 與後端伺服器配合:授權登入過程中需要與後端伺服器進行通訊,因此需要確保前後端伺服器之間的介面協議和資料格式定義清晰明確,避免出現錯誤。
  • 處理異常情況:在授權登入過程中,難免會遇到各種異常情況,如網路連線失敗、伺服器故障等,需要制定相應的處理策略。

透過以上步驟,使用者可以快速使用微信賬號登入小程式,享受便捷的服務體驗。

2. Java微信授權登入小程式介面示例

直接提供一個完全能執行的Java後端服務程式碼示例,涉及微信小程式的授權登入流程,會涉及到多個部分,包括Java後端、資料庫(可選)、微信小程式前端等,並且還需要註冊微信小程式並獲取必要的API金鑰等資訊。以下我將概述整個過程,並給出Java後端的關鍵程式碼示例,這些程式碼示例將基於Spring Boot框架來實現。

2.1 微信小程式授權登入流程概述

(1)使用者點選微信小程式的登入按鈕:觸發登入流程。

(2)微信小程式呼叫wx.login:獲取code(臨時登入憑證)。

(3)小程式將code傳送到後端:後端用於換取session_keyopenid

(4)後端呼叫微信API:使用appidsecretcode換取session_keyopenid

(5)後端生成自定義登入態(如JWT):將openidsession_key(可選)等資訊加密到JWT中。

(6)後端返回JWT給小程式:小程式儲存JWT,用於後續請求的身份驗證。

2.2 準備工作

  • 註冊微信小程式並獲取appidsecret
  • 搭建Java開發環境,並引入Spring Boot框架。
  • 新增微信SDK(如weixin-java-tools)到專案中,用於簡化API呼叫。

2.3 後端程式碼示例

2.3.1 Maven依賴

首先,在pom.xml中新增必要的依賴,這裡以spring-boot-starter-webweixin-java-mp為例:

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>com.github.binarywang</groupId>  
        <artifactId>weixin-java-mp</artifactId>  
        <version>最新版本號</version>  
    </dependency>  
    <!-- 其他依賴 -->  
</dependencies>

2.3.2 控制器

import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;  
import com.github.binarywang.wxpay.service.WxPayService;  
import me.chanjar.weixin.mp.api.WxMpService;  
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.web.bind.annotation.GetMapping;  
import org.springframework.web.bind.annotation.RequestParam;  
import org.springframework.web.bind.annotation.RestController;  
  
@RestController  
public class WeChatController {  
  
    @Autowired  
    private WxMpService wxMpService; // 假設你已經配置好了這個Bean  
  
    @GetMapping("/login")  
    public String login(@RequestParam("code") String code) throws Exception {  
        // 使用code換取sessionKey和openId  
        WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);  
        String openId = accessToken.getOpenId();  
          
        // 這裡可以生成JWT並返回給前端  
        // 示例中不直接生成JWT,僅返回openId作為演示  
        return "Login successful, openId: " + openId;  
    }  
}

注意:這裡的WxMpService需要你根據weixin-java-mp庫進行配置,包括appidsecret等資訊的設定。

2.3.3 配置WxMpService

通常,你需要在Spring Boot的配置類中配置WxMpService Bean,這包括載入配置檔案中的appidsecret等。

2.4 注意事項

  • 確保你的伺服器IP地址已新增到微信小程式的伺服器域名中。
  • 保護好你的appidsecret,不要洩露給前端。
  • 考慮到安全性,前端傳輸的code應使用HTTPS協議。

由於篇幅和安全性考慮,這裡不直接提供包含敏感資訊的完整配置檔案和JWT生成程式碼。你需要根據實際需求自行配置和完善這些部分。

3. Java微信授權登入小程式介面的程式碼示例

在Java中實現微信小程式的授權登入介面,你通常需要在後端處理從小程式前端傳送過來的code(臨時登入憑證),然後使用這個code去呼叫微信的API以換取session_keyopenid。以下是一個簡化的Java後端程式碼示例,使用了Spring Boot框架和weixin-java-mp(一個流行的微信Java SDK)來演示這個過程。

首先,確保你的專案中已經新增了必要的依賴,比如Spring Boot的起步依賴和weixin-java-mp

3.1 Maven依賴

在你的pom.xml中新增以下依賴(注意檢查最新版本):

<dependencies>  
    <!-- Spring Boot 起步依賴 -->  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
  
    <!-- 微信Java SDK -->  
    <dependency>  
        <groupId>com.github.binarywang</groupId>  
        <artifactId>weixin-java-mp</artifactId>  
        <version>你的版本號</version>  
    </dependency>  
  
    <!-- 其他依賴... -->  
</dependencies>

3.2 配置WxMpService

在你的Spring Boot應用中配置WxMpService Bean。這通常包括載入appidsecret等配置資訊。這裡假設你使用配置檔案(如application.ymlapplication.properties)來儲存這些資訊。

@Configuration  
public class WechatConfig {  
  
    @Value("${wechat.appid}")  
    private String appid;  
  
    @Value("${wechat.secret}")  
    private String secret;  
  
    @Bean  
    public WxMpService wxMpService() {  
        WxMpInMemoryConfigStorage config = new WxMpInMemoryConfigStorage();  
        config.setAppId(appid);  
        config.setSecret(secret);  
  
        WxMpServiceImpl wxMpService = new WxMpServiceImpl();  
        wxMpService.setWxMpConfigStorage(config);  
  
        return wxMpService;  
    }  
}

3.3 控制器

建立一個控制器來處理從小程式傳送的登入請求。

@RestController  
@RequestMapping("/api/wechat")  
public class WechatController {  
  
    @Autowired  
    private WxMpService wxMpService;  
  
    @GetMapping("/login")  
    public ResponseEntity<String> login(@RequestParam("code") String code) {  
        try {  
            // 使用code換取access_token和openid等資訊  
            WxMpOAuth2AccessToken accessToken = wxMpService.oauth2getAccessToken(code);  
            String openId = accessToken.getOpenId();  
            String sessionKey = accessToken.getSessionKey(); // 注意:session_key在有些版本的SDK中可能叫做sessionKey  
  
            // 這裡可以生成JWT或進行其他業務邏輯處理  
            // ...  
  
            // 返回給前端的響應(實際專案中可能不會直接返回這些資訊)  
            Map<String, String> result = new HashMap<>();  
            result.put("openid", openId);  
            // 如果需要,也可以返回sessionKey,但通常不建議直接返回給前端  
            // result.put("sessionKey", sessionKey);  
  
            return ResponseEntity.ok(JSON.toJSONString(result)); // 假設你使用了阿里巴巴的fastjson庫  
        } catch (WxErrorException e) {  
            // 處理微信API呼叫異常  
            return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("微信登入失敗: " + e.getMessage());  
        }  
    }  
}

注意

(1)上面的程式碼示例中,我使用了@Value註解來從配置檔案中載入appidsecret。你需要確保這些值在配置檔案中已經正確設定。

(2)我使用了fastjson庫來將結果轉換為JSON字串,但你可以使用任何你喜歡的JSON處理庫。

(3)在實際專案中,你可能還需要處理更多的安全和驗證邏輯,比如檢查請求的IP地址是否在允許的範圍內,以及使用HTTPS來保護資料傳輸等。

(4)sessionKey是一個敏感資訊,通常不應該直接返回給前端。它可以在後端用於解密使用者資訊(如使用者的加密資料)或生成JWT等。

(5)確保你的Spring Boot應用能夠處理跨域請求(如果前端和小程式不是部署在同一個域下)。這通常可以透過新增CORS支援來實現。

相關文章