關于微信平臺的后臺接入,官方已經提供了php示例的下載,對于java這塊后臺接入,暫時還沒有一個完整的案例可以拿來直接使用,我寫了一個java版本的demo便于大家使用。
一、前期準備
項目是用maven構建,直接導入到eclipse即可,jdk的版本為1.8.0_111 ,這兩項都可以根據實際需求進行修改,最終達成war發布到服務器中即可。
二、實戰演練
操作前,先閱讀一下官方的文檔,先整體有個思路流程,官方地址參考
1.設置成開發者模式:
登錄微信公眾平臺后臺后,點「功能」-「高級功能」-「開發模式」,進入開發模式,如果公眾平臺顯示「尚未成為開發者」,就點擊「成為開發者」
2.填寫服務器配置:
點「開發」-「基本配置」-「填寫服務器配置」如圖1~如3
圖1
圖2
圖3
3.示例代碼:
sha1.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
|
package com.dqiang.demo; public class sha1 { private final int [] abcde = { 0x67452301 , 0xefcdab89 , 0x98badcfe , 0x10325476 , 0xc3d2e1f0 }; // 摘要數據存儲數組 private int [] digestint = new int [ 5 ]; // 計算過程中的臨時數據存儲數組 private int [] tmpdata = new int [ 80 ]; // 計算sha-1摘要 private int process_input_bytes( byte [] bytedata) { // 初試化常量 system.arraycopy(abcde, 0 , digestint, 0 , abcde.length); // 格式化輸入字節數組,補10及長度數據 byte [] newbyte = bytearrayformatdata(bytedata); // 獲取數據摘要計算的數據單元個數 int mcount = newbyte.length / 64 ; // 循環對每個數據單元進行摘要計算 for ( int pos = 0 ; pos < mcount; pos++) { // 將每個單元的數據轉換成16個整型數據,并保存到tmpdata的前16個數組元素中 for ( int j = 0 ; j < 16 ; j++) { tmpdata[j] = bytearraytoint(newbyte, (pos * 64 ) + (j * 4 )); } // 摘要計算函數 encrypt(); } return 20 ; } // 格式化輸入字節數組格式 private byte [] bytearrayformatdata( byte [] bytedata) { // 補0數量 int zeros = 0 ; // 補位后總位數 int size = 0 ; // 原始數據長度 int n = bytedata.length; // 模64后的剩余位數 int m = n % 64 ; // 計算添加0的個數以及添加10后的總長度 if (m < 56 ) { zeros = 55 - m; size = n - m + 64 ; } else if (m == 56 ) { zeros = 63 ; size = n + 8 + 64 ; } else { zeros = 63 - m + 56 ; size = (n + 64 ) - m + 64 ; } // 補位后生成的新數組內容 byte [] newbyte = new byte [size]; // 復制數組的前面部分 system.arraycopy(bytedata, 0 , newbyte, 0 , n); // 獲得數組append數據元素的位置 int l = n; // 補1操作 newbyte[l++] = ( byte ) 0x80 ; // 補0操作 for ( int i = 0 ; i < zeros; i++) { newbyte[l++] = ( byte ) 0x00 ; } // 計算數據長度,補數據長度位共8字節,長整型 long n = ( long ) n * 8 ; byte h8 = ( byte ) (n & 0xff ); byte h7 = ( byte ) ((n >> 8 ) & 0xff ); byte h6 = ( byte ) ((n >> 16 ) & 0xff ); byte h5 = ( byte ) ((n >> 24 ) & 0xff ); byte h4 = ( byte ) ((n >> 32 ) & 0xff ); byte h3 = ( byte ) ((n >> 40 ) & 0xff ); byte h2 = ( byte ) ((n >> 48 ) & 0xff ); byte h1 = ( byte ) (n >> 56 ); newbyte[l++] = h1; newbyte[l++] = h2; newbyte[l++] = h3; newbyte[l++] = h4; newbyte[l++] = h5; newbyte[l++] = h6; newbyte[l++] = h7; newbyte[l++] = h8; return newbyte; } private int f1( int x, int y, int z) { return (x & y) | (~x & z); } private int f2( int x, int y, int z) { return x ^ y ^ z; } private int f3( int x, int y, int z) { return (x & y) | (x & z) | (y & z); } private int f4( int x, int y) { return (x << y) | x >>> ( 32 - y); } // 單元摘要計算函數 private void encrypt() { for ( int i = 16 ; i <= 79 ; i++) { tmpdata[i] = f4(tmpdata[i - 3 ] ^ tmpdata[i - 8 ] ^ tmpdata[i - 14 ] ^ tmpdata[i - 16 ], 1 ); } int [] tmpabcde = new int [ 5 ]; for ( int i1 = 0 ; i1 < tmpabcde.length; i1++) { tmpabcde[i1] = digestint[i1]; } for ( int j = 0 ; j <= 19 ; j++) { int tmp = f4(tmpabcde[ 0 ], 5 ) + f1(tmpabcde[ 1 ], tmpabcde[ 2 ], tmpabcde[ 3 ]) + tmpabcde[ 4 ] + tmpdata[j] + 0x5a827999 ; tmpabcde[ 4 ] = tmpabcde[ 3 ]; tmpabcde[ 3 ] = tmpabcde[ 2 ]; tmpabcde[ 2 ] = f4(tmpabcde[ 1 ], 30 ); tmpabcde[ 1 ] = tmpabcde[ 0 ]; tmpabcde[ 0 ] = tmp; } for ( int k = 20 ; k <= 39 ; k++) { int tmp = f4(tmpabcde[ 0 ], 5 ) + f2(tmpabcde[ 1 ], tmpabcde[ 2 ], tmpabcde[ 3 ]) + tmpabcde[ 4 ] + tmpdata[k] + 0x6ed9eba1 ; tmpabcde[ 4 ] = tmpabcde[ 3 ]; tmpabcde[ 3 ] = tmpabcde[ 2 ]; tmpabcde[ 2 ] = f4(tmpabcde[ 1 ], 30 ); tmpabcde[ 1 ] = tmpabcde[ 0 ]; tmpabcde[ 0 ] = tmp; } for ( int l = 40 ; l <= 59 ; l++) { int tmp = f4(tmpabcde[ 0 ], 5 ) + f3(tmpabcde[ 1 ], tmpabcde[ 2 ], tmpabcde[ 3 ]) + tmpabcde[ 4 ] + tmpdata[l] + 0x8f1bbcdc ; tmpabcde[ 4 ] = tmpabcde[ 3 ]; tmpabcde[ 3 ] = tmpabcde[ 2 ]; tmpabcde[ 2 ] = f4(tmpabcde[ 1 ], 30 ); tmpabcde[ 1 ] = tmpabcde[ 0 ]; tmpabcde[ 0 ] = tmp; } for ( int m = 60 ; m <= 79 ; m++) { int tmp = f4(tmpabcde[ 0 ], 5 ) + f2(tmpabcde[ 1 ], tmpabcde[ 2 ], tmpabcde[ 3 ]) + tmpabcde[ 4 ] + tmpdata[m] + 0xca62c1d6 ; tmpabcde[ 4 ] = tmpabcde[ 3 ]; tmpabcde[ 3 ] = tmpabcde[ 2 ]; tmpabcde[ 2 ] = f4(tmpabcde[ 1 ], 30 ); tmpabcde[ 1 ] = tmpabcde[ 0 ]; tmpabcde[ 0 ] = tmp; } for ( int i2 = 0 ; i2 < tmpabcde.length; i2++) { digestint[i2] = digestint[i2] + tmpabcde[i2]; } for ( int n = 0 ; n < tmpdata.length; n++) { tmpdata[n] = 0 ; } } // 4字節數組轉換為整數 private int bytearraytoint( byte [] bytedata, int i) { return ((bytedata[i] & 0xff ) << 24 ) | ((bytedata[i + 1 ] & 0xff ) << 16 ) | ((bytedata[i + 2 ] & 0xff ) << 8 ) | (bytedata[i + 3 ] & 0xff ); } // 整數轉換為4字節數組 private void inttobytearray( int intvalue, byte [] bytedata, int i) { bytedata[i] = ( byte ) (intvalue >>> 24 ); bytedata[i + 1 ] = ( byte ) (intvalue >>> 16 ); bytedata[i + 2 ] = ( byte ) (intvalue >>> 8 ); bytedata[i + 3 ] = ( byte ) intvalue; } // 將字節轉換為十六進制字符串 private static string bytetohexstring( byte ib) { char [] digit = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'a' , 'b' , 'c' , 'd' , 'e' , 'f' }; char [] ob = new char [ 2 ]; ob[ 0 ] = digit[(ib >>> 4 ) & 0x0f ]; ob[ 1 ] = digit[ib & 0x0f ]; string s = new string(ob); return s; } // 將字節數組轉換為十六進制字符串 private static string bytearraytohexstring( byte [] bytearray) { string strdigest = "" ; for ( int i = 0 ; i < bytearray.length; i++) { strdigest += bytetohexstring(bytearray[i]); } return strdigest; } // 計算sha-1摘要,返回相應的字節數組 public byte [] getdigestofbytes( byte [] bytedata) { process_input_bytes(bytedata); byte [] digest = new byte [ 20 ]; for ( int i = 0 ; i < digestint.length; i++) { inttobytearray(digestint[i], digest, i * 4 ); } return digest; } // 計算sha-1摘要,返回相應的十六進制字符串 public string getdigestofstring( byte [] bytedata) { return bytearraytohexstring(getdigestofbytes(bytedata)); } public static void main(string[] args) { string data = "tokendemo" ; system.out.println(data); string digest = new sha1().getdigestofstring(data.getbytes()); system.out.println(digest); } } |
wechatjavatokenvalidate.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
package com.dqiang.demo; import java.io.ioexception; import java.util.arrays; import javax.servlet.servletexception; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; import javax.servlet.http.httpservletresponse; /** * @author stemq * @version v1.0 * blog:http://blog.csdn.net/stemq * web:www.dqiang.com */ public class wechatjavatokenvalidate extends httpservlet { private static final long serialversionuid = -6761982938477193120l; /* 例如 * url(服務器地址) http://weixin.xxxx.com/wechatjavatokenvalidate/wechattoken * token(令牌) tokenchat * */ private string token = "tokenchat" ; //根據實際情況自己定義token與基本配置/填寫服務器配置token(令牌)相同 @override protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception { // 微信加密簽名 string signature = request.getparameter( "signature" ); // 隨機字符串 string echostr = request.getparameter( "echostr" ); // 時間戳 string timestamp = request.getparameter( "timestamp" ); // 隨機數 string nonce = request.getparameter( "nonce" ); string[] str = { token, timestamp, nonce }; // 字典序排序 arrays.sort(str); string bigstr = str[ 0 ] + str[ 1 ] + str[ 2 ]; // sha1加密 string digest = new sha1().getdigestofstring(bigstr.getbytes()).tolowercase(); // 確認請求來至微信 if (digest.equals(signature)) { response.getwriter().print(echostr); } } } |
3.源碼下載:wechatjavatokenvalidate
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/StemQ/article/details/53002096