Artikel ini akan berbicara tentang langkah pertama dalam pengembangan WeChat, akses ke akun resmi dan manajemen Access_Token.
1. Akses ke akun resmi WeChat
Dalam manual pengembangan akun resmi WeChat, konten tentang bagian akses akun resmi ditulis secara lebih rinci. Dokumen itu mengatakan bahwa mengakses akun resmi membutuhkan tiga langkah, yaitu:
Faktanya, Langkah 3 tidak dapat lagi dianggap sebagai langkah mengakses akun resmi. Namun, setelah akses, pengembang dapat melakukan beberapa pengembangan berdasarkan antarmuka yang disediakan oleh akun resmi WeChat.
Pada Langkah 1, konfigurasi server mencakup alamat server (URL), token dan encodingaesKey.
Alamat server adalah alamat masuk yang memberikan logika bisnis ke backend akun resmi. Saat ini, hanya mendukung port 80. Setelah itu, verifikasi akses dan permintaan operasi lainnya (seperti pengiriman pesan, manajemen menu, manajemen materi, dll.) Harus dimasukkan dari alamat ini. Perbedaan antara verifikasi akses dan permintaan lainnya adalah bahwa ketika verifikasi akses adalah permintaan GET, dan ketika lain kali itu adalah permintaan pos;
Token dapat diisi oleh pengembang dan digunakan sebagai tanda tangan untuk menghasilkan (token akan dibandingkan dengan token yang terkandung dalam URL antarmuka untuk memverifikasi keamanan);
Encodingaeskey diisi secara manual atau dihasilkan secara acak oleh pengembang dan akan digunakan sebagai kunci pesan dekripsi yang dienkripsi badan. Dalam contoh ini, semua adalah pesan plaintext yang tidak terenkripsi, dan item konfigurasi ini tidak terlibat.
Langkah 2: Verifikasi validitas alamat server. Saat mengklik tombol "Kirim", server WeChat akan mengirim permintaan HTTP Get ke alamat server yang baru saja Anda isi, dan bawa empat parameter:
Setelah menerima permintaan, kita perlu melakukan tiga langkah berikut. Jika kami mengonfirmasi bahwa permintaan GET berasal dari server WeChat dan mengembalikan konten parameter Echostr sebagaimana adanya, akses akan berlaku, jika tidak, akses akan gagal.
Kode dapat berbicara. Berikut ini adalah entri servlevt yang saya tentukan, di mana metode verifikasi didefinisikan dalam metode doGet:
// tokenPrivate final string token = "fengzheng"; DoGet void yang dilindungi (permintaan httpservletRequest, respons httpservletResponse) melempar servletException, ioException {system.out.println ("Mulai verifikasi tanda tangan"); String Signature = request.getParameter ("Signature"); String timestamp = request.getParameter ("timestamp"); String nonce = request.getParameter ("nonce"); String echoStr = request.getParameter ("echostr"); ArrayList <String> array = ArrayList baru <string> (); array.add (tanda tangan); array.add (timestamp); array.add (nonce); // mengurutkan string sortstring = sort (token, timestamp, nonce); // enkripsi string myToken = descript.sha1 (sortString); // Periksa tanda tangan if (mytoken! = Null && mytoken! = "" && myToken.equals (tanda tangan)) {System.out.println ("Verifikasi tanda tangan berlalu."); response.getWriter (). println (echostr); // Jika verifikasi berhasil dikeluarkan Echostr, server WeChat akan mengkonfirmasi bahwa verifikasi diselesaikan hanya setelah menerima output ini. } else {System.out.println ("Verifikasi tanda tangan gagal."); }} /** * Sortir metode * @param token * @param timestamp * @param nonce * @return * /public static string sort (string token, string timestamp, string nonce) {string [] strarray = {token, timestamp, nonce}; Arrays.sort (Strarray); StringBuilder sBuilder = stringBuilder baru (); untuk (string str: strarray) {sbuilder.append (str); } return sbuilder.toString ();}Kode berikut adalah metode enkripsi:
deskripsi kelas publik {public static string sha1 (string descript) {try {messageSageTest digest = messageSmest .getInstance ("sha-1"); Digest.update (descript.getbytes ()); byte messagedigest [] = digest.gigest (); // buat hex string stringBuffer hexString = new stringBuffer (); // Konversi array byte menjadi hexadecimal number untuk (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 (); } kembali ""; }}XML yang dipetakan oleh servlet adalah sebagai berikut:
<servlet> <servlet-name> Mulai </servlet-name> <servlet-class> org.fengzheng.wechat.start </servlet-class> </servlet> <servlet-Mapping> <servlet-name> Mulai </servlet-name> <rerl-pattern>/weChat </url-pola> </servlet>
Saya menggunakan IntelliJ Idea+Tomcat7.0 pengembangan di sini, memulai proyek secara langsung, dan kemudian menggunakan NGROK untuk memetakan port 8080 lokal ke jaringan eksternal. Masukkan antarmuka manajemen akun resmi WeChat Test, isi alamat jaringan eksternal yang dipetakan dan token dalam informasi konfigurasi antarmuka.
Klik tombol Kirim dan halaman akan meminta konfigurasi berhasil.
Anda akan pergi ke IDE dan melihat output informasi di konsol
2. Manajemen Access_Token
Sebelum access_token, ada dua parameter penting yang perlu diketahui. Kedua parameter ini appid dan appsecret. Ini secara otomatis ditugaskan ke akun resmi saat mengajukan permohonan akun resmi. Ini setara dengan tanda identitas akun resmi. Dua parameter ini diperlukan di banyak antarmuka. Selanjutnya, saat meminta akses_token, kedua parameter ini diperlukan.
Setelah akun resmi berhasil diakses, logika yang sesuai harus diimplementasikan. Saat menggunakan antarmuka akun resmi WeChat, saya menemukan bahwa banyak permintaan memerlukan Access_Token. Access_Token adalah kredensial unik global dari akun resmi. Access_Token diperlukan saat memanggil setiap antarmuka akun resmi. Pengembang perlu menyimpannya dengan benar. Penyimpanan Access_Token harus mempertahankan setidaknya 512 ruang karakter. Periode validitas Access_Token saat ini 2 jam dan perlu disegarkan secara teratur. Akuisisi berulang akan menyebabkan akses_token yang Anda peroleh terakhir kali menjadi tidak valid. Dan batas atas antarmuka Access_Token dipanggil setiap hari adalah 2.000 kali.
Untuk meringkas penjelasan di atas, Access_Token perlu melakukan dua poin berikut:
Dalam hal ini, solusi yang diadopsi di sini adalah sebagai berikut: Tentukan servlet startup default, mulai utas dalam metode init, dan tentukan metode loop tak terbatas dalam proses ini untuk mendapatkan access_token. Ketika akuisisi berhasil, proses tidur selama 7000 detik, jika tidak, ia akan tidur selama 3 detik untuk terus mendapatkan. Bagan aliran adalah sebagai berikut:
Berikut ini adalah gagasan di atas yang telah diimplementasikan dalam proyek, karena data yang dikembalikan semuanya dalam format JSON, Perpustakaan FastJson Alibaba akan digunakan di sini untuk memberikan dukungan untuk serialisasi data dan deserialisasi setelah membangun permintaan dan permintaan pemrosesan. Antarmuka lainnya juga akan digunakan.
1. Tentukan entitas AccessToken
Public Class AccessToken {public String getAccessToken () {return accessToken; } public void setAccessToken (String accessToken) {this.accessToken = accessToken; } public int getExpiresin () {return berakhir; } public void setExpiresin (int kedaluwarsa) {this.expiresin = kedaluwarsa; } Private String AccessToken; int pribadi kedaluwarsa; } 2. Tentukan servlet startup default, mulai utas dalam metode init, dan atur servlet ini ke martam mandiri default di web.xml.
Impor javax.servlet.servletException; impor javax.servlet.annotation.webservlet; import javax.servlet.http.htpservlet; import javax.servlet.http.httpservletrequest; impor javax.servlet.http.htpservletRequest; impor javax.servlet.htp.htpservet; java.io.ioException; @webservlet (name = "accessTokeServlet") kelas publik AccessTokenservlet memperluas httpservlet {public void init () melempar servletException {tokenthread.appid = getInitparameter ("appid"); // Dapatkan parameter awal dari Servlet Appid dan AppSecret Tokenthread.appsecret = getInitparameter ("AppSecret"); System.out.println ("AppID:"+Tokenthread.Appid); System.out.println ("AppSecret:"+Tokenthread.appsecret); utas baru (new tokenthread ()). start (); // Mulai proses} void dopost yang dilindungi (httpservletrequest permintaan, httpservletResponse response) melempar servletException, ioException {} void doGet yang dilindungi (httpservletRequest, httpservletResponse response {httpservlequest, httpservletResponseReSe) lemparan servletException {httpserVletsconsconsception {httpserVleSponse) lemparan servletexception {httpserVLesconsconsception {httpserVleSponse) loug Setel Servlet AutoStart di web.xml dan atur parameter inisialisasi appid dan appsecret
<servlet> <servlet-name> initAccessTokenServlet </servlet-name> <servlet-class> org.fengzheng.wechat.accesstoken.accesstokenservlet </servlet-class> <in-param> <param-name> </param-name> <param-value> <-param> <param-vAdam> </Param-name> <param-value> <param- Param> </Param- vale </param-name> <param-value> <param- Param> <param-name> appsecret </param-name> <param-value> AppSecret Anda </param-value> </itin-param> <Boad-on-startup> 0 </boad-on-startup> </servlet>
3. Tentukan kelas utas, hubungi access_token di kelas ini untuk mendapatkan antarmuka, dan abstrak data yang dihasilkan ke entitas statis untuk digunakan di tempat lain. Alamat antarmuka adalah https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appid&secret=appsecret, di mana Grant_Type ditulis secara tepat sebagai client_credential. Permintaan ini adalah permintaan mendapatkan https, dan format data yang dikembalikan adalah {"access_token": "access_token", "Expires_in": 7200}.
Implementasi kelas proses adalah sebagai berikut:
Impor com.alibaba.fastjson.json; impor com.alibaba.fastjson.jsonobject; impor org.fengzheng.wechat.common.networkhelper; Tokentread kelas publik mengimplementasikan runnable {public static string = ""; public static string appsecret = ""; <br> // perhatikan bahwa itu adalah statis statis statis accessToken accessToken = null; public void run () {while (true) {try {accessToken = this.getAccessToken (); if (null! = accessToken) {System.out.println (accessToken.getAccessToken ()); Thread.sleep (7000 * 1000); // Dapatkan akses_token ke tidur selama 7000 detik} else {thread.sleep (1000*3); // Access_token yang diperoleh adalah tidur kosong selama 3 detik}} catch (Exception e) {System.out.println ("Pengecualian terjadi:"+e.getMessage ()); e.printstacktrace (); coba {thread.sleep (1000*10); // Pengecualian muncul untuk tidur selama 1 detik} catch (Exception e1) {}}}}}/** * Dapatkan akses_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", this.appid, this.appsecret); String result = nethelper.getHttpsResponse (url, ""); System.out.println (hasil); //response.getwriter().println(result); JsonObject json = json.parseObject (hasil); AccessToken token = AccessToken baru (); token.setAccessToken (json.getString ("access_token")); token.setexpiresin (json.getInteger ("Expires_in")); Token kembali; }}Metode GetHTTPSResponse di NetworkHelper meminta alamat HTTPS, Parameter RequestMethod adalah string "Get" atau "Post", dan defaultnya adalah metode GET.
Implementasi adalah sebagai berikut:
string publik getHttpsResponse (string hsurl, string requestMethod) {url url; InputStream adalah = null; String resultData = ""; coba {url = url baru (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 baru () {@Override public boolean verifikasi (string arg0, sslsession arg1) {return true;}}); con.setdoInput (true); // Izinkan aliran input, yaitu, unduhan,/di Android, item ini harus diatur ke false con.setDoOutput (false); // Izinkan aliran output, yaitu, mengunggah con.setusecaches (false); // Jangan gunakan buffering if (null! = RequestMethod &&! RequestMethod.equals ("")) {con.setRequestMethod (requestMethod); // gunakan metode yang ditentukan} else {con.setRequestMethod ("get"); // Gunakan Permintaan Dapatkan} adalah = con.getInputStream (); // Dapatkan aliran input, dan kemudian tautan sebenarnya dibuat. InputStreamReader ISR = InputStreamReader baru (IS); BufferedReader buferReader = new BufferedReader (ISR); String inputline = ""; while ((inputline = bufferreader.readline ())! = null) {resultData + = inputline + "/n"; } System.out.println (resultData); Sertifikat [] sertifikat = con.getServerCertificates (); int certnum = 1; untuk (sertifikat sertifikat: sertifikat) {x509certificate xcert = (x509certificate) cert; }} catch (Exception e) {e.printstacktrace (); } return resultData; } X509TrustManager xtm = X509TrustManager () {@Override public x509certificate [] getacceptedissuers () {// TODO Metode yang dihasilkan secara otomatis Stub return return null; } @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { // TODO Auto-generated method stub } };Pada titik ini, setelah kode diimplementasikan, proyek ini digunakan, dan output konsol adalah sebagai berikut:
Untuk melihat efeknya, Anda dapat mengatur waktu tidur sedikit lebih pendek, seperti mendapatkannya sekali dalam 30 detik, dan kemudian mengeluarkan access_token. Mari kita lakukan halaman tes JSP dan atur waktu tidur menjadi 30 detik. Dengan cara ini, setelah 30 detik, Anda dapat melihat perubahannya. Ngomong -ngomong, cara mendapatkan access_token di tempat lain
<%@ page contentType = "Teks/html; charset = utf-8" bahasa = "java"%> <%@ page impor = "org.fengzheng.wechat.accesstoken.tokenthread"%> <html> <title> </title </title </head> <godes> <html> <tead> </title> </head> <godes> Access_coKoKoKen (heads =/title </title> </head> <hodes> Access_coKoKook </body> </html>
Dengan cara ini, telusuri halaman ini di browser, dan efek tampilan adalah sebagai berikut:
Segarkan setelah 30 detik, nilai ini berubah:
Artikel ini telah dikompilasi menjadi "Ringkasan Tutorial Pengembangan Android WeChat", dan "Java WeChat Development Tutorial Ringkasan" menyambut semua orang untuk dipelajari dan dibaca.
Di atas adalah semua tentang artikel ini. Saya harap akan sangat membantu bagi semua orang untuk mengembangkan akun resmi Java WeChat.