前段时间写了用友盟的QQ、微信、微博的第三方登录和分享。已经全都做出来了。
结果,经理莫名其妙的一句不行,全部都要用官方的做,我只做了微信的这里贴出我的全部过程。
**第一步**:首先、还是获取微信的AppID跟AppSecret。获取方法:[微信开放平台](https://open.weixin.qq.com/)注册获取开发者资格——创建移动应用就可以获取了。
这里需要强调的是微信的登录获取个人信息,需要300大洋。
**第三步**:签名弄好之后,在你刚才下载签名生成工具那个页面,下载微信的SDK,
然后就是搭建环境了。把下载的SDK里面的jar包复制粘贴到libs目录下面,如果没有这个目录就创建一个,
然后粘贴到目录下面之后,就右键Configure Build Path...至此环境就搭建好了
**第四步**:在你的清单文件中添加相应的权限:
`<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>`
**第五步**:是我认为最重要的一步,请你一个字都不差的看完,我开始也认为我知道,
因为我做过友盟的微信登录分享,也成功了。但是,我还是在这里卡了很久。那就是添加微信写死的一个类WXEntryActivity。首先,你要在你包名的目录下面创建一个包,名字是wxapi,记住,一定要在包名目录下面,
不要再其他目录下面,其他目录下面就错了,我开始就是在其他目录下面创建的,结果他不走resp方法
(后面会说到)一定要在包名目录下面创建wxapi包,我强调了很多遍了,然后在该目录下面创建WXEntryActivity类继承Activity实现IWXAPIEventHandler接口。在后面会给出我的这个类
**第六步**:准备工作已经全部完成了,就可以开始欢乐的敲代码了,我先说一下登录的过程。
先注册,然后向微信发请求,最后操作返回结果。先注册就是先向微信的后台注册你申请的app;
向微信发请求就是你刚才在你手机上面安装的那个helloworld应用,向微信发送请求;
最后操作返回结果,就是操作返回结果(- -!)
1.注册的代码:(随便写在哪里,只要在你发送请求之前注册就可以了,我的写在主页的onCreate方法里面)
String APPID = "wx8a350ba041be9334";
IWXAPI wxapi = WXAPIFactory.createWXAPI(this, APPID, true);
wxapi.registerApp(APPID);
2.向微信发送请求的代码(写在你的点击事件里面就可以了,点击微信按钮发送请求)
public void wxLogin(){
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
wxapi.sendReq(req);
}
3.操作返回结果,前面我们写死了一个类,那个类是微信要求我们这样写的,估计就是他们已经写死的,
我们要实现它的一个借口,里面有一个onResp方法,我们请求回来的数据都在这个方法的参数里面,
我们需要做的就是首先获取code值,然后访问一个连接获取access_token和openid。
最后通过这两个值访问另一个连接获取个人信息。
**第七步**:操作返回结果,大部分公司用微信登录获取的个人信息应该跟我做的是一样的,
都是昵称,头像,性别,access_token和openid。获取这些信息的第一个条件就是获取code。
就是在刚才我说的onResp方法返回的参数里面。
String code = ((SendAuth.Resp) resp).code;
String codeUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret="
+ APP_SECRECT + "&code=" + code + "&grant_type=authorization_code";
然后访问上面那个链接,APP_ID和APP_SECRECT都在你创建应用的信息里面,code刚才就获取到了,
就是普通的访问链接,从返回值里面解析出来access_token和openid。我直接用的xUtils做的,
用过xUtils的小伙伴都知道在onSuccess方法里面返回的参数就是返回信息。这个信息是Json格式的字符串,
我们没法通过键值来获取,然后我用到了Gson把字符串转成Map,然后通过Map的键值对获取access_token
和openid的值。然后就是访问另一个链接了
String userUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid="
+ openId;
同样的思路,这次返回的信息就是个人信息了。然后按照公司的需求获取信息就好了。
这里我给出我自己写的微信让我们写死的类
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
private Context context = WXEntryActivity.this;
private String result;
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String APPID = "XXXXXXX";
api = WXAPIFactory.createWXAPI(this, APPID, false);
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
MainActivity.wxapi.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
String code = ((SendAuth.Resp) resp).code;
String APP_ID = "XXXXXXX";
String APP_SECRECT = "XXXXXXXX";
String codeUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID + "&secret="
+ APP_SECRECT + "&code=" + code + "&grant_type=authorization_code";
HttpUtils utils = new HttpUtils();
utils.send(HttpMethod.POST, codeUrl, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
System.out.println(arg0.result);
Gson gs = new Gson();
Map map = gs.fromJson(arg0.result, Map.class);
final String accessToken = (String) map.get("access_token");
final String openId = (String) map.get("openid");
HttpUtils userUtils = new HttpUtils();
String userUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid="
+ openId;
userUtils.send(HttpMethod.POST, userUrl, new RequestCallBack<String>() {
@Override
public void onFailure(HttpException arg0, String arg1) {
}
@Override
public void onSuccess(ResponseInfo<String> arg0) {
System.out.println(arg0.result);
Gson gs = new Gson();
Map map = gs.fromJson(arg0.result, Map.class);
String nickname = (String) map.get("nickname");
String sex = map.get("sex") + "";
String headimgurl = ((String) map.get("headimgurl")).replace("\\/", "/");
result = "{'nickname':'" + nickname + "','imageUrl':'" + headimgurl + "','gender':'" + sex
+ "','openId':'" + openId + "','accessToken':'" + accessToken + "'}";
System.out.println(result);
Handler handler = null;
WXInter wxLoginInter = new WXInter(context, handler);
wxLoginInter.getInstance().asasasas(result);
}
});
}
});
break;
default:
break;
}
finish();
}
}
至此,微信登录就已经成功了,需要小伙伴们,耐心的看完,你一定做的出来,我做的时候,MD,用了友盟,
全部做出来了,又让我重新用官方的做,我当时内心是崩溃的,也很着急。
但是没办法,领导的任务还是要完成,只要你用心,耐心的看完我这个,你就一定能做出来。