Android에 WeChat 로그인을 통합하는 단계에 대한 자세한 그래픽 및 텍스트 설명

高洛峰
풀어 주다: 2017-03-15 17:23:28
원래의
2913명이 탐색했습니다.

이 글에서는 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 오픈 플랫폼에 계정을 등록한 다음 모바일 앱을 만드는 것입니다.

Android에 WeChat 로그인을 통합하는 단계에 대한 자세한 그래픽 및 텍스트 설명

지원서 서명 부분에 주의하세요

Android에 WeChat 로그인을 통합하는 단계에 대한 자세한 그래픽 및 텍스트 설명

지원서 서명은 온라인 버전을 사용합니다. 여기에서 keymd5를 확인하세요. Android 서명 요약

2. 파일을 프로젝트 디렉터리에

개발 도구 키트(SDK) 다운로드: WeChat 공유, 로그인, 수집, 결제 및 기타 기능을 사용하는 데 필요한 라이브러리 및 파일

Example Demo

다운로드 후 libammsdk.jar 파일을 AS 프로젝트의 libs 디렉터리에 복사하고, example Demo의 소스 파일 디렉터리 아래 wxapi 디렉터리 전체를 루트 패키지에 복사합니다. 프로젝트 디렉터리의 src 아래:

Android에 WeChat 로그인을 통합하는 단계에 대한 자세한 그래픽 및 텍스트 설명

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!