微信小程序啟用消息推送 驗證token


  剛剛開始處理處理小程序消息推送的時候有點懵,處理完之后也是豁然開朗,所以貼上代碼給大家分享。說明一下,我用的是SpringBoot。

       實現功能分別用了三個類:1、entity:WeChatMessage.java、2、controller:WeChatMessageController.java、3、service:WeCharMessageService.java

直接上代碼: 首先是entity

  

 1 public class WeChatMessage {
 2     
 3     //微信加密簽名,signature結合了開發者填寫的token參數和請求中的timestamp參數、nonce參數
 4     private String signature;
 5     
 6     //時間戳
 7     private String timestamp;
 8     
 9     //隨機數
10     private String nonce;
11     
12     //隨機字符串
13     private String echostr;
14 
15     public String getSignature() {
16         return signature;
17     }
18 
19     public void setSignature(String signature) {
20         this.signature = signature;
21     }
22 
23     public String getTimestamp() {
24         return timestamp;
25     }
26 
27     public void setTimestamp(String timestamp) {
28         this.timestamp = timestamp;
29     }
30 
31     public String getNonce() {
32         return nonce;
33     }
34 
35     public void setNonce(String nonce) {
36         this.nonce = nonce;
37     }
38 
39     public String getEchostr() {
40         return echostr;
41     }
42 
43     public void setEchostr(String echostr) {
44         this.echostr = echostr;
45     }
46     
47 }

  其次是controller

@RestController
public class WeChatMessageController {
    
    @Autowired
    private WeChatMessageService service;
    
    @RequestMapping(value="/getMessage.do", method=RequestMethod.GET)
    public String getMessage(WeChatMessage message) {
        
        return service.checkSignature(message);
    }
}

  最后是service:

@Service
public class WeChatMessageService {

    public String checkSignature(WeChatMessage message) {
        String signature = message.getSignature();
        String timestamp = message.getTimestamp();
        String nonce = message.getNonce();

        String token = "XXXXXXX"; //必須與請求參數中的token一致
        
        //將token、timestamp、nonce三個參數進行字典排序
        String[] arr = new String[] {token, timestamp, nonce};
        Arrays.sort(arr);

        StringBuilder content = new StringBuilder();  
        for (int i = 0; i < arr.length; i++) {  
            content.append(arr[i]);  
        }

        MessageDigest md = null;  
        String tmpStr = null;  

        try {  
            md = MessageDigest.getInstance("SHA-1");  
            // 將三個參數字符串拼接成一個字符串進行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest); 
        } catch (NoSuchAlgorithmException e) {  
            e.printStackTrace();  
        }  
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) ? message.getEchostr() : "" : "";
    }

    /**
     * 將字節數組轉換為十六進制字符串
     * @param byteArray
     * @return
     */
    private String byteToStr(byte[] byteArray) {
        String strDigest = "";  
        for (int i = 0; i < byteArray.length; i++) {  
            strDigest += byteToHexStr(byteArray[i]);  
        }  
        return strDigest;
    }

    /**
     * 將字節轉換為十六進制字符串
     * @param mByte
     * @return
     */
    private String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };  
        char[] tempArr = new char[2];  
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];  
        tempArr[1] = Digit[mByte & 0X0F];  

        String s = new String(tempArr);  
        return s;  
    }
}

以上代碼親測可用,有不好的地方請朋友們多多指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM