最近写了一个微信公众号的项目,要获取用户详细信息及是否关注公众号,需要调用微信的接口。因为第一次用,所以开始的时候是很懵逼的,后来看了很多遍的文档以及百度了很多的CSDN才弄明白了一点。
微信公众号开发需要服务号才可以,需要企业的认证信息,所以这个一般都是用的公司的公众号,个人是不能注册的.
关于如何调用接口,在开发者文档中已经有详细说明,开发者文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
1.静默授权总结起来就两步:
第一步:静默授权,获取code
第二部:通过code换取网页授权access_token及openid
2.用户授权总结起来三步:
第一:用户授权,获取code
第二:通过code,换取access_token及openid
第三:拉取用户详细信息
开发文档中提到的两种access_token,开始的时候我没搞明白一直以为两种是一样的(请原谅我反应比较慢,虽然文档中已经提到两种不一样,然而我还是没明白到底有啥区别),在开发的过程中总是提示错误,参考了一些CSDN才弄明白是怎么回事。
两种token: 网页授权access_token和普通access_token
1.网页授权access_token:
微信的授权分为两种,一是默认授权,只能获取到openid的信息,一个是用户授权,可以获取到昵称,头像等详细信息.
(1) 用户授权
url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri= {redirect_url&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect'
(2) 默认授权
url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid={APPID}&redirect_uri={redirect_url}&response_type=code&scope=snsapi_base&state=123#wechat_redirect'
以上步骤通过授权,获取code,用code 来换取网页授权的access_token值
获取到code之后,再调用url2接口获取网页授权access_token
url2 = 'https://api.weixin.qq.com/sns/oauth2/access_token?' \
'appid={APPID}&secret={SECRET}&code={CODE}&grant_type=authorization_code'
ps: 在静默授权时,这一步已经获取到access_token,同时也获取到了openID,静默授权到此结束,如果还要获取用户昵称,头像等详细信息,则需要用户授权,还要进行其他操作.
在这里静默授权和用户授权的access_token 都是网页授权token.只是用来换取token的code值获取接口不一样.
2.普通基础access_token:
url='https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={SECRET}'
ps:如果想获取用户关注信息就要用到普通基础access_token,获取到token之后,请求以下接口获取关注信息
redirect_url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token={ACCESS_TOKEN}&openid={OPENID}&lang=zh_CN'
代码示例(python3):
1. 静默授权获取用户openId
在这里,我把静默授权获取用户信息给拆开来写,因为在实际开发中还要考虑到access_token是有时限的,每天获取的次数也是有限的,所以在实际开发中可以将acees_token进行缓存,每次要使用时先从缓存中读取,如果缓存过期,再重新获取.
项目中,我使用的是数据库缓存,把缓存信息存在了数据库中,配置如下:
使用其他的缓存也是可以的,因为我要缓存的信息只有这个token信息,使用这个比较简单.
用到的路由信息
代码中用到的APPID,SECRET,ROOT_URL都是重要信息,所以,我将他们配置在Django 项目的settings.py文件中,在使用的时候调用即可.
2.用户授权获取用户详细信息
调用微信的接口,返回的数据是json格式,在微信文档中有提到返回的具体信息。
u_info中包含用户openID,昵称,头像等信息。
获取到的attention_info中包含是否关注等信息。
到此需要的信息都已经拿到了,再根据你的需求去做处理就可以了。
路由信息
因为要调微信接口,所以开发的时候不太好测试,可以使用微信开发者工具进行调试.
在写项目的时候还遇到一个问题,就是缓存中的access_token没有到过期时间就会失效的问题,后来查了一下资料才知道是我这个公众号还运行其他的项目,也需要用到access_token ,每次获取新access_token的时候,上一次的token会自动失效,所以才导致这个问题,所以在写项目之前要注意你要用到的公众号是否还有其他项目在运行.