Cet article vous donnera une explication détaillée avec des images et du texte de AndroidLes étapes pour intégrer la connexion WeChat Grâce au contenu compilé dans l'article, vous n'avez besoin que de quelques lignes de code pour réaliser la connexion WeChat. fonction de connexion. Amis simplement intéressés. Jetons un coup d'œil ci-dessous.
1. Écrivez d'abord dans onCreate of Application :
// GeneralAppliction.java public static IWXAPI sApi; @Override public void onCreate() { super.onCreate(); sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID); }
2. Ajouter :
// MainActivity.java WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
3. les étapes d’intégration spécifiques sont décrites en détail ci-dessous.
Étapes d'intégration :
1. Inscrivez-vous et créez une application sur la plateforme ouverte, demandez les autorisations de connexion
2 . Téléchargez le SDK, copiez les fichiers associés dans le répertoire du projet
3. Initialisez globalement le composant WeChat
4. Demandez l'autorisation de vous connecter et obtenez le code
5. Obtenez via le code le mot de passe d'autorisation access_token
6. À l'étape 5, déterminez si le access_token existe et expire
7. Si le access_token expire et n'est pas valide, utilisezfresh_token pour actualiser it
8. Utilisez access_token pour obtenir des informations sur l'utilisateur
1 Enregistrez-vous et créez une application sur la plateforme ouverte et demandez des autorisations de connexion
Ceci. Cette étape n'a pas besoin d'être expliquée. Le seul moyen est de créer un compte sur la plateforme ouverte WeChat. Créez ensuite l'application mobile.
Ce qu'il faut noter c'est : la partie signature de la candidature
J'utilise celle en ligne pour la signature de la candidature ici. clé md5 Pour les problèmes qui nécessitent une attention particulière, vous pouvez consulter : Résumé de la signature Android
Téléchargez le SDK et copiez le fichier correspondant. fichiers dans le répertoire du projet
Téléchargement du kit d'outils de développement (SDK) : bibliothèques et fichiers nécessaires à l'utilisation du partage, de la connexion, de la collecte, du paiement et d'autres fonctions de WeChat
Exemple de démo
Après le téléchargement, copiez le fichier libammsdk.jar dans le répertoire libs du projet AS et copiez l'intégralité du répertoire wxapi sous le répertoire du fichier source dans l'exemple Demo vers le package racine sous src du répertoire du projet :
Si le dossier wxapi est placé au mauvais endroit, vous ne pourrez pas vous connecter et le SDK WeChat ne peut pas trouver la connexion Fonction d'autorisation d'activité. Ajoutez ensuite 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. Initialisation globale Le Le composant WeChat
initialise globalement le composant WeChat, bien sûr dans le onCreate de l'Application (bien sûr le onCreate de l'Activité est également possible, afin d'utiliser l'api WeChat objet globalement pour un fonctionnement pratique) :
@Override public void onCreate() { super.onCreate(); // 初始化微信组件 initWeiXin(); } public static IWXAPI sApi; private void initWeiXin() { sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID); }
Demander une autorisation pour vous connecter et obtenir le code
Pour le seul principe de la même activité, j'ai regroupé tout ce qui concerne WeChat dans le package wxapi et 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; } } }
Amis avez des questions sur ce qu'est le code :
Un tiers doit utiliser le code pour obtenir le access_token. Le délai d'expiration du code est de 10 minutes. Un code ne peut être échangé avec succès qu'une seule fois. et alors il deviendra invalide. La nature temporaire et unique du code garantit la sécurité de la connexion autorisée à WeChat. Les tiers peuvent renforcer davantage la sécurité de leurs propres connexions autorisées en utilisant https et les paramètres d'état.
De cette façon, le client utilise de la manière suivante :
WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
5 . Le code d'accès obtient le mot de passe d'autorisation access_token
Nous obtenons le code dans la méthode de rappel onResp, puis obtenons le mot de passe d'autorisation access_token via le code :
/** * 获取授权口令 */ 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. Déterminez si access_token existe et expire à l'étape 5
在回调的onResp方法中获取code后,处理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); }
总结
集成的详细描述就这样,至于获取的用户信息,小伙伴们应该知道后续自己业务的需求,该怎么处理了。以上就是本文的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!