微信公衆番号開発の公衆番号取得のaccess_token


なぜ公衆番号のアクセスを取得するのかtoken?
これから微信公衆番号のカスタムメニューを実現するにはaccessが必要だからです.tokenは、メニューのURlがサードパーティのページにジャンプしても使用されます.
一、access_tokenの概要
サードパーティの開発者がユーザーにより価値のある個性化サービスを提供できるように、微信公衆プラットフォームはカスタムメニューインタフェース、カスタマーサービスインタフェース、ユーザー情報インタフェース、ユーザーグループインタフェース、群発インタフェースなど、多くのインタフェースを開放している.
開発者は、これらのインタフェースを呼び出すときに、同じパラメータaccessを入力する必要があります.tokenは、公衆アカウントのグローバル唯一の手形であり、インタフェースアクセス証明書です.
access_tokenは公衆番号のグローバル一意の手形であり、公衆番号が各インタフェースを呼び出す際にaccessを使用する必要がある.token.開発者は適切に保存する必要がある.
access_tokenのストレージは、少なくとも512文字の空間を保持する必要があります.
access_tokenの有効期間は現在2時間で、タイミングリフレッシュが必要で、繰り返し取得すると前回取得したaccess_tokenは無効です.
 
サードパーティがミドルコントロールサーバを使用しないで、各ビジネスロジックポイントを選択してaccess_をリフレッシュします.tokenでは、競合が発生し、サービスが不安定になる可能性があります.
公衆番号はAppIDとAppSecretを使用してこのインタフェースを呼び出してaccessを取得することができます.token.AppIDとAppSecretは、微信公衆プラットフォームの公式サイト-開発者センターページで入手できます(開発者になる必要があり、アカウントに異常はありません).注意すべての微信インタフェースを呼び出すときはhttpsプロトコルを使用する必要があります.
 
access_tokenの有効期間は7200秒(2時間)で、有効期間内で、access_tokenが期限切れになった場合、インタフェースを再呼び出してaccessを取得する必要があります.token.理想的には、7 x 24時間稼働するシステムは、毎日12回のaccess_を取得するだけです.token、すなわち2時間ごとに取得されます.有効期間内にaccess_を再取得するとtoken、では前回取得したaccess_tokenは失効します.
現在、アクセスを取得tokenインタフェースの呼び出し頻度は2000回/日に制限され、カスタマーサービスメッセージの送信、ユーザー情報の取得、群発メッセージの送信前にアクセスを呼び出す必要がある場合tokenインタフェースはインタフェースアクセス証明書を取得します.これは明らかに合理的ではありません.一方で、インタフェース呼び出し操作が1回多くなる一方で、2000回/日の呼び出し制限も十分ではありません.したがって、実際のアプリケーションでは、取得したaccess_をtokenは格納され、access_が定期的に呼び出されます.tokenインタフェースは、いつでも取り出すaccessを保証するために更新されます.tokenはすべて有効です.
 
 
公式の説明:
インタフェース呼び出し要求の説明
http    : GET
https://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"}

二、パッケージ基本類
tokenクラスをカプセル化します.
 
package cn.com.comit.appointment.modules.wechat.entity;


/**
*   : Token 
*   :    
 */
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を取得する.
1.質問:tokenを取得するにはどうすればいいですか?
ソリューション:(1)ブラウザから直接アクセスします.(2)プログラムを記述し,https接続をシミュレートしtokenを得る.
解決の詳細は次のとおりです.
(1)ブラウザに直接リンクを入力:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRETを選択し、APPIDとAPPSECRETを自分のappIDとappsecretに置き換え、ブラウザでtokenを取得します. 
(2)httpsリクエストの送信をプログラムでシミュレートしtokenを取得する方法
httpリクエストには、証明書信頼マネージャが必要です.このマネージャクラスは独自に定義する必要がありますが、X 509 TrustManagerインタフェースを実装する必要があります.
まず、MyX 509 TrustManagerクラスを定義します.
package cn.com.comit.appointment.modules.wechat.utils;


import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.X509TrustManager;

/**
*   : MyX509TrustManager 
*   :       
 */
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 cn.com.comit.appointment.modules.wechat.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 cn.com.comit.appointment.modules.wechat.entity.Token;
import cn.com.comit.appointment.modules.wechat.utils.CommonUtil;
import cn.com.comit.appointment.modules.wechat.utils.MyX509TrustManager;


public class TokenTest {
    
    public static void main(String[] args) throws Exception {
    	Token token = CommonUtil.getToken("     appID","     appsecret");
    	System.out.println("access_token:"+token.getAccessToken());
        System.out.println("expires_in:"+token.getExpiresIn());
        //  appID,secret
        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);
    }
    
        
}

汎用ツールクラス:CommonUtil
package cn.com.comit.appointment.modules.wechat.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 net.sf.json.JSONException;
import net.sf.json.JSONObject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.comit.appointment.modules.wechat.entity.Token;


/**
*   : CommonUtil 
*   :        
 */
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;
    }
    
    /**
     * URL  (utf-8)
     * 
     * @param source
     * @return
     */
    public static String urlEncodeUTF8(String source) {
        String result = source;
        try {
            result = java.net.URLEncoder.encode(source, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return result;
    }
    
    /**
     *              
     * 
     * @param contentType     
     * @return
     */
    public static String getFileExt(String contentType) {
        String fileExt = "";
        if ("image/jpeg".equals(contentType))
            fileExt = ".jpg";
        else if ("audio/mpeg".equals(contentType))
            fileExt = ".mp3";
        else if ("audio/amr".equals(contentType))
            fileExt = ".amr";
        else if ("video/mp4".equals(contentType))
            fileExt = ".mp4";
        else if ("video/mpeg4".equals(contentType))
            fileExt = ".mp4";
        return fileExt;
    }
}

アクセスを取得する2つの方法が提供されています.token、効果:
access_token:15_Wq-IcnQDU-SjkePrAQkZ70lnmQzlQ2fBNlp6DCQBkQ98GQQr_C5ASy8xVqaS6zuE8-3lOkZeKPDc7UzwVyQWkYB0r45waUXpPA62-vFxvVWe26egNjSm_duZI83e37iGMNrU6L7tgrUYTSdAIABWV
expires_in:7200
{"access_token":"15_BueUYZQeX8oYYqGNAQkZ70lnmQzlQ2fBNlp6DCQBkQ98GQQr_C5ASy8xVqYR5h8DOWutAOvscCiFzL1nCgOTldsfmeHZda_z7h0_e1NxGYvqhjcoL7OQc1DWF-wenOk5z6m0-lRUXBdAIAMPT","expires_in":7200}

私の座右の銘:いいえ、私は学ぶことができます;遅れて、私は追いかけることができます;転んで、私は立ち上がることができます;私はきっとできます.