原文連接html
對於基礎的微信公衆號開發,網頁受權,JSSDK,圖片處理應該是最重要的三部分了
根本上也是按照文檔開發,技術含量並不高。
(選Django=不少權限控制模塊已經作好了,比較省力)python
在開始以前極力推薦內網穿透的各類工具,能夠實時調試公衆號
推薦本身搭建,能夠自定義域名,傳輸也放心
https://github.com/inconshreveable/ngrok
https://github.com/fatedier/frp
不想手動實現所有的能夠參考 WeRoBot
一開始就打算用這個,省力一下,不過它也有部分接口沒有實現
改着改着,致使到最後。。。。不經意地本身實現了'小封裝'
不過只用一些基礎接口仍是直接用框架比較方便git
網頁受權,直接摘抄官方文檔:github
# 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_token code = 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
這裏我直接在公衆號菜單部分設置了引導url
這裏設置成base受權,是由於在代碼裏添加了認證部分
用戶第一次認證後咱們就能保存用戶基本信息了,下一次就不必在進行userinfo受權了
並且靜默受權用戶體驗也更好點
{ "type": "view", "name": "申請活動", "url": wechat_get_code+'snsapi_base#wechat_redirect', "key": "test_4" }
如文檔所說,在獲取code以後直接請求換取咱們須要的access_tokenweb
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是一個明智的選擇
具體的緩存下面會提到redis
換取access_token的同時微信會返回一個refresh_token
用於對access_token的刷新,不過個人代碼中沒有采用
而是直接採起了從新受權數據庫
在第一次受權的時候咱們檢測數據庫中是否有此用戶的認證記錄
若是沒有則跳轉引導用戶進行userinfo受權
其中咱們須要注意的是這裏微信服務器返回的數據沒有指明數據編碼類型致使直接讀取會出現亂碼
咱們能夠指定response編碼進行轉碼
具體解釋推薦這個帖子https://www.v2ex.com/t/172276django
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的方式json
此處採用Redis的方式
首先Django的settings.py引入緩存配置api
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)
這裏獲取根目錄.env文件的各類配置
能夠針對部分祕密token,app_id進行單獨配置
由此創建虛擬環境推薦工具Pipenv而不是經常使用的virtualenv等~默認支持.env的導入