原文链接

对于基础的微信公众号开发,网页授权,JSSDK,图片处理应该是最重要的三部分了
根本上也是按照文档开发,技术含量并不高。

(选Django=很多权限控制模块已经做好了,比较省力)

在开始之前极力推荐内网穿透的各种工具,可以实时调试公众号
推荐自己搭建,可以自定义域名,传输也放心
https://github.com/inconshreveable/ngrok
https://github.com/fatedier/frp

不想手动实现全部的可以参考 WeRoBot
一开始就打算用这个,省力一下,不过它也有部分接口没有实现
改着改着,导致到最后。。。。不经意地自己实现了'小封装'
不过只用一些基础接口还是直接用框架比较方便

网页授权,直接摘抄官方文档:

  • 第一步:用户同意授权,获取code
  • 第二步:通过code换取网页授权access_token
  • 第三步:刷新access_token(如果需要)
  • 第四步:拉取用户信息(需scope为 snsapi_userinfo)
  • 附:检验授权凭证(access_token)是否有效
# xgc.wechat.py部分token=os.environ.get('TOKEN') # 文末会提到
app_id=os.environ.get('APP_ID')
app_secret=os.environ.get('APP_SECRET')
redirect_url = os.environ.get('REDIRECT_URL')
state = os.environ.get('STATE')
#网页授权部分
web_get_code = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&state=%s&scope='%(app_id,redirect_url,state)
web_get_fan_info = 'https://api.weixin.qq.com/sns/userinfo?access_token='
web_check_access_token = 'https://api.weixin.qq.com/sns/auth?access_token='
web_get_access_token = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&grant_type=authorization_code&code='%(app_id,app_secret)# views.py部分class web_authorization(View):def get(self, request):from xgc.wechat import web_get_code, web_get_fan_info,web_get_access_token,web_check_access_tokencode = request.GET.get("code", "")if not code:return HttpResponse("非法访问")requests_web_get_access_token_result = requests.get(web_get_access_token+code).json()if 'errmsg' in requests_web_get_access_token_result.keys():return HttpResponseRedirect(web_get_code+'snsapi_base#wechat_redirect')if cache.has_key('web_access_token'):web_access_token = cache.get('web_access_token')else:web_access_token = requests_web_get_access_token_result['access_token']cache.set('web_access_token',web_access_token,110*60) #下面会有说明fan_openid = requests_web_get_access_token_result['openid']# 这部分检验对于缓存来说是多余的,但是你如果担心缓存出问题,可以再次检验一波# check_access_token = requests.get(web_check_access_token+'%s&openid=%s'%(web_access_token,fan_openid)).json()# if check_access_token['errcode']!=0:#     return HttpResponseRedirect(web_get_code+'snsapi_base#wechat_redirect')scope = requests_web_get_access_token_result["scope"]if scope == "snsapi_userinfo":fan_info = requests.get(web_get_fan_info+'%s&openid=%s&lang=zh_CN' % (web_access_token, fan_openid))fan_info.encoding = 'utf-8'fan_info = fan_info.json()FansProfile.create_fan(fan_info)check_openid = FansProfile.objects.filter(openid=fan_openid).first()if not check_openid:return render(request, 'register.html', {'url': web_get_code+'snsapi_userinfo#wechat_redirect','header':'认证提示','text':'你还未进行信息认证,请进行第一次认证'})response = HttpResponseRedirect('index')response.set_cookie('fanid',check_openid.id,3600)return response

code

这里我直接在公众号菜单部分设置了引导url
这里设置成base授权,是因为在代码里添加了认证部分
用户第一次认证后我们就能保存用户基本信息了,下一次就没必要在进行userinfo授权了
而且静默授权用户体验也更好点

{"type": "view","name": "申请活动","url": wechat_get_code+'snsapi_base#wechat_redirect',"key": "test_4"
}

access_token

如文档所说,在获取code之后直接请求换取我们需要的access_token

if cache.has_key('web_access_token'):web_access_token = cache.get('web_access_token')
else:web_access_token = requests_web_get_access_token_result['access_token']cache.set('web_access_token',web_access_token,110*60)

代码中采用了缓存策略,微信中很多token是有请求次数限制的
而且都有一段失效期,缓存token是一个明智的选择
具体的缓存下面会提到

refresh_token

换取access_token的同时微信会返回一个refresh_token
用于对access_token的刷新,不过我的代码中没有采用
而是直接采取了重新授权

snsapi_userinfo

在第一次授权的时候我们检测数据库中是否有此用户的认证记录
如果没有则跳转引导用户进行userinfo授权

其中我们需要注意的是这里微信服务器返回的数据没有指明数据编码类型导致直接读取会出现乱码
我们可以指定response编码进行转码
具体解释推荐这个帖子https://www.v2ex.com/t/172276

if scope == "snsapi_userinfo":fan_info = requests.get(web_get_fan_info+'%s&openid=%s&lang=zh_CN' % (web_access_token, fan_openid))fan_info.encoding = 'utf-8'fan_info = fan_info.json()FansProfile.create_fan(fan_info)

PS:set_cookie是因为我没有把粉丝的模型继承Django的user模型
不能使用自身的auth模块,后期提交表单,上传图片又需要知道是谁上传的
就采用记录用户id到cookie的方式

关于缓存

此处采用Redis的方式
首先Django的settings.py引入缓存配置

