微信公共番号開発教程java版——公共番号access_tokenの取得(五)

29227 ワード

一:access_tokenの概要
サードパーティの開発者がユーザーにより価値のある個性化サービスを提供できるように、微信公衆プラットフォームはカスタムメニューインタフェース、カスタマーサービスインタフェース、ユーザー情報インタフェース、ユーザーグループインタフェース、群発インタフェースなど、多くのインタフェースを開放している.
access_tokenは公衆番号のグローバル唯一のインタフェース呼び出し証明書であり、公衆番号が各インタフェースを呼び出す際にaccessを使用する必要がある.token.開発者は適切に保存する必要がある.access_tokenのストレージは、少なくとも512文字の空間を保持する必要があります.access_tokenの有効期間は現在2時間で、タイミングリフレッシュが必要で、繰り返し取得すると前回取得したaccess_tokenは無効です.
パブリックプラットフォームのAPI呼び出しに必要なaccess_tokenの使用と生成方法の説明:
1、公衆番号開発者は中制御サーバーを使用してアクセスを統一的に取得し、リフレッシュすることを提案する.token、他のビジネスロジックサーバで使用されるaccess_tokenはいずれもこの中制御サーバから来ており、それぞれリフレッシュすべきではありません.そうしないと衝突しやすくなり、access_tokenがカバーして業務に影響する.
2、現在アクセスtokenの有効期間は、返されたexpire_を通過します.inは7200秒以内の値であることを伝えます.中制御サーバは、この有効時間に基づいて新しいaccessをリフレッシュする必要があります.token.リフレッシュ中に、中国制御サーバが外部に出力し続ける古いaccess_token、この時公衆プラットフォームのバックグラウンドは5分以内に保証して、新旧access_tokenは、サードパーティのビジネスのスムーズな移行を保証するために使用できます.
3、Access_tokenの有効時間は将来調整される可能性があるため、中制御サーバは内部タイミングでアクティブにリフレッシュするだけでなく、パッシブリフレッシュaccessを提供する必要があります.tokenのインタフェースは、ビジネスサーバがAPIでaccessを呼び出すのを容易にする.tokenがタイムアウトした場合、access_をトリガーできます.tokenのリフレッシュプロセス.
公衆番号はAppIDとAppSecretを使用してこのインタフェースを呼び出してaccessを取得することができます.token.AppIDおよびAppSecretは、「WeChatパブリックプラットフォーム-開発-基本構成」ページで入手できます(開発者になる必要があり、アカウントに異常はありません).インタフェースを呼び出すときは、「微信公衆プラットフォーム-開発-基本構成」にログインして、サーバーのIPアドレスをIPホワイトリストに追加し、設定方法の表示をクリックしてください.そうしないと、呼び出すことができません.
現在、アクセスを取得tokenインタフェースの呼び出し頻度は2000回/日に制限され、カスタマーサービスメッセージの送信、ユーザー情報の取得、群発メッセージの送信前にアクセスを呼び出す必要がある場合tokenインタフェースはインタフェースアクセス証明書を取得します.これは明らかに合理的ではありません.一方で、インタフェース呼び出し操作が1回多くなる一方で、2000回/日の呼び出し制限も十分ではありません.したがって、実際のアプリケーションでは、取得したaccess_をtokenは格納され、access_が定期的に呼び出されます.tokenインタフェースは、いつでも取り出すaccessを保証するために更新されます.tokenはすべて有効です.
公式サイトの詳細:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140183
インタフェース呼び出し要求の説明
https    : GEThttps://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

パラメータの説明
パラメータ
必要かどうか
説明
grant_type
はい
アクセスの取得tokenクライアントに記入_credential
appid
はい
サードパーティユーザー固有の資格証明
secret
はい
サードパーティユーザー固有の証明鍵、すなわちappsecret
説明に戻る
通常、微信は次のJSONパケットを公衆番号に返します.
{"access_token":"ACCESS_TOKEN","expires_in":7200}

パラメータの説明
パラメータ
説明
access_token
取得した資格証明
expires_in
資格証明有効時間、単位:秒
エラーが発生した場合、ウィーチャットはエラーコードなどの情報を返します.JSONパケットの例は以下の通りです(この例はAppID無効エラーです).
{"errcode":40013,"errmsg":"invalid appid"}

