一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - java版微信公眾平臺后臺接入

java版微信公眾平臺后臺接入

2021-05-12 15:33享叔 Java教程

這篇文章主要為大家詳細介紹了java版微信公眾平臺后臺接入,具有一定的參考價值,感興趣的小伙伴們可以參考一下

關(guān)于微信平臺的后臺接入,官方已經(jīng)提供了php示例的下載,對于java這塊后臺接入,暫時還沒有一個完整的案例可以拿來直接使用,我寫了一個java版本的demo便于大家使用。

一、前期準備

項目是用maven構(gòu)建,直接導入到eclipse即可,jdk的版本為1.8.0_111 ,這兩項都可以根據(jù)實際需求進行修改,最終達成war發(fā)布到服務(wù)器中即可。

二、實戰(zhàn)演練

操作前,先閱讀一下官方的文檔,先整體有個思路流程,官方地址參考

1.設(shè)置成開發(fā)者模式:

登錄微信公眾平臺后臺后,點「功能」-「高級功能」-「開發(fā)模式」,進入開發(fā)模式,如果公眾平臺顯示「尚未成為開發(fā)者」,就點擊「成為開發(fā)者」

2.填寫服務(wù)器配置:

點「開發(fā)」-「基本配置」-「填寫服務(wù)器配置」如圖1~如3

java版微信公眾平臺后臺接入

圖1

java版微信公眾平臺后臺接入

圖2

java版微信公眾平臺后臺接入

圖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 };
 // 摘要數(shù)據(jù)存儲數(shù)組
 private int[] digestint = new int[5];
 // 計算過程中的臨時數(shù)據(jù)存儲數(shù)組
 private int[] tmpdata = new int[80];
 
 // 計算sha-1摘要
 private int process_input_bytes(byte[] bytedata) {
 // 初試化常量
 system.arraycopy(abcde, 0, digestint, 0, abcde.length);
 // 格式化輸入字節(jié)數(shù)組,補10及長度數(shù)據(jù)
 byte[] newbyte = bytearrayformatdata(bytedata);
 // 獲取數(shù)據(jù)摘要計算的數(shù)據(jù)單元個數(shù)
 int mcount = newbyte.length / 64;
 // 循環(huán)對每個數(shù)據(jù)單元進行摘要計算
 for (int pos = 0; pos < mcount; pos++) {
  // 將每個單元的數(shù)據(jù)轉(zhuǎn)換成16個整型數(shù)據(jù),并保存到tmpdata的前16個數(shù)組元素中
  for (int j = 0; j < 16; j++) {
  tmpdata[j] = bytearraytoint(newbyte, (pos * 64) + (j * 4));
  }
  // 摘要計算函數(shù)
  encrypt();
 }
 return 20;
 }
 
 // 格式化輸入字節(jié)數(shù)組格式
 private byte[] bytearrayformatdata(byte[] bytedata) {
 // 補0數(shù)量
 int zeros = 0;
 // 補位后總位數(shù)
 int size = 0;
 // 原始數(shù)據(jù)長度
 int n = bytedata.length;
 // 模64后的剩余位數(shù)
 int m = n % 64;
 // 計算添加0的個數(shù)以及添加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;
 }
 // 補位后生成的新數(shù)組內(nèi)容
 byte[] newbyte = new byte[size];
 // 復制數(shù)組的前面部分
 system.arraycopy(bytedata, 0, newbyte, 0, n);
 // 獲得數(shù)組append數(shù)據(jù)元素的位置
 int l = n;
 // 補1操作
 newbyte[l++] = (byte) 0x80;
 // 補0操作
 for (int i = 0; i < zeros; i++) {
  newbyte[l++] = (byte) 0x00;
 }
 // 計算數(shù)據(jù)長度,補數(shù)據(jù)長度位共8字節(jié),長整型
 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);
 }
 
 // 單元摘要計算函數(shù)
 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字節(jié)數(shù)組轉(zhuǎn)換為整數(shù)
 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);
 }
 
 // 整數(shù)轉(zhuǎn)換為4字節(jié)數(shù)組
 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;
 }
 
 // 將字節(jié)轉(zhuǎn)換為十六進制字符串
 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;
 }
 
 // 將字節(jié)數(shù)組轉(zhuǎn)換為十六進制字符串
 private static string bytearraytohexstring(byte[] bytearray) {
 string strdigest = "";
 for (int i = 0; i < bytearray.length; i++) {
  strdigest += bytetohexstring(bytearray[i]);
 }
 return strdigest;
 }
 
 // 計算sha-1摘要,返回相應的字節(jié)數(shù)組
 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(服務(wù)器地址) http://weixin.xxxx.com/wechatjavatokenvalidate/wechattoken
   * token(令牌) tokenchat
   * */
  private string token = "tokenchat"; //根據(jù)實際情況自己定義token與基本配置/填寫服務(wù)器配置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");
 // 隨機數(shù)
 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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持服務(wù)器之家。

原文鏈接:https://blog.csdn.net/StemQ/article/details/53002096

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人一区二区1 | 日本高清全集免费观看 | 国产高清不卡视频在线播放 | 色老板在线视频观看 | 8x8x极品国产在线 | 色婷婷综合缴情综六月 | 欧美一级久久久久久久大片 | free性欧洲 | 视频在线观看一区二区三区 | 全彩孕交漫画福利啪啪吧 | 欧美成人aaaa免费高清 | 国产黄频在线观看高清免费 | 加勒比一本大道在线 | 9re视频这里只有精品 | 91免费在线| 免费标准高清看机机桶机机 | 国产目拍亚洲精品一区二区三区 | b片在线观看 | hd性欧美俱乐部中文 | 97午夜| 欧美侏儒xxx | 九九精品热 | 美女草b | 亚洲国产在线视频中文字 | 草逼网站视频 | 九九热在线免费观看 | 无人在线视频高清免费播放 | 精品视频免费在线观看 | 全日爱韩国视频在线观看 | 亚洲sss视频 | 污小说在线阅读 | www.亚洲天堂 | 天天舔天天操天天干 | 亚洲欧美综合在线观看 | 91久久精品国产亚洲 | 日本不卡一区二区三区在线观看 | 国产欧美成人免费观看 | 国产欧美曰韩一区二区三区 | 免费看a片毛片 | 热久久天天拍天天拍热久久2018 | 四虎国产成人亚洲精品 |