java微信公眾號開發token驗證失敗的問題及解決辦法


本文引自http://m.blog.csdn.net/qq_32331997/article/details/72885424

 

微信公眾平台服務器配置時,需要引入token,但是提交的時候總是提示token驗證失敗,是因為微信后台並未檢測到你代碼中有驗證token的代碼,那么應該按照官方文檔對token進行驗證,驗證后再將結果返回微信公眾平台即可。

驗證的代碼為:

 1 public class SignUtil {
 2     
 3     private static String token = "WnbVm6GTQj4BPmLliSday4K";//這里是自定義的token,需和你提交的token一致
 4 
 5     /**
 6      * 校驗簽名
 7      * 
 8      * @param signature
 9      *            簽名
10      * @param timestamp
11      *            時間戳
12      * @param nonce
13      *            隨機數
14      * @return 布爾值
15      */
16     public static boolean checkSignature(String signature, String timestamp, String nonce) {
17         String checktext = null;
18         if (null != signature) {
19             // 對ToKen,timestamp,nonce 按字典排序
20             String[] paramArr = new String[] { token, timestamp, nonce };
21             Arrays.sort(paramArr);
22             // 將排序后的結果拼成一個字符串
23             String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
24 
25             try {
26                 MessageDigest md = MessageDigest.getInstance("SHA-1");
27                 // 對接后的字符串進行sha1加密
28                 byte[] digest = md.digest(content.toString().getBytes());
29                 checktext = byteToStr(digest);
30             } catch (NoSuchAlgorithmException e) {
31                 e.printStackTrace();
32             }
33         }
34         // 將加密后的字符串與signature進行對比
35         return checktext != null ? checktext.equals(signature.toUpperCase()) : false;
36     }
37 
38     /**
39      * 將字節數組轉化為16進制字符串
40      * 
41      * @param byteArrays
42      *            字符數組
43      * @return 字符串
44      */
45     private static String byteToStr(byte[] byteArrays) {
46         String str = "";
47         for (int i = 0; i < byteArrays.length; i++) {
48             str += byteToHexStr(byteArrays[i]);
49         }
50         return str;
51     }
52 
53     /**
54      * 將字節轉化為十六進制字符串
55      * 
56      * @param myByte
57      *            字節
58      * @return 字符串
59      */
60     private static String byteToHexStr(byte myByte) {
61         char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
62         char[] tampArr = new char[2];
63         tampArr[0] = Digit[(myByte >>> 4) & 0X0F];
64         tampArr[1] = Digit[myByte & 0X0F];
65         String str = new String(tampArr);
66         return str;
67     }
68 
69 }

 

提交時公眾平台會請求你的地址,並校驗你是否在后台做了驗證,驗證部分:

 1         if (StringUtils.isNotBlank(request.getParameter("signature"))) {
 2             String signature = request.getParameter("signature");
 3             String timestamp = request.getParameter("timestamp");
 4             String nonce = request.getParameter("nonce");
 5             String echostr = request.getParameter("echostr");
 6             LOGGER.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr);
 7             if (SignUtil.checkSignature(signature, timestamp, nonce)) {
 8                 LOGGER.info("數據源為微信后台,將echostr[{}]返回!", echostr);
 9                 response.getOutputStream().println(echostr);
10             }
11         }

 


免責聲明!

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



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