首先是去获取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. AB32VG1系列之手把手入门与RTC简单评测

    说是评测, 时间仓库仅仅是玩了一下例程而已. 后面有时间打算移植 CoreMark 看看与Cortex-M3的对比. AB32VG1系列之手把手入门与RTC简单评测

  2. 如何使用C#编写低代码应用插件

    本文由葡萄城技术团队发布.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 作为当今快速发展的技术之一,低代码平台为开发人员提供了更高效.更简便的工具和 ...

  3. 发现AI自我意识:从理解到思维

    广义"理解"已经实现 在最新的人工智能系统中,我们经常可以观察到一种类似"理解"的能力.这种广义的"理解"能力,主要建立在两个基础之上:海量 ...

  4. Video教程的Domain设计

    Domain设计 下面将介绍Video的表设计,和模型定义. 表设计 Videos设计 /// <summary> /// 视频聚合 /// </summary> public ...

  5. 在EXCEL表格中快速自动求和

    在Microsoft Excel中,可以通过多种方式快速自动求和.以下是一种简单但常用的方法: 使用SUM函数 选定求和区域: 在Excel表格中,首先需要选定要进行求和的区域.这可以是一个列.行或者 ...

  6. [gym104542F] Interesting String Problem

    Since you are a good friend of Jaber and Eyad, they are asking for your help to solve this problem. ...

  7. 基于.NetCore开发博客项目 StarBlog - (30) 实现评论系统

    前言 时隔五个月,终于又来更新 StarBlog 系列了~ 这次是呼声很大的评论系统. 由于涉及的代码量比较大,所以本文不会贴出所有代码,只介绍关键逻辑,具体代码请同学们自行查看 GitHub 仓库. ...

  8. LeetCode224:基本计算器(栈)

    解题思路: 1.双栈模拟,一个用来存数,一个用来存操作符.需要考虑 '('后面紧跟'+'.'-'这种情况 2.递归:遇到左括号开始递归,遇到右括号结束递归,返回值. 1 class Solution: ...

  9. DHorse v1.5.0 发布,基于 k8s 的发布平台

    版本说明 新增特性 支持同一机器部署多个DHorse服务: 支持Next..NET应用部署: 优化Node.Nuxt应用构建和部署的性能: 默认使用fabric8客户端与k8s集群交互,可以通过指定参 ...

  10. 部署堡垒机4——CentOS7 编译安装 Python 3.8.12

    1.去python3的官方网站下载源代码 https://www.python.org/downloads/ 下载安装Python 3.8.12到/opt/python3 cd /opt wget h ...