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.전역 적 으로 위 챗 구성 요소 초기 화
     4.로그 인 권한 부여 요청,코드 획득
     5、code 를 통 해 권한 수여 구령 access 획득token
     6,5 단계 판단 accesstoken 존재 여부 와 만 료 여부
     7、accesstoken 기한 이 지나 면 무효,refreshtoken 으로 새로 고침 하 겠 습 니 다.
     8、access 사용token 사용자 정보 가 져 오기
1.오픈 플랫폼 에 등록 하여 애플 리 케 이 션 을 만 들 고 로그 인 권한 을 신청 합 니 다.
이 단 계 는 사실 별로 말 하지 않 아 도위 챗 오픈 플랫폼에 계 정 을 등록 한 다음 에 모 바 일 애플 리 케 이 션 을 만 들 수 없다.

주의해 야 할 것 은 서명 을 사용 하 는 부분 입 니 다.

여기에 서명 을 적용 합 니 다.저 는 온라인 키 의 md5 를 사용 합 니 다.이 주의 할 점 은 다음 과 같 습 니 다.Android 서명 요약
2.sdk 를 다운로드 하여 프로젝트 프로젝트 디 렉 터 리 에 관련 파일 복사
개발 키 트(SDK)다운로드:위 챗 공유,로그 인,컬 렉 션,결제 등 기능 에 필요 한 라 이브 러 리 및 파일 사용 가능
예시 데모
다운로드 후 libammsdk.jar 파일 을 AS 프로젝트 의 libs 디 렉 터 리 에 복사 하고 예제 데모 소스 파일 디 렉 터 리 의 wxapi 디 렉 터 리 를'프로젝트 디 렉 터 리 의 src 아래 루트 패키지'에 복사 합 니 다.

wxapi 라 는 폴 더 의 위치 가 맞지 않 으 면 로그 인 할 수 없다 고 합 니 다.위 챗 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.전역 적 으로 위 챗 구성 요소 초기 화
전역 적 으로 위 챗 구성 요 소 를 초기 화 합 니 다.물론 애플 리 케 이 션 의 onCreate 에 있 습 니 다.(물론 Activity 의 onCreate 도 가능 합 니 다.전역 적 으로 위 챗 api 대상 을 사용 하여 쉽게 조작 할 수 있 습 니 다)

@Override
public void onCreate() { 
 super.onCreate();
 //        
 initWeiXin();
}

public static IWXAPI sApi;
private void initWeiXin() {
 sApi = WXEntryActivity.initWeiXin(this, AppConst.WEIXIN_APP_ID);
}
4.로그 인 권한 부여 요청,코드 획득
같은 업무 의 단일 원칙 을 위해 저 는 위 챗 과 관련 된 것 을 모두 wxapi 패키지 와 WXEntry Activity 에 통일 적 으로 포 장 했 습 니 다.

//   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 을 사용 할 때 필요 합 니 다.code 의 시간 초과 시간 은 10 분 입 니 다.하나의 code 는 access 를 한 번 만 성공 적 으로 바 꿀 수 있 습 니 다.token 은 무효 입 니 다.코드 의 임시 성과 한 번 에 위 챗 권한 수여 로그 인의 안전성 을 보장 합 니 다.제3 자 는 https 와 state 파 라 메 터 를 사용 하여 자신의 권한 수여 로그 인 안전성 을 강화 할 수 있 습 니 다.
이렇게 클 라 이언 트 가 사용 하 는 곳 은:

WXEntryActivity.loginWeixin(MainActivity.this, GeneralAppliction.sApi);
5.code 를 통 해 권한 수여 구령 access 획득token
우 리 는 onResp 의 리 셋 방법 에서 code 를 얻 은 후에 code 를 통 해 권한 수여 구령 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 단계 판단 accesstoken 존재 여부 와 만 료 여부
리 셋 된 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.만약 accesstoken 기한 이 지나 면 무효,refreshtoken 으로 새로 고침 하 겠 습 니 다.

/**
 *       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);
}
총결산
통 합 된 상세 한 설명 은 이렇게 해서 얻 은 사용자 정보 에 대해 어린이 들 은 후속 적 인 자신의 업무 수 요 를 알 고 어떻게 처리 해 야 하 는 지 알 아야 한다.이상 은 본 고의 모든 내용 입 니 다.여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기