首先是去获取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. C#操作Microsoft.Office.Interop.Word类库完整例子

    使用Microsoft.Office.Interop.Word类库操作wor文档 一.准备工作 首先在工厂中,引用[Microsoft.Office.Interop.Word],本地安装了world, ...

  2. Windows10+Python+Yolov8+ONNX图片缺陷识别,并在原图中标记缺陷,有onnx模型则无需配置,无需训练。

    目录 一.训练自己数据集的YOLOv8模型 1.博主电脑配置 2.深度学习GPU环境配置 3.yolov8深度学习环境准备 4.准备数据集 二.Python+Onnx模型进行图像缺陷检测,并在原图中标 ...

  3. 平稳扩展:可支持RevenueCat每日12亿次API请求的缓存

    平稳扩展:可支持RevenueCat每日12亿次API请求的缓存 目录 平稳扩展:可支持RevenueCat每日12亿次API请求的缓存 低延迟 建立连接池 故障检测 Up and warm 对故障做 ...

  4. 小满OKKICRM与金蝶云星空对接集成客户资料

    小满OKKICRM与金蝶云星空对接集成客户列表查询(更新列表)&客户新增(小满客户对接金蝶客户-P) 数据源平台:小满OKKICRM 小满科技成立于2013年,是阿里巴巴集团战略投资的高新技术 ...

  5. idea配置servlet项目找不到servlet jar包爆红【解决办法】

    1.看你的implements 后面的Servlet是否大写了 2.大部分原因就是缺少servlet-api jar包或者idea找不到jar包 如果你是爆红的,那么问题就在这里,点击-号,重新添加这 ...

  6. Linux下通过AnySetup配置防火墙

    软件 AnySetup 主要功能 主要功能是对Linux操作系统下的基本配置进行管理.多种服务配置进行管理.安全配置进行管理等.如:操作系统的升级管理,软件包的安装.更新和卸载管理,软件仓库源的管理, ...

  7. BI工具:让数据分析井然有序一望而知

    BI(Business Intelligence)工具是一类专门用于数据分析和决策支持的软件工具. 它们能够将企业内部和外部的数据进行整合.处理和可视化,帮助用户从海量数据中获取有价值的见解和洞察,并 ...

  8. Go笔记(3)-3种go语言的键盘输入详解

    go语言的键盘输入详解 go语言中有三种输入函数,分别是: fmt.Scanf() 可以按照指定的格式进行输入 fmt.Scanln() 通过指针将值赋值给变量 fmt.Scan() (1)fmt.S ...

  9. SSPRQ码型设计

    serdes速率超过50G之后,在VSR光模块场景下SSPRQ使用较为广泛.SSPRQ用于PAM4光模块眼图压力,闭合率测试. 但是有很多serdes IP不支持此功能.出于测试需要需要新设计SSPR ...

  10. 吉特日化MES系统&生产工艺控制参数对照表

    吉特日化MES生产工艺参数对照表 工艺编号 PROCE_BASE_TIMER 工艺名称 定时器 工艺说明 主要用于生产工艺步骤过程计时 参数编号 参数名称 参数描述 Prop_Timer_Enable ...