使用微信登录APP

来源:互联网 发布:淘宝无线详情页加链接 编辑:程序博客网 时间:2024/04/30 14:49

关注微信号,发送demo获取github上的demo吧!





现在利用第三方平台登录APP已经是很普通的方式,现在记一下利用微信登录APP的过程。


上面的图片是描述使用微信登录的过程:

1、用户点击第三方开发的APP微信登录按键,

2、APP使用申请得的APPID与微信联系

3、微信平台会向APP发送一个code

4、APP利用获得的code和APPID、secrect向微信平台获取access_token、openid

5、APP使用获取得的access_token、openid获取用户的基本信息,如昵称、性别、国家等。


具体做法

第一步:获取APPID和secrect

           在微信开发平台创建应用,填写APP的包名和签名(签名不是SHA1,要使用第三方工具安装到手机输入APP的包名获取),审核通过后会有APPID和secrect.

第二步:环境集成

            从微信官网下载SDK集成到项目libs中,并在包名路径下创建名为xwapi的文件夹

第三步:在wxapi内创建WXEntryActivity

           在wxapi内创建WXEntryActivity,并implements IWXAPIEventHandler,

在manifest中加入android:exported="true",如

<activity

            android:name=".wxapi.WXEntryActivity"

            android:exported="true"></activity>

第四步:在有微信登录的Activity加入接口信息

          在有微信登录的Activity加入接口信息,一般都是在weclome界面或login界面,加入。如:

public class MainActivity extends AppCompatActivity {
public static IWXAPI api;
   private String WXAPP_ID="";//申请到的APPID

   @Override
   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       api= WXAPIFactory.createWXAPI(this,WXAPP_ID,true);
       final SendAuth.Req req = new SendAuth.Req();
       req.scope="snsapi_userinfo";
       req.state="none";
       api.sendReq(req);
       //


   }
}

第五步:在WXEntryActivity实现对接功能

        第四步与微信通信之后,会弹出一个授权窗口,提醒用户是否使用微信登录APP,点击确定之后微信会回调WXEntryActivity中的onResp方法,把code传为BaseResp传过来,我们就可以用这个code一步步获取accesstoken,再获取用户信息。如:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private static final int TIMELINE_SUPPORTED_VERSION = 0x21020001;
   // IWXAPI 是第三方app和微信通信的openapi接口
   //private IWXAPI api;
   private static final int RETURN_MSG_TYPE_LOGIN = 1;
   private static final int RETURN_MSG_TYPE_SHARE = 2;
   private String code;
   private String tokenJson;//access_token串
   private boolean accesss_token_effective;//access_token是否有效
   private String openId;//openId
   private String refresh_token;
   private String access_token="";
    private String unionid;
   private String userInfoJson;//用户信息json串
   private String WXAPP_ID="";//申请到的APPID
   private String WXAppSecret="";//申请到的Secret



   @Override
   protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
      // setContentView(R.layout.activity_wxentry);
       MainActivity.api.handleIntent(getIntent(), this);


   }

@Override
   public void onReq(BaseReq req) {
Toast.makeText(this, "onReq方法被调用!", Toast.LENGTH_LONG).show();
       switch (req.getType()) {
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
goToGetMsg();
               break;
           case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
//goToShowMsg((ShowMessageFromWX.Req) req);
               break;
           default:
break;
       }

}

private void goToGetMsg() {
Intent intent = new Intent(this, MainActivity.class);
       intent.putExtras(getIntent());
       startActivity(intent);
       finish();
   }



@Override
   public void onResp(BaseResp baseResp) {
Toast.makeText(this, "onResp方法被调用!", Toast.LENGTH_LONG).show();
       int result = 0;

       //String id=baseResp.openId;
       Log.e("ErrorCode", "结果---" + baseResp.errCode);
       switch (baseResp.errCode) {
case BaseResp.ErrCode.ERR_OK:

switch (baseResp.getType()) {
case RETURN_MSG_TYPE_LOGIN:
//拿到了微信返回的code,立马再去请求access_token
                       code = ((SendAuth.Resp) baseResp).code;
                       Log.e("ErrorCode", "code---" + code);
                       getAccess_token(code);

                       //获取用户信息
                       getUserInfo();


                       break;

                   case RETURN_MSG_TYPE_SHARE:
//AppData.showToast("微信分享成功");
                       Toast.makeText(this, "微信分享成功", Toast.LENGTH_LONG).show();
                       finish();
                       break;
               }

break;
           case BaseResp.ErrCode.ERR_USER_CANCEL:

break;
           case BaseResp.ErrCode.ERR_AUTH_DENIED:

break;
           default:

break;
       }



}

