首先是去获取access_token,access_token接口有次数限制,所以保存到缓存,失效时再去调用接口

import base64
import json
import time
import traceback import requests
from django.core.cache import cache
from rest_framework.response import Response
from rest_framework.views import APIView app_id = 'xxxxxxx' # appid
app_secret = 'xxxxxx' # app密钥
msg_key = 'xxxxxx' # 消息模板id
app_token = "xxxxxxx" # apptoken def get_wx_access_token():
"""
获取access_token,保存到缓存
:return:
"""
url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}'.format(app_id, app_secret)
resp = requests.get(url)
# print(resp.json())
access_token = resp.json()['access_token']
cache.set('wx_access_token', access_token, 60*60*2)
# print(access_token)
return access_token def get_ticket(access_token, scene_str=''):
"""
获取ticket
:param access_token:
:param scene_str:
:return:
""" url = 'https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}'.format(access_token)
# print(scene_id)
data = {
"expire_seconds": 604800,
"action_name": "QR_STR_SCENE",
"action_info": {"scene": {'scene_str': scene_str}} # 一定要取字符串,整形有最大值限制
}
resp = requests.post(url, data=json.dumps(data))
# print(resp.json())
ticket = resp.json()['ticket']
return ticket def get_code_img(ticket):
"""
获取二维码,保存位图片
:param ticket:
:return:
"""
url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket
resp = requests.get(url)
# print(resp.content)
img = base64.b64encode(resp.content).decode('ascii')
fileData = base64.urlsafe_b64decode(img.encode('UTF-8'))
with open('thefilename.png', 'wb') as theFile:
theFile.write(fileData)
# print(img)
return img from rest_framework.throttling import AnonRateThrottle # 限制调用次数
class CustomAnonRateThrottle(AnonRateThrottle):
THROTTLE_RATES = {"anon": "5/min"} # 获取二维码
class WxGetCode(APIView):
throttle_classes = [CustomAnonRateThrottle] def get(self, request): # cache.delete('wx_access_token')
# body = request.query_params.dict()
# scene_id = get_json_values('scene_id', body, 1)
scene_str = str(int(time.time()*100000))
# print(scene_str)
access_token = cache.get('wx_access_token') if cache.get('wx_access_token') else get_wx_access_token()
ticket = get_ticket(access_token, scene_str)
# code_img = get_code_img(ticket) code_url = 'https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=' + ticket resp = {'data': code_url, 'sceneStr': scene_str}
return Response(resp)
下面get请求是公众号回调时需要验证token的接口,post请求是扫码完成以后回调的接口
微信回调的是xml形式,需要让django允许解析xml格式参数

import datetime
import hashlib
import time
import traceback import requests
from django.core.cache import cache
from django.http import HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_xml.parsers import XMLParser from wxgetcode import get_wx_access_token, app_token, msg_key class TextXMLParser(XMLParser):
media_type = 'text/xml'
# class weixin(APIView):
parser_classes = (TextXMLParser,) def get(self, request):
# 自己写的授权
# print(request.method)
data = request.GET
# print(data)
signature = data.get("signature")
# print(signature)
if not signature:
return HttpResponse("dasdfafd")
# print("sign", signature)
timestamp = data.get("timestamp")
nonce = data.get("nonce")
echostr = data.get("echostr")
# token 为用户在微信公众平台自定义token
token = app_token
# 将token、timestamp、nonce三个参数进行字典序排序
list = [token, timestamp, nonce]
list.sort()
# 将三个参数字符串拼接成一个字符串进行sha1加密
info = "".join(list)
sha1 = hashlib.sha1()
sha1.update(info.encode())
hashcode = sha1.hexdigest()
# 比对相同就返回 echostr
if hashcode == signature:
return HttpResponse(echostr)
else:
return "" def post(self, request): param = request.query_params.dict()
# print(param)
dic = request.data
# EventKey场景码,获取二维码时返回的sceneStr
EventKey = dic.get('EventKey')
if dic.get('MsgType') == 'event': if dic.get('Event') == 'subscribe':
# print('新用户')
# parse_subscribe(dic) # 新关注用户扫码
access_token = cache.get('wx_access_token') if cache.get(
'wx_access_token') else get_wx_access_token()
open_id = param.get('openid')
# print(access_token)
# print(open_id)
url = f"https://api.weixin.qq.com/cgi-bin/user/info?access_token={access_token}&openid={open_id}&lang=zh_CN"
res = requests.get(url)
# print(res.json())
res = res.json()
unionid = res.get('unionid') # 处理逻辑
pass # 完成登录公众号推送消息
send_wx_msg(access_token, open_id) elif dic.get('Event') == 'SCAN':
# print('老用户')
access_token = cache.get('wx_access_token') if cache.get('wx_access_token') else get_wx_access_token()
open_id = param.get('openid')
# print(access_token)
# print(open_id)
url = f"https://api.weixin.qq.com/cgi-bin/user/info?access_token={access_token}&openid={open_id}&lang=zh_CN"
res = requests.get(url)
# print(res.json())
res = res.json()
unionid = res.get('unionid')
# parse_scan(dic) # 已经关注用户扫码 # 处理逻辑
pass # 完成登录公众号推送消息
send_wx_msg(access_token, open_id) resp = 'success'
return HttpResponse(resp) def send_wx_msg(ACCESS_TOKEN, openid):
"""
消息推送,根据消息模板的定义传值即可
:param ACCESS_TOKEN:
:param openid:
:return:
"""
url = f'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={ACCESS_TOKEN}'
data = {
"touser": openid,
"template_id": msg_key,
"url": "http://weixin.qq.com/download",
"topcolor": "#FF0000",
"data": {
'character_string3': {'value': 'xxxxxxx', "color": "#173177"},
'thing2': {'value': 'xxx', "color":"#173177"},
'keyword2': {'value': 'ssss', "color": "#173177"},
'time4': {'value': datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "color": "#173177"}, 'keyword5': {'value': 'ssss', "color": "#173177"}, }
}
res = requests.post(url, json=data)
# print(res.json())