CACHES = {'default': {'BACKEND': 'django_redis.cache.RedisCache', #本地文件缓存'LOCATION': '127.0.0.1:6379','TIMEOUT': 600,'OPTIONS': {"CLIENT_CLASS": "django_redis.client.DefaultClient","IGNORE_EXCEPTIONS": True,}}
}

然后我们就可以通过引入from django.core.cache import cache模块
进行一些基本的操作,比如下面

# 设置web_access_token键值
# 有效期110*60s,即110min
cache.set('web_access_token',web_access_token,110*60)

官方文档

os.environ.get('')

这里获取根目录.env文件的各种配置
可以针对部分秘密token,app_id进行单独配置

由此建立虚拟环境推荐工具Pipenv
而不是常用的virtualenv等~
默认支持.env的导入

微信公众号开发Django-网页授权相关推荐

  1. ASP.NET MVC4 微信公众号开发之网页授权(一):搭建基础环境

    首先你得注册并认证一个个人或企业的微信公众号===服务号从而确保获得以下接口权限: 然后打开公众号设置里的功能设置里找到业务域名和网页授权域名分别填上你的域名(注:已备案的域名),如下图所示: 到这里 ...

  2. Java微信公众号开发之网页授权获取用户基本信息

    本篇博客讲解的网页授权只需要前端传递一个backUrl(回调地址) 到后台接口,后台接口会完成整个授权流程,无需前端做更多工作: 一. 前言 微信公众号开发,需要用到网页授权获取用户信息,通过OAut ...

  3. 微信公众号开发系列-网页授权获取用户基本信息

    OAuth2.0网页授权这个也是在做微信公众平台用到最多的,可以利用授权接口对自己平台内用户进行绑定,实现用户扫描码和微信分享.微信签到.微信商城购物等: 1.高级接口OAuth2.0网页授权设置 a ...

  4. 公众号h5获取手机号权限_微信公众号开发之网页授权(获取用户信息)

    这次暑假留在学校参与工作室的项目,对微信公众号比较感兴趣,所以参与这方面的学习研究. 昨天完成了关于网页授权,获取用户信息方面的功能,所以乘热打铁,写上一篇.实现本篇涉及的 功能,还需要完成一些基础. ...

  5. 微信公众号开发之网页授权认证获取用户的详细信息,实现自动登陆

    原创声明:本文转来源本人另一博客[http://blog.csdn.net/liaohaojian/article/details/70175835]绝非他人处转载 从接触公众号到现在,开发维护了2个 ...

  6. 微信公众号开发(网页授权)

    关于网页授权的两种scope(域)的区别说明* 1.以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的.用户感知的就是直接 ...

  7. php微信公众号开发之网页授权

    一.用户同意授权,获取code https://open.weixin.qq.com/connect/oauth2/authorize?appid=公众号appid&redirect_uri= ...

  8. 微信公众号开发1-微信授权登录

    说在前面的话 关于微信公众号的项目也已经告落一段时间了,但是项目结束后又有参加了新的项目,导致一直没有时间分享项目经验,今天正好得空来分享一下本项目,本项目主要用到了微信公众号开发,百度地图api等, ...

  9. 微信公众号开发Django 图片处理

    title: 微信公众号开发Django-图片处理 date: 2018-06-21 17:03:39 tags: [微信公众号,Django] 微信公众号开发,图片处理部分 上篇文章已经获取了wx的 ...

最新文章

  1. 局域网伪造源地址DDoS***解决方法
  2. 腾讯十年老兵:区块链本质上是一个异地多活的分布式数据库
  3. [HOW TO]-下载android官方源码
  4. 使用net start mysql命令后出现“MySQL 服务正在启动 . MySQL 服务无法启动。 服务没有报告任何错误。”问题的解决办法
  5. form中action属性后面?传递参数 获取不到
  6. 进程(并发,并行) join start 进程池 (同步异步)
  7. 二陈丸配什么吃不上火_宝妈一个人带孩子是什么感觉?前三种场景,不知道是怎么熬过来的...
  8. 本地项目怎么推送到码云_【重谈npm】当下载一个项目到本地执行npm install报错时应该怎么办...
  9. delphi webbrowser 对象不支持_建模初学者,那些你可能还不知道的10个ZBrush小技巧!【值得收藏】...
  10. JS:The Definitive Guide JavaScript 和 XML
  11. 不定期更新的IDEA功能整理
  12. 【转】SQL server 2000 各种版本
  13. 时间和日期的JS库Moment.js常见用法总结
  14. java拷贝字符文件
  15. 大学计算机基础vfp程序设计课程试验报告簿,vfp实验报告2014.doc
  16. UVA 12307 Smallest Enclosing Rectangle(旋转卡壳)
  17. shopnc linux im安装教程,shopnc编译安装IM服务器node.js
  18. @csrf_exempt 类的视图跨域
  19. Linux 添加一块新硬盘
  20. Exsel 设置固定表头

热门文章

  1. 挨踢项目求生法则-战略篇
  2. shell脚本的执行方式及区别
  3. TurboMail荣获2010年度优秀电子邮件产品殊荣
  4. linux 下的 rsync 文件同步
  5. GnuPG如何安全地分发私钥(1)GnuPG的用法
  6. 学习Mongodb(一)
  7. VS2005 / windows sdk7.1配置
  8. sqlite3里类似top的用法
  9. profile asp.net technology membership
  10. mysql left join 慢 的一个原因