فيما يتعلق بالوصول إلى خلفية منصة 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 {private final int [] abcde = {0x67452301 ، 0xefcdab89 ، 0x98badcfe ، 0x10325476 ، 0xc3d2e1f0} ؛ // مجردة مجموعة تخزين البيانات الخاصة int [] digestint = new int [5] ؛ // مجموعة تخزين البيانات المؤقتة الخاصة int [] tmpdata = new int [80] ؛ // حساب sha-1 digest private int process_input_bytes (byte [] bytedata) {// التجربة الأولية للنظام الثابت. // تنسيق صفيف بايت الإدخال ، الملحق 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] = byteartoint (newbyte ، (pos * 64). } // وظيفة حساب الملخص encrypt () ؛ } العودة 20 ؛ }. // إجمالي عدد الأرقام بعد تكملة T int Size = 0 ؛ // طول البيانات الأصلي int n = bytedata.length ؛ // العدد المتبقي من الأرقام بعد mod 64 int m = n ٪ 64 ؛ // احسب عدد 0 إضافة والطول الكلي بعد إضافة 10 إذا (M <56) {zeros = 55 - m ؛ الحجم = n - m + 64 ؛ } آخر إذا (m == 56) {zeros = 63 ؛ الحجم = n + 8 + 64 ؛ } آخر {zeros = 63 - m + 56 ؛ الحجم = (N + 64) - M + 64 ؛ } // محتوى الصفيف الجديد الذي تم إنشاؤه بعد ملء البايت [] newbyte = new byte [size] ؛ // انسخ الجزء السابق من system.arraycopy (bytedata ، 0 ، newbyte ، 0 ، n) ؛ // الحصول على موضع عنصر بيانات إلحاق الصفيف int l = n ؛ // The Complement 1 Operation Newbyte [l ++] = (byte) 0x80 ؛ // عملية مكملة 0 لـ (int i = 0 ؛ i <zeros ؛ i ++) {newbyte [l ++] = (byte) 0x00 ؛ } // احسب طول البيانات ، وتكون بتات طول البيانات 8 بايت في إجمالي عدد صحيح طويل n = (طويل) 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 >> 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) ؛ بايت H1 = (بايت) (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 ؛ } 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] ؛ لـ (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] + tmpdata [l] 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] + tmpdata [m] 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 بايت إلى integer 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 ؛ } // تحويل البايتات إلى سلسلة سداسية سداسية سترون ثابتة بويتيتوهكسسترنج (بايت IB) {char [] digit = {'0' ، '1' ، '2' ، '3' ، '4' ، '5' ، '6' ، '7' ، '8' ، '9' ، 'a' ، 'b' ، 'd' ، '} ، char [] ob = new Char [2] ؛ OB [0] = digit [(ib >>> 4) & 0x0F] ؛ OB [1] = DIGIT [IB & 0x0F] ؛ سلسلة S = سلسلة جديدة (OB) ؛ العودة s ؛ }. لـ (int i = 0 ؛ i <bytearray.length ؛ i ++) {strDigest+= bytetoHexString (bytearray [i]) ؛ } إرجاع strdigest ؛ }. Byte [] Digest = New Byte [20] ؛ لـ (int i = 0 ؛ i <digestint.length ؛ i ++) {inttoByTearRay (digestint [i] ، digest ، i * 4) ؛ } إرجاع Digest ؛ }. } public static void main (string [] args) {string data = "tokendemo" ؛ system.out.println (data) ؛ String Digest = جديد sha1 (). getDigestofString (data.getBytes ()) ؛ System.out.println (Digest) ؛ }}WeChatjavatokenValidate.java
حزمة com.dqiang.demo ؛ استيراد java.io.ioException ؛ import java.util.arrays ؛ import javax.servlet.servletexception ؛ import javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservletRequest ؛ javax.servlet.http.httpservletresponse ؛ /** * Author STEMQ * version v1.0 * المدونة: http: //blog.csdn.net/stemq * web: www.dqiang.com */public class wechatjavatokenvalidate يمتد httpservlet {private static finalversionuid = -6761982938477120l ؛ / * على سبيل المثال * url (عنوان الخادم) http://weixin.xxxx.com/wechatjavatokenvalidate/wechattoken * token (token) tokenchat * */private string token = "tokenchat" ؛ . // سلسلة عشوائية echosttr = request.getParameter ("echosttr") ؛ // timestamp string timestamp = request.getParameter ("timestamp") ؛ // number number string nonce = request.getParameter ("nonce") ؛ String [] str = {token ، timestamp ، nonce} ؛ // قاموس تصنيف المصفوفات. String bigstr = str [0] + str [1] + str [2] ؛ // sha1 تشفير سلسلة digest = new sha1 (). getDigestofString (bigstr.getBytes ()). // تأكيد طلب WeChat if (digest.equals (signature)) {response.getWriter (). print (echoStr) ؛ }}}3. تنزيل رمز المصدر: WeChatjavatokenValidate
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.