Java解析微信獲取手機號資訊

TechSynapse發表於2024-06-22

在微信中,使用者手機號的獲取通常是透過微信小程式的getPhoneNumber介面來實現的。這個介面允許使用者在授權後,將加密的手機號資料傳遞給開發者。由於隱私保護,微信不會直接提供使用者的明文手機號,而是提供一個加密的手機號字串和相應的解密金鑰。

以下是一個基於Java的示例,展示瞭如何接收並解密從微信小程式傳遞過來的加密手機號資訊。

步驟 1: 微信小程式前端獲取手機號

在微信小程式前端,我們需要呼叫getPhoneNumber介面來獲取使用者的手機號資訊。這裡不展開微信小程式的程式碼,但基本流程是:

  1. wxml中新增一個按鈕,繫結點選事件到getPhoneNumber函式。
  2. 在對應的js檔案中實現getPhoneNumber函式,呼叫微信的wx.getPhoneNumber API。
  3. 使用者點選按鈕併成功授權後,微信會返回一個加密的手機號資料和相應的解密金鑰。

步驟 2: 後端Java程式碼解密手機號

後端Java程式碼需要完成以下任務:

  1. 接收前端傳遞的加密手機號資料和解密金鑰。
  2. 使用微信提供的解密演算法和金鑰來解密手機號。
  3. 返回解密後的手機號。

以下是一個簡化的Java示例,用於解密從微信小程式獲取的加密手機號:

import javax.crypto.Cipher;  
import javax.crypto.spec.IvParameterSpec;  
import javax.crypto.spec.SecretKeySpec;  
import java.nio.charset.StandardCharsets;  
import java.util.Base64;  
  
public class WeChatPhoneNumberDecrypter {  
  
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";  
  
    public static String decryptPhoneNumber(String encryptedData, String sessionKey, String iv) throws Exception {  
        // Base64 解碼  
        byte[] encryptedDataBytes = Base64.getDecoder().decode(encryptedData);  
        byte[] sessionKeyBytes = Base64.getDecoder().decode(sessionKey);  
        byte[] ivBytes = Base64.getDecoder().decode(iv);  
  
        // 設定AES金鑰和初始化向量  
        SecretKeySpec secretKeySpec = new SecretKeySpec(sessionKeyBytes, "AES");  
        IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes);  
  
        // 建立Cipher例項並初始化  
        Cipher cipher = Cipher.getInstance(ALGORITHM);  
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);  
  
        // 解密  
        byte[] decryptedBytes = cipher.doFinal(encryptedDataBytes);  
  
        // 將解密後的位元組轉換為字串  
        return new String(decryptedBytes, StandardCharsets.UTF_8);  
    }  
  
    public static void main(String[] args) {  
        try {  
            // 這些值通常從微信小程式前端獲取,並透過網路請求傳送到後端  
            String encryptedData = "..."; // 加密的手機號資料,從微信小程式獲取  
            String sessionKey = "..."; // 會話金鑰,從微信小程式獲取  
            String iv = "..."; // 初始化向量,從微信小程式獲取  
  
            // 解密手機號  
            String decryptedPhoneNumber = decryptPhoneNumber(encryptedData, sessionKey, iv);  
            System.out.println("解密後的手機號: " + decryptedPhoneNumber);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
}

注意事項

  1. encryptedDatasessionKeyiv通常是由微信小程式前端在獲取使用者手機號後透過網路請求傳送到後端的。這些值在每個請求中都是不同的。
  2. 確保我們的Java環境支援AES加密,並已正確配置。
  3. 解密後的資料是一個JSON字串,其中包含了使用者的手機號等資訊。我們可能需要使用JSON解析庫(如Jackson或Gson)來進一步處理這些資料。
  4. 出於安全考慮,務必確保我們的後端服務是安全的,以防止潛在的攻擊和資料洩露。
  5. 由於微信的API和策略可能會發生變化,建議經常檢視微信官方文件以獲取最新資訊。

相關文章