WeChat Development APIからメッセージを取得して返信する方法、以下に紹介します
1。説明
*この例は、WeChat開発文書に従って開発および実証されています:http://mp.weixin.qqq.com/wiki/home/index.html最新バージョン(4/3/2016 5:34:36 PM)。
*編集プラットフォーム:myeclipse10.7+win32+jdk1.7+tomcat7.0
*サーバー:Alibaba Cloud Windows Server 2008 64bits
*プラットフォーム要件:サーブレットの使用アノテーション方法、プラットフォーム要件:J2EE6.0+、JDK6.0+、Tomcat7.0+
*デモは、API解析にもっと焦点を当てています。
*テストの指示のために、各テストケースは独立しており、他の方法に依存しません。パッケージをあまり考えないでください。
*デモンストレーションは、API要件に従って可能な限り実行されます。目的:ドキュメントの使用方法を理解し、1つの例から学習し、他の例に適用する効果を実現します。
*知識要件:Solid Java Foundation、HTTPネットワーク通信の知識を理解し、Javawebを十分に理解している、JSON分析
*デモソースコードのこの部分は、各記事の最後に与えられます。 APIを分析した後、すべてのデモソースコードはソースコードパッケージの形式で提供されます。
*現在の時刻:2016年4月3日午後5時32分57分、今回は勝ちます。
2。オリジナルのテキストメッセージ管理を文書化する(要約)
•ドキュメントアドレス:http://mp.weixin.qq.com/wiki/17/F298879F8FB29AB98B2F2971D42552FD.HTML
•メッセージ管理
◦受信メッセージ受信通常のメッセージ
◦受信メッセージ受信イベントのプッシュ
◦メッセージとパッシブの返信メッセージを送信します
◦受動的な応答時のメッセージの暗号化と復号化を送信します
◦メッセージカスタマーサービスメッセージを送信します
◦メッセージマッソージインターフェイスを送信します
◦メッセージテンプレートメッセージインターフェイスを送信します
◦メッセージテンプレートメッセージの操作仕様を送信します
◦公式アカウントの自動応答構成を取得します
3。ドキュメントの理解
•メッセージを受信します
◦ドキュメントはこれを説明しています。通常のWeChatユーザーがパブリックアカウントにメッセージを送信すると、WeChatサーバーは、POSTメッセージのXMLデータを開発者が記入したURLにパッケージ化します。
◦理解:WeChatサーバーは、ポストストリームの形でREQに送信されたメッセージをユーザーから返します。ユーザーから送信されたメッセージを取得したい場合は、Req.getInputStream()を使用して取得できます。もちろん、ドキュメント内の返品メッセージのXML形式に基づいて必要な解析を実行できます。
◦
成し遂げる:
/**この部分では、ユーザーから送信された情報を取得し、表示* ///ユーザーが送信した情報を解析します。 inputstream is = req.getInputStream(); //リクエストストリームを取得//解析結果をハッシュマップに保存する<文字列、文字列>マップ= new hashmap = new hashmap <string、string>(); // parse xml、saxreader reader(); xml] document document = null; try {document = reader.read(is);} catch(documentexception e1){// todo auto-fenerated catch block e1.printstacktrace();} // get xml root要素root = document.getRootelement(); (要素E:ElementList)Map.put(e.getName()、E.getText())のノード; //テスト出力セット<string> keyset = map.keyset(); //テスト出力が解析された後、ユーザーが送信した情報はユーザーSystem.out.println(tag + "によって送信された情報が送信されます。 for(string key:keyset){system.out.println(key + ":" + map.get(key));} system.out.println(tag + ":ユーザーが送信した情報を解析するために終了します"); •メッセージを送信します
◦ドキュメントはこれを説明しています。ユーザーが公式アカウントにメッセージを送信すると(または特定のユーザー操作によってイベントがプッシュされたとき)、POSTリクエストが生成されます。開発者は、応答パッケージ(GET)の特定のXML構造を返信してメッセージに応答できます(返信テキスト、写真、テキスト、音声、ビデオ、音楽をサポートしています)。厳密に言えば、パッシブ応答メッセージの送信は実際にはインターフェイスではなく、WeChatサーバーに送信されたメッセージへの返信です。
◦理解:ユーザーがリクエストを送信すると、POSTリクエストが生成され、Responeを介してメッセージに返信できます。ただし、返信コンテンツには厳密な形式の要件があります。フォーマット要件が満たされている場合にのみ、WeChatサーバーがプロセスし、ユーザーに戻ります。ドキュメント「メッセージ管理」モジュールを表示することにより、WeChatにはさまざまなメッセージがあり、各タイプのメッセージには独自の特定の形式要件があることがわかります。通常、特定の情報をユーザーに返すために要件に従う必要があります。ドキュメントの必要な形式のテキスト情報とグラフィックメッセージをユーザーに返信しようとします。フォーカス:ドキュメントの要件に従って必要なパラメーターを構築します。特別なメモ:パラメーターはケースに敏感です。
◦通常のテキストメッセージから1回の実現:
//例1:通常のテキストメッセージを送信するには、「返信テキストメッセージ」に関するドキュメントのXML形式を確認してください。 textmsg.setfromusername(map.get( "tousername")); textmsg.setcreatetime(new date()。gettime()); //メッセージ作成時間(整数)textmsg.setmsgtype( "text"); WeChat [baidu:xstream Bean to xml]によって認識された形式XStream XStream = new XStream(); XStream.Alias( "xml"、textmsg.getClass()); string textmsg2xml = xstream.toxml(textmsg); system.out.out.out.out.out; WeChatサーバーに情報をフォーマットし、サーバーがユーザーprintwriter printwriter = resp.getwriter(); printwriter.print(textmsg2xml);
◦テキストメッセージに2回再評価:
//例2、グラフィックメッセージとテキストメッセージを送信します。ドキュメント「テキストメッセージへの返信」のXML形式を確認してください//ステップ1:テキストメッセージリストへの返信で必要なパラメーターを作成します<porth> article = new arraylist <ports>(); artice a = new article(); a.settitle( "i am the picture title"); a.seturl( "www.abaidu.com"); a.setpicurl( "http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg"); //このアドレスは有効な画像アドレスです。 picandTextmsg = new picandtextmsg(); picandtextmsg.settousername(map.get( "fromusername")); //メッセージを送信して受信します。 picandtextmsg.setmsgtype( "news"); //グラフィックとテキストタイプメッセージpicandtextmsg.setarticlecount(1); picandTextmsg.setarticles(記事); // 2番目のステップは、構築された情報をWeChat [baidu:XStream BeanからXML]によって認識されたXML形式に変換することです。XSTREAMXSTREAM = new XStream(); XStream.Alias( "XML"、picandtextmsg.getClams(); picandtextmsg2xml = xstream.toxml(picandtextmsg); system.out.println(picandtextmsg2xml); // 3番目のステップはXMLのフォーマット情報をWeChatサーバーに送信することです。
この部分のすべての操作ソースコードは直接使用できます
•CoreServlet.java(サーバーアクセス、ユーザーの送信メッセージの受信、通常のテキストメッセージへの返信、グラフィックメッセージへの返信を含む。サードパーティの瓶:DOM4J、XSTREAM)
パッケージcom.gist.servlet; import java.io.ioexception; import java.io.inputStream; import java.io.printwriter; import java.security.messagegest; import java.security.nosuchalgorithmexception; import java.util.arraylist; import java.util.util. java.util.hashmap; Import java.util.list; Import java.util.map; Import java.util.set; Import javax.servletexception; import javax.servlet.annotation.webservlet; import javax.servlet.http.httpservlet; javax.servlet.http.httpservletrequest; Import javax.servlet.http.httpservletresponse; Import org.dom4j.document; Import org.dom4j.documentexception; import org.dom4j.element; Import org.dom.dom.dom.dom.daxedrementer; com.gist.bean.picandtextmsg;インポートcom.thoughtworks.xstream.xstream;/** * @author gao yuan </n>電子メール:[email protected] </n> blog http://blog.csdn.net/wgyscsf </n> * writing </n> * writing </n> * write */@webservlet( "/coreServlet")パブリッククラスCoreServletはhttpservletを拡張します{private static final long serialversionuid = 1l; string tag = "coreServlet"; / * *ステップ2:開発者が情報を送信した後、サーバーアドレスの有効性を確認します。WeChatサーバーは、Fill-in ServerアドレスのURLにGETリクエストを送信します。 * GETリクエストには、署名、タイムスタンプ、ノンセ、echostrの4つのパラメーターが含まれています *開発者は、署名を確認して要求を検証します(以下に確認方法があります)。 Get RequestがWeChatサーバーからのものであることを確認する場合は、Echostrパラメーターコンテンツをそのまま返してください。 *、アクセスが有効になり、開発者に成功します。そうしないと、アクセスが失敗します。 * *暗号化/チェックプロセスは次のとおりです。1。トークン、タイムスタンプ、およびノンセの辞書順序をソートします。 * 3つのパラメーター文字列をSHA1暗号化の文字列にスプライスします3。フォームシーケンス。この方法は、アルファベット順に、または小規模および大量の順序で、小から大部分までシーケンスを形成することです。 */ @Override Protected void doget(httpservletrequest req、httpservletresponse rep)servletexception、ioexception {// req.setcharacterencoding( "utf-8")のエンコードを設定します。 resp.setContentType( "html/text; charset = utf-8"); rest.setcharacterencoding( "utf-8"); //出力ストリームprintwriter printwriter = resp.getWriter()を取得します。 //グローバルトークンを設定すると、開発者は自分で設定します。 APIはこれを説明します:トークンは開発者によって自由に記入できます。//世代の署名として使用される(トークンは、セキュリティを検証するためにインターフェイスURLに含まれるトークンと比較されます)string token = "wgyscsf"; // APIの説明に従って、上記の4つのパラメーター文字列署名= req.getParameter( "signature")を取得します。文字列タイムスタンプ= req.getParameter( "Timestamp");文字列nonce = req.getParameter( "nonce"); string echostr = req.getParameter( "echostr"); // temp:一時的な印刷、returnパラメーターの状況を監視してください// APIで言及されている「暗号化/検証プロセス」に従ってアクセスします。合計に3つのステップがあります//ステップ1:トークンの辞書順序、タイムスタンプ、ノンセ3パラメーター文字列= new String [] {Token、Timestamp、nonce}; //配列配列に辞書をソートする必要がある文字列を配置します。 //文字列弦のスプライスparmsstring = ""; //ここでは= nullできないことに注意してください。 for(int i = 0; i <parms.length; i ++){parmsstring+= parms [i]; } // sha1暗号化文字列mparms = null; //暗号化された結果MESSAGED GIGEST DIGEST = NULL; try {digest = java.security.messagegigest.getInstance( "sha"); } catch(nosuchalgorithmexception e){// todo auto-fenated catch block e.printstacktrace(); } digest.update(parmsstring.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); } mparms = hexString.toString(); // encryption result/ * * API要件:GETリクエストがWeChatサーバーからのものであることを確認する場合は、Echostrパラメーターコンテンツをそのまま返してください。アクセスが有効になり、開発者になります。それ以外の場合、アクセスが失敗します。 */ //ステップ3:開発者は暗号化された文字列を取得し、署名と比較して、リクエストがWeChatの成功したアクセスから来ることを特定できます。 // system.out.println(tag + ":" + mparms + "--->" + signature); if(mparms.equals(signature)){// system.out.println(tag + ":" + mparms + "---->" + signature); printwriter.write(echostr); } else {//アクセスに失敗し、// System.out.println(tag + "Access Failed"); }} / * *メッセージの送信と受信、基本的に同じメッセージ形式のプッシュについてAPIドキュメントを確認します。次の形式のように:<xml> * <tousername> <![cdata [touser]]> </tousername> * <fromusername> <![cdata [fromuser]]> </<createTime> 1348831860 </msgta> </msgta> <content> <![cdata [これはテスト]]> </content> * <msgid> 1234567890123456 </msgid> </xml>、統一処理を実行できます。 * / / * *最初に入力ストリームを取得し、入力ストリームの情報を表示しましょう。印刷フローをテストすることにより、ユーザーがリクエストするたびにREQリクエストを受信することがわかります。要求形式はXML形式で、ドキュメントで説明されています。 * / / * * req.getInputStream()は一度しか取得できず、1回しか読み取れないことに注意してください。複数回読みたい場合は、別の方法を見つける必要があります。簡単にするために、 * req.getInputStream()は、出力ストリーム情報を印刷しなくなりました。解析された情報を直接印刷します。 */ @Override Protected void dopost(httpservletrequest req、httpservletresponse rep)servletexception、ioexception {// req.setcharacterencoding( "utf-8")のエンコードを設定します。 resp.setContentType( "html/text; charset = utf-8"); rest.setcharacterencoding( "utf-8"); /**この部分では、ユーザーから送信された情報を取得し、<k、v> for display*/ //ユーザーinputstreamが送信した情報を分析します。 // XMLを解析し、取得したリターン結果XMLをテキスト情報に解析しますsaxreader reader = new Saxreader(); //サードパーティのjar:dom4j [baidu:saxreader解析xml] document document = null; try {document = reader.read(is); } catch(documentexception e1){// todo auto-fenated catch block e1.printstacktrace(); } // xmlルート要素root = document.getRootelement()を取得します。 //ルート要素リストのすべての子ノードを取得<lement> elementList = root.Elements(); //(要素E:ElementList)Map.put(e.getName()、e.getText())のすべての子ノードをトラバースします。 //テスト出力セット<string> keyset = map.keyset(); //分析システムの後にユーザーが送信した出力メッセージをテストします。 for(string key:keyset){system.out.println(key + ":" + map.get(key)); } system.out.println(tag + ":ユーザーが送信した情報を解析する終了"); / * *このパートでは、ドキュメントの必要な形式に従って、テキスト情報とグラフィックメッセージをユーザーに返信しようとします。フォーカス:ドキュメントの要件に従って必要なパラメーターを構築します。特別なメモ:パラメーターはケースに敏感です。 */ // //例1:通常のテキストメッセージを送信するには、「返信テキストメッセージ」に関するドキュメントのXML形式を確認してください。 // textmsg.settousername(map.get( "fromusername")); //メッセージを送信して受信します。 // textmsg.setcreatetime(new date()。gettime()); //メッセージ作成時間(整数)// textmsg.setmsgtype( "text"); // text type message // textmsg.setContent( "ユーザーへのサーバーの返信"); // // // // // 2番目のステップは、構築された情報をWeChat [baidu:xstream Bean to xml]によって認識されたXML形式に変換することです。 // XSTREAM.ALIAS( "xml"、textmsg.getClass()); // string textmsg2xml = xstream.toxml(textmsg); // system.out.println(textmsg2xml); // // // // // // 3番目のステップは、XMLのフォーマット情報をWeChatサーバーに送信し、サーバーをユーザーに転送することです// printwriter printwriter = resp.getwriter(); // printwriter.print(textmsg2xml); // //例2、グラフィックメッセージとテキストメッセージを送信します。 「テキストメッセージへの返信」のXML形式に関するドキュメントを確認してください//ステップ1:テキストメッセージリストへの返信に従って必要なパラメーターを構築します<porth> article = new arraylist <porth>();記事a = new article(); A.Settitle(「私は写真のタイトルです」); a.seturl( "www.baidu.com"); //このアドレスは、写真をクリックしてa.setpicurl( "http://b.hiphotos.baidu.com/image/pic/item/08F790529822720EA5D058BA7CB0A46F1FAB50")のaddervertion a.setDescription(「私は画像の説明です」);記事(a); picandTextmsg picandTextmsg = new picandtextmsg(); picandtextmsg.settousername(map.get( "fromusername")); //メッセージを送信して受信します。 picandtextmsg.setcreatetime(new date()。gettime()); //メッセージ作成時間(整数)picandtextmsg.setmsgtype( "news"); //グラフィックタイプメッセージpicandtextmsg.setarticlecount(1); picandtextmsg.setarticles(記事); // 2番目のステップは、構築された情報をWeChat [baidu:XStream Bean to XML]によって認識されたXML形式に変換することですXSTREAM XSTREAM = new XStream(); Xstream.alias( "xml"、picandtextmsg.getClass()); Xstream.alias( "item"、a.getclass()); string picandTextmsg2xml = xstream.toxml(picandtextmsg); System.out.println(picandtextmsg2xml); // 3番目のステップは、XMLのフォーマット情報をWeChatサーバーに送信し、サーバーをユーザーprintwriter printwriter = resp.getwriter()に転送することです。 printwriter.print(picandtextmsg2xml); }}
•testmsg.java(通常のテキストメッセージBean)
パッケージcom.gist.bean;/** * @author gao yuan </n>電子メール:[email protected] </n> blog http://blog.csdn.net/wgyscsf </n> *執筆期間2016-4-4 2:09:27 PMプライベート文字列fromUsername;プライベートロングクリエティタイム;プライベート文字列msgtype; @Override public String toString(){return "textmsg [tousername =" + tousername + "、fromusername =" + fromusername + "、createTime =" + createtime + "、msgtype +"、content = " + content +"] "; }プライベート文字列コンテンツ。 public Textmsg(String Tousername、String FromUsername、Long CreateTime、String MSGType、String Content){super(); tousername = tousername; fromusername = fromusername; createTime = createTime; msgtype = msgtype; content = content; } public textmsg(){super(); } public string getTousername(){return tousername; } public void setoudername(string tousername){tousername = tousername; } public String getFromUsername(){return fromUsername; } public void setfromusername(string fromusername){fromusername = fromusername; } public long getCreatetime(){return createTime; } public void setCreatetime(long createTime){createTime = createTime; } public string getMSGTYPE(){return msgtype; } public void setmsgtype(string msgtype){msgtype = msgtype; } public string getContent(){return content; } public void setContent(string content){content = content; }}
•article.java(テキストメッセージ内の記事Bean)
パッケージcom.gist.bean;/** * @author gao yuan </n>メール:[email protected] </n> blog http://blog.csdn.net/wgyscsf </n> *執筆期間2016-4-4-4 2:47:08 @Override public String toString(){return "item [title =" + title + "、description =" + description + "、picurl =" + picurl + "、url =" + url + "]"; } public string getTitle(){return title; } public void settitle(string title){title = title; } public string getDescription(){return description; } public void setDescription(string description){説明=説明; } public string getPicurl(){return picurl; } public void setpicurl(string picurl){picurl = picurl; } public string geturl(){return url; } public void seturl(string url){url = url; }プライベート文字列の説明;プライベートストリングピカール;プライベート文字列URL;}
•picandtextmsg.java(グラフィックテキストメッセージビーン)
パッケージcom.gist.bean;インポートjava.util.list;/** * @author gao yuan </n>電子メール:[email protected] </n> blog http://blog.csdn.net/wgyscsf </n> *執筆期間toushername;プライベート文字列fromUsername;プライベートロングクリエティタイム;プライベート文字列msgtype; Private int articlecount;プライベートリスト<記事>記事; @Override public String toString(){return "picandTextmsg [tousername =" + tousername + "、fromusername =" + " +" + " +" + createtime + "、msgtype =" + msgtype + "、articlecount =" + articlecount + " } public string getTousername(){return tousername; } public void setoudername(string tousername){tousername = tousername; } public String getFromUsername(){return fromUsername; } public void setfromusername(string fromusername){fromusername = fromusername; } public long getCreatetime(){return createTime; } public void setCreatetime(long createTime){createTime = createTime; } public string getMSGTYPE(){return msgtype; } public void setmsgtype(string msgtype){msgtype = msgtype; } public int getArticleCount(){return articlecount; } public void setarticlecount(int articlecount){articlecount = articlecount; } public list <ports> getArticles(){return article; } public void setarticles(list <portion> article){article = article; }}
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。