微信公衆番号の開発

14954 ワード

自分で微信の公衆番号のdemoを書いてみて、開発の流れと出会った問題を記録します.この文章は白の入門の1つの道しるべと言えることができて、コードはネット上で探した1つの例から少し変更して、住所http://blog.csdn.net/pamchen/article/details/38718947ああ、原作者に感謝.
文章の冒頭に微信公衆プラットフォームの技術文書の住所を貼るhttps://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432tips:公式のドキュメント、重要性はあなたが知っているので、基本的にはそれに頼っています!
一般的に、私たちのウェブプロジェクトはブラウザを通じて直接ユーザーとインタラクティブになります.微信の公衆番号の開発は本質的に同じです.私たちとユーザーのインタラクティブには微信を媒介する必要があります.私たちがしなければならないのは、微信を通じてユーザーの操作を受け取り、微信に応答を渡すことです.
外部ネットワークが私たちのプログラムにアクセスできるようにすると
開発が直面した最初の問題は、微信と対話する以上、私たちのプロジェクトをどのように外部ネットワークに置くか、微信にアクセスできるようにすることです.もちろん実際の開発には生産環境がありますが、生産環境でのテストは極めて不便です.ここではオープンソースの小さなプログラムであるngrokを紹介します.ngrokは、共通のエンドポイントとローカルで実行されるWebサーバとの間に安全なチャネルを確立する逆エージェントです.
Windowsバージョンを使っています.リンクを貼ります.https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-386.zipプログラムを開くとdosコマンドボックスがポップアップする、図:微信公众号的开发_第1张图片のように赤いボックスの内容をコピーするngrok.exe http 80. tips:80はあなたのプロジェクトのポート番号を指し、8080ならngrokと書きます.exe http 8080 tips:パブリックプラットフォームインタフェース呼び出しは80ポートのみサポート
図:微信公众号的开发_第2张图片の起動に成功すると、外部ネットワークがローカルプロジェクトにアクセスできます.赤いボックスでは、左のアドレスが右と同じで、後でプロジェクト名を付けることを覚えています.
二Tokenの取得とインタフェーステスト番号申請
第一歩は微信に公衆番号を登録する必要があります.ここではテスト番号を登録することができます.微信公衆プラットフォーム技術ドキュメントの開発開始ディレクトリの下のインタフェーステスト番号申請にリンクがあり、図:微信公众号的开发_第3张图片のようにクリックして登録することができます.
tips:微信の提出をクリックするとこのアドレスに要求が送信され、アクセス検証時にechostrパラメータが受信され、微信に戻る必要があります.詳細はコードを参照してください.
ここには2つの情報を記入する必要があります.一つはURLです.つまり、あなたのプロジェクトが微信側の情報を受信し、応答するためのアドレスです.もう一つはToken、あなたの公衆番号のトークンです.以下はTokenの取得方法である.微信公衆プラットフォーム技術文書で開発を開始したディレクトリの下でaccessを取得する.token、図:微信公众号的开发_第4张图片図のアドレスはTokenを取得するインタフェースで、私たちは赤い枠の中のAPPIDとAPPSECRETを前の画像に置き換えるだけで、copyはアドレスバーに戻ってtokenを取得することができます.図:微信公众号的开发_第5张图片
登録に戻って、RULとTokenを記入して提出をクリックすると、微信の公衆番号のテストを開始することができます!
三javaコード
微信公衆番号の情報インタラクションはXMLデータによって行われる.一覧:
    public void test(HttpServletRequest request, HttpServletResponse response) throws Exception{
        /**        */
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        /**     ,        */
            ...(    5)
        if(boolean) return;

       /**              ,             echostr  ,           */
        String result ;
        String echostr = request.getParameter("echostr");
        if (echostr != null && echostr.length() > 1) {
            /**       */
            result = echostr;
        } else {
            /**        */
                  xml  ... (    2)
              xml  ...(    3)
            result =     xml  ...(    4)
        }

       try {
            OutputStream os = response.getOutputStream();
            os.write(result.getBytes("UTF-8"));
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } 

1.初回アクセスの有無を判断する:
        String result ;
        /**              ,             echostr  ,           */
        String echostr = request.getParameter("echostr");
        if (echostr != null && echostr.length() > 1) {
            result = echostr;
        } else {
            //         
        }
        try {
            OutputStream os = response.getOutputStream();
            os.write(result.getBytes("UTF-8"));
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

2.微信xmlデータを読み取る:
        /**       xml   */
        StringBuffer sb = new StringBuffer();
        InputStream is = request.getInputStream();
        InputStreamReader isr = new InputStreamReader(is, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String s = "";
        while ((s = br.readLine()) != null) {
            sb.append(s);
        }
        String xml = sb.toString(); 

3.xmlデータのカプセル化:entityオブジェクト
public class ReceiveXmlEntity {
    private String ToUserName;
    private String FromUserName;
    private String CreateTime;
    private String MsgType;
    private String MsgId;
    private String Event;
    private String EventKey;
    private String Ticket;
    private String Latitude;
    private String Longitude;
    private String Precision;
    private String PicUrl;
    private String MediaId;
    private String Title;
    private String Description;
    private String Url;
    private String Location_X;
    private String Location_Y;
    private String Scale;
    private String Label;
    private String Content;
    private String Format;
    private String Recognition;
    /** get,set        */
}

xmlデータのカプセル化

        ReceiveXmlEntity msg = null;
        try {
            if (strXml.length() <= 0 || strXml == null) return null;

            //        XML    
            Document document = DocumentHelper.parseText(strXml);
            //         
            Element root = document.getRootElement();
            //            
            Iterator> iter = root.elementIterator();

            //       
            msg = new ReceiveXmlEntity();
            //      ,  set  
            //         
            Class> c = Class.forName("entity.ReceiveXmlEntity");
            msg = (ReceiveXmlEntity)c.newInstance();

            while(iter.hasNext()){
                Element ele = (Element)iter.next();
                //  set        (      )
                Field field = c.getDeclaredField(ele.getName());
                //  set  ,field.getType())          
                Method method = c.getDeclaredMethod("set"+ele.getName(), field.getType());
                //  set  
                method.invoke(msg, ele.getText());
            }
        } catch (Exception e) {
            // TODO: handle exception
            System.out.println("xml     : "+ strXml);
            e.printStackTrace();
        }

tips:dom 4 jが必要です.jar 4.微信公衆プラットフォーム技術ドキュメントにおけるメッセージ管理ディレクトリの下でxmlデータに応答する受信メッセージを返す-通常メッセージにxmlデータがある例を受信し、コードはテキストメッセージを例に挙げる
public String formatXmlAnswer(String to, String from, String content) {
        StringBuffer sb = new StringBuffer();
        Date date = new Date();
        sb.append("<xml><ToUserName>ToUserName><FromUserName>FromUserName><CreateTime>");
        sb.append(date.getTime());
        sb.append("CreateTime><MsgType>MsgType><Content>Content><FuncFlag>0FuncFlag>xml>");
        return sb.toString();
    }

5.微信メッセージの検証は、メッセージが確かに微信側の情報であるかどうかを検証することができ、微信公衆プラットフォーム技術ドキュメントで開発を開始したディレクトリの下のアクセスガイドに検証メッセージのパラメータの紹介がある.JAvaコードは以下の通りです
public class CheckUtil {
    private static final String token = "";
    public static boolean checkSignature(String signature,String timestamp,String nonce){

        String[] arr = new String[] { token, timestamp, nonce };

        //   
        Arrays.sort(arr);

        //      
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }

        // sha1  
        String temp = getSHA1String(content.toString());

        return temp.equals(signature); //               
    }

    private static String getSHA1String(String data){
        return DigestUtils.sha1Hex(data);    //   commons codec  sha1   
    }
}

4つのカスタムメニューの設定
カスタムメニューは公式ドキュメントに詳細な説明とデバッグツールへのリンクがあります.ここで私が出会った問題を説明します.公式サイトに書いてあるjsonの例を貼り付けてエラーを返します.自分で参照して1つ書くとOkになります.
五その他
微信の公衆番号には多くの使い方がありますが、インタフェースアドレスの後にtokenを持って、post方式で特定のフォーマットのデータを送信するだけでなく、開発ドキュメントをよく研究する必要があります.