Android統合WeChat登録の手順詳細
一、まずAppleのonCreateに書いてください。
統合ステップ:
1、オープンプラットフォームに登録してアプリケーションを作成し、登録権限を申請する
2、sdkをダウンロードして、関連ファイルをプロジェクトプロジェクトプロジェクトのプロジェクトディレクトリにコピーします。
3、グローバル初期化WeChatコンポーネント
4、登録の許可を要求し、コードを取得する
5、codeで授権パスワードaccess_を取得するtoken
6、5ステップ目でaccess_を判断するtokenは存在していますか?期限が切れていますか?
7、もしaccess_token有効期限が切れたら、refreshを使います。token更新
8、access_を使うtokenはユーザ情報を取得する。
1.オープンプラットフォームに登録してアプリケーションを作成し、登録権限を申請する
このステップはあまり言わなくてもいいです。ウィーチャットオープンプラットフォームにアカウントを登録してモバイルアプリケーションを作成することはできません。
注意したいのは、署名を適用する部分です。
ここに署名を適用します。私が使っているのはオンラインのkeyのmd 5です。これについて注意したいことはAndroidの署名のまとめです。
2.sdkをダウンロードして、関連ファイルをプロジェクトプロジェクトのプロジェクトディレクトリにコピーします。
開発キット(SDK)のダウンロード:WeChat共有、ログイン、コレクション、決済などの機能が必要なライブラリとファイルを使用できます。
例のデモ
ダウンロードした後にlibammsdk.jarファイルをASプロジェクトのlibsディレクトリにコピーして、サンプルDemoのソースファイルのディレクトリの下のwxapiディレクトリを全部コピーして、プロジェクトディレクトリのsrcの下のルートで包んでください。
wxappiというフォルダの位置が間違っていたら、ログインできないと言っています。WeChat sdkは登録されたActivityライセンス機能を見つけられません。その後、Manifest.xmlに追加します。
グローバル初期化マイクロレターコンポーネントは、もちろんApplicationのonCreateにあります。
同じ業務の単一原則のために、WeChat関連のものを全部WXEntryActivityにまとめてパッケージしました。
第三者がコードでaccess_を取得します。tokenの時に必要です。codeのタイムアウト時間は10分です。一つのコードは一回のaccess_と交換することに成功しました。tokenは無効です。コードの一時性と一回のWeChatライセンス登録の安全性を保障しました。第三者はhttpsとstateパラメータを使うことによって、自身のライセンス登録の安全性をさらに強化することができます。
このようにクライアントが使うところは以下の通りです。
私たちはonRespのコールバック方法でコードを取得し、コードを通じてライセンスパスワードaccess(u)を取得しました。token:
コールバックのワンストップメソッドでコードを取得した後、access_を処理します。tokenが登録されていますか?または期限が切れていますか?
統合の詳細はこのようにして、獲得したユーザー情報については、パートナー達は自分の業務の需要を知っていて、どう処理すればいいですか?以上が本文の全部です。皆さんの勉強や仕事に一定の助けを与えてほしいです。もし疑問があれば、メッセージを残して交流してもいいです。
// GeneralAppliction.java
public static IWXAPI sApi;
@Override
public void onCreate() {
super.onCreate();
sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
}
二、登録が必要なところに追加する:
// MainActivity.java
WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
三、具体的な集積ステップについて詳しく説明します。統合ステップ:
1、オープンプラットフォームに登録してアプリケーションを作成し、登録権限を申請する
2、sdkをダウンロードして、関連ファイルをプロジェクトプロジェクトプロジェクトのプロジェクトディレクトリにコピーします。
3、グローバル初期化WeChatコンポーネント
4、登録の許可を要求し、コードを取得する
5、codeで授権パスワードaccess_を取得するtoken
6、5ステップ目でaccess_を判断するtokenは存在していますか?期限が切れていますか?
7、もしaccess_token有効期限が切れたら、refreshを使います。token更新
8、access_を使うtokenはユーザ情報を取得する。
1.オープンプラットフォームに登録してアプリケーションを作成し、登録権限を申請する
このステップはあまり言わなくてもいいです。ウィーチャットオープンプラットフォームにアカウントを登録してモバイルアプリケーションを作成することはできません。
注意したいのは、署名を適用する部分です。
ここに署名を適用します。私が使っているのはオンラインのkeyのmd 5です。これについて注意したいことはAndroidの署名のまとめです。
2.sdkをダウンロードして、関連ファイルをプロジェクトプロジェクトのプロジェクトディレクトリにコピーします。
開発キット(SDK)のダウンロード:WeChat共有、ログイン、コレクション、決済などの機能が必要なライブラリとファイルを使用できます。
例のデモ
ダウンロードした後にlibammsdk.jarファイルをASプロジェクトのlibsディレクトリにコピーして、サンプルDemoのソースファイルのディレクトリの下のwxapiディレクトリを全部コピーして、プロジェクトディレクトリのsrcの下のルートで包んでください。
wxappiというフォルダの位置が間違っていたら、ログインできないと言っています。WeChat sdkは登録されたActivityライセンス機能を見つけられません。その後、Manifest.xmlに追加します。
<activity
android:name=".wxapi.WXEntryActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:configChanges="keyboardHidden|orientation|screenSize"
android:exported="true"
android:screenOrientation="portrait" />
3.グローバル初期化WeChatコンポーネントグローバル初期化マイクロレターコンポーネントは、もちろんApplicationのonCreateにあります。
@Override
public void onCreate() {
super.onCreate();
//
initWeiXin();
}
public static IWXAPI sApi;
private void initWeiXin() {
sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
}
4.登録の許可を要求し、コードを取得する同じ業務の単一原則のために、WeChat関連のものを全部WXEntryActivityにまとめてパッケージしました。
// IWXAPIEventHandler ,
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final String WEIXIN_ACCESS_TOKEN_KEY = "wx_access_token_key";
private static final String WEIXIN_OPENID_KEY = "wx_openid_key";
private static final String WEIXIN_REFRESH_TOKEN_KEY = "wx_refresh_token_key";
private Gson mGson;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//
GeneralAppliction.sApi.handleIntent(getIntent(), this);
mGson = new Gson();
}
/**
*
* @param context
* @param weixin_app_id appid
* @return api
*
/
public static IWXAPI initWeiXin(Context context, @NonNull String weixin_app_id) {
if (TextUtils.isEmpty(weixin_app_id)) {
Toast.makeText(context.getApplicationContext(), "app_id ", Toast.LENGTH_SHORT).show();
}
IWXAPI api = WXAPIFactory.createWXAPI(context, weixin_app_id, true);
api.registerApp(weixin_app_id);
return api;
}
/**
*
*
* @param api api
*/
public static void loginWeixin(Context context, IWXAPI api) {
//
if (!api.isWXAppInstalled()) {
Toast.makeText(context.getApplicationContext(), " !", Toast.LENGTH_SHORT).show();
return;
}
// , code
SendAuth.Req req = new SendAuth.Req();
// ,
req.scope = "snsapi_userinfo";
/**
* ,
* csrf ( ), session
*/
req.state = "app_wechat";
api.sendReq(req);
}
// ,
@Override
public void onReq(BaseReq req) {
switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
break;
default:
break;
}
}
// ,
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
//
case BaseResp.ErrCode.ERR_OK:
// code
String code = ((SendAuth.Resp) resp).code;
// code access_token
getAccessToken(code);
break;
}
}
}
子供たちが疑問を持っているのは、codeとは何ですか?第三者がコードでaccess_を取得します。tokenの時に必要です。codeのタイムアウト時間は10分です。一つのコードは一回のaccess_と交換することに成功しました。tokenは無効です。コードの一時性と一回のWeChatライセンス登録の安全性を保障しました。第三者はhttpsとstateパラメータを使うことによって、自身のライセンス登録の安全性をさらに強化することができます。
このようにクライアントが使うところは以下の通りです。
WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
5.codeによるライセンスパスワードaccess_token私たちはonRespのコールバック方法でコードを取得し、コードを通じてライセンスパスワードaccess(u)を取得しました。token:
/**
*
*/
private void getAccessToken(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid=" + AppConst.WEIXIN_APP_ID +
"&secret=" + AppConst.WEIXIN_APP_SECRET +
"&code=" + code +
"&grant_type=authorization_code";
// access_token
httpRequest(url, new ApiCallback<String>() {
@Override
public void onSuccess(String response) {
Logger.e(response);
// , ,
processGetAccessTokenResult(response);
}
@Override
public void onError(int errorCode, final String errorMsg) {
Logger.e(errorMsg);
showMessage(" : " + errorMsg);
}
@Override
public void onFailure(IOException e) {
Logger.e(e.getMessage());
showMessage(" ");
}
});
}
/**
*
* @param response
*/
private void processGetAccessTokenResult(String response) {
//
if (validateSuccess(response)) {
// Gson
WXAccessTokenInfo tokenInfo = mGson.fromJson(response, WXAccessTokenInfo.class);
Logger.e(tokenInfo.toString());
//
saveAccessInfotoLocation(tokenInfo);
//
getUserInfo(tokenInfo.getAccess_token(), tokenInfo.getOpenid());
} else {
// ,
WXErrorInfo wxErrorInfo = mGson.fromJson(response, WXErrorInfo.class);
Logger.e(wxErrorInfo.toString());
//
showMessage(" : " + wxErrorInfo.getErrmsg());
}
}
/**
*
*
* @param response
* @return
*/
private boolean validateSuccess(String response) {
String errFlag = "errmsg";
return (errFlag.contains(response) && !"ok".equals(response))
|| (!"errcode".contains(response) && !errFlag.contains(response));
}
6.第5ステップでaccess_を判断するtokenは存在していますか?期限が切れていますか?コールバックのワンストップメソッドでコードを取得した後、access_を処理します。tokenが登録されていますか?または期限が切れていますか?
// , access_token, ,
String accessToken = (String) ShareUtils.getValue(this, WEIXIN_ACCESS_TOKEN_KEY, "none");
String openid = (String) ShareUtils.getValue(this, WEIXIN_OPENID_KEY, "");
if (!"none".equals(accessToken)) {
// access_token,
isExpireAccessToken(accessToken, openid);
} else {
// access_token
getAccessToken(code);
}
授権パスワードが有効かどうかを判断する:
/**
* accesstoken
* @param accessToken token
* @param openid
*/
private void isExpireAccessToken(final String accessToken, final String openid) {
String url = "https://api.weixin.qq.com/sns/auth?" +
"access_token=" + accessToken +
"&openid=" + openid;
httpRequest(url, new ApiCallback<String>() {
@Override
public void onSuccess(String response) {
Logger.e(response);
if (validateSuccess(response)) {
// accessToken ,
getUserInfo(accessToken, openid);
} else {
// , refresh_token accesstoken
refreshAccessToken();
}
}
@Override
public void onError(int errorCode, final String errorMsg) {
Logger.e(errorMsg);
showMessage(" : " + errorMsg);
}
@Override
public void onFailure(IOException e) {
Logger.e(e.getMessage());
showMessage(" ");
}
});
}
7.access_token有効期限が切れたら、refreshを使います。token更新
/**
* access_token
*
/
private void refreshAccessToken() {
// refresh_token
final String refreshToken = (String) ShareUtils.getValue(this, WEIXIN_REFRESH_TOKEN_KEY, "");
if (TextUtils.isEmpty(refreshToken)) {
return;
}
// access_token url
String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?" +
"appid=" + AppConst.WEIXIN_APP_ID +
"&grant_type=refresh_token" +
"&refresh_token=" + refreshToken;
//
httpRequest(url, new ApiCallback<String>() {
@Override
public void onSuccess(String response) {
Logger.e("refreshAccessToken: " + response);
// , ,
processGetAccessTokenResult(response);
}
@Override
public void onError(int errorCode, final String errorMsg) {
Logger.e(errorMsg);
showMessage(" : " + errorMsg);
//
loginWeixin(WXEntryActivity.this.getApplicationContext(), GeneralAppliction.sApi);
}
@Override
public void onFailure(IOException e) {
Logger.e(e.getMessage());
showMessage(" ");
//
loginWeixin(WXEntryActivity.this.getApplicationContext(), GeneralAppliction.sApi);
}
});
}
8.access_を使うtokenはユーザ情報を取得する。
/**
*
*
/
private void getUserInfo(String access_token, String openid) {
String url = "https://api.weixin.qq.com/sns/userinfo?" +
"access_token=" + access_token +
"&openid=" + openid;
httpRequest(url, new ApiCallback<String>() {
@Override
public void onSuccess(String response) {
//
WXUserInfo userInfo = mGson.fromJson(response, WXUserInfo.class);
Logger.e(" :" + userInfo.toString()); }
@Override
public void onError(int errorCode, String errorMsg) {
showMessage(" : " + errorMsg);
}
@Override
public void onFailure(IOException e) {
showMessage(" ");
}
});
}
通信セクション
private OkHttpClient mHttpClient = new OkHttpClient.Builder().build();
private Handler mCallbackHandler = new Handler(Looper.getMainLooper());
/**
* Okhttp
* * @param url
* @throws Exception
*/
public void httpRequest(String url, final ApiCallback<String> callback) {
Logger.e("url: %s", url);
final Request request = new Request.Builder()
.url(url)
.get()
.build();
mHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
if (callback != null) {
mCallbackHandler.post(new Runnable() {
@Override
public void run() {
// ,
callback.onFailure(e);
}
});
}
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (callback != null) {
if (!response.isSuccessful()) {
mCallbackHandler.post(new Runnable() {
@Override
public void run() {
// ,
callback.onError(response.code(), response.message());
}
});
} else {
mCallbackHandler.post(new Runnable() {
@Override
public void run() {
try {
// ,
callback.onSuccess(response.body().string());
} catch (final IOException e) {
// ,
mCallbackHandler.post(new Runnable() {
@Override
public void run() {
callback.onFailure(e);
}
});
}
}
});
}
}
}
});
}
// Api
public interface ApiCallback<T> {
/**
*
*
* @param response
*/
void onSuccess(T response);
/**
*
*
* @param errorCode
* @param errorMsg
*/
void onError(int errorCode, String errorMsg);
/**
*
*/
void onFailure(IOException e);
}
締め括りをつける統合の詳細はこのようにして、獲得したユーザー情報については、パートナー達は自分の業務の需要を知っていて、どう処理すればいいですか?以上が本文の全部です。皆さんの勉強や仕事に一定の助けを与えてほしいです。もし疑問があれば、メッセージを残して交流してもいいです。