ستتحدث هذه المقالة عن الخطوة الأولى في تطوير WeChat ، والوصول إلى الحساب الرسمي وإدارة Access_Token.
1. الوصول إلى حساب WeChat الرسمي
في دليل تطوير الحساب الرسمي في WeChat ، يتم كتابة المحتوى المتعلق بقسم الوصول الرسمي للحساب بمزيد من التفصيل. تقول المستند أن الوصول إلى الحساب الرسمي يتطلب ثلاث خطوات ، أي:
في الواقع ، لم يعد من الممكن اعتبار الخطوة 3 خطوة للوصول إلى الحساب الرسمي. ومع ذلك ، بعد الوصول ، يمكن للمطورين القيام ببعض التطوير بناءً على الواجهة التي يوفرها حساب WeChat الرسمي.
في الخطوة 1 ، يتضمن تكوين الخادم عنوان الخادم (url) ، الرمز المميز و isodingaeskey.
عنوان الخادم هو عنوان الدخول الذي يوفر منطق العمل للواجهة الخلفية للحساب الرسمي. حاليًا ، يدعم المنفذ 80 فقط. بعد ذلك ، يجب إدخال التحقق من الوصول وأي طلبات تشغيل أخرى (مثل إرسال الرسائل ، وإدارة القائمة ، وإدارة المواد ، وما إلى ذلك) من هذا العنوان. الفرق بين التحقق من الوصول والطلبات الأخرى هو أنه عندما يكون التحقق من الوصول هو طلب الحصول على ، وعندما يكون هناك طلب آخر ؛
يمكن شغل الرمز المميز بواسطة المطور واستخدامه كتوقيع لتوليده (سيتم مقارنة الرمز المميز مع الرمز المميز الموجود في عنوان URL للواجهة للتحقق من الأمان) ؛
يتم ملء encodingaeskey يدويًا أو تم إنشاؤه بشكل عشوائي بواسطة المطور وسيتم استخدامه كمفتاح فك تشفير الجسم المشفر. في هذا المثال ، كلها رسائل نصية غير مشفرة ، ولا يشارك عنصر التكوين هذا.
الخطوة 2: تحقق من صحة عنوان الخادم. عند النقر فوق الزر "إرسال" ، سيرسل خادم WeChat طلب HTTP للحصول على عنوان الخادم الذي قمت بملئه للتو ، ويحمل أربع معلمات:
بعد تلقي الطلب ، نحتاج إلى القيام بالخطوات الثلاث التالية. إذا أكدنا أن طلب GET يأتي من خادم WeChat وإرجاع محتوى معلمة EchoStr كما هو ، فسيصبح الوصول ساري المفعول ، وإلا سيفشل الوصول.
يمكن أن يتحدث الرمز. ما يلي هو servlevt إدخال قمت بتعريفه ، حيث يتم تعريف طريقة التحقق في طريقة doget:
// tokenprivate final string token = "fengzheng" ؛ DOGED VOID DOGET (طلب httpservletrequest ، استجابة httpservletresponse) يلقي servleTexception ، ioException {system.out.println ("ابدأ التحقق من توقيع") ؛ سلسلة التوقيع = request.getParameter ("التوقيع") ؛ سلسلة Timestamp = request.getParameter ("Timestamp") ؛ سلسلة nonce = request.getParameter ("nonce") ؛ سلسلة echosttr = request.getParameter ("echosttr") ؛ ArrayList <String> Array = New ArrayList <Tring> () ؛ Array.Add (توقيع) ؛ Array.Add (Timestamp) ؛ Array.Add (nonce) ؛ // sorting string sortString = sort (token ، timestamp ، nonce) ؛ // encrypt string mytoken = discript.sha1 (sortString) ؛ ] استجابة. // إذا تم إخراج التحقق بنجاح من ECHOSTR ، فسيؤكد خادم WeChat أن التحقق من الانتهاء فقط بعد تلقي هذا الإخراج. } آخر {system.out.println ("فشل التحقق من التوقيع.") ؛ }} /** * sort method * param token * param timestamp * param nonce * /string string sort (string token ، string timestamp ، string nonce) {String [] strarray = {token ، timestamp ، nonce} ؛ المصفوفات. StringBuilder sbuilder = new StringBuilder () ؛ لـ (String str: strarray) {sbuilder.append (str) ؛ } إرجاع sbuilder.tostring () ؛}الكود التالي هو طريقة التشفير:
DESCRIPTER SCRIPCE {public static string sha1 (سلسلة discript) {try {messagedigest digest = messagedigest .getInstance ("sha-1") ؛ Digest.update (decprist.getBytes ()) ؛ byte messagedigest [] = digest.digest () ؛ // إنشاء hex string stringbuffer hexstring = new StringBuffer () ؛ // تحويل صفيف البايت إلى الرقم السداسي ل (int i = 0 ؛ i <messagedigest.length ؛ i ++) {String Shahex = Integer.ToHexString (messagedigest [i] & 0xff) ؛ if (shahex.length () <2) {hexstring.append (0) ؛ } hexstring.append (shahex) ؛ } إرجاع hexstring.toString () ؛ } catch (nosuchalgorithMexception e) {e.printstacktrace () ؛ } يعود ""؛ }}XML تم تعيينه بواسطة servlet كما يلي:
<Srevlet> <Servlet-Name> ابدأ </servlet-name> <Servlet-class> org.fengzheng.wechat.start </servlet-class> </servlet> <sterled mapping> </servlet> ابدأ </servlet-name> <url-patern>/wechat </url-patern>
أنا أستخدم Idea Idea+Tomcat7.0 Development هنا ، وابدأ المشروع مباشرة ، ثم استخدم NGROK لرسم خريطة منفذ 8080 المحلي إلى الشبكة الخارجية. أدخل واجهة إدارة الحساب الرسمية لـ WeChat ، وقم بملء عنوان الشبكة الخارجية المعينة والرمز المميز في معلومات تكوين الواجهة.
انقر فوق الزر "إرسال" وستطالب الصفحة بأن التكوين ناجح.
ستذهب إلى IDE وترى إخراج المعلومات في وحدة التحكم
2. Access_Token Management
قبل Access_Token ، هناك معلمتان مهمتان يجب أن يكونا معروفين. هاتان المعلمتان هما AppID و AppSecret. يتم تعيين هذا تلقائيًا للحساب الرسمي عند التقدم بطلب للحصول على حساب رسمي. إنها تعادل علامة هوية الحساب الرسمي. هناك حاجة إلى هاتين المعلمتين في العديد من الواجهات. بعد ذلك ، عند طلب Access_Token ، هناك حاجة إلى هاتين المعلمتين.
بعد الوصول إلى الحساب الرسمي بنجاح ، يجب تنفيذ المنطق المقابل. عند استخدام واجهة حساب WeChat الرسمية ، وجدت أن العديد من الطلبات تتطلب Access_Token. Access_token هي بيانات الاعتماد الفريدة العالمية للحساب الرسمي. مطلوب access_token عند الاتصال بكل واجهة من الحساب الرسمي. يحتاج المطورون إلى حفظه بشكل صحيح. يجب أن يحتفظ تخزين Access_Token بحجم 512 مساحة على الأقل. تكون فترة صحة Access_Token حاليًا ساعتين وتحتاج إلى تحديثها بانتظام. سوف يتسبب الاستحواذ المتكرر في الوصول إلى Access_Token الذي حصلت عليه في المرة الأخيرة لتكون غير صالحة. ويسمى الحد الأعلى لواجهة Access_Token كل يوم 2000 مرة.
لتلخيص التفسير أعلاه ، يحتاج Access_Token إلى القيام بالنقطتين التاليتين:
في هذا الصدد ، يكون الحل المعتمد هنا كما يلي: تحديد Servlet Startup الافتراضي ، وابدأ مؤشر ترابط في طريقة init ، وتحديد طريقة حلقة لا حصر لها في هذه العملية للحصول على Access_Token. عندما تنجح عملية الاستحواذ ، تنام العملية لمدة 7000 ثانية ، وإلا فإنها ستنام لمدة 3 ثوانٍ لمواصلة الحصول عليها. مخطط التدفق كما يلي:
فيما يلي الفكرة أعلاه التي تم تنفيذها في المشروع ، لأن البيانات التي تم إرجاعها هي كلها بتنسيق JSON ، سيتم استخدام مكتبة Fastjson من Alibaba هنا لتوفير الدعم لتسلسل البيانات وفرسها بعد إنشاء الطلبات وطلبات المعالجة. سيتم أيضًا استخدام واجهات لاحقة أخرى.
1. تحديد كيان AccessToken
الفئة العامة AccessToken {public string getAccessToken () {return AccessToken ؛ } public void setAccessToken (String AccessToken) {this.accessToken = AccessToken ؛ } public int getExpiresin () {return Expiresin ؛ } public void setExpiresin (int Expiresin) {this.expiresin = Expiresin ؛ } سلسلة accessToken الخاصة ؛ Private Int Expiresin ؛ } 2. حدد servlet بدء التشغيل الافتراضي ، وابدأ مؤشر ترابط في طريقة init ، وقم بتعيين هذا servlet على البداية الذاتية الافتراضية في web.xml.
استيراد javax.servlet.servletexception ؛ import javax.servlet.annotation.webservlet ؛ import javax.servlet.http.httpservlet ؛ import javax.servlet.http.httpservletrequest ؛ import javax.servlet.http.httpservervepnes ؛ java.io.ioException ؛ webservlet (name = "accesstokenservlet") فئة عامة accesstokenservlet يمتد httpservlet {public void init () remsletexception {tokenthread.appid = getInitParameter ("appid") ؛ // احصل على المعلمات الأولية ل Servlet Appid و AppSecret tokenthread.appsecret = getInitParameter ("AppSecret") ؛ system.out.println ("appid:"+tokenthread.appid) ؛ System.out.println ("AppSecret:"+TokentHread.AppSecret) ؛ موضوع جديد (جديد tokenthread ()). start () ؛ // ابدأ العملية} void dopost المحمية (طلب httpservletrequest ، استجابة httpservletresponse) يرمي servletexception ، ioException {} doget void المحمية (httpservletrequest طلب ، httpservletrespons اضبط Servlet autostart في web.xml وقم بتعيين معلمات التهيئة Appid و AppSecret
<Srevlet> <Servlet-Name> initAccessTokenServlet </revlet-name> <Servlet-class> org.fengzheng.wechat.accesstoken.accesstokenservlet </servlet-class> <Ing-param> <param-name> appid </param-name> <baram-value> <Param-Name> AppSecret </param-name> <param-value> appsecret </param-value> </ith-param> <load-on-startup> 0 </over-on-startup> </servlet>
3. حدد فئة مؤشرات الترابط ، واتصل Access_Token في هذه الفئة للحصول على الواجهة ، وتجريد البيانات الناتجة إلى كيان ثابت للاستخدام في أماكن أخرى. عنوان الواجهة هو https://api.weixin.qq.com/cgi-bin/token؟grant_type=client_credential&appid=appid&secret=appsecret ، حيث يتم كتابة Grant_type على أنها client_credential. هذا الطلب عبارة عن طلب HTTPS GET ، وتنسيق البيانات التي تم إرجاعها هو {"Access_Token": "Access_Token" ، "Expires_in": 7200}.
تنفيذ فئة العملية على النحو التالي:
استيراد com.alibaba.fastjson.json ؛ import com.alibaba.fastjson.jsonoBject ؛ استيراد org.fengzheng.wechat.common.networkhelper ؛ الطبقة العامة tokenthread تنفذ Runnable {public static appid = "" ؛ appsecret acpsecret = "" ؛ <br> // لاحظ أنه ثابت ثابت للوصول إلى accessToken AccessToken = null ؛ public void run () {بينما (true) {try {accessToken = this.getAccessToken () ؛ if (null! = AccessToken) {system.out.println (AccessToken.getAccessToken ()) ؛ thread.sleep (7000 * 1000) ؛ // احصل على Access_token للنوم لمدة 7000 ثانية} {thread.sleep (1000*3) ؛ . E.PrintStackTrace () ؛ حاول {thread.sleep (1000*10) ؛ // يحدث الاستثناء للنوم لمدة ثانية واحدة} catch (استثناء e1) {}}}}}/** String url = string.format ("https://api.weixin.qq.com/cgi-bin/token؟grant_type=client_credential&appid=٪S&Secret=٪S" ، this.appid ، this.appsecret) ؛ النتيجة سلسلة = nethelper.gethttpsresponse (url ، "") ؛ System.out.println (نتيجة) ؛ //response.getWriter().println(result) ؛ jsonobject json = json.parseObject (النتيجة) ؛ AccessToken Token = جديد AccessToken () ؛ token.setAccessToken (json.getString ("access_token")) ؛ token.setexpiresin (json.getInteger ("Expires_in")) ؛ الرمز الرمز المميز. }}تطلب طريقة GethTtpsResponse في NetworkHelper عنوان HTTPS ، وطلاب المعلمة هو السلسلة "GET" أو "post" ، والافتراضي هو طريقة GET.
التنفيذ على النحو التالي:
السلسلة العامة gethttpsresponse (سلسلة hsurl ، string requestMethod) {url url ؛ inputStream هو = فارغ ؛ سلسلة resultData = "" ؛ حاول {url = url جديد (hsurl) ؛ httpsurlConnection con = (httpsurlConnection) url.openconnection () ؛ TrustManager [] tm = {xtm} ؛ sslContext ctx = sslContext.getInstance ("tls") ؛ ctx.init (null ، tm ، null) ؛ con.setsslsocketfactory (ctx.getSocketFactory ()) ؛ Con.SethostNameverifier (New HostNameverifier () {Override Public Boolean التحقق (String arg0 ، sslsession arg1) {return true ؛}}) ؛ consetDoInput (صواب) ؛ // السماح لتيارات الإدخال ، أي التنزيلات ،/في Android ، يجب ضبط هذا العنصر على consetDoOutput false (false) ؛ // السماح لتدفقات الإخراج ، أي ، تحميل consetuseCaches (خطأ) ؛ // لا تستخدم التخزين المؤقت إذا (null! = requestMethod &&! requestMethod.equals ("")) {consetRequestMethod (requestMethod) ؛ // استخدم الطريقة المحددة} else {con.setRequestMethod ("get") ؛ // استخدام get request} هو = con.getInputStream () ؛ // احصل على دفق الإدخال ، ثم يتم إنشاء الرابط بالفعل. inputStreamReader ISR = جديد inputStreamReader (IS) ؛ BufferedReader Bufferreader = جديد BufferedReader (ISR) ؛ string inputline = "" ؛ بينما ((inputLine = bufferReader.ReadLine ())! = null) {resultData + = inputline + "/n" ؛ } system.out.println (resultData) ؛ شهادة [] certs = con.getServerCertificates () ؛ int certnum = 1 ؛ لـ (شهادة الشهادة: certs) {x509certificate xcert = (x509certificate) cert ؛ }} catch (استثناء e) {E.PrintStackTrace () ؛ } return resultdata ؛ } x509trustmanager xtm = new x509trustmanager () {Override public x509certificate [] getAcceptedIssuers () {// todo method method method stub null ؛ } Override public void checkservertrusted (x509certificate [] arg0 ، string arg1) يرمي CertificateException {// todo method method tuto method} @override public checkClientTrusted (x509certificate [] arg0 ، string arg1)في هذه المرحلة ، بعد تنفيذ الكود ، يتم نشر المشروع ، وإخراج وحدة التحكم كما يلي:
لعرض التأثير ، يمكنك ضبط وقت النوم أقصر قليلاً ، مثل الحصول عليه مرة واحدة في 30 ثانية ، ثم إخراج Access_Token. دعنا نفعل صفحة اختبار JSP وضبط وقت النوم على 30 ثانية. بهذه الطريقة ، بعد 30 ثانية ، يمكنك رؤية التغييرات. بالمناسبة ، كيفية الوصول إلى Access_Token في أماكن أخرى
<٪@ page contentType = "text/html ؛ charset = utf-8" language = "java" ٪> <٪@ page import = "org.fengzheng.wechat.accesstoken.tokenthread" ٪> <html> <٪ = tokenthread.accesstoken.getAccessToken () ٪> </body> </html>
وبهذه الطريقة ، تصفح هذه الصفحة على المتصفح ، وتأثير العرض كما يلي:
تم تحديثها بعد 30 ثانية ، تغيرت هذه القيمة:
تم تجميع هذه المقالة في "ملخص Tutorial Android WeChat Development" ، و "ملخص تعليمي Java WeChat Development" يرحب الجميع بالتعلم والقراءة.
ما سبق هو كل شيء عن هذا المقال. آمل أن يكون من المفيد للجميع تطوير حساب رسمي Java WeChat.