/**
    * 通过code获取access_token
    * @param code
    * @return
    */
   private String getAccess_token(String code) {
final String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WXAPP_ID + "&secret=" +WXAppSecret +
"&code=" + code + "&grant_type=authorization_code";
       new Thread(new Runnable() {
@Override
           public void run() {
String result =getURLResponse(url);
               tokenJson = result;
               Log.e("tokenJson", "tokenJson====" + tokenJson);
               try {
JSONObject jsonObject = new JSONObject(result);
                   access_token = jsonObject.getString("access_token");
                   refresh_token = jsonObject.getString("refresh_token");
                   openId = jsonObject.getString("openid");
                   unionid = jsonObject.getString("unionid");
                   Log.e("access_token", "access_token====" + access_token);
                   Thread.currentThread().sleep(1000);//毫秒
               } catch (JSONException ex) {
ex.printStackTrace();
               } catch (InterruptedException ex) {
ex.printStackTrace();
               }


}
}).start();

       return tokenJson;
   }

/**
    * 由于access_token有效期为两小时,所以进行下一步操作前最好进行一次检查
    * 判断token是否有效
    *
    * @param access_token
    * @param openId
    * @return
    */
   private boolean checkToken(String access_token, String openId) {
final String url = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + openId;

       new Thread(new Runnable() {
@Override
           public void run() {
String result = getURLResponse(url);
               try {
JSONObject jsonObject = new JSONObject(result);
                   if (jsonObject.getString("errcode").equals("0")) {
//返回0表示accesss_token有效
                       accesss_token_effective=true;
                   }else if(jsonObject.getString("errcode").equals("40003")){
//返回40003表示accesss_token无效
                       accesss_token_effective=false;

                   }
} catch (JSONException ex) {
ex.printStackTrace();
               }

}
}).start();
       return accesss_token_effective;
   }


/**
    * 刷新重新获取accesss_token
    * @return
    */
   private String getRefresh_token(){
final String url = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid="+WXAPP_ID+"&grant_type=refresh_token&refresh_token="+refresh_token;

       new Thread(new Runnable() {
@Override
           public void run() {
String result = getURLResponse(url);
               try {
JSONObject jsonObject = new JSONObject(result);
                  access_token=jsonObject.getString("access_token");
               } catch (JSONException ex) {
ex.printStackTrace();
               }

}
}).start();

       return access_token;
   }

private String getUserInfo() {
//access_token为空,延时500毫秒,再回调自己,等上个线程获取access_token为空
       //此处还应该判断
       if (access_token.equals("")) {
Timer timer=new Timer();//实例化Timer类
           timer.schedule(new TimerTask(){
public void run(){
System.out.println("退出");
                   this.cancel();}},500);//五百毫秒
           getUserInfo();
       } else {
final String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openId;

       new Thread(new Runnable() {
@Override
           public void run() {
String result = getURLResponse(url);
               userInfoJson = result;
               //打出用户信息
               Log.e("userInfo", "userInfo====" + userInfoJson);

           }
}).start();
   }
return userInfoJson;
   }


/**
    * 获取指定URL的响应字符串
    * @param urlString
    * @return
    */
   public String getURLResponse(String urlString){
HttpURLConnection conn = null; //连接对象
       InputStream is = null;
       String resultData = "";
       try {
URL url = new URL(urlString); //URL对象
           conn = (HttpURLConnection)url.openConnection(); //使用URL打开一个链接
           conn.setDoInput(true); //允许输入流,即允许下载
           conn.setDoOutput(true); //允许输出流,即允许上传
           conn.setUseCaches(false); //不使用缓冲
           conn.setRequestMethod("GET"); //使用get请求
           is = conn.getInputStream();   //获取输入流,此时才真正建立链接
           InputStreamReader isr = new InputStreamReader(is);
           BufferedReader bufferReader = new BufferedReader(isr);
           String inputLine = "";
           while((inputLine = bufferReader.readLine()) != null){
resultData += inputLine + "\n";
           }

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
           e.printStackTrace();
       }catch (IOException e) {
// TODO Auto-generated catch block
           e.printStackTrace();
       }finally{
if(is != null){
try {
is.close();
               } catch (IOException e) {
// TODO Auto-generated catch block
                   e.printStackTrace();
               }
}
if(conn != null){
conn.disconnect();
           }
}

return resultData;
   }





}
                                             
0 0