android微信登录官方,微信应用开发之安卓 集成微信(一)实现微信登录详解

本文将带你了解微信应用开发之安卓 集成微信(一)实现微信登录详解,希望本文对大家学微信有所帮助。

集成微信(一)实现微信登录详解1.原理:第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;通过code参数加上AppID和AppSecret等,通过API换取access_token;通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。2.登录微信开放平台,注册app,申请微信登录并通过审核。获取APPID和appsecrethttps://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN3.在资源中心下载sdk,并将jar包放入项目的libs文件夹下,并导入到项目,成功之后可以在项目build.grade文件中看到引用4.在项目下,新建文件夹和activity,文件名和activity名不可改变,activity布局文件不用编写5.在配置文件中配置注意AppId换成自己申请的APPID,                                                                                                            

在监听方法中拉起微信登录界面。

//拉起微信登录界面 /**     * 微信登录方法     */    private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口    public static final String APP_ID = "wx93f10000000 换成自己的appid";    private void weixinlogin() {        // 通过WXAPIFactory工厂,获取IWXAPI的实例        api = WXAPIFactory.createWXAPI(this, APP_ID, true);        api.registerApp(APP_ID);        SendAuth.Req req = new SendAuth.Req();        req.scope = "snsapi_userinfo";//获取个人用户信息的权限        req.state = "wechat_sdk_demo_test";//防止攻击        api.sendReq(req);//向微信发送请求    }

编写WXAEntryActivity类,并将获取到的用户信息上传到自己的服务器。

