この記事では、WeChat開発の最初のステップ、公式アカウントへのアクセス、Access_Tokenの管理について説明します。
1。WeChatの公式アカウントへのアクセス
WECHAT公式アカウント開発マニュアルでは、公式アカウントアクセスセクションに関するコンテンツについて詳しく説明します。この文書によれば、公式アカウントにアクセスするには3つのステップが必要であると述べています。
実際、ステップ3は、公式アカウントにアクセスするステップと見なすことはできません。ただし、アクセス後、開発者はWeChatの公式アカウントが提供するインターフェイスに基づいて開発を行うことができます。
ステップ1では、サーバーの構成には、サーバーアドレス(URL)、トークン、エンコーディンスキーが含まれます。
サーバーアドレスは、公式アカウントのバックエンドにビジネスロジックを提供する入り口アドレスです。現在、ポート80のみをサポートしています。その後、アクセス検証とその他の操作要求(メッセージ送信、メニュー管理、材料管理など)をこのアドレスから入力する必要があります。アクセス検証と他のリクエストの違いは、アクセス検証がGETリクエストであり、他の場合にはPOSTリクエストである場合です。
トークンは開発者が記入し、生成する署名として使用できます(トークンは、セキュリティを検証するためにインターフェイスURLに含まれるトークンと比較されます)。
EncodingAeskeyは、開発者によって手動で埋められたり、ランダムに生成されたりし、メッセージボディ暗号化された復号化キーとして使用されます。この例では、すべてが暗号化されていないプレーンテキストメッセージであり、この構成アイテムは関係していません。
ステップ2:サーバーアドレスの有効性を確認します。 「送信」ボタンをクリックすると、WeChatサーバーは、埋め込まれたばかりのサーバーアドレスにHTTP Get Requestを送信し、4つのパラメーターを掲載します。
リクエストを受け取った後、次の3つの手順を実行する必要があります。 GETリクエストがWeChatサーバーから来て、Echostrパラメーターコンテンツをそのまま返すことを確認すると、アクセスが有効になり、それ以外の場合はアクセスが失敗します。
コードは話すことができます。以下は、私が定義したエントリServlevtで、検証方法はDoGetメソッドで定義されています。
// tokenprivate final string token = "fengzheng";保護されたvoid doget(httpservletrequest request、httpservletResponse応答)ServleTexception、ioException {system.out.println( "sign signature vidification");文字列署名= request.getParameter( "signature");文字列タイムスタンプ= request.getParameter( "Timestamp");文字列nonce = request.getParameter( "nonce"); string echostr = request.getParameter( "echostr"); arraylist <string> array = new arrayList <String>(); array.add(署名); array.add(タイムスタンプ); array.add(nonce); // sorting string sortstring = sort(token、timestamp、nonce); // string mytoken = descript.sha1(sortstring); //署名を確認するif(mytoken!= null && mytoken!= "" && mytoken.equals(signature)){system.out.println( "署名検証が通過します。"); Response.getWriter()。println(echostr); //検証が正常に出力された場合、WeChatサーバーは、この出力を受信した後にのみ検証が完了したことを確認します。 } else {system.out.println( "署名検証に失敗しました。"); }} /** sort method * @param token * @param timestamp * @param nonce * @return * /public static string sort(string token、string timestamp、string nonce){strirray = {token、timestamp、nonce}; arrays.sort(strarray); stringbuilder sbuilder = new StringBuilder(); for(string str:strarray){sbuilder.append(str); } sbuilder.toString();}を返します次のコードは暗号化方法です。
public class decrupt {public static string sha1(string descript){try {mesagedigest digest = mesagedgest .getInstance( "sha-1"); Digest.update(descript.getBytes()); BYTE MESSAGEDGEST [] = Digest.Digest(); // hex string stringbuffer hexstring = new StringBuffer()を作成します。 //(int i = 0; i <messagedigest.length; i ++){string shahex = integer.tohexstring(mesagedgest [i]&0xff); if(shahex.length()<2){hexstring.append(0); } hexstring.append(shahex); } return hexstring.toString(); } catch(nosuchalgorithmexception e){e.printstacktrace(); } 戻る ""; }}サーブレットによってマッピングされたXMLは次のとおりです。
<Servlet> <Servlet-Name> start </servlet-name> <servlet-class> org.fengzheng.wechat.start </servlet-class> </servlet> <servlet-name> start </servlet-name> <url-pattern>/wechat </url-pattern> </servlet-mapping>
ここでIntellij Idea+Tomcat7.0開発を使用して、プロジェクトを直接開始し、Ngrokを使用してローカル8080ポートを外部ネットワークにマッピングします。 WECHATテストの公式アカウント管理インターフェイスを入力し、マッピングされた外部ネットワークアドレスを入力し、インターフェイス構成情報にトークンを入力します。
[送信]ボタンをクリックすると、ページが構成が成功するように求められます。
IDEにアクセスして、コンソールの情報出力が表示されます
2。Access_TokenManagement
Access_Tokenの前に、既知が必要な2つの重要なパラメーターがあります。これらの2つのパラメーターはAppidとAppSecretです。これは、公式アカウントを申請するときに公式アカウントに自動的に割り当てられます。これは、公式アカウントのIDマークに相当します。これらの2つのパラメーターは、多くのインターフェイスで必要です。次に、Access_Tokenを要求するとき、これらの2つのパラメーターが必要です。
公式アカウントに正常にアクセスされた後、対応するロジックを実装する必要があります。 WeChatの公式アカウントインターフェイスを使用する場合、多くのリクエストにAccess_Tokenが必要であることがわかりました。 Access_Tokenは、公式アカウントのグローバルユニークな資格情報です。公式アカウントの各インターフェイスを呼び出すときは、Access_Tokenが必要です。開発者はそれを適切に保存する必要があります。 Access_Tokenのストレージは、少なくとも512文字のスペースを保持する必要があります。 Access_Tokenの有効期間は現在2時間であり、定期的に更新する必要があります。繰り返し取得すると、前回取得したAccess_Tokenが無効になります。また、Access_Tokenインターフェイスの上限は毎日2,000回と呼ばれます。
上記の説明を要約するには、Access_Tokenが次の2つのポイントを実行する必要があります。
この点で、ここで採用されているソリューションは次のとおりです。デフォルトの起動サーブレットを定義し、initメソッドでスレッドを開始し、このプロセスの無限ループメソッドを定義してAccess_tokenを取得します。買収が成功すると、プロセスは7000秒間眠ります。そうしないと、3秒間眠りにつくために眠ります。フローチャートは次のとおりです。
返されたデータはすべてJSON形式であるため、プロジェクトで実装されている上記のアイデアです。ここでは、リクエストと処理のリクエストを作成した後にデータのシリアル化と脱シリア化のサポートを提供するためにAlibabaのFastJSONライブラリが使用されます。他の後続のインターフェイスも使用されます。
1.アクセストークンエンティティを定義します
public class 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。デフォルトの起動サーブレットを定義し、initメソッドでスレッドを開始し、このサーブレットをWeb.xmlでデフォルトのセルフスタートに設定します。
javax.servlet.servletexception; import javax.servlet.annotation.websert; import javax.servlet.http.httpservlet; import javax.servlet.http.httpservletrequest; Import javax.servlet.http.httptservletresponse; Import; java.io.ioexception; @webservlet(name = "AccessTokenServlet")public class accessTokenServlet extends httpservlet {public void init()throws servletexception {tokenthread.appid = getInitParameter( "appid"); //サーブレット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(httpservletrequest request、httpservletresponse応答)Servletexception、ioexception、ioexception {}}} web.xmlでサーブレットオートステルトを設定し、初期化パラメーターをappidとappsecretを設定します
<Servlet> <Servlet-Name> initaccesstokenServlet </servlet-name> <servlet-class> org.fengzheng.wechat.accesstoken.accestokenservlet </servlet-class> <init-param> <param-name> appid </param-name> <param-name> appsecret </param-name> <param-value> your appsecret </param-value> </init-param> <load-on-startup> 0 </load-on-startup> </servlet>
3.スレッドクラスを定義し、このクラスでAccess_Tokenを呼び出してインターフェイスを取得し、結果のデータを他の場所で使用する静的エンティティに抽象化します。インターフェイスアドレスはhttps://api.weixin.qq.com/cgi-bin/token?grant_type=crient_credential&appid = appid&secret = appsecretです。このリクエストはhttps get requestであり、返されたデータ形式は{"access_token": "Access_token"、 "expires_in":7200}です。
プロセスクラスの実装は次のとおりです。
com.alibaba.fastjson.jsonをインポート;インポートcom.alibaba.fastjson.jsonobject; Import org.fengzheng.wechat.common.networkhelper; public class tokenthread explments {public static string appid = ""; public static string appsecret = ""; <br> // static public static accesstoken accesstoken = nullであることに注意してください。 public void run(){while(true){try {accessToken = this.getAcsToken(); if(null!= accessToken){System.out.println(accessToken.getAcsToken()); thread.sleep(7000 * 1000); // Access_Tokenを7000秒間スリープして} else {thread.sleep(1000*3); //取得したAccess_Tokenは3秒間空の睡眠です}} catch(Exception E){system.out.println( "例外が発生します:"+e.getMessage()); e.printstacktrace(); {thread.sleep(1000*10); //例外は、1秒間眠りにつくために発生します} catch(Exception E1){}}}}}/** * get Access_token * @return */private AccessToken getAccesToken(){NetworkHelper nethelper = new 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);文字列result = nethelper.gethttpsResponse(url、 ""); system.out.println(result); //response.getWriter( ).println(result); jsonobject json = json.parseobject(result); AccessToken token = new AccessToken(); token.SetAccesToken(json.getString( "Access_Token")); token.setexpiresin(json.getinteger( "expires_in"));トークンを返します。 }}networkhelperのgethttpsResponseメソッドは、httpsアドレスを要求し、パラメーターrequestmethodは文字列「get」または「post」であり、デフォルトはgetメソッドです。
実装は次のとおりです。
public string gethttpsResponse(string hsurl、string requestmethod){url url; inputstream is = null;文字列resultData = ""; try {url = new 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 verify(string arg0、sslsession arg1){return true;}}); con.setdoinput(true); //入力ストリーム、つまりダウンロード、/Androidでは、このアイテムはfalse con.setdooutput(false)に設定する必要があります。 //出力ストリーム、つまり、con.setusecaches(false)をアップロードすることを許可します。 //バッファリングを使用しないif(null!= requestmethod &&!requestMethod.equals( "")){con.setRequestMethod(requestMethod); //指定された方法を使用} else {con.setRequestMethod( "get"); // get request}を使用} is = con.getInputStream(); //入力ストリームを取得すると、リンクが実際に確立されます。 inputStreamReader ISR = new inputStreamReader(is); BufferedReader BufferReader = new BufferedReader(ISR);文字列inputline = ""; while((inputline = bufferreader.readline())!= null){resultData + = inputline + "/n"; } system.out.println(resultData);証明書[] certs = con.getServerCertificates(); int certnum = 1; for(証明書証明書:certs){x509certificate xcert =(x509certificate)cert; }} catch(例外e){e.printstacktrace(); } runter resultData; } x509TrustManager XTM = new X509TrustManager(){@Override public x509Certificate [] getCicteDissuers(){// todo auto-fenerated method stub Returt null; } @OverRide public void checkServerTrusted(x509Certificate [] arg0、string arg1)strows certifateexception {// todo auto-enerated method stub} @override public void checkclienttrusted(x509certificate [] arg0、string arg1)exterimectectectectectectectextextextextextextextextextextextextextextextex;この時点で、コードが実装された後、プロジェクトが展開され、コンソール出力は次のとおりです。
効果を表示するには、30秒で1回取得してからAccess_Tokenを出力するなど、睡眠時間を少し短く設定できます。 JSPページをテストし、スリープ時間を30秒に設定しましょう。このようにして、30秒後に変更を確認できます。ちなみに、他の場所でaccess_tokenを取得する方法
<%@ page contentType = "text/html; charset = utf-8"言語= "%> <%@ page import =" org.fengzheng.wechat.accesstoken.tokenthread "%> <html> <head> <title> </ittitle> </head> <bodydoken <%= tokenthread.accesstoken.getaccestoken()%> </body> </html>
これにより、このページをブラウザで閲覧すると、表示効果は次のとおりです。
30秒後に更新されたこの値は変更されました。
この記事は「Android Wechat Development Tutorial Summary」にまとめられており、「Java Wechat Development Tutorial Summary」は、すべての人を学び、読むことを歓迎します。
上記はこの記事に関するすべてです。誰もがJava Wechatの公式アカウントを開発することが役立つことを願っています。