リターンコード説明
リターンコード
説明
-1
システムが忙しいので、開発者はしばらく待ってから試してください.
0
リクエスト成功
40001
AppSecretエラーまたはAppSecretがこの公衆番号に属していない場合は、開発者にAppSecretの正確性を確認してください
40002
grant_を確認してくださいtypeフィールド値はclient_credential
40164
呼び出しインタフェースのIPアドレスはホワイトリストにありません.インタフェースのIPホワイトリストに設定してください.
二:基本クラスのパッケージ
tokenクラスをカプセル化します.
package com.wyj.wechart.pojo;

/**
 * 
 *   
 * 
 * @author:WangYuanJun
 * @date:2018 1 23    3:19:14
 */
public class Token {

    //       
    private String accessToken;

    //      ,  : 
    private int expiresIn;

    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;
    }
}

三:tokenの取得
  • Webデバッグツールを使用してインタフェースをデバッグする:Webデバッグツール
  • は、ブラウザから直接アクセスします.https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETを選択し、APPIDとAPPSECRETを自分のappIDとappsecretに置き換え、ブラウザでtokenを取得します.
  • プログラムを作成し、https接続をシミュレートし、tokenを取得する:httpsリクエストに対して、証明書信頼マネージャが必要です.このマネージャクラスは自分で定義する必要がありますが、X 509 TrustManagerインタフェースを実現する必要があります.
  • まず、MyX 509 TrustManagerクラスを定義します.
    package com.wyj.wechart.utils;
    
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    import javax.net.ssl.X509TrustManager;
    
    /**
     *        (  https  )
     *                        ,              ,          。
     * 
     * @author:WangYuanJun
     * @date:2018 1 23    3:22:19
     */
    public class MyX509TrustManager implements X509TrustManager {
    
        //        
        public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    
        //         
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
        }
    
        //       X509    
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
    

    tokenテストクラスを作成します.
    package com.wyj.wechart.test;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    
    import org.junit.Test;
    
    import com.wyj.wechart.pojo.Token;
    import com.wyj.wechart.utils.CommonUtil;
    import com.wyj.wechart.utils.MyX509TrustManager;
    
    public class TokenTest {
    
        @Test
        public void testGetToken1() throws Exception {
            String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appID&secret=appsecret";
            //     
            URL url = new URL(tokenUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
    
            //   SSLContext  ,                
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            //    SSLContext     SSLSocketFactory  
            SSLSocketFactory ssf = sslContext.getSocketFactory();
    
            httpUrlConn.setSSLSocketFactory(ssf);
            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
    
            //       (GET/POST)
            httpUrlConn.setRequestMethod("GET");
    
            //      
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(
                    inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            //       
            StringBuffer buffer = new StringBuffer();
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            //     
            inputStream.close();
            httpUrlConn.disconnect();
            //       
            System.out.println(buffer);
        }
    
    }
    

    WeChatサーバから返された結果:
    {"access_token":"E3kRcQTati3QBPz97ou7zG0NXFrZFbA5No_hs5FNUZ62ROT0jr0txWr-gG1w-t06kk0zBW0kFmJiicJAydFyHNZhIh2uqIw4B5t85huRLs4","expires_in":7200}
    

    コードの最適化:微信サーバーはjsonデータを返して、どのようにjsonの中から解析した値
    オープンソースのjson開発キットjson-libでjavaオブジェクトに変換
            <dependency>
                <groupId>net.sf.json-libgroupId>
                <artifactId>json-libartifactId>
                <version>2.4version>
                <classifier>jdk15classifier>
            dependency>
    

    共通のツールクラスCommonUtilをカプセル化し、tokenを専用に取得します.
    package com.wyj.wechart.utils;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.ConnectException;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.wyj.wechart.pojo.Token;
    import com.wyj.wechart.pojo.WeixinUserInfo;
    
    import net.sf.json.JSONException;
    import net.sf.json.JSONObject;
    
    /**
     *      
     * 
     * 
     * @author:WangYuanJun
     * @date:2018 1 23    3:36:50
     */
    public class CommonUtil {
        private static Logger log = LoggerFactory.getLogger(CommonUtil.class);
    
        //     (GET)
        public final static String token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
    
        /**
         *   https  
         * 
         * @param requestUrl
         *                
         * @param requestMethod
         *                (GET、POST)
         * @param outputStr
         *                 
         * @return JSONObject(  JSONObject.get(key)     json      )
         */
        public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {
            JSONObject jsonObject = null;
            try {
                //   SSLContext  ,                
                TrustManager[] tm = { new MyX509TrustManager() };
                SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
                sslContext.init(null, tm, new java.security.SecureRandom());
                //    SSLContext     SSLSocketFactory  
                SSLSocketFactory ssf = sslContext.getSocketFactory();
    
                URL url = new URL(requestUrl);
                HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
                conn.setSSLSocketFactory(ssf);
    
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                //       (GET/POST)
                conn.setRequestMethod(requestMethod);
    
                //  outputStr  null        
                if (null != outputStr) {
                    OutputStream outputStream = conn.getOutputStream();
                    //       
                    outputStream.write(outputStr.getBytes("UTF-8"));
                    outputStream.close();
                }
    
                //           
                InputStream inputStream = conn.getInputStream();
                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
                String str = null;
                StringBuffer buffer = new StringBuffer();
                while ((str = bufferedReader.readLine()) != null) {
                    buffer.append(str);
                }
    
                //     
                bufferedReader.close();
                inputStreamReader.close();
                inputStream.close();
                inputStream = null;
                conn.disconnect();
                jsonObject = JSONObject.fromObject(buffer.toString());
            } catch (ConnectException ce) {
                log.error("    :{}", ce);
            } catch (Exception e) {
                log.error("https    :{}", e);
            }
            return jsonObject;
        }
    
        /**
         *         
         * 
         * @param appid
         *              
         * @param appsecret
         *              
         * @return
         */
        public static Token getToken(String appid, String appsecret) {
            Token token = null;
            String requestUrl = token_url.replace("APPID", appid).replace("APPSECRET", appsecret);
            //   GET      
            JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);
    
            if (null != jsonObject) {
                try {
                    token = new Token();
                    token.setAccessToken(jsonObject.getString("access_token"));
                    token.setExpiresIn(jsonObject.getInt("expires_in"));
                } catch (JSONException e) {
                    token = null;
                    //   token  
                    log.error("  token   errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
                }
            }
            return token;
        }
    }

    Tokenテストクラスを変更するには、次の手順に従います.
    package com.wyj.wechart.test;
    
    import java.io.BufferedReader;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.URL;
    
    import javax.net.ssl.HttpsURLConnection;
    import javax.net.ssl.SSLContext;
    import javax.net.ssl.SSLSocketFactory;
    import javax.net.ssl.TrustManager;
    
    import org.junit.Test;
    
    import com.wyj.wechart.pojo.Token;
    import com.wyj.wechart.utils.CommonUtil;
    import com.wyj.wechart.utils.MyX509TrustManager;
    
    public class TokenTest {
    
        @Test
        public void testGetToken1() throws Exception {
            String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=appID&secret=appsecret";
            //     
            URL url = new URL(tokenUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
    
            //   SSLContext  ,                
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            //    SSLContext     SSLSocketFactory  
            SSLSocketFactory ssf = sslContext.getSocketFactory();
    
            httpUrlConn.setSSLSocketFactory(ssf);
            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
    
            //       (GET/POST)
            httpUrlConn.setRequestMethod("GET");
    
            //      
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(
                    inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            //       
            StringBuffer buffer = new StringBuffer();
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            //     
            inputStream.close();
            httpUrlConn.disconnect();
            //       
            System.out.println(buffer);
        }
    
        @Test
        public void testGetToken2() {
            Token token = CommonUtil.getToken("appID","appsecret");
            System.out.println("access_token:"+token.getAccessToken());
            System.out.println("expires_in:"+token.getExpiresIn());
        }
    }
    

    コンソール出力の効果は、access_を取得したことを示しています.tokenとexpires_in:
    access_token:2amR6pr1eN-BuSBgho-nzo5tofxJ6BdEnRJQ87Zs5bj4ny4CGB8w-1D3YtjG2PzmEvVm1INrsVg-5BjyHCkWmBKsLPDSF3r_bdaPxMpKtbw
    expires_in:7200

    注意:githubプロジェクトアドレス:微信共通番号開発用例