Android App實現第三方微信登錄
1、下載微信官方最新的sdk,集成到app中。如下圖:
2、註冊到微信
可以在app的某個Activity的onCreate方法中註冊,這裏也可以在app的application的onCreate()方法中註冊,這樣,在整個app的中都可以使用。例如:
public class CarApplication extends Application{
…… …… ……
public static IWXAPI api;
public void onCreate() {
//註冊微信
api = WXAPIFactory.createWXAPI(this, “你的應用在微信上申請的app_id”, true);
api.registerApp(“你的應用在微信上申請的app_id”);
…… …… ……
}
}
3、在app的包名目錄下新建一個wxapi目錄,然後在此目錄下新建WXEntryActivity.java文件,如下,app的包名爲carjob.com.cn,新建的wxapi目錄如下。(注意:一定是包名目錄下新建,不要在其他目錄新建,否則WXEntryActivity.java裏的public void onResp(BaseResp resp)方法不會被調用)
WXEntryActivity繼承Activity,實現IWXAPIEventHandler,並重寫protected void onNewIntent(Intent intent)、public void onReq(BaseReq arg0)、public void onResp(BaseResp resp)方法。WXEntryActivity.java文件可以見最後附錄。
4、發送微信登錄的請求
app中點擊某一個view,發送微信登錄的請求如下:
final SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "carjob_wx_login";
CarApplication.api.sendReq(req);
其中,CarApplication.api就是第2步中註冊的IWXAPI對象。
請求成功後,可拉起微信的授權登錄頁面,如下。用戶點擊“確認登錄”後,SDK通過SendAuth的Resp返回數據給調用方(即app),此時WXEntryActivity中的public void onResp(BaseResp resp)方法被調用(微信、朋友圈分享成功後,此方法同樣會被調用),微信登錄的返回值說明如下。這裏app可以做相關的處理,見WXEntryActivity.java文件中的處理,取code爲下一步獲取access_token和openid等信息做準備。此處獲取code的方法:
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) resp).code; //即爲所需的code
break;
…… …… ……
}
}
5、通過code獲取access_token
獲取上一步中的code後,調用以下接口獲取access_token,官方指出用Get方式請求。
請求參數說明:
appid:應用唯一標識,在微信開放平臺提交應用審覈通過後獲得。
secret:應用密鑰AppSecret,在微信開放平臺提交應用審覈通過後獲得。
code:填寫第一步獲取的code參數。
grant_type:填authorization_code。
返回說明
正確的返回:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
返回參數說明:
access_token:接口調用憑證。
expires_in:access_token接口調用憑證超時時間,單位(秒)。
refresh_token:用戶刷新access_token。
openid:授權用戶唯一標識。
scope:用戶授權的作用域,使用逗號(,)分隔
6、獲得access_token、openid後,app就可以根據自己的規則與互自己的server進行交互。
7、微信請求的一般流程如下:
附錄:
WXEntryActivity.java
package carjob.com.cn.wxapi;
import carjob.com.cn.CarApplication;
import carjob.com.cn.newversion.MyResumeLoginView;
import carjob.com.cn.search.SharedPreferencesclass;
import carjob.com.cn.util.SharedPreferenceUtil;
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.SendAuth;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private Context context = WXEntryActivity.this;
private void handleIntent(Intent paramIntent) {
CarApplication.api.handleIntent(paramIntent, this);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
handleIntent(getIntent());
}
@Override
protected void onNewIntent(Intent intent) {
// TODO Auto-generated method stub
super.onNewIntent(intent);
setIntent(intent);
handleIntent(intent);
}
@Override
public void onReq(BaseReq arg0) {
// TODO Auto-generated method stub
finish();
}
@Override
public void onResp(BaseResp resp) {
// TODO Auto-generated method stub
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
if (ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX == resp.getType()) {
Toast.makeText(context, "分享成功", Toast.LENGTH_LONG).show();
break;
}
String code = ((SendAuth.Resp) resp).code;
new SharedPreferencesclass(49, code, context);
System.out.println("微信確認登錄返回的code:" + code);
Toast.makeText(context, "微信確認登錄返回的code:" + code, Toast.LENGTH_LONG).show();
MyResumeLoginView.loginHandler.sendEmptyMessage(MyResumeLoginView.WEIXIN_LOGIN_SUCCESS);
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
break;
default:
break;
}
finish();
}
}