android app使用第三方微信登录

相信很多公司的app都有一个功能就是使用微信作为第三方登录,可以去掉中间注册app等繁琐的步骤。 这个问题困扰了我两天。 今天终于弄好了。恕我才疏学浅,微信的开发文档写得不够详细,因此我花了很多时间在此。 废话少说。


step 1:

注册微信开发者,创建app应用,配置相关信息。


記住你的appId 和secret 有用。



step 2. 接入sdk    网址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN

打开如下图:



那么 step1中的签名如何获取就是这个签名工具那获取的。


step 3. 也是在step中的资源下载那里,下载相关的android开发包,将之放进你的项目中,如何放,这里不细说。

step4.   登录代码:

public class LoginActivity extends AppCompatActivity implements View.OnClickListener {
    private static final String TAG = LoginActivity.class.getSimpleName();
    private Context mContext;
	private Button btnLogin;

	

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        mContext = LoginActivity.this;
        initViews();
    }

    private void initViews() {
        btnLogin = (Button)findViewById(R.id.btn_login);
		btnLogin.setOnClickLis....
    }



    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.rel_wechat:
                starActivityForResult(new Intent(this, WXEntryActivity.class), 0); // 我在WXEntryActivity注册微信
                break;
        }
    }
}

 

step 5. 在你的项目新建一个包,   如下图

注意 : c 必須是wxapi这个文件夹, d必须是WXEntryActivity这个名称。 据说是微信规定的。另外,WXEntryActivity这个类,在step2中下载的sample里有这个类。

在WXEntActivity里,如下:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {


    private String weixin_login_url = Constant.ZHJ + "tapp/passport/login_third_party";  // 这个是我公司app自个的登录接口,需要携带微信信息的


    /*----------------- 微信登录相关 ----------------*/

    private IWXAPI api;  // IWXAPI 是第三方app和微信通信的openapi接口

    private String access_token = "";
    private String openid = "";
    private String unionid = "";

    private String nickName = "";
    private String icon_url = "";



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setContentView(R.layout.entry);

        // 通过WXAPIFactory工厂,获取IWXAPI的实例
        api = WXAPIFactory.createWXAPI(this, Constant.WEIXIN_APP_ID, false);
        api.registerApp(Constant.WEIXIN_APP_ID);
        SendAuth.Req req = new SendAuth.Req();
        req. scope = "snsapi_userinfo";
        req. state = "wechat_sdk_demo_test";


        api.sendReq(req);//执行完毕这句话之后,会在WXEntryActivity回调

        api.handleIntent(getIntent(), this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);

        setIntent(intent);
        api.handleIntent(intent, this);
    }

    // 微信发送请求到第三方应用时,会回调到该方法
    @Override
    public void onReq(BaseReq req) {
        switch (req.getType()) {
            case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
                finish();
                break;
            case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
                finish();
                break;
            default:
                break;
        }
    }




    // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
    @Override
    public void onResp(BaseResp resp) {

        switch (resp.errCode) {
            case BaseResp.ErrCode.ERR_OK:
                // 成功
                if(resp instanceof SendAuth.Resp){
                    SendAuth.Resp newResp = (SendAuth.Resp) resp;
                    //获取微信传回的code
                    String code = newResp.code;
                    getWXData(code);
                }

                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL:
                System.out.println("-------------b");
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
                System.out.println("-------------c");
                finish();
                break;
            default:
                System.out.println("-------------d");
                finish();
                break;
        }

    }


    private void getWXData(String code){
        final OKHttpUtil okHttpUtil = new OKHttpUtil();

// 这里的app_id app_secret 都是我们在申请账号时就生成的。 详情看step 1和2
        String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+Constant.WEIXIN_APP_ID+"&secret="+Constant.APP_SECRET+"&code="+code+"&grant_type=authorization_code";
        okHttpUtil.get(url, new OKHttpUtil.BaseCallBack() {
            @Override
            public void onSuccess(Response response, String json) {
                try {
                    JSONObject obj = new JSONObject(json);
                    access_token = obj.getString("access_token");
                    openid = obj.getString("openid");

                    getToken(okHttpUtil, access_token, openid);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onFail(Request request, IOException e) {

            }

            @Override
            public void onError(Response response, int code) {

            }
        });

    }



//我目的是想获取微信用户的参数 用户名, 头像等信息。
    private void getToken(OKHttpUtil okHttpUtil, String access_token, String openid){
        String url_string = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid;
        okHttpUtil.get(url_string, new OKHttpUtil.BaseCallBack() {

            @Override
            public void onSuccess(Response response, String json) {
                try {
                    JSONObject object = new JSONObject(json);
                    nickName = object.getString("nickname");
                    icon_url = object.getString("headimgurl");
                    unionid = object.getString("unionid");

                    weixinLogin(icon_url,nickName,unionid); // 自个方法是我公司app登录携带微信用户信息登录的接口。

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

            }

            @Override
            public void onFail(Request request, IOException e) {

            }

            @Override
            public void onError(Response response, int code) {

            }
        });
    }


    private void weixinLogin(String head_url, String nick, String id){
        OKHttpUtil okHttpUtil = new OKHttpUtil();
        HashMap<String, String> params = new HashMap<String, String>();
        params.put("kind", "weixin");
        params.put("icon", head_url);
        params.put("nickname", nick);
        params.put("account", id);
        okHttpUtil.post(weixin_login_url, params, new OKHttpUtil.BaseCallBack() {
            @Override
            public void onSuccess(Response response, String json) {
                System.out.println("--登录成功json-- " +json);

                String headPicUrl = "";
                String userName = "";
                String mark ="";
                String token = "";
                String userid = "";
                String cityname = "";

                try {
                    JSONObject object = new JSONObject(json);
                    if(object.getInt("error_code")==0){
                        //微信登录成功
                        JSONObject data = object.getJSONObject("data");
                        headPicUrl = data.getString("icon");
                        userName = data.getString("name");
                        mark = data.getString("mark");
                        token = data.getString("token");
                        userid = data.getString("uid");
                        cityname = data.getString("cityname");

                        SharedPreferences saveInfo = getSharedPreferences("User_Info_SP", Context.MODE_PRIVATE);
                        SharedPreferences.Editor editor = saveInfo.edit();
                        editor.putString("user_name", userName);
                        editor.putString("head_pic_url", headPicUrl);
                        editor.putString("mark", mark);
                        editor.putString("user_id", userid);
                        editor.putString("token", token);
                        editor.putString("city_name", cityname);
                        editor.commit();

                        setResult(Constant.WEIXIN_LOGIN_RESULTCODE);
                        finish();

                    }

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

            @Override
            public void onFail(Request request, IOException e) {

            }

            @Override
            public void onError(Response response, int code) {

            }
        });
    }
}



 




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值