이 글에서는 Android위챗 로그인 통합 단계를 그림과 텍스트로 자세히 설명합니다. 글에 정리된 내용을 통해 위챗을 구현하려면 몇 줄의 코드만 있으면 됩니다. 로그인 기능. 그냥 관심 있는 친구는 아래를 살펴보겠습니다.
1. 먼저 애플리케이션의 onCreate에 작성:
// GeneralAppliction.java public static IWXAPI sApi; @Override public void onCreate() { super.onCreate(); sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID); }
2. 추가:
// MainActivity.java WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
3 , 구체적인 통합 단계는 다음과 같습니다. 아래에 자세히 설명되어 있습니다.
통합 단계:
1. 오픈 플랫폼에서 애플리케이션 등록 및 생성, 로그인 권한 신청
2 .sdk를 다운로드하고 관련 파일 을 프로젝트 디렉토리
에 복사합니다. 3. WeChat 구성 요소를 전역으로 초기화합니다
4. 로그인하고 코드를 얻으려면 권한을 요청합니다
5. 코드를 통해 획득 인증 비밀번호 access_token
6. 5단계에서 access_token이 존재하고 만료되는지 확인
7. access_token이 만료되고 유효하지 않은 경우 Refresh_token을 사용하여 새로 고침 it
8. access_token을 사용해 사용자 정보 획득
1. 오픈 플랫폼에 애플리케이션을 등록 및 생성하고 로그인 권한을 신청합니다
이것은 단계는 설명할 필요가 없습니다. 유일한 방법은 WeChat 오픈 플랫폼에 계정을 등록한 다음 모바일 앱을 만드는 것입니다.
지원서 서명 부분에 주의하세요
지원서 서명은 온라인 버전을 사용합니다. 여기에서 key의 md5를 확인하세요. Android 서명 요약
2. 파일을 프로젝트 디렉터리에
개발 도구 키트(SDK) 다운로드: WeChat 공유, 로그인, 수집, 결제 및 기타 기능을 사용하는 데 필요한 라이브러리 및 파일
Example Demo
다운로드 후 libammsdk.jar 파일을 AS 프로젝트의 libs 디렉터리에 복사하고, example Demo의 소스 파일 디렉터리 아래 wxapi 디렉터리 전체를 루트 패키지에 복사합니다. 프로젝트 디렉터리의 src 아래:
wxapi 폴더가 잘못된 위치에 있으면 로그인할 수 없으며 WeChat SDK에서 로그인을 찾을 수 없습니다. 활동 승인 기능. 그런 다음 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 구성 요소를 전역적으로 초기화합니다.
물론 애플리케이션의 onCreate에서 WeChat 구성 요소를 전역적으로 초기화합니다(물론 WeChat API 개체를 사용하기 위해 Activity의 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 All are packaged in the wxapi package and 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; } } }
관련 질문이 있는 경우 코드 정의:
아니요. 제3자는 access_token을 얻기 위해 코드를 사용해야 합니다. 코드의 제한 시간은 10분이며, 한 번만 액세스할 수 있습니다. 그러면 무효가 됩니다. 코드의 임시 및 일회성 특성은 WeChat 인증 로그인의 보안을 보장합니다. 제3자는 https 및 상태 매개변수를 사용하여 자체 인증된 로그인의 보안을 더욱 강화할 수 있습니다.
이런 방식으로 클라이언트는 을 다음과 같이 사용합니다.
WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
5. 획득 코드를 통해 인증 비밀번호 access_token
onResp 콜백 메소드에서 코드를 얻은 후 다음 코드를 통해 인증 비밀번호 access_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이 존재하고 만료되는지 확인
在回调的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); }
总结
集成的详细描述就这样,至于获取的用户信息,小伙伴们应该知道后续自己业务的需求,该怎么处理了。以上就是本文的全部内容了,希望能对大家的学习或者工作带来一定的帮助,如果有疑问大家可以留言交流。
위 내용은 Android에 WeChat 로그인을 통합하는 단계에 대한 자세한 그래픽 및 텍스트 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!