本文将带你了解微信应用开发之安卓 集成微信(一)实现微信登录详解,希望本文对大家学微信有所帮助。
集成微信(一)实现微信登录详解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";
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之微信频道!