国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

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

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

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

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

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

一、前期準備

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

二、實戰演練

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

1.設置成開發者模式:

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

2.填寫服務器配置:

點「開發」-「基本配置」-「填寫服務器配置」如圖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 };
 // 摘要數據存儲數組
 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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产传媒自拍 | 婷婷久 | 久久久国产精品一区 | 欧美大片黄 | 玖玖操 | 一级片国产 | 毛片网免费 | 亚洲高清精品视频 | 欧美日本一区二区三区 | 久久丁香 | 久久se精品一区精品二区 | jizzxxx日本| 啪啪av| 亚洲一区二区中文字幕 | 激情久久网 | 中文字幕一区二区三区乱码图片 | 日韩中文视频 | 国产乱码精品一区二区三区av | 中文字幕1区 | 精品久久久一 | 81精品国产乱码久久久久久 | 亚洲一区二区久久 | 亚洲视频一区二区 | 国内自拍偷拍 | 成人免费视频网 | 日韩欧美在线视频 | 国产成人精品久久 | 特一级毛片 | 日韩免费一区二区 | 羞羞动漫网 | 天天草夜夜 | 二区在线观看 | 一级黄色大片 | 爱操在线| 久久中文字幕一区 | 亚洲免费观看视频 | 亚州国产精品视频 | 午夜影院免费 | 成人三级视频 | 亚洲精品一区二区三区在线观看 | 亚洲国产精品无卡做爰天天 |