/** * Created by dell on 2017/5/22. * 集成微信sdk的接口 */public class WXEntryActivity extends AppCompatActivity implements IWXAPIEventHandler {    public static final String APP_ID = "wx93f10000000 换成自己的appid";// 申请的appid    private IWXAPI api; // IWXAPI 是第三方app和微信通信的openapi接口    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_wxentry);        //注册api        api = WXAPIFactory.createWXAPI(this, APP_ID);        api.handleIntent(getIntent(), this);    }    @Override    public void onReq(BaseReq baseReq) {    }    /**     * 发送微信授权请求的响应结果     * @param baseResp     */    @Override    public void onResp(BaseResp baseResp) {        switch (baseResp.errCode) {            //如果errcode为零,表示用户同意授权            case BaseResp.ErrCode.ERR_OK:                // 得到所需的code                //此处报错检查下载的sdk是否正确                String code = ((SendAuth.Resp) baseResp).code;                Log.i("wxentry","code = "+code);                // 获取code之后携带参数获取用户信息                getToken(code);                break;            default:                break;        }    }    /**     * 携带参数获取用户信息     * @param code     */    private void getToken(String code) {        //调用官方给的接口获取openid        RequestParams params = new RequestParams(Httpurl.OAUTH);        params.addQueryStringParameter("appid", APP_ID);        //审核通过后生成appsecret码        params.addQueryStringParameter("secret", "981cdce51a3e1d8411111111111 换成你自己申请的appsecret");        params.addQueryStringParameter("code", code);        params.addQueryStringParameter("grant_type", "authorization_code");//固定写法        x.http().get(params, new Callback.CommonCallback() {            @Override            public void onSuccess(String result) {                String access_token = "";//接口调用凭证。                String expires_in = "";//接口调用凭证超时时间,单位(秒)。                String refresh_token = "";//用户刷新access_token。                String openid = "";//授权用户唯一标识。                String scope = "";//用户授权的作用域,使用逗号(,)分隔                String unionid = "";//当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。                // 解析数据,获取用户信息                try {                    JSONObject job = new JSONObject(result);                    access_token = job.getString("access_token");                    expires_in = job.getString("expires_in");                    refresh_token = job.getString("refresh_token");                    openid = job.getString("openid");                    scope = job.getString("scope");                    unionid = job.getString("unionid");                } catch (JSONException e) {                    e.printStackTrace();                }                // 判断openid是否为空                if (!openid.equals("")) {                    Log.i("wxentry", access_token + "---" + openid + "---" + expires_in + "---" + refresh_token + "---" + scope + "---" + unionid);                    //这个位置调用后台给的登录接口,别忘了登录成功之后finish()当前activity,不然会停留在空白页                    //传参给后台,获取返回的token,UID并保存                    setLogin(access_token, openid);                } else {                    Log.i("wxentry","检查appsecret码是否重置");                    //销毁界面                    finish();                }            }            @Override            public void onError(Throwable ex, boolean isOnCallback) {            }            @Override            public void onCancelled(CancelledException cex) {            }            @Override            public void onFinished() {            }        });    }    /**     * 授权成功,获取用户信息     * @param access_token     * @param openid     */    private void setLogin(String access_token, String openid) {        //调用官方给的接口获取用户信息        RequestParams params = new RequestParams(Httpurl.USERINFO);        params.addBodyParameter("access_token",access_token);        params.addBodyParameter("openid",openid);        x.http().get(params, new Callback.CommonCallback() {            @Override            public void onSuccess(String result) {                String openid = "";                String nickname = "";//昵称                String headimgurl = "";//头像路径                try {                    JSONObject object = new JSONObject(result);                    openid =   object.getString("openid");                    nickname = object.getString("nickname");                    headimgurl = object.getString("headimgurl");                } catch (JSONException e) {                    e.printStackTrace();                }                // 执行联网方法,将数据传给服务器                skip(openid,nickname,headimgurl);            }            @Override            public void onError(Throwable ex, boolean isOnCallback) {            }            @Override            public void onCancelled(CancelledException cex) {            }            @Override            public void onFinished() {            }        });    }    /**     * 联网上传用户信息     */    private void skip(String openid, String nickname, String headimgurl) {        //调用后台给的三方登陆的接口,上传用户信息,并获取token保存,销毁界面        RequestParams params = new RequestParams(Httpurl.THIRDLOGIN);        params.addBodyParameter("openid",openid);        params.addBodyParameter("nickname",nickname);        params.addBodyParameter("head_pic",headimgurl);        params.addBodyParameter("oauth","wx");        Log.i("wxtntry","openid:"+openid+" nickname:"+nickname+" headimgurl:"+headimgurl);        x.http().post(params, new Callback.CommonCallback() {            @Override            public void onSuccess(String result) {                try {                    Log.i("wxentry","result"+result);                    JSONObject object = new JSONObject(result);                    // 如果获取成功                    if (object.getInt("status") == 1){                        JSONObject data = object.getJSONObject("result");                        String token = data.getString("token");                        //偏好设置保存user_id                        SharedPreferences.Editor editor =                                getSharedPreferences("user",MODE_PRIVATE).edit();//文件名为user                        editor.putString("token",token);                        editor.apply();//提交                        // 第一次登录需要给Application赋值                        MyApplication.token = token;                        Toast.makeText(WXEntryActivity.this,object.getString("msg"),Toast.LENGTH_SHORT).show();                        //跳转界面                        startActivity(new Intent(WXEntryActivity.this,MainActivity.class));                        //销毁当前Activity                        finish();                    }else {                        Toast.makeText(WXEntryActivity.this,"请检查您的网络",Toast.LENGTH_SHORT).show();                    }                } catch (JSONException e) {                    e.printStackTrace();                }            }            @Override            public void onError(Throwable ex, boolean isOnCallback) {            }            @Override            public void onCancelled(CancelledException cex) {            }            @Override            public void onFinished() {            }        });    }}

在app项目中常量类中初始化微信接口,以便代码中调用

//微信平台给出的接口    //微信登录    //获取微信token及openid    public static final String OAUTH = "https://api.weixin.qq.com/sns/oauth2/access_token";    //获取用户信息的接口    public static final String USERINFO = "https://api.weixin.qq.com/sns/userinfo";

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值