WECHATパブリックアカウントの開発は、一般に企業と組織を対象としています。個人はサブスクリプションアカウントのみを申請でき、呼び出すインターフェイスは限られています。パブリックアカウントにアクセスするための手順を簡単に説明しましょう。
1.まず、WeChat公式アカウントプラットフォームに登録するには、メールアドレスが必要です。
登録方法には、サブスクリプションアカウント、公式アカウント、ミニプログラム、企業アカウントが含まれます。個人、ここではサブスクリプションアカウントのみを選択できます。
2。登録後、公式アカウントプラットフォーム--->開発--->基本的な構成にログインします。ここでURLとトークンを入力する必要があります。 URLは、サーバーを使用するインターフェイスです。
3. Java Web Serverプログラムがサーバーにコンパイルされて展開され、実行できる場合は、WeChatの公式アカウントでオンラインインターフェイスをデバッグできます。
1)適切なインターフェイスを選択します
2)システムは、このインターフェイスのパラメーターテーブルを生成します。テキストボックスの対応するパラメーター値を直接入力できます(赤いアスタリスクは、このフィールドが必要であることを示します)
3)[問題の問題]ボタンをクリックして、対応するデバッグ情報を取得します
例:アクセスを取得する手順_token:
1)インターフェイスタイプ:基本的なサポート
2)インターフェイスリスト:Access_Token Interface/Tokenを取得します
3)対応するパラメーターを入力します:grant_type、appid、secret
4)クリックして問題を確認します
5)結果とプロンプトは、検証が成功した後に返され、結果は次のとおりです。
ここでもっと確認しているのは、メッセージインターフェイスのデバッグです:テキストメッセージ、画像メッセージ、音声メッセージ、ビデオメッセージなど。
4.インターフェイスがわからない場合は、開発に移動できます - >開発者ツール - > Developer Documents to Query
5。インターフェイスの権限:サブスクリプションアカウントには、主に基本的なサポート、メッセージ受信、およびWebサービスのいくつかのインターフェイスがあります。
以下では、主にサブスクリプションアカウントでメッセージを受信する方法のケースについて説明します。
1.個人のWechatサブスクリプションアカウントを申請する必要があります
2。URLサーバーとサーバー側のコード展開(Tencent CloudまたはAlibaba Cloud Serverを使用できます)
1)AccountSservlet.javaクラスWeChat ServerおよびWeChat Serverからのメッセージ処理を確認する
パッケージcn.jon.wechat.servlet; java.io.ioexceptionをインポートします。 java.io.printwriterをインポートします。 javax.servlet.servletexceptionをインポートします。 javax.servlet.http.httpservletをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 javax.servlet.http.httpservletResponseをインポートします。 cn.jon.wechat.service.accountsserviceをインポートします。 cn.jon.wechat.utils.signutilをインポートします。 public class councountservletは、httpservlet {public countssservlet(){super(); } public void Destroy(){super.destroy(); //コードをここに置く}/ *** wechatサーバーからの要求が来ることを確認します// wechat暗号化署名文字列signature = request.getParameter( "signature"); //タイムスタンプ文字列タイムスタンプ= request.getParameter( "Timestamp"); //乱数文字列nonce = request.getParameter( "nonce"); //ランダム文字列string echostr = request.getParameter( "echostr"); printwriter out = response.getWriter(); //署名をチェックしてリクエストを確認します。検証が成功した場合、echostrをそのまま返し、アクセスが成功したことを示します。そうしないと、アクセスが失敗します} out.close(); out = null; // Response.Encoderedirecturl( "success.jsp"); } /*** wechat serverによって送信されたプロセスメッセージ* /public void dopost(httpservletrequest request、httpservletresponse応答)は、servletexception、ioexception {//受信、処理、およびメッセージrequest.setcharacterencoding( "utf-8")をスローします。 Response.setcharacterencoding( "utf-8"); //コアビジネスタイプを呼び出してメッセージを受け入れ、メッセージを処理する文字列respmessage = AccountSService.ProcessRequest(リクエスト); //応答メッセージprintwriter out = response.getWriter(); out.print(respmessage); out.close(); } public void init()throws servletexception {//コードをここに置く}}} 2)signutil.javaクラス、リクエスト検証ツールクラス、トークンはwechatのトークンが充填されたトークンと一致する必要があります
パッケージcn.jon.wechat.utils; java.security.messagedigestをインポートします。 java.security.nosuchalgorithmexceptionをインポートします。 java.util.arraysをインポートします。 java.util.iteratorをインポートします。 java.util.mapをインポートします。 java.util.setをインポートします。 java.util.concurrent.concurrenthashmapをインポートします。 /***検証ツールクラスを要求* @Author Jon*/public class Signutil {// wechat構成のトークンと一致するprivate static string token = ""; public static boolean checksignature(string signature、string timestamp、string nonce){string [] array = new String [] {token、Timestamp、nonce}; //arrays.sort(arra); stringbuilder sb = new StringBuilder(); for(int i = 0; i <arra.length; i ++){sb.append(arra [i]); } MESSAGEDGEST MD = null; string stnstr = null; try {md = mesagedigest.getInstance( "sha-1"); byte [] digest = md.digest(sb.toString()。getBytes()); stnstr = bytetostr(digest); } catch(nosuchalgorithmexception e){// todo auto-fenated catch block e.printstacktrace(); } //無料メモリSb = null; // sha1の暗号化された文字列を署名と比較し、wechat return stnstr!= null?stnstr.equals(signature.touppercase())からのリクエストを識別します。 } / ** *バイトアレイを160個の文字列に変換 * @param Digestarra * @return * / private static string bytetostr(byte [] digestarra){// todo auto-generated method stub string digeststr = ""; for(int i = 0; i <digestarra.length; i ++){digeststr+= bytetohexstr(digestarra [i]); } digestStrを返します。 } / ***バイトをヘキサデシマの文字列に変換* / private static string bytetohexstr(byte dbyte){// todo auto-enerated method stub char [] digit = {'0'、 '1'、 '2'、 '3'、 '4'、 '5'、 '6'、 '7'、 '8'、 '9'、 'a'、 'b'、 'c'、 'd'、 'e'、 'f'}; char [] tmparr = new char [2]; tmparr [0] = digit [(dbyte >>> 4)&0x0f]; tmparr [1] = digit [dbyte&0x0f];文字列s = new String(tmparr); s; } public static void main(string [] args){ /*byte dbyte = 'a'; System.out.println(bytetohexstr(dbyte));*/ map <string、string> map = new concurrenthashmap <string、string>(); map.put( "4"、 "Zhangsan"); map.put( "100"、 "lisi"); set set = map.keyset(); iterator iter = set.iterator(); while(iter.hasnext()){// string keyv =(string)iter.next(); string key =(string)iter.next(); System.out.println(map.get(key)); // system.out.println(map.get(iter.next())); } /*for(int i = 0; i <map.size(); i ++){}* /}}} 3)accountsservice.javaサービスクラス、主にメッセージリクエストと応答処理のため、およびユーザーが公式アカウントに従うと、デフォルトのプッシュメッセージを設定できます
パッケージcn.jon.wechat.service; Import Java.util.date; java.util.mapをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 cn.jon.wechat.message.req.imagemessageをインポートします。 cn.jon.wechat.message.req.linkmessageをインポートします。 cn.jon.wechat.message.req.locationmessageをインポートします。 cn.jon.wechat.message.req.videomessageをインポートします。 cn.jon.wechat.message.req.voicemessageをインポートします。 cn.jon.wechat.message.resp.textmessageをインポートします。 cn.jon.wechat.utils.messageutilをインポートします。 / ***デカップリング、コントロールレイヤーをビジネスロジックレイヤーから分離し、主にリクエストを処理し、* @author jon*/ public class countssservice {public static string processRequest(httpservletrequest request){string respmessage = null; //デフォルトで返されたテキストメッセージコンテンツstring respcontent = "リクエスト処理の例外、後で試してください!"; try {// xml要求マップ<string、string> requestmap = messageutil.parexml(request); // senderアカウント(open_id)string fromusername = requestmap.get( "fromusername"); //パブリックアカウント文字列toushername = requestmap.get( "tousername"); //メッセージタイプ文字列msgtype = requestmap.get( "msgtype"); //デフォルトでこのテキストメッセージを返信するtextmessage defaulttextmessage = new TextMessage(); defaultTextMessage.settousername(fromusername); defaultTextMessage.setFromUsername(Tousername); defaultTextMessage.setCreatetime(new Date()。getTime()); defaultTextMessage.setMSGTYPE(messageutil.messsage_type_text); defaultTextMessage.setFuncFlag(0); // href属性値は二重引用符で発生する必要があるため、これは文字列自体の二重引用符と競合する必要があるため、defaulttextmessage.setcontentを逃がす必要があります( "http://blog.csdn.net/j086924/"> jon's blog </a> "); // defaultTextMessage.setContent(getMainMenu()); //テキストメッセージオブジェクトをXML文字列respmessage = messiontil.textmessagetoxml(defaultTextMessage)に変換します。 //テキストメッセージif(msgtype.equals(messagutil.messsage_type_text)){// respcontent = "こんにちは、テキストメッセージを送信しています!"; //テキストへの返信Textmessage textmessage = new TextMessage(); // textmessage.settousername(tousername); // textMessage.setFromUsername(fromUsername); //ここで注意してください。そうしないと、メッセージをユーザーtextmessage.settousername(fromusername)に返信することはできません。 textmessage.setfromUsername(tousername); textmessage.setcreatetime(new date()。getTime()); textmessage.setmsgtype(messageutil.messsage_type_text); textMessage.setFuncFlag(0); respcontent = "こんにちは、あなたが送信したメッセージは:"+requestmap.get( "content"); textmessage.setContent(respcontent); respmessage = messageutil.textmessagetoxml(textmessage); } //画像メッセージelse if(msgtype.equals(messageutil.messsage_type_image)){imagemessage imagemessage = new imagemessage(); imagemessage.settousername(fromusername); imagemessage.setfromusername(tousername); imagemessage.setcreatetime(new date()。gettime()); imagemessage.setmsgtype(messageutil.messsage_type_image); //respcontent = requestmap.get("picurl "); ImageMessage.setPicurl( "http://img24.pplive.cn//2013/07/24//12103112092_230x306.jpg"); respmessage = messageutil.imagemessagetoxml(imagemessage); } // Geographic location else if(msgtype.equals(messagutil.messsage_type_location)){locationmessage locationmessage = new locationmessage(); locationmessage.settousername(fromusername); locationmessage.setfromusername(tousername); locationmessage.setcreatetime(new date()。gettime()); locationmessage.setmsgtype(messageutil.messsage_type_location); locationmessage.setLocuid_x(requestmap.get( "location_x")); locationmessage.setlocuid_y(requestmap.get( "location_y")); locationmessage.setscale(requestmap.get( "scale")); locationmessage.setlabel(requestmap.get( "label")); respmessage = messageutil.locationmessagetoxml(locationmessage); } //ビデオメッセージelse if(msgtype.equals(messagutil.messsage_type_video)){videoMessage videomessage = new videomessage(); videomessage.settousername(fromusername); videomessage.setfromusername(tousername); videoMessage.setCreatetime(new Date()。getTime()); videomessage.setmsgtype(messageutil.messsage_type_video); videoMessage.setMediaid(requestMap.get( "MediaId")); videomEssage.setThumbMediaid(requestMap.get( "thumbmediaid")); respmessage = messageutil.videomessagetoxml(videomessage); } // link message else if(msgtype.equals(messagutil.messsage_type_link)){linkmessage linkmessage = new linkmessage(); linkmessage.settousername(fromusername); linkmessage.setfromusername(tousername); linkmessage.setcreatetime(new date()。getTime()); linkmessage.setmsgtype(messageutil.messsage_type_link); linkmessage.settitle(requestmap.get( "title")); linkmessage.setdescription(requestMap.get( "説明")); linkmessage.seturl(requestmap.get( "url")); respmessage = messageutil.linkmessagetoxml(linkmessage); } //音声メッセージelse if(msgtype.equals(messagutil.messsage_type_voice)){voicemessage voicemessage = new voicemessage(); voicemessage.settousername(fromusername); voicemessage.setfromUsername(tousername); voicemessage.setcreatetime(new date()。getTime()); voicemessage.setmsgtype(messageutil.messsage_type_voice); voicemessage.setmediid(requestMap.get( "MediaId")); voicemessage.setformat(requestmap.get( "format")); respmessage = messageutil.voicemessagetoxml(voicemessage); } //イベントプッシュelse if(msgtype.equals(messagutil.messsage_type_event)){// event type string eventtype = requestmap.get( "event"); // subscribe if(eventType.equals(messagutil.event_type_subscribe)){respcontent = "ありがとうございます!"; } // unsubscribe else if(eventtype.equals(mesageutil.event_type_unsubscribe)){// system.out.println( "unsubscribe"); } else if(eventtype.equals(messagutil.event_type_click)){//カスタムメニューメッセージ処理System.out.println( "カスタムメニューメッセージ処理"); }}} catch(例外e){// todo auto-enerated catch block e.printstacktrace(); } repmessageを返します。 } public static string getMainMenu(){StringBuffer Buffer = new StringBuffer(); buffer.append( "こんにちは、私はジョンです、番号選択サービスに返信してください:")。append( "/n"); buffer.append( "1。myblog")。append( "/n"); buffer.append( "/n"); Buffer.Append( "2。SongOn Demand")。append( "/n"); buffer.append( "3。クラシックゲーム")。append( "/n"); Buffer.Append( "4。Chatand Play Cards")。append( "/n/n"); buffer.append( "Reply"+"0"+"HELPメニューを表示); return buffer.toString(); }} 4)messageutil.javaは、定義とXMLメッセージの変換と処理を含むクラスをヘルプします
パッケージcn.jon.wechat.utils; java.io.inputStreamをインポートします。 java.io.writerをインポートします。 java.util.hashmapをインポートします。 java.util.listをインポートします。 java.util.mapをインポートします。 javax.servlet.http.httpservletrequestをインポートします。 Import org.dom4j.document; Import org.dom4j.element; Import org.dom4j.io.saxreader; cn.jon.wechat.message.req.imagemessageをインポートします。 cn.jon.wechat.message.req.linkmessageをインポートします。 cn.jon.wechat.message.req.locationmessageをインポートします。 cn.jon.wechat.message.req.videomessageをインポートします。 cn.jon.wechat.message.req.voicemessageをインポートします。 cn.jon.wechat.message.req.voicemessageをインポートします。 cn.jon.wechat.message.resp.textmessageをインポートします。 cn.jon.wechat.message.resp.musicmessageをインポートします。 cn.jon.wechat.message.resp.textmessageをインポートします。 cn.jon.wechat.message.resp.textmessageをインポートします。 cn.jon.wechat.message.resp.textmessageをインポートします。 cn.jon.wechat.message.resp.textmessageをインポートします。 com.thoughtworks.xstream.xstreamをインポートします。 com.thoughtworks.xstream.core.util.quickwriterをインポートします。 com.thoughtworks.xstream.io.hierarchicalStreamWriterをインポートします。 com.thoughtworks.xstream.io.xml.prettyprintwriterをインポートします。 com.thoughtworks.xstream.io.xml.xppdriverをインポートします。 / ***さまざまなメッセージ処理クラス* @author jon*/ public class messageutil {/ ***テキストタイプ*/ public static final string smessage_type_text = "text"; / ***音楽タイプ*/ public static final string smessage_type_music = "music"; / ***画像タイプ*/ public static final string smessage_type_news = "news"; / ***ビデオタイプ*/ public static final string smessage_type_video = "video"; / ***画像タイプ*/ public static final string smessage_type_image = "image"; / *** link type*/ public static final string smessage_type_link = "link"; / ***地理的位置タイプ*/ public static final string smessage_type_location = "location"; / ***オーディオタイプ*/ public static final string smessage_type_voice = "Voice"; / ***プッシュタイプ*/ public static final string smessage_type_event = "event"; / ** *イベントタイプ:subscribe(subscribe) */ public static final in final string event_type_subscribe = "subscribe"; / ** *イベントタイプ:unsubscribe(unsubscribe) */ public static final string event_type_unsubscribe = "unsubscribe"; / ** *イベントタイプ:クリック(カスタムメニュークリックイベント) */ public static final string event_type_click = "click"; /** * * * weChatによって送信されたXMLの解析 */@suppresswarnings( "un -checked")public static map <string、string> parexml(httpservletrequest request)throws {//解析結果の保存ハッシュマップマップ<文字列> reqmap = new hashmap <string、hashmap <string> //リクエストから入力ストリームを取得しますinputstream inputstream = request.getInputStream(); //入力ストリームsaxreader reader = new saxreader()を読む; document document = reader.read(inputstream); // XMLルート要素を取得しますroot = document.getRootelement(); //ルート要素リストのすべての子ノードを取得<lement> elementList = root.Elements(); //すべての子ノードを輸送して情報クラスコンテンツを取得します(要素ELEM:elementList){reqmap.put(elem.getName()、elem.getText()); } //リソース入力stream.close()をリリースします。 inputstream = null; reqmapを返します。 } / ** *応答メッセージをxmlに変換して *テキストオブジェクトをxmlに返信 * / public static string textmessagetoxml(textmessage textmessage){xstream.alias( "xml"、textmessage.getclass()); xstream.toxml(textmessage)を返します。 } / ** *音声オブジェクトのxml * * / public static string voicemessagetoxml(voicemessage voicemessage){xstream.alias( "xml"、voicemessage.getclass()); xstream.toxml(voicemessage)を返します。 } / ** *ビデオオブジェクトからXML * * / public Static String videomessagetoxml(videomessage videomessage){xstream.alias( "xml"、videoMessage.getClass()); xstream.toxml(videoMessage)を返します。 } / ** *音楽オブジェクトをXML * * * / public Static String MusicMessagetoxml(MusicMessage MusicMessage){Xstream.Alias( "xml"、musicmessage.getClass()); xstream.toxml(musicmessage)を返します。 } / ** *グラフィックオブジェクトのXML * * / public Static String NewsMessagetoxml(NewsMessage NewsMessage){Xstream.alias( "xml"、newsmessage.getClass()); Xstream.alias( "item"、new article()。getClass()); xstream.toxml(newsmessage)を返します。 } / ** *画像オブジェクトをxml * * * / public static string imagemessagetoxml(imagemessage imagemessage){xstream.alias( "xml"、imagemessage.getclass()); xstream.toxml(imagemessage)を返します。 } / ** * linkオブジェクトをxml * * * / public static string linkmessagetoxml(linkmessage linkmessage){xstream.alias( "xml"、linkmessage.getclass()); xstream.toxml(linkmessage)を返します。 } / ** *ジオロケーションオブジェクトをxml * * * / public static string locationmessagetoxml(locationmessage locationmessage){xstream.alias( "xml"、locationmessage.getclass()); xstream.toxml(locationmessage)を返します。 } /*** XSTREAMを展開してCDATAブロックをサポートしますboid name、super.startnode(clazz)} write.write( "<!["); }); } 5)basemessage.javaメッセージベースクラス(開発者Wechatアカウント、ユーザーアカウント、作成時間、メッセージタイプ、メッセージID変数、ビデオ、および画像メッセージがこのベースクラスを継承し、この基準に基づいて、開発者のドキュメントのさまざまなメッセージ属性に基づいて独自の変数を拡張し、定義できます。
パッケージcn.jon.wechat.message.req; /** *メッセージベースクラス(通常のユーザーパブリックアカウント) * @author jon */public class basemessage {//開発者wechat id private string tousname; //送信者アカウント(1つのOpenID)プライベート文字列FromUsername; //メッセージ作成時間(整数)プライベートロングクリエティタイム。 //メッセージタイプ(テキスト/画像/場所/リンク...)プライベート文字列msgtype; //メッセージID 64ビット整数プライベート文字列msgid; public basemessage(){super(); // TODO自動生成コンストラクタースタブ} public Basemessage(String Tousername、String FromUsername、Long CreateTime、String MSGType、String MSGID){super(); tousername = tousername; fromusername = fromusername; createTime = createTime; msgtype = msgtype; msgid = msgid; } 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 getMsgid(){return msgid; } public void setmsgid(string msgid){msgid = msgid; }} 6)TextMessage.javaテキストメッセージ、5の基本クラスから継承され、コンテンツ属性を拡張する
パッケージcn.jon.wechat.message.req; /***テキストメッセージ* @author jon*/public class textmessageはbasemessage {//メッセージコンテンツプライベート文字列コンテンツを拡張します。 public string getContent(){return content; } public void setContent(string content){this.content = content; }}7)imagemessage.java画像メッセージ
パッケージcn.jon.wechat.message.req; /***画像メッセージ* @author jon*/public class imagemessageはbasemessageを拡張します{// pic link private string picurl; public string getpicurl(){return picurl; } public void setpicurl(string picurl){picurl = picurl; }} 8)VideoMessage.javaビデオメッセージ
パッケージcn.jon.wechat.message.req;パブリッククラスのビデオメッジはベースメッジを拡張します{private string mediaid;プライベートストリングサムメディアイド; public string getMediaid(){return mediaid; } public void setmediaid(string mediaid){this.mediaid = mediaid; } public String getThumbMediaid(){return thumbmediaid; } public void setthumbmediaid(string thumbmediaid){this.thumbmediaid = thumbmediaid; }}他のメッセージクラスは、開発者のドキュメントに基づいて自分で完了することができます。さらに、開発者はパブリックプラットフォームテストアカウントを申請して、開発の関連コンテンツをテストすることもできます。
この記事は「Android Wechat Development Tutorial Summary」にまとめられており、「Java Wechat Development Tutorial Summary」は、すべての人を学び、読むことを歓迎します。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。