django实现微信公众号扫码登录的更多相关文章

  1. 微信公众号 扫码支付 模式二 demo

    扫码支付 本文附有代码,在下方,如果不熟悉场景的可以看看下面的场景介绍 场景介绍 官网介绍地址:https://pay.weixin.qq.com/wiki/doc/api/native.php?ch ...

  2. Django实现微信公众号简单自动回复

    在上篇博客阿里云部署django实现公网访问已经实现了了django在阿里云上的部署,接下来记录django实现微信公众号简单回复的开发过程,以方便日后查看 内容概要: (1)微信公众号声请 (2)微 ...

  3. 微信小程序与微信公众号同一用户登录问题

    微信小程序与微信公众号同一用户登录问题 最近在做微信小程序与微信公众号登录合并的接口.整理相关资料以及个人认识的心得写了这篇文章与大家一起分享. 首先,简单说下我遇到的问题是我们的程序调用微信小程序得 ...

  4. .Net 调用微信公众号扫一扫

    1.绑定域名 去微信公众号平台中设置js接口安全域名,要注意的是不填写http://, 只填写域名即可,如 www.baidu.com. 一个月只能修改三次,要谨慎填写. 2.引入JS文件 在页面中引 ...

  5. 微信公众号 H5授权登录

    首先微信公众号 必须是服务号,订阅号没有 "网页授权获取用户基本信息" 没有这个权限.服务号也必须认证后才有这个权限

  6. 微信公众号网页授权登录--JAVA

    网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的.现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你. 请看流程图!看懂图,就懂了一半了: 其实整体流程大体只需三步:用户点 ...

  7. asp.net 微信公众号源码

    需要源码,请加QQ:858-048-581 功能菜单 该源码功能十分的全面,具体介绍如下:1.菜单回复:微信自定义回复.关注时回复.默认回复.文本回复.图文回复.语音回复. 请求回复记录.LBS位置回 ...

  8. 微信支付-微信公众号支付,微信H5支付,微信APP支付,微信扫码支付

    在支付前,如果使用第三方MVC框架,则使用重写模式,服务器也需要配置该项 if (!-e $request_filename){ rewrite ^/(.*)$ /index.php/$ last; ...

  9. Java 扫描微信公众号二维码,关注并自动登录网站

    https://blog.csdn.net/qq_42851002/article/details/81327770 场景:用户扫描微信公众号的二维码,关注后自动登录网站,若已关注则直接登录. 逻辑: ...

  10. Django+wechatpy接入微信公众平台以及授权登录

    确定Django环境可以正常运行,环境搭建见:Linux 搭建Nginx+uwsgi+Django环境 安装 wechatpy[cryptography] sudo pip3 install wech ...

随机推荐

  1. re1-100

    虽然关键的判断函数和"成功"的提示也在这里,但是具体对输入flag的操作却在后面 看到对数组bufParentRead[1]开始赋值"53fc275d81",b ...

  2. Net 高级调试之八:代码审查及杂项命令

    一.简介 今天是<Net 高级调试>的第八篇文章.这篇文章设计的内容挺多的,比如:如何查看方法的汇编代码,如何获取方法的描述符,对象同步块的转储,对象方法表的转储,托管堆和垃圾回收器信息的 ...

  3. 6k Star!B站、滴滴、小红书都在用的网站防火墙

    你有网站么?你担心网站被黑客攻击么?你知道如何抵御来自黑客的攻击吗? 据称互联网上有 30% 的流量都来自于恶意攻击.做过 Web 开发或者有过建站经验的朋友对 SQL 注入.CC 攻击.XSS.We ...

  4. MySQL-安全更新参数

    版权声明:原创作品,谢绝转载!否则将追究法律责任. ----- 作者:kirin 注意! 生产环境中,updata必须要加where条件 1.开启安全功能,会提示你加where,不加会提示语法不正确. ...

  5. 【Android】【外包杯】后台管理系统 | 进度day01

    外包杯官方提示:平台不要太大,只是一些小东西包括支付宝和微信小程序打开,无需安装口香糖,餐巾纸有一块屏幕,不需要很大,只需要满足顾客可以看到传播的内容打开橱窗不要有锋利边角,不要求一体,提高场景利用率 ...

  6. MarkdownPad 文件访问权限受限导致软件打开后不久闪退解决方法

    近几天发现MarkdownPad有一些小问题,打开时会弹出以下报错信息,告诉你打开文件的权限不够 解决方法如下: 1.复制报错信息中的文件路径"Access to the path 'C:\ ...

  7. 【UniApp】-uni-app-内置组件

    前言 好,经过上个章节的介绍完毕之后,了解了一下 uni-app-全局数据和局部数据 那么了解完了uni-app-全局数据和局部数据之后,这篇文章来给大家介绍一下 UniApp 中内置组件 首先不管三 ...

  8. [ARC161F] Everywhere is Sparser than Whole (Judge)

    Problem Statement We define the density of a non-empty simple undirected graph as $\displaystyle\fra ...

  9. IoC入门案例

    1.管理什么?(Service和Dao) 2.如何将被管理的对象告知IoC容器?(配置) 3.被管理的对象交给IoC容器,如何获取IoC容器?(接口) 4.IoC容器得到后,如何从容器中获取到bean ...

  10. 【Linux API 揭秘】container_of函数详解

    [Linux API 揭秘]container_of函数详解 Linux Version:6.6 Author:Donge Github:linux-api-insides 1.container_o ...