由于业务需要,近期在做微信公众号开发,其中一个模块是微信用户点击个人中心访问可以得到次微信用户的头像昵称国家省份等基本信息。
但由于业务需求,这块功能暂时用不上了,但这功能的实现毕竟是自己花费几天时间搞出来的,觉得以后会用的上,暂且记录一下实现过程。
首先:获取用户信息的过程属于微信网页授权登陆,再做这一块之前请先阅读微信开发文档以熟悉基本的开发过程:
https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
微信开发文档开头讲的授权基本配置,两张授权方式,access_token的区别这里就不多说了,文档说的很清楚,下面就直接记录一下开发的过程:
为了使过程清晰,结合着文档给出的开发步骤按照自己开发的方式一步步说,首先文档给的开发步骤:
第一步:肯定是先获取code了,要获取code,官网给出了获取code的链接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect;我这里是直接复制过来的,当然为了避免出错,建议还是直接复制过来好,然后替换上相应的参数
官网上给出的有相应的参数说明:
然后在链接上依次替换上:
appid在公众微信号平台上可以看的到的,这个不多说;
redirect_uri授权后重定向的回调链接地址, 请使用 urlEncode 对链接进行处理,哪就定义一个对链接进行urlEncode处理的方法:
在通用工具类里面写一个方法对链接进行编码:
注意引入相应的jar包,这个方法里面的参数就是要转码的链接;
response_type:返回类型 就填code就可以了;
scope:应用授权作用域,如果仅仅需要获取关注用户的openid 哪这个可以填:snsapi_base ;如果需要获取用户的其他信息,就填写:snsapi_userinfo
state:可以不用改写;
wechat_redirect:带在后面就可以了。
这里说一下关于链接跳转的:
有一种是这样的:http://www.jb51.net/article/99465.htm
但是我是将链接的url直接作为微信自定义菜单中view类型中的url:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=此处填写你的appid&redirect_uri=此处添加你要重定向的地址(要经过urlEncode编码过的)&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect
我用这种是成功的了,原因只是不想跳太多的方法,所以我自己是这样写的。
下面继续说通过上面方法获取到code以后的做法,直接上图了:
说明:
1:上一部链接中需要重定向的路径;
2:此时重定向过来的路径已经带有code了,此步骤是获取到链接带过来的code参数(请注意code参数只能使用一次而且有效时间很短,5分钟未被使用便会过期需要重新获取。)
3:先说一下为什么要这么写。如果我不用这个if语句直接获取code然后一步步获取access_token,openid,用户信息等这样固然是可以的,但是在微信公众号中打开链接获取到用户信息后在此页面刷新或报错,就是code已经被使用这个错误
前面说过code只能被使用一次,为了解决这个问题,我网上没有查到具体的解决方案,而且时间不够,只能自己想想写了一个就是先判断缓存中有没有网页授权access_token如果有则证明code已经被使用过了,刷新的时候直接用缓存中的;
同理,如果没有择证明是第一次网页授权,就是接下来的if(weixinOauth2Token == null) 里面的方法了;这里是我自己想到的一个办法,至于可行性我自己用的时候没有出现什么错误,但是没有经过成百上千次的测试,所以仅供参考使用。
4:你的公众微信号中的appid;
5:你的公众微信号中的appsecret;
6:2,4.5都是6的参数,是为了获取网页授权凭证,用到的请求链接微信公众号文档给的有:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
实现的方法为:在封装的AdvancedUtil中实现获取网页授权凭证,还是直接上图:
这是第6步的方法实现;
7:这个是把网页授权的access_token等信息存入到session中;
8:是为了防止access_token实现刷新用的,有需要的时候用,方法大致和获取的相同。
9:是刷新access_token的方法;具体有没有刷新,这个因为时间问题我也没有经过多次的测试,至少现在我用的时候没有出现什么异常,仅供参考。
10:获取网页授权凭证接口的access_token;
11:获取用户的openId;
12:就是获取用户的基本信息了,在这之前需要先定义一个用户基本信息实体类SNSUserInfo:
写上相应的get,set方法;然后是获取用户基本信息的方法getSNSUserInfo:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
然后是具体实现:
13:是需要跳转的页面路径:
这些就是获取用户信息的基本步骤,都是个人总结,仅供参考,此处写一下方便以后用到。
然后是页面上调用。
等到测试完成再次总结。先写到这里记录一下,开始工作写新的内容了!
此外:对于刚接触微信公众号开发的同学我可以推荐一个学习:http://www.cnblogs.com/liuhongfeng/p/4846260.html
原文地址:https://www.cnblogs.com/ka-bu-qi-nuo/p/8715854.html