テンセントのプッシュ——ハトのテスト

5916 ワード

サーバー側に情報をプッシュする必要があるので、ハトを使いました.ここに記録しておきます.ついでに私が出会った問題をいくつかお話しします.今回のテストは単一口座のプッシュしか使いませんでした.前提はハトのaccessid、secret_keyと関連する設定はすでに設定済みです.これは省略して、直接サーバー側をテストします.
  • タイムスタンプの問題
  • sign署名の問題ハトSDK説明ドキュメント内の単一アカウントのプッシュurlパスhttp://インタフェースドメイン名/v 2/push/single_Account?paramsリクエストパラメータ:汎用パラメータに加えて、次のパラメータパラメータ名タイプ必須デフォルト値記述
  • も含まれます.
    Account stringはあるアカウントに対してプッシュして、アカウントはqq番号、メールボックス番号、openid、携帯電話番号などの各種タイプのmessage_type uintメッセージタイプ:1:通知2:透過メッセージmessagestringは1.4、1.5の2節expire_を参照していないtime uint日メッセージオフラインストレージ時間(秒単位)、最長ストレージ時間は3日間です.0に設定すると、デフォルト値(3日間)send_が使用されます.time stringは、year-mon-day hour:min:secがサーバの現在の時間より小さい場合、multi_をすぐにプッシュするプッシュ時間を指定します.pkg uintは、登録時に提供されたパケット名でメッセージを配信することを示す.1はaccess idによってメッセージを配布することを示し、このaccess idでプッシュに成功したすべてのappはメッセージenvironment uintを受信することができ、iOSのみがiOSデバイスにプッシュする必要がない場合に必ず記入し、1はプッシュ生産環境を表す.2開発環境をプッシュすることを示す.Androidプラットフォームをプッシュして0応答結果を入力しないか、入力しない:汎用戻り結果パラメータではresultフィールドのjsonが空です.このインタフェースはpush id例を返さない:MD 5暗号化前urlはsignを生成するために使用され、RestApi Urlは最終要求のurl(以下androidプッシュ例であり、汎用パラメータを置き換えて使用する必要がある)MD 5暗号化前:GETopenapi.xg.qq.com/v 2/push/single_accountaccess_id=210240957 account=easonshipushtestaccountmessage={"title":"テストメッセージ","content":"restapiからの単一アカウントインタフェーステストメッセージ"}message_type=1timestamp=1502361241f255184d160bad51b88c31627bbd9530
    RestApi Url: http://openapi.xg.qq.com/v2/push/single_account?access_id=210240957&account=easonshipushtestaccount&message={"title":"テストメッセージ","content":"restapiからの単一アカウントインタフェーステストメッセージ"}&message_type=1×tamp=1502361241&sign=0d7bee840e87801e8a90b831ee87eefb
    私はいくつかの重要なパラメータしか設定していません.他の空のパラメータは設定されていません.
    ここで注意したのは、タイムスタンプの問題に戻ります.ここでのタイムスタンプはunixのタイムスタンプlong longDate=System.currentTimeMillis()/1000です.
    署名の問題は、署名暗号化前の文字列フォーマットに注意する必要があります.タイムスタンプの後ろに鍵を付けます.例:String get_skj = “GETopenapi.xg.qq.com/v2/push/single_accountaccess_id=”+access_id+”account=”+account+”message={‘content’:’”+message_content+”’,’title’:’”+message_title+”’}message_type=1timestamp=” +unix_timestamp+secret_key;
    ここで鍵を直接暗号化しmd 5で暗号化する
    String sign = MD5Kit.MD5(get_skj);
    またハトのgetURLをお願いします
    String get_url = “http://openapi.xg.qq.com/v2/push/single_account“; String sr = okGet(get_url+”?access_id=”+access_id+”&account=”+account+” ×tamp=”+unix_timestamp+”&message_type=1&message={‘content’:’”+message_content+”’,’title’:’”+message_title+”’}&sign=”+sign);
    ここではOKhttpを使ってgetリクエストをしましたが、Apacheより使いやすく、コードも簡単であることがわかりました.コード:
    @Controller
    public class HttpController {
        @RequestMapping(value="userTest",method=RequestMethod.GET)
        public @ResponseBody String userTest(){
               //  GET  
             //    unix  long  
            long longDate = System.currentTimeMillis()/1000;
    
            String account = "easonshipushtestaccount";
            String access_id = "2100240957";
            String unix_timestamp = String.valueOf(longDate);//long       string  
            String message_content = "okhttp    !!";
            String message_title = "      ";
            String secret_key = "255184d160bad51b88c31627bbd9530";
    
            String get_skj = "GETopenapi.xg.qq.com/v2/push/single_accountaccess_id="+access_id+"account="+account+"message={'content':'"+message_content+"','title':'"+message_title+"'}message_type=1timestamp="+unix_timestamp
            +secret_key;
            //  md5  
            String sign = MD5Kit.MD5(get_skj);
            String get_url = "http://openapi.xg.qq.com/v2/push/single_account";
            String sr = okGet(get_url+"?access_id="+access_id+"&account="+account+"&timestamp="+unix_timestamp+"&message_type=1&message={'content':'"+message_content+"','title':'"+message_title+"'}&sign="+sign);
    
            System.out.println(sr);
            return sr;
        }
    /**
         * OKHttp
         */
        private static String okGet(String url){
            try {
                OkHttpClient httpClient = new OkHttpClient();
                Request request = new Request.Builder().url(url).build();
                Response reponse = httpClient.newCall(request).execute();
                return reponse.body().string();
            } catch (IOException e) {
                e.printStackTrace();
                return null;
            }
        }