微信公共番号開発教程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
インタフェース呼び出し要求の説明
パラメータの説明
パラメータ
必要かどうか
説明
grant_type
はい
アクセスの取得tokenクライアントに記入_credential
appid
はい
サードパーティユーザー固有の資格証明
secret
はい
サードパーティユーザー固有の証明鍵、すなわちappsecret
説明に戻る
通常、微信は次のJSONパケットを公衆番号に返します.
パラメータの説明
パラメータ
説明
access_token
取得した資格証明
expires_in
資格証明有効時間、単位:秒
エラーが発生した場合、ウィーチャットはエラーコードなどの情報を返します.JSONパケットの例は以下の通りです(この例はAppID無効エラーです).
リターンコード説明
リターンコード
説明
-1
システムが忙しいので、開発者はしばらく待ってから試してください.
0
リクエスト成功
40001
AppSecretエラーまたはAppSecretがこの公衆番号に属していない場合は、開発者にAppSecretの正確性を確認してください
40002
grant_を確認してくださいtypeフィールド値はclient_credential
40164
呼び出しインタフェースのIPアドレスはホワイトリストにありません.インタフェースのIPホワイトリストに設定してください.
二:基本クラスのパッケージ
tokenクラスをカプセル化します.
三: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クラスを定義します.
tokenテストクラスを作成します.
WeChatサーバから返された結果:
コードの最適化:微信サーバーはjsonデータを返して、どのようにjsonの中から解析した値
オープンソースのjson開発キットjson-libでjavaオブジェクトに変換
共通のツールクラスCommonUtilをカプセル化し、tokenを専用に取得します.
Tokenテストクラスを変更するには、次の手順に従います.
コンソール出力の効果は、access_を取得したことを示しています.tokenとexpires_in:
注意:githubプロジェクトアドレス:微信共通番号開発用例
サードパーティの開発者がユーザーにより価値のある個性化サービスを提供できるように、微信公衆プラットフォームはカスタムメニューインタフェース、カスタマーサービスインタフェース、ユーザー情報インタフェース、ユーザーグループインタフェース、群発インタフェースなど、多くのインタフェースを開放している.
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の取得
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プロジェクトアドレス:微信共通番号開発用例