บทความนี้จะพูดคุยเกี่ยวกับขั้นตอนแรกในการพัฒนา WeChat การเข้าถึงบัญชีอย่างเป็นทางการและการจัดการ ACCEST_TOKEN
1. การเข้าถึงบัญชีอย่างเป็นทางการของ WeChat
ในคู่มือการพัฒนาบัญชีอย่างเป็นทางการของ WeChat เนื้อหาเกี่ยวกับส่วนการเข้าถึงบัญชีอย่างเป็นทางการจะถูกเขียนขึ้นโดยละเอียด เอกสารบอกว่าการเข้าถึงบัญชีอย่างเป็นทางการต้องใช้สามขั้นตอนคือ:
ในความเป็นจริงขั้นตอนที่ 3 ไม่สามารถพิจารณาได้ว่าเป็นขั้นตอนการเข้าถึงบัญชีอย่างเป็นทางการอีกต่อไป อย่างไรก็ตามหลังจากการเข้าถึงนักพัฒนาสามารถทำการพัฒนาได้ตามส่วนต่อประสานที่จัดทำโดยบัญชีอย่างเป็นทางการของ WeChat
ในขั้นตอนที่ 1 การกำหนดค่าเซิร์ฟเวอร์รวมที่อยู่เซิร์ฟเวอร์ (URL) โทเค็นและ encodingaeskey
ที่อยู่เซิร์ฟเวอร์เป็นที่อยู่ทางเข้าที่ให้ตรรกะทางธุรกิจไปยังแบ็กเอนด์ของบัญชีอย่างเป็นทางการ ขณะนี้รองรับพอร์ต 80 หลังจากนั้นการตรวจสอบการเข้าถึงและคำขอการดำเนินการอื่น ๆ (เช่นการส่งข้อความการจัดการเมนูการจัดการวัสดุ ฯลฯ ) จะต้องป้อนจากที่อยู่นี้ ความแตกต่างระหว่างการตรวจสอบการเข้าถึงและคำขออื่น ๆ คือเมื่อการตรวจสอบการเข้าถึงเป็นคำขอรับและเมื่อเวลาอื่น ๆ เป็นคำขอโพสต์
โทเค็นสามารถเติมเต็มโดยนักพัฒนาและใช้เป็นลายเซ็นเพื่อสร้าง (โทเค็นจะถูกนำมาเปรียบเทียบกับโทเค็นที่มีอยู่ใน URL อินเตอร์เฟสเพื่อตรวจสอบความปลอดภัย);
ENCODINGAESKEY เต็มไปด้วยตนเองหรือสร้างขึ้นโดยนักพัฒนาและจะใช้เป็นคีย์ถอดรหัสข้อความที่เข้ารหัสข้อความ ในตัวอย่างนี้ทั้งหมดเป็นข้อความธรรมดาที่ไม่ได้เข้ารหัสและรายการการกำหนดค่านี้ไม่เกี่ยวข้อง
ขั้นตอนที่ 2: ตรวจสอบความถูกต้องของที่อยู่เซิร์ฟเวอร์ เมื่อคลิกปุ่ม "ส่ง" เซิร์ฟเวอร์ WeChat จะส่งคำขอ GET HTTP ไปยังที่อยู่เซิร์ฟเวอร์ที่คุณเพิ่งกรอกและพกพาพารามิเตอร์สี่ตัว:
หลังจากได้รับคำขอเราต้องทำสามขั้นตอนต่อไปนี้ หากเรายืนยันว่าคำขอ GET นั้นมาจาก WeChat Server และส่งคืนเนื้อหาพารามิเตอร์ ECHOSTR ตามที่เป็นอยู่การเข้าถึงจะมีผลมิฉะนั้นการเข้าถึงจะล้มเหลว
รหัสสามารถพูดคุยได้ ต่อไปนี้เป็นรายการ Servlevt ที่ฉันกำหนดไว้ซึ่งวิธีการตรวจสอบถูกกำหนดไว้ในวิธีการ DOGET:
// tokenprivate สตริงสุดท้ายโทเค็น = "fengzheng"; Void Doget ที่ได้รับการป้องกัน (คำขอ httpservletRequest, การตอบสนอง httpservletResponse) พ่น servletexception, ioexception {system.out.println ("เริ่มการตรวจสอบลายเซ็น"); String Signature = request.getParameter ("ลายเซ็น"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); String echosttr = request.getParameter ("echosttr"); ArrayList <String> array = new ArrayList <String> (); array.add (ลายเซ็น); array.add (การประทับเวลา); array.add (nonce); // การเรียงลำดับสตริง sortString = sort (โทเค็น, timestamp, nonce); // เข้ารหัสสตริง myToken = descript.sha1 (SortString); // ตรวจสอบลายเซ็นถ้า (mytoken! = null && mytoken! = "" && mytoken.equals (ลายเซ็น)) {system.out.println ("การตรวจสอบลายเซ็นผ่าน"); Response.getWriter (). println (echostr); // หากการตรวจสอบได้รับการส่งออกสำเร็จ ECHOSTR เซิร์ฟเวอร์ WECHAT จะยืนยันว่าการตรวจสอบจะเสร็จสมบูรณ์หลังจากได้รับเอาต์พุตนี้เท่านั้น } else {system.out.println ("การตรวจสอบลายเซ็นล้มเหลว"); }} /** * วิธีการเรียงลำดับ * @param โทเค็น * @param timestamp * @param nonce * @return * /การเรียงลำดับสตริงคงที่สาธารณะ (โทเค็นสตริง, สตริง timestamp, สตริง nonce) {string [] strarray = {token, timestamp, nonce}; array.sort (Strarray); StringBuilder sbuilder = new StringBuilder (); สำหรับ (String str: strarray) {sbuilder.append (str); } return sbuilder.toString ();}รหัสต่อไปนี้คือวิธีการเข้ารหัส:
ตัวอธิบายคลาสสาธารณะ {สตริงคงที่สาธารณะ sha1 (สตริงตัวอธิบาย) {ลอง {messageDigest digest = messageDigest .getInstance ("sha-1"); digest.update (descript.getBytes ()); byte messageGeSt [] = 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); } return hexstring.toString (); } catch (nosuchalgorithmexception e) {e.printstacktrace (); } กลับ ""; -XML ที่แมปโดย servlet มีดังนี้:
<servlet> <servlet-name> start </servlet-name> <servlet-lass> org.fengzheng.wechat.start </servlet-lass> </servlet> <servlet-mapping> <servlet-name> เริ่มต้น </servlet-name>
ฉันใช้ Intellij Idea+Tomcat7.0 การพัฒนาที่นี่เริ่มโครงการโดยตรงจากนั้นใช้ 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 ปัจจุบัน 2 ชั่วโมงและจำเป็นต้องได้รับการรีเฟรชเป็นประจำ การได้มาซ้ำ ๆ จะทำให้ Access_token คุณได้รับครั้งสุดท้ายที่จะไม่ถูกต้อง และขีด จำกัด สูงสุดของอินเทอร์เฟซ Access_Token เรียกว่าทุกวันคือ 2,000 ครั้ง
เพื่อสรุปคำอธิบายข้างต้น access_token ต้องทำสองจุดต่อไปนี้:
ในเรื่องนี้โซลูชันที่นำมาใช้ที่นี่มีดังนี้: กำหนด Servlet เริ่มต้นเริ่มต้นเริ่มต้นเธรดในวิธีการเริ่มต้นและกำหนดวิธีการวนซ้ำที่ไม่มีที่สิ้นสุดในกระบวนการนี้เพื่อให้ได้ access_token เมื่อการซื้อกิจการสำเร็จกระบวนการจะนอนเป็นเวลา 7000 วินาทีมิฉะนั้นจะนอนหลับเป็นเวลา 3 วินาทีเพื่อให้ได้มา แผนภูมิการไหลมีดังนี้:
ต่อไปนี้เป็นแนวคิดข้างต้นที่ได้นำไปใช้ในโครงการเนื่องจากข้อมูลที่ส่งคืนนั้นทั้งหมดอยู่ในรูปแบบ JSON ไลบรารี FastJSON ของอาลีบาบาจะถูกนำมาใช้ที่นี่เพื่อให้การสนับสนุนการทำให้เป็นอนุกรมข้อมูลและ deserialization หลังจากสร้างคำขอและการประมวลผลคำขอ อินเทอร์เฟซที่ตามมาอื่น ๆ จะถูกนำมาใช้
1. กำหนดเอนทิตี AccessToken
Public Class AccessToken {Public String getAccessToken () {return AccessToken; } โมฆะสาธารณะ setAccessToken (String AccessToken) {this.accessToken = AccessToken; } public int getExpiresin () {return expiresin; } โมฆะสาธารณะ setExpiresin (int expiresin) {this.expiresin = expiresIn; } accesstoken สตริงส่วนตัว; Int Expiresin ส่วนตัว - 2. กำหนด Servlet เริ่มต้นเริ่มต้นเริ่มต้นเธรดในเมธอด init และตั้งค่า servlet นี้เป็นเริ่มต้นด้วยตนเองเริ่มต้นใน web.xml
นำเข้า javax.servlet.servletexception; นำเข้า Javax.servlet.annotation.webservlet; นำเข้า Javax.servlet.http.httpservlet; นำเข้า Javax.servlet.http.httpservletRequest; java.io.ioException; @webservlet (name = "AccessTokenServlet") คลาสสาธารณะ AccessTokenServlet ขยาย httpservlet {โมฆะสาธารณะเริ่มต้น () พ่น servletexception {tokenthread.appid = getInitParameter ("appid"); // รับพารามิเตอร์เริ่มต้นของ servlet appid และ appsecret tokenthread.appsecret = getInitParameter ("AppSecret"); System.out.println ("appid:"+tokenthread.appid); System.out.println ("AppSecret:"+tokenthread.appsecret); เธรดใหม่ (New Tokenthread ()). start (); // เริ่มกระบวนการ} void dopost (httpservletrequest Request, httpservletResponse การตอบสนอง) พ่น servletexception, ioexception {} void doget ที่ได้รับการป้องกัน ตั้งค่า servlet autostart ใน web.xml และตั้งค่าพารามิเตอร์การเริ่มต้น appid และ appsecret
<servlet> <servlet-name> initaccessTokenServlet </servlet-name> <servlet-lass> org.fengzheng.wechat.accessToken.accessTokenServlet </servlet-class> <init-Param> <param-Name> <param-name> appsecret </param-name> <param-value> appsecret ของคุณ </param-value> </itrient-Param> <load-on-Startup> 0 </load-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; นำเข้า com.alibaba.fastjson.jsonobject; นำเข้า org.fengzheng.wechat.Common.networkhelper; แอปสตริงสแตติกสาธารณะสาธารณะ = ""; <br> // โปรดทราบว่ามันเป็น accessToken accessToken สาธารณะคงที่สาธารณะคงที่ = null; โมฆะสาธารณะเรียกใช้ () {ในขณะที่ (จริง) {ลอง {accessToken = this.getAccessToken (); if (null! = AccessToken) {System.out.println (AccessToken.getAccessToken ()); Thread.sleep (7000 * 1000); // รับ access_token to sleep เป็นเวลา 7000 วินาที} else {thread.sleep (1000*3); // access_token ที่ได้รับคือการนอนหลับว่างเป็นเวลา 3 วินาที}} catch (Exception e) {system.out.println ("ข้อยกเว้นเกิดขึ้น:"+e.getMessage ()); E.PrintStackTrace (); ลอง {thread.sleep (1,000*10); // ข้อยกเว้นเกิดขึ้นที่จะนอนหลับเป็นเวลา 1 วินาที} catch (Exception e1) {}}}}}/** * รับ access_token * @return */private AccessToken getAccessToken () {NetworkHelper nethelper = networkHelper () ใหม่ (); string url = string.format ("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%S&secret=%S" นี่คือสิ่งนี้ สตริงผลลัพธ์ = nethelper.gethttpsresponse (url, ""); System.out.println (ผลลัพธ์); //response.getWriter().println(result); jsonObject json = json.parseObject (ผลลัพธ์); AccessToken Token = new AccessToken (); token.setAccessToken (json.getString ("access_token")); token.setexpiresin (json.getinteger ("expires_in")); โทเค็นกลับมา; -วิธี gethttpsresponse ใน NetworkHelper ร้องขอที่อยู่ HTTPS, Parameter RequestMethod คือสตริง "รับ" หรือ "โพสต์" และค่าเริ่มต้นคือวิธีการรับ
การดำเนินการมีดังนี้:
สตริงสาธารณะ gethttpsresponse (String hsurl, string requestmethod) {url url; InputStream คือ = null; String 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 (Hostnameverifier ใหม่ () {@Override Public Boolean Verify (String Arg0, SslSession Arg1) {return true;}}); Con.setDoInput (จริง); // อนุญาตให้สตรีมอินพุตนั่นคือการดาวน์โหลด/ใน Android รายการนี้จะต้องตั้งค่าเป็น false con.setDoOutput (เท็จ); // อนุญาตให้สตรีมเอาต์พุตนั่นคืออัปโหลด con.setUsecaches (เท็จ); // อย่าใช้บัฟเฟอร์ถ้า (null! = requestMethod &&! requestMethod.equals ("")) {con.setRequestMethod (requestMethod); // ใช้วิธีการที่ระบุ} else {con.setRequestMethod ("รับ"); // ใช้ GET Request} คือ = Con.getInputStream (); // รับสตรีมอินพุตจากนั้นลิงก์จะถูกสร้างขึ้นจริง InputStreamReader ISR = ใหม่ inputStreamReader (IS); bufferedReader bufferReader = new bufferedReader (ISR); สตริงอินพุต = ""; ในขณะที่ ((inputline = bufferReader.readline ())! = null) {resultData + = inputline + "/n"; } system.out.println (resultData); ใบรับรอง [] certs = con.getServerCertificates (); int certnum = 1; สำหรับ (ใบรับรองใบรับรอง: ใบรับรอง) {x509Certificate xcert = (x509Certificate) ใบรับรอง; }} catch (exception e) {e.printstacktrace (); } return resultData; } x509TrustManager xtm = ใหม่ x509trustManager () {@Override สาธารณะ x509certificate [] getacceptedissuers () {// วิธีการที่สร้างอัตโนมัติ todo stub return null; } @Override โมฆะสาธารณะ CheckserVerTrusted (x509Certificate [] arg0, String arg1) พ่นใบรับรองการรับรู้ {// todo วิธีการที่สร้างอัตโนมัติ auto} @Override โมฆะ public CheckClientTrusted (x509Certificate [] arg0, arg1 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> <head> <%= tokenthread.accessToken.getAccessToken ()%> </body> </html>
ด้วยวิธีนี้เรียกดูหน้านี้บนเบราว์เซอร์และเอฟเฟกต์การแสดงผลมีดังนี้:
รีเฟรชหลังจาก 30 วินาทีค่านี้เปลี่ยนไป:
บทความนี้ได้รวบรวมไว้ใน "บทสรุปการสอนการพัฒนา Android WeChat" และ "สรุปการสอนการพัฒนา Java WeChat" ยินดีต้อนรับทุกคนให้เรียนรู้และอ่าน
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการพัฒนาบัญชีอย่างเป็นทางการของ Java WeChat