開發中用的是測試號html
微信公衆號認證流程jquery
用戶登錄ajax
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> {% csrf_token %} <input type="text" name="user" placeholder="用戶名"> <input type="password" name="pwd" placeholder="密碼"> <input type="submit" value="登陸"> </form> </body> </html>
{% load staticfiles %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div style="width: 600px;margin: 0 auto"> <h1>請關注路飛學城服務號,並綁定我的用戶(用於之後的消息提醒)</h1> <div> <h3>第一步:關注路飛學城微信服務號</h3> <img style="height: 100px;width: 100px" src="{% static "img/wx.png" %}"> </div> <input type="button" value="下一步【獲取綁定二維碼】" onclick="getBindUserQcode()"> <div> <h3>第二步:綁定我的帳戶</h3> <div id="qrcode" style="width: 250px;height: 250px;background-color: white;margin: 100px auto;"></div> </div> </div> <script src="{% static "js/jquery.min.js" %}"></script> <script src="{% static "js/jquery.qrcode.min.js" %}"></script> <script src="{% static "js/qrcode.js" %}"></script> <script> function getBindUserQcode() { $.ajax({ url: '/bind_qcode/', type: 'GET', success: function (result) { console.log(result); $('#qrcode').empty().qrcode({text: result.data}); } }); } </script> </body> </html>
關注公衆號的數據庫
而後綁定權限django
模板信息的新建json
用戶登陸,api
關注公衆號,刷二維碼或點擊連接(向微信服務器說授予某公衆號應用權限),微信服務器再經過二維碼裏面回調url(綁定時裏面連接或二維碼的重定向url),通知開發服務器,咱們在經過微信服務區通知咱們的url裏面的code,請求獲取用戶的openid(即權限id)而後保存到數據庫。 緩存
import json import functools import requests from django.conf import settings from django.shortcuts import render, redirect, HttpResponse from django.http import JsonResponse from app01 import models # 沙箱環境地質:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login def auth(func): @functools.wraps(func) def inner(request, *args, **kwargs): user_info = request.session.get('user_info') if not user_info: return redirect('/login/') return func(request, *args, **kwargs) return inner def login(request): """ 用戶登陸 :param request: :return: """ # models.UserInfo.objects.create(username='wen',password=123) if request.method == "POST": user = request.POST.get('user') pwd = request.POST.get('pwd') obj = models.UserInfo.objects.filter(username=user, password=pwd).first() if obj: request.session['user_info'] = {'id': obj.id, 'name': obj.username, 'uid': obj.uid} return redirect('/bind/') else: return render(request, 'login.html') @auth def bind(request): """ 用戶登陸後,關注公衆號,並綁定我的微信(用於之後消息推送) :param request: :return: """ return render(request, 'bind.html') @auth def bind_qcode(request): """ 生成二維碼 用戶點擊或掃描用於向微信服務器發送綁定某個微信公衆號的請求(用戶到微信服務器的公衆號處報到) 連接裏面會含有重定向的url,和從微信請求攜帶的code(用於重定向的url再次向微信服務器請求用戶openid) :param request: :return: """ ret = {'code': 1000} try: access_url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid={appid}&redirect_uri={" \ "redirect_uri}&response_type=code&scope=snsapi_userinfo&state={state}#wechat_redirect " access_url = access_url.format( appid=settings.WECHAT_CONFIG["app_id"], redirect_uri=settings.WECHAT_CONFIG["redirect_uri"], state=request.session['user_info']['uid'] ) ret['data'] = access_url except Exception as e: ret['code'] = 1001 ret['msg'] = str(e) return JsonResponse(ret) def callback(request): """ 用戶在手機微信上掃碼後,微信自動調用該方法。 二維碼中含有重定向的url, 用於獲取掃碼用戶的惟一ID,之後用於給他推送消息。 :param request: :return: """ code = request.GET.get("code") #像微信服務器要的code # 用戶UID state = request.GET.get("state") # 獲取該用戶openId(用戶惟一,用於給用戶發送消息) res = requests.get( url="https://api.weixin.qq.com/sns/oauth2/access_token", params={ "appid": settings.WECHAT_CONFIG["app_id"], "secret": settings.WECHAT_CONFIG["appsecret"], "code": code, "grant_type": 'authorization_code', } ).json() # 獲取的到openid表示用戶受權成功 openid = res.get("openid") print("get ",openid) if openid: models.UserInfo.objects.filter(uid=state).update(wx_id=openid) response = "<h1>受權成功 %s </h1>" % openid else: response = "<h1>用戶掃碼以後,手機上的提示</h1>" return HttpResponse(response) def sendmsg(request): def get_access_token(): """ 獲取微信全局接口的憑證(默認有效期倆個小時) 若是不天天請求次數過多, 經過設置緩存便可 """ result = requests.get( url="https://api.weixin.qq.com/cgi-bin/token", params={ "grant_type": "client_credential", "appid": settings.WECHAT_CONFIG['app_id'], "secret": settings.WECHAT_CONFIG['appsecret'], } ).json() if result.get("access_token"): access_token = result.get('access_token') else: access_token = None return access_token access_token = get_access_token() print("---------",request.POST) # user_id = request.get() openid = models.UserInfo.objects.get(id=2).wx_id #獲取用戶id,而不是直接填一個數 print("send msg",openid) # def send_custom_msg(): # body = { # "touser": openid, # "msgtype": "text", # "text": { # "content": '要發送的內容...' # } # } # response = requests.post( # url="https://api.weixin.qq.com/cgi-bin/message/custom/send", # params={ # 'access_token': access_token # }, # data=bytes(json.dumps(body, ensure_ascii=False), encoding='utf-8') # ) # # 這裏可根據回執code進行斷定是否發送成功(也能夠根據code根據錯誤信息) # result = response.json() # return result def send_template_msg(): """ 發送模版消息 """ res = requests.post( url="https://api.weixin.qq.com/cgi-bin/message/template/send", params={ 'access_token': access_token }, json={ "touser": openid, "template_id": settings.WECHAT_CONFIG['template_id'], "data": { "key": { "DATA": "lalal", "color": "#173177" }, "value": { "DATA": "關注本公衆號", "color": "#173177" }, } } ) result = res.json() return result result = send_template_msg() print(result) if result.get('errcode') == 0: return HttpResponse('發送成功') return HttpResponse('發送失敗')