เกี่ยวกับการเข้าถึงพื้นหลังของแพลตฟอร์ม WeChat อย่างเป็นทางการได้ให้การดาวน์โหลดตัวอย่าง PHP สำหรับการเข้าถึงพื้นหลังของ Java ปัจจุบันยังไม่มีกรณีที่สมบูรณ์ที่จะใช้โดยตรง ฉันเขียนตัวอย่างของ Java เพื่อให้ทุกคนใช้
1. การเตรียม
โครงการสร้างขึ้นด้วย Maven และสามารถนำเข้าโดยตรงไปยัง Eclipse เวอร์ชันของ JDK คือ 1.8.0_111 ทั้งสองรายการนี้สามารถแก้ไขได้ตามความต้องการที่แท้จริงและในที่สุดสงครามก็ถูกปล่อยไปยังเซิร์ฟเวอร์
2. การฝึกซ้อมเชิงปฏิบัติ
ก่อนการดำเนินการอ่านเอกสารอย่างเป็นทางการก่อนและมีกระบวนการแนวคิดโดยรวมอ้างถึงที่อยู่อย่างเป็นทางการ
1. ตั้งค่าเป็นโหมดนักพัฒนา:
หลังจากเข้าสู่ระบบพื้นหลังแพลตฟอร์มสาธารณะ WeChat ให้คลิก "ฟังก์ชั่น" - "ฟังก์ชั่นขั้นสูง" - "โหมดการพัฒนา" เพื่อเข้าสู่โหมดการพัฒนา หากแพลตฟอร์มสาธารณะแสดง "ยังไม่ได้เป็นนักพัฒนา" ให้คลิก "กลายเป็นนักพัฒนา"
2. กรอกข้อมูลในการกำหนดค่าเซิร์ฟเวอร์:
คลิก "การพัฒนา" - "การกำหนดค่าพื้นฐาน" - "กรอกในการกำหนดค่าเซิร์ฟเวอร์" ดังแสดงในรูปที่ 1 ถึง 3
รูปที่ 1
รูปที่ 2
รูปที่ 3
3. ตัวอย่างโค้ด:
sha1.java
แพ็คเกจ com.dqiang.demo; คลาสสาธารณะ sha1 {ส่วนตัวสุดท้าย int [] abcde = {0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0}; // บทคัดย่อการจัดเก็บข้อมูลอาร์เรย์ส่วนตัว int [] digestint = ใหม่ int [5]; // การจัดเก็บข้อมูลชั่วคราวอาร์เรย์ส่วนตัว int [] tmpdata = ใหม่ int [80]; // คำนวณ sha-1 digest private int process_input_bytes (byte [] bytedata) {// การทดลองเบื้องต้นของ System.arrayCopy (ABCDE, 0, Digestint, 0, abcde.length); // จัดรูปแบบอาร์เรย์ไบต์อินพุตเสริม 10 และความยาวไบต์ [] newByte = byteArrayFormatData (bytedata); // รับจำนวนหน่วยข้อมูลที่คำนวณสำหรับข้อมูลสรุปข้อมูล int mcount = newByte.length / 64; // ลูปเพื่อสรุปแต่ละหน่วยข้อมูลสำหรับ (int pos = 0; pos <mcount; pos ++) {// แปลงข้อมูลของแต่ละหน่วยเป็น 16 ข้อมูลจำนวนเต็มและบันทึกไว้ในองค์ประกอบอาร์เรย์ 16 ตัวแรกของ tmpdata สำหรับ (int j = 0; j <16; j ++) {tmpdata [j] } // ฟังก์ชั่นการคำนวณบทคัดย่อเข้ารหัส (); } return 20; } // รูปแบบอินพุตไบต์อาร์เรย์รูปแบบไบต์ส่วนตัว [] byteArrayFormatData (byte [] bytedata) {// จำนวนของส่วนประกอบ 0 int Zeros = 0; // จำนวนตัวเลขทั้งหมดหลังจากเติมเต็มขนาด int = 0; // ความยาวข้อมูลดั้งเดิม int n = bytedata.length; // จำนวนตัวเลขที่เหลือหลังจาก mod 64 int m = n % 64; // คำนวณจำนวน 0 เพิ่มและความยาวทั้งหมดหลังจากเพิ่ม 10 if (m <56) {Zeros = 55 - m; ขนาด = n - m + 64; } อื่นถ้า (m == 56) {zeros = 63; ขนาด = n + 8 + 64; } else {Zeros = 63 - M + 56; ขนาด = (n + 64) - M + 64; } // เนื้อหาของอาร์เรย์ใหม่ที่สร้างขึ้นหลังจากกรอกไบต์ [] newByte = ไบต์ใหม่ [ขนาด]; // คัดลอกส่วนก่อนหน้าของอาร์เรย์ system.arraycopy (bytedata, 0, newByte, 0, n); // รับตำแหน่งขององค์ประกอบข้อมูลภาคผนวกของอาร์เรย์ int l = n; // การดำเนินการ 1 การดำเนินการ newByte [l ++] = (ไบต์) 0x80; // การดำเนินการเสริม 0 สำหรับ (int i = 0; i <Zeros; i ++) {newByte [l ++] = (ไบต์) 0x00; } // คำนวณความยาวของข้อมูลและบิตความยาวของข้อมูลคือทั้งหมด 8 ไบต์, ความยาวจำนวนเต็มยาว n = (ยาว) n * 8; ไบต์ H8 = (ไบต์) (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 >> 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; กลับ NewByte; } int ส่วนตัว f1 (int x, int y, int z) {return (x & y) | (~ x & z); } int ส่วนตัว f2 (int x, int y, int z) {return x ^ y ^ z; } int ส่วนตัว f3 (int x, int y, int z) {return (x & y) | (x & z) | (y & z); } int ส่วนตัว f4 (int x, int y) {return (x << y) | x >>> (32 - y); } // ฟังก์ชั่นการคำนวณสรุปหน่วยเป็นโมฆะส่วนตัวเข้ารหัส () {สำหรับ (int i = 16; i <= 79; i ++) {tmpdata [i] = f4 (tmpdata [i - 3] ^ tmpdata [i - 8] ^ tmpdata [i - 14] } int [] tmpaBcde = new int [5]; สำหรับ (int i1 = 0; i1 <tmpaBcde.length; i1 ++) {tmpaBcde [i1] = digestint [i1]; } สำหรับ (int j = 0; j <= 19; j ++) {int tmp = f4 (tmpabcde [0], 5) + f1 (tmpabcde [1], tmpaBcde [2], tmpaBcde [3]) + tmpabcde [4] TMPABCDE [4] = TMPABCDE [3]; TMPABCDE [3] = TMPABCDE [2]; TMPABCDE [2] = F4 (TMPABCDE [1], 30); TMPABCDE [1] = TMPABCDE [0]; TMPABCDE [0] = TMP; } สำหรับ (int k = 20; k <= 39; k ++) {int tmp = f4 (tmpaBcde [0], 5) + f2 (tmpaBcde [1], tmpaBcde [2], tmpaBcde [3]) + tmpabcde [4] TMPABCDE [4] = TMPABCDE [3]; TMPABCDE [3] = TMPABCDE [2]; TMPABCDE [2] = F4 (TMPABCDE [1], 30); TMPABCDE [1] = TMPABCDE [0]; TMPABCDE [0] = TMP; } สำหรับ (int l = 40; l <= 59; l ++) {int tmp = f4 (tmpaBcde [0], 5) + f3 (tmpaBcde [1], tmpaBcde [2], tmpaBcde [3]) + tmpabcde [4] TMPABCDE [4] = TMPABCDE [3]; TMPABCDE [3] = TMPABCDE [2]; TMPABCDE [2] = F4 (TMPABCDE [1], 30); TMPABCDE [1] = TMPABCDE [0]; TMPABCDE [0] = TMP; } สำหรับ (int m = 60; m <= 79; m ++) {int tmp = f4 (tmpabcde [0], 5) + f2 (tmpaBcde [1], tmpaBcde [2], tmpaBcde [3]) + tmpabcde [4] + tmpda TMPABCDE [4] = TMPABCDE [3]; TMPABCDE [3] = TMPABCDE [2]; TMPABCDE [2] = F4 (TMPABCDE [1], 30); TMPABCDE [1] = TMPABCDE [0]; TMPABCDE [0] = TMP; } สำหรับ (int i2 = 0; i2 <tmpaBcde.length; i2 ++) {digestint [i2] = digestint [i2]+tmpaBcde [i2]; } สำหรับ (int n = 0; n <tmpdata.length; n ++) {tmpdata [n] = 0; }} // แปลงอาร์เรย์ 4-byte เป็นจำนวนเต็มส่วนตัว 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-byte เป็นโมฆะส่วนตัว inttobytearray (int intvalue, byte [] bytedata, int i) {bytedata [i] = (byte) (intvalue >>> 24); bytedata [i + 1] = (ไบต์) (intvalue >>> 16); bytedata [i + 2] = (ไบต์) (intvalue >>> 8); bytedata [i + 3] = (ไบต์) intvalue; } // แปลงไบต์เป็น hexadecimal สตริงสตริงคงที่ส่วนตัว bytetohexstring (byte ib) {char [] digit = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', ',' ถ่าน [] ob = ถ่านใหม่ [2]; ob [0] = digit [(ib >>> 4) & 0x0f]; ob [1] = digit [IB & 0x0f]; สตริง s = สตริงใหม่ (ob); กลับ s; } // แปลงอาร์เรย์ไบต์เป็น hexadecimal สตริงสตริงคงที่ส่วนตัว byteArraytoHexstring (byte [] byteArray) {string strDigest = ""; สำหรับ (int i = 0; i <bytearray.length; i ++) {strdigest+= bytetohexstring (bytearray [i]); } return strdigest; } // คำนวณ sha-1 digest และส่งคืนไบต์อาร์เรย์ไบต์ที่สอดคล้องกันไบต์ [] getDigestofbytes (byte [] bytedata) {process_input_bytes (bytedata); ไบต์ [] digest = ไบต์ใหม่ [20]; สำหรับ (int i = 0; i <digestint.length; i ++) {inttobytearray (digestint [i], digest, i * 4); } return digest; } // คำนวณ sha-1 digest และส่งคืนสตริง hexadecimal สตริงสาธารณะ getDigestofstring (byte [] bytedata) {return bytearraytohexstring (getDigestofbytes (bytedata)); } โมฆะคงที่สาธารณะหลัก (สตริง [] args) {สตริง data = "tokendemo"; System.out.println (ข้อมูล); String Digest = ใหม่ sha1 (). getDigestofstring (data.getBytes ()); System.out.println (Digest); -wechatjavatokenvalidate.java
แพ็คเกจ com.dqiang.demo; นำเข้า java.io.ioException; นำเข้า java.util.Arrays; นำเข้า Javax.servlet.servletexception; นำเข้า Javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletRequest; javax.servlet.http.httpservletResponse; /** * @author stemq * @version v1.0 * บล็อก: http: //blog.csdn.net/stemq * เว็บ: www.dqiang.com */คลาสสาธารณะ wechatjavatokenvalidate ขยาย httpservlet / * ตัวอย่างเช่น * url (ที่อยู่เซิร์ฟเวอร์) http://weixin.xxxx.com/wechatjavatokenvalidate/wechattoken * โทเค็น (โทเค็น) tokenchat * */โทเค็นสตริงส่วนตัว = "tokenchat"; // กำหนดโทเค็นด้วยตัวคุณเองตามสถานการณ์จริงและกรอกโทเค็นการกำหนดค่าเซิร์ฟเวอร์ (โทเค็น) เช่นเดียวกับ @Override ป้องกันโมฆะ doget (httpservletrequest คำขอ httpservletresponse) โยน servletexception, ioexception // การสุ่มสตริงสตริง echosttr = request.getParameter ("echosttr"); // timestamp สตริง timestamp = request.getParameter ("timestamp"); // สตริงหมายเลขสุ่ม nonce = request.getParameter ("nonce"); สตริง [] str = {โทเค็น, การประทับเวลา, nonce}; // พจนานุกรมเรียงลำดับอาร์เรย์ (STR); String bigstr = str [0] + str [1] + str [2]; // SHA1 การเข้ารหัสสตริง digest = new sha1 (). getDigestofstring (bigstr.getBytes ()). TOLOWERCASE (); // ยืนยันคำขอไปยัง weChat ถ้า (digest.equals (ลายเซ็น)) {response.getWriter (). พิมพ์ (echosttr); -3. การดาวน์โหลดซอร์สโค้ด: wechatjavatokenvalidate
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น