做一个项目使用微信登陆。使用过程中只能吐槽BAT三大公司的服务还是阿里做的最好,不管是文档说明还是客服服务。微信登陆中的坑真是太多了。为避免以后再走同样的坑和其他人采坑,分享一下过程。
首先在 https://open.weixin.qq.com 申请 账号,然后在管理中心创建申请应用。打一个签名的申请的app包,
然后下载签名生成工具 :
通过签名生成工具把读取到的签名 填到应用签名里面以及填写包名。还有一个坑爹的地方 如果申请的应用名称叫Test,而以前别人也申请过的其他应用也叫Test,那么你就不能申请了,为什么不是通过包名去判断是不是以前使用过,应用名称太容易重复了。如果你申请的时候把应用名称改成test1,应用名称依然test,那么微信第三方登录的时候显示的就是 test1 了
然后提交审核。
下面操作都是审核通过后才会才能使用登陆,以前好像使用微信登陆免费,现在也开始一年300的收费费用了,更坑爹了,连免费服务都没了。
下载微信登陆分享 Jar 包。
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&lang=zh_CN
导入Jar包。
在启动页进行 微信注册
public static IWXAPI api;
private void regToWx() {
api = WXAPIFactory.createWXAPI(this, WXAPPID, true);
api.registerApp(WXAPPID);
}
WXAPPID 为 申请审核通过后的 APPID。
在登陆的时候使用 SendAuth.Req,即点击微信登陆调用下面代码
final SendAuth.Req req = new SendAuth.Req();
//授权读取用户信息
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);
注意 req.scope = "snsapi_userinfo"; snsapi_userinfo 需要使用这个值, 获取微信用户信息范围,不能乱写,不然会出现 scope参数错误或没有scope权限 错误。
这个网络请求回调的结果在 微信规定的 WXEntryActivity 里。
代码如下
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityLogin.api.handleIntent(getIntent(), this);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
if(baseResp instanceof SendAuth.Resp){
SendAuth.Resp newResp = (SendAuth.Resp) baseResp;
//获取微信传回的code
String code = newResp.code;
}
}
}
这个需要注意 WXEntryActivity 的位置。需要在申请的包名的路径下。如包名为com.apptest.wxapi 还得有 wxapi 这个包名路径
而我今天遇到的问题是这样的,申请的微信登陆还没审核通过,于是就使用了以前申请的 微信登陆APPID,APPSECRET的,然后在gradle中把包名改成了以前使用 的包名,同时签名也是用了以前的APP的签名key,微信登陆一切正常,但点击 《确认登陆》之后 在 WXEntryActivity 一直没有回调,以为少什么配置,就一直找官方说明,但是怎么找都没找到原因,最后发现是 gradle 中的包名 和 Manifest 中的包名不一样,然后 那个定义好的 WXEntryActivity 就接收不到 登陆授权之后的回调了,真是坑。 也就是在 Manifest中假如 WXEntryActivity 包名为 com.testapp1.wxapi 而 以前申请通过的 微信登陆的包名 为 com.testapp2, 那么com.testapp1.wxapi下的的包名 WXEntryActivity 是得不到 登陆分享回调的,在Manifest中 WXEntryActivity 的包名路径也得为 com.testapp2.wxapi。
登陆之后通过得到的code 再获取access_token,链接格式如下
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
成功时得到如下格式数据:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid":"o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
再获取用户基本信息,请求接口格式如下:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
成功时返回信息:
{
"openid":"OPENID",
"nickname":"NICKNAME",
"sex":1,
"province":"PROVINCE",
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
"privilege":[
"PRIVILEGE1",
"PRIVILEGE2"
],
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
}