Android 통합 위 챗 로그 인 절차 상세 설명
// 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);
}
총결산통 합 된 상세 한 설명 은 이렇게 해서 얻 은 사용자 정보 에 대해 어린이 들 은 후속 적 인 자신의 업무 수 요 를 알 고 어떻게 처리 해 야 하 는 지 알 아야 한다.이상 은 본 고의 모든 내용 입 니 다.여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.