1. 程式人生 > >第三方之聯合登陸(微信)

第三方之聯合登陸(微信)

前言 App聯合登陸很常用,包括使用qq、微信、微博賬號登陸等,這篇記錄下微信登陸的接入流程。 接入流程

1:申請開發者

2:整合程式碼

1.匯入libammsdk.jar的jar包

2.初始化IWXAPI

// 通過WXAPIFactory工廠,獲取IWXAPI的例項 api = WXAPIFactory.createWXAPI(this, G.AppId_WX,true); 3.傳送認證請求

if( !api.isWXAppInstalled()){
Toast.makeText(context, "請先安裝微信應用", Toast.LENGTH_SHORT).show();
return false;
 }

if(!api.isWXAppSupportAPI() ){
Toast.makeText(context, "請先更新微信應用", Toast.LENGTH_SHORT).show();
return false;
 }

// 將應用的APPID註冊到微信

api.registerApp(Constant.WX_APP_ID);
final SendAuth.Req req = newSendAuth.Req();
req.scope = Constant.WX_APP_SCOPE;
req.state = Constant.WX_APP_STATE;
api.sendReq(req);

4.調起微信授權

調起微信客戶端讓使用者進行授權,使用者進行操作後會調起...wxapi.WXEntryActivity 這個類,..是應用包名,這個WXEntryActivity需要繼承Activity並且實現IWXAPIEventHandler介面,當然,這個WXEntryActivity也需要在清單檔案中註冊

<activity
       android:name="**.**.**.wxapi.WXEntryActivity"
       android:exported="true"
       android:label="@string/app_name"
       android:launchMode="singleTop"
       android:screenOrientation="portrait" >
       <intent-filter>
                <actionandroid:name="android.intent.action.VIEW" />      <categoryandroid:name="android.intent.category.DEFAULT" />
          <dataandroid:scheme="sdksample" />
       </intent-filter>
   </activity>

5.獲取微信回撥資訊

WXEntryActivity先實現IWXAPIEventHandler,然後實現3個方法一個onNewIntent、onReq、onResp在onResp得到code,然後在通過code獲取openid和access_token,然後根據這兩個引數調自己系統後臺,判斷是該使用者登入過

public classWXEntryActivity extends Activityimplements IWXAPIEventHandler{
   privateIWXAPIapi;
   String openid,access_token,expires_in;
   ContextthisContext;
   Intentintent;


  Handlerhandler= newHandler(){
  @Override
  public void handleMessage(Messagemsg) {
    // TODO Auto-generated method stub
    super.handleMessage(msg);
    JSONObjectjsonObject = (JSONObject) msg.obj;

    switch (msg.what) {
    case 1:
       try {
          openid = jsonObject.getString("openid");
          access_token =jsonObject.getString("access_token");
          requestCodeApiData(); 
       }catch(JSONException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
       }    
       break;
    default:
       break;
    }
  }
 };



   @Override

   public void onCreate(Bundle savedInstanceState) {                                                                              super.onCreate(savedInstanceState);
   thisContext = this;
   intent = getIntent();
   setContentView(R.layout.activity_wx_entry);
   api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);
    api.handleIntent(getIntent(),this);
   }


@Override
protected void onNewIntent(Intentintent) {
  super.onNewIntent(intent);
  setIntent(intent);
  api.handleIntent(intent,this);
  }

@Override
public void onReq(BaseReq req) {
  finish();
  }

@Override
public void onResp(BaseResp resp) {
  switch (resp.errCode) {
  case BaseResp.ErrCode.ERR_OK:
                System.out.println("0000");
                Stringcode = ((SendAuth.Resp) resp).code;//即為所需的code
                System.out.println("code:"+code);
                doGet(((SendAuth.Resp)resp).code);
                break;


  case BaseResp.ErrCode.ERR_AUTH_DENIED:
              System.out.println("使用者拒絕授權");
              break;

  case BaseResp.ErrCode.ERR_USER_CANCEL:
              System.out.println("使用者取消");
              break;

  default:
            break;
  }
}



public void doGet(final String code){ 

  new Thread(){

    @Override

    public void run() {

       // TODO Auto-generated method stub

        URL url;

        String link = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+G.AppId_WX+"&secret="+G.AppScrect+"&code="+code+"&grant_type=authorization_code";

          byte[] buf = Util.httpGet(link);

          if (buf !=null && buf.length > 0) {

          Stringcontent = newString(buf);

           JSONObject json = JSONObject.parseObject(content);

          Messagemessage = newMessage();

          message.obj = json;

          message.what = 1;

          handler.sendMessage(message);
          }
    }
  }.start();
   }
  }

小心有坑:在獲取code時候微信後臺返回{“errcode”:40029,”errmsg”:”invalidcode”},我那時獲取不到微信返回的json,就將獲取的url在logcat上列印,然後放瀏覽器裡面一直返回時{“errcode”:40029,”errmsg”:”invalidcode”},查了半天,發現是其他地方錯了,再一個就是微信的同一個code,只請求了一次,我在瀏覽器上請求相當於多次了就出現了{“errcode”:40029,”errmsg”:”invalidcode”}