1. 程式人生 > >快速整合微信登入。(超詳細)

快速整合微信登入。(超詳細)

整合第三方雖然有第三方的,但是第三方整合相容問題,以及不太好修改。等問題。所以這篇是寫給需要整合微信登入的。我儘可能詳細,方便大家一次完成,減少時間成本。
如果比較囉嗦的地方,請不要介意,跳過即可。
1.第一大步:
第一步:獲得對應引數。檢查環境
登入微信開發平臺:https://open.weixin.qq.com/
第二步:
獲得Appid(必須),Appsecret(必須) ,儲存。

這裡寫圖片描述

public class API {
public static String WX_APPID=”wx2821e7a6a3ada08a”;
public static String WX_AppSecret=”938e1df7698342bdf2dde5031c658213”;

}

第三步:(非必需,如果獲得Code後請求微信伺服器,報錯appid錯誤,檢查這步)
應用簽名不能有冒號,用命令列工具生成的MD5會有冒號。最好用微信簽名生成工具。
配置基本完成了。
這裡寫圖片描述

第二大步:實現授權,獲得code

第一步:配置庫
Android Stuoid:
在build.gradle 下配置:
compile ‘com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+’
Eclipse,見微信開發平臺的Android接入指南

第二步:配置許可權




第三步:在Application 的 onCreate()註冊。我用工具類封裝一遍。後面有資源供給大家下載。
@Override
public void onCreate() {
super.onCreate();
LoginTools.initLoginTools(this);
}

public class LoginTools {
public static IWXAPI mWxApi;
public static void initLoginTools(Application mContext){
//AppConst.WEIXIN.APP_ID是指你應用在微信開放平臺上的AppID,記得替換。
mWxApi = WXAPIFactory.createWXAPI(mContext, API.WX_APPID, false);
// 將該app註冊到微信
mWxApi.registerApp(API.WX_APPID);
}
}

第四步:調起微信授權登入介面,

public static void wxLogin(Context mContext) {
if (!mWxApi.isWXAppInstalled()) {
Tools.toast(mContext,”你還沒有安裝微信!”);
return;
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo”;
req.state = “diandi_wx_login”;
mWxApi.sendReq(req);
}

第五步:在包名目錄下新建一個名字為wxapi的包,並在wxapi包下新建一個
Activity,名字為:WXEntryActivity 。在,對應xml中加上, android:exported=”true”

注意:1。不是Java類,是需要在xml配置的
Activity, 2.不是 WXPayEntryActivity,這個是用於微信支付的,不是微信登入。
特別注意: 1.是繼承 Activity, 最好不是其他父類不然有可能收不到回撥。

這裡寫圖片描述

第六步:實現 implements IWXAPIEventHandler ,並且重寫onNewIntent(Intent intent),
在OnonCreate ,呼叫handleIntent。

Activity程式碼:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //如果沒回調onResp,八成是這句沒有寫
    LoginTools.handleIntent(getIntent(), this);
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
    if (!LoginTools.handleIntent(getIntent(), this)) {
        finish();
    }
}

@Override
public void onReq(BaseReq baseReq) {
}

@Override
public void onResp(BaseResp baseResp) {

}
}

LoginTools程式碼:
public static boolean handleIntent(Intent intent, IWXAPIEventHandler var2){
if (intent==null){
return false;
}
return mWxApi.handleIntent(intent,var2);
}

第三大步: 根據code,獲得登入資訊。經過上面,已經實現拉起微信。下面就是獲得使用者資訊,
希望就在眼前。
第一步,判斷code是佛正常。
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode) {
//成功獲得回撥。
case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) baseResp).code;

break;

    //失敗。返回值為-6,檢查下,第一大步的,第三步。 
    default:
                 break;
}

}
第二步,根據Code請求微信的伺服器,獲得token。

public static void geyUserInfo(BaseResp baseResp){
//1. get請求。 2.這裡的請求方式可以多變,可以手動去拼接 get的引數。 我這裡是封裝的請求。
// grant_type的值固定為 :authorization_code
// get的請求完整地址格式為為:
/*
https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的APPID&secret=你的SECRET&code=你的CODE&grant_type=authorization_code

 */
String code = ((SendAuth.Resp) baseResp).code;
String url ="https://api.weixin.qq.com/sns/oauth2/access_token";
RequestParams params = new  RequestParams();
//grant_type
params.put("grant_type","authorization_code");
params.put("code",code);
params.put("appid", API.WX_APPID);
params.put("secret",API.WX_AppSecret);
MyHttp.Get(url, params, new TextHandler() {
    @Override
    public void onSuccess(int header, Object response) {
    }
    @Override
    public void onFailure(Throwable error) {
    }
});

}

