微信的第三方登录
最近在做一个项目,需要用到微信的第三方登录,查找了好多的百度资料,但是都没有得到自己想要的答案,经过不断的摸索,总算完成了,鉴于现在的情况,所以就想着要做一个总结,或者说是一个分享,希望更多像我这样的小白能够不断的成长。
微信的第三方登录,涉及到的平台和资源很多,并且它相对于qq、腾讯微博等其他的平台登录来说要更复杂,最根本的还是在于微信的严谨性。好了,废话少说,我们直奔主题了。
对于没接触过的人来说,解决这个问题,首先要在理论上下功夫,要明白微信的第三方登录到底是怎么一回事。记得小时候,大人们常说字典是最好的老师,那么现在我告诉你,度娘才是最好的老师。首先去了解他的话,我认为对于初学者而言,一开始不要去微信公众平台上看文档,因为你根本看不懂,所以我建议去相关论坛上作初步的了解,像 开源社区、CSDN、知乎等平台上一些见解和看法,每个人的风格不一样,每个人掌握的知识不一样,所以那些文章写的深入程度也不同,所以呢,学学汉代董仲舒吧,融汇百家,然后再自成一家,(个人觉得这是比较合适的方法) 看的差不读的时候就可以去微信开放平台作了解了。
其实呢,可能很多人不了解,在现在网络平台这么多的情况下,很多人可能没有听过这样一个平台——mob。http://www.mob.com/#/index 网址就在这儿了。这里面有很贴心的客服,有什么问题可以问,他们会很认真的回答,并且要什么资源,他们也会给你。
以上就是关于开发微信第三方登录的基本准备了。
下面开始了:
首先你应该去微信开放平台注册一个账号。
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN
注册完后,你就可以创建应用了,填写完后,系统会提示你应用创建成功,然后等几天进入审核,审核完后会给你 一个id和密钥,相信做过百度地图的人就知道。很多人可能没有注意到,在我们创建应用的时候,它提示你要填入一个MD5,添加一个签名,这个签名是在我们打包apk的时候生成的。把那个填入进去就行了。值得注意的是,我们生成的MD5是一个不符合微信开放平台上要求的格式,所以要符合就应该改成他要的格式。即:大写字母变成小写的,去掉冒号。还有一个,这个签名我们要时刻警醒,一定要和我们安装在手机上的应用签名保持一致,像我们在eclipse上直接调试安装的,那个签名在微信开放平台上是不被认可的,所以我们应该在打包成apk之后,再调试,这一点,一定要狠注意。很注意!!!!记住!不能忘记。
好了。说完我们要注意的,马上进入我们接下来的,那么我们想要获取微信的第三方登录权限,我们需要什么呢,
1. 认证微信开发者,这里面需要缴纳相关费用,具体的微信开放平台上会有详细的说明,这里不会再累述。一般看来,我们还需要获得微信支付权限,但事实上,我们并不需要微信支付权限,这是我一开始的误区。那么真正来说,我们一般人是不需要这个第三方登录的,所以一般只有企业才会有这个需求,所以,你会发现,在认证的时候,会让你填一些关于企业的信息,这就是里面的原因了。相信看到这里,我们大致的对微信的第三方登录有所了解了,但是我们还不至于进入编码阶段。还记得我在前面提到的mob平台上的攻略吗,说到里面的贴心客服,所以呢,我建议你应该尝试的去跟他们的客服沟通,然后可以跟他要写demo,这个demo还是有要注意的地方,当你解压完之后,看到里面不仅有源码,还有一个apk文件,这个就是我们前面提到的,项目调试会自动生成一个签名,那个是debug签名,这个微信平台上是不认可的,所以贴心的mob平台给你一个已经签名好的apk。你看,这多么贴心。然后你运行后看一些运行的过程,然后再结合源码,相信很快就能实现登录。
2. 这中间有什么不懂,完全可以和客服沟通的。
那么有源码了,是不是就简单的粘贴复制就行了呢,其实不是这样的,拷贝过来的代码,马上能用,但是要实现自己想要的功能,还是要用点心去理解里面的东西。先看看我们的代码:
private void authorize(Platform plat) {
if(plat.isValid()) {
String userId = plat.getDb().getUserId();
if (!TextUtils.isEmpty(userId)) {
UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
login(plat.getName(), userId, null);
return;
}
}
plat.setPlatformActionListener(this);
plat.SSOSetting(true);
plat.showUser(null);
}
public void onComplete(Platform platform, int action,
HashMap<String, Object> res) {
String id,name,description,profile_image_url;
id=res.get("ret").toString();//ID
name=res.get("nickname").toString();//用户名
description=res.get("is_lost").toString();//描述
profile_image_url=res.get("city").toString();//头像链接
String str="ID: "+id+";\n"+
"用户名: "+name+";\n"+
"描述:"+description+";\n"+
"用户头像地址:"+profile_image_url;
System.out.println("用户资料: "+str);
}
public void onError(Platform platform, int action, Throwable t) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_ERROR, this);
}
t.printStackTrace();
}
public void onCancel(Platform platform, int action) {
if (action == Platform.ACTION_USER_INFOR) {
UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this);
}
}
private void login(String plat, String userId, HashMap<String, Object> userInfo) {
Message msg = new Message();
msg.what = MSG_LOGIN;
msg.obj = plat;
UIHandler.sendMessage(msg, this);
}
public boolean handleMessage(Message msg) {
switch(msg.what) {
case MSG_USERID_FOUND: {
Toast.makeText(this, R.string.userid_found, Toast.LENGTH_SHORT).show();
}
break;
case MSG_LOGIN: {
String text = getString(R.string.logining, msg.obj);
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
// Builder builder = new Builder(this);
// builder.setTitle(R.string.if_register_needed);
// builder.setMessage(R.string.after_auth);
// builder.setPositiveButton(R.string.ok, null);
// builder.create().show();
}
break;
case MSG_AUTH_CANCEL: {
Toast.makeText(this, R.string.auth_cancel, Toast.LENGTH_SHORT).show();
System.out.println("-------MSG_AUTH_CANCEL--------");
}
break;
case MSG_AUTH_ERROR: {
Toast.makeText(this, R.string.auth_error, Toast.LENGTH_SHORT).show();
System.out.println("-------MSG_AUTH_ERROR--------");
}
break;
case MSG_AUTH_COMPLETE: {
Toast.makeText(this, R.string.auth_complete, Toast.LENGTH_SHORT).show();
System.out.println("--------MSG_AUTH_COMPLETE-------");
}
break;
}
return false;
}
这其中,你看到这个:
public void onComplete(Platform platform, int action,
HashMap<String, Object> res) {
String id,name,description,profile_image_url;
id=res.get("ret").toString();//ID
name=res.get("nickname").toString();//用户名
description=res.get("is_lost").toString();//描述
profile_image_url=res.get("city").toString();//头像链接
String str="ID: "+id+";\n"+
"用户名: "+name+";\n"+
"描述:"+description+";\n"+
"用户头像地址:"+profile_image_url;
System.out.println("用户资料: "+str);
}
这里看上去好像没什么问题,能不能在里面加上个toast呢?答案是不可以的,为什么呢,这里面涉及到线程,我相信到了这个阶段的人已经不需要再多解释了,耗时的操作应该在子线程里面,涉及到改变UI的操作,也是在子线程里面进行操作,所以你知道这为什么了吧。
又因为微信所返回的数据key值有可能不一样,可能现在我写文档的时候它是这样的一个返回值,几天后可能就变了,所以,我个人还是不提倡死记硬背 ,你可以在获取返回的数据之后,对hasmap进行一个遍历,通过遍历查看到这个返回值,具体怎么去遍历,一句话:问度娘。
以上就是关于微信第三方登录的全部内容,这里可能太过理论,但是作为一个入门的程序员,一定要重视理论的作用,马克思主义哲学就告诉我们,我们要用理论去指导实践,并且在实践中不断更新自己的理论,实现理论的升华。祝菜鸟们早点变成大鸟,成为新一代的国家栋梁