安卓第三方微信登陆及其中的坑

来源:互联网 发布:过程控制软件 编辑:程序博客网 时间:2024/05/21 22:42

       做一个项目使用微信登陆。使用过程中只能吐槽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"}




0 0
原创粉丝点击