第三步:
得到或者解析返回的資料。
正確:
{
“access_token”:”ACCESS_TOKEN”,
“expires_in”:7200,
“refresh_token”:”REFRESH_TOKEN”,
“openid”:”OPENID”,
“scope”:”SCOPE”,
“unionid”:”o6_bmasdasdsad6_2sgVt7hMZOPfL”
}
錯誤:
{“errcode”:40029,”errmsg”:”invalid code”}

如果返回的資料的appid,secretid錯誤,那麼看下你請求伺服器的完整地址。不要把我那串完整地址,當url,然後還在後面拼接引數。我就是犯過這個錯誤。找了半天。。。至於其他你只能自行解決。

String code = ((SendAuth.Resp) baseResp).code;
String url =”https://api.weixin.qq.com/sns/userinfo”;
RequestParams params = new RequestParams();
//grant_type
params.put(“openid”,“上面獲取的openid”);
params.put(“access_token”,“access_token”);
MyHttp.Get(url, params, new TextHandler() {
@Override
public void onSuccess(int header, Object response) {

    }
    @Override
    public void onFailure(Throwable error) {
    }
});

}

/*
正確的返回
*/
{
“openid”:”OPENID”,
“nickname”:”NICKNAME”,
“sex”:1,
“province”:”PROVINCE”,
“city”:”CITY”,
“country”:”COUNTRY”,
“headimgurl”: “http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0“,
“privilege”:[
“PRIVILEGE1”,
“PRIVILEGE2”
],
“unionid”: ” o6_bmasdasdsad6_2sgVt7hMZOPfL”

}
/*
錯誤的返回
*/
{
“errcode”:40003,”errmsg”:”invalid openid”
}

第五步,請求自己伺服器的授權登入介面,然後自行解決後續跳轉等等。。

完。
工具類程式碼:
public class LoginTools {
public static IWXAPI mWxApi;

public static void initLoginTools(Application application){
    //AppConst.WEIXIN.APP_ID是指你應用在微信開放平臺上的AppID,記得替換。
    mWxApi  = WXAPIFactory.createWXAPI(application, API.WX_APPID, false);
    // 將該app註冊到微信
    mWxApi.registerApp(API.WX_APPID);
}

public static void wxLogin(Context mContext) {
    if (!mWxApi.isWXAppInstalled()) {
        Tools.toast(mContext,"你還沒有安裝微信!");
        return;
    }
    final SendAuth.Req req = new SendAuth.Req();
    req.scope = "snsapi_userinfo";
    req.state = "diandi_wx_login";
    mWxApi.sendReq(req);
}

public static boolean handleIntent(Intent intent, IWXAPIEventHandler var2){
    if (intent==null){
        return false;
    }
    return mWxApi.handleIntent(intent,var2);
}

public static void  geyUserInfo(String code){
    //1. get請求。 2.這裡的請求方式可以多變,可以手動去拼接 get的引數。  我這裡是封裝的請求。
    // grant_type的值固定為 :authorization_code
    // get的請求完整地址格式為為:
    /*
    https://api.weixin.qq.com/sns/oauth2/access_token?appid=你的APPID&secret=你的SECRET&code=你的CODE&grant_type=authorization_code

     */

    String url ="https://api.weixin.qq.com/sns/oauth2/access_token";
    RequestParams params = new  RequestParams();
    //grant_type
    params.put("grant_type","authorization_code");
    params.put("code",code);
    params.put("appid", API.WX_APPID);
    params.put("secret",API.WX_AppSecret);
    MyHttp.Get(url, params, new TextHandler() {
        @Override
        public void onSuccess(int header, Object response) {
        //請求成功!
 //成功後
            JSONObject jsonObject = JSONObject.parseObject(response.toString());
            String openid = jsonObject.getString("openid");
            String access_token = jsonObject.getString("access_token");
            //請求使用者資訊,程式碼在上面第4部。需要自己的網路請求方式,
            //我就忽略不寫了。
            RequestWXInfo(openid,access_token);
        }
        @Override
        public void onFailure(Throwable error) {
         //請求失敗!
        }
    });
}

}

最後,裡面我涉及到的工具類,我就發程式碼的方式。就不上傳了。至於有什麼
不足的歡迎評論,如果遇到了bug了請百度解決,我收到你的訊息時估計都好幾天了,如果你能等,就評論吧。