Django+微信公众号开发小项目

        最近搞了点事情,因为web.py对微信公众号开发时不方便扩展和复用,使用Django开发微信公众号。使用celery推送模板消息到用户微信上,最终方便以后重复利用和功能增加。

01 准备

  • python3环境

  • 微信公众号

  • 可用域名

  • Mysql数据库

  • redis数据库

02 公众号配置

        管理员在微信公众号中的基本配置中需要获取开发者 AppID 和 AppSecret 两个值,并保存下来。

获取 AppSecret 的值后,会出现IP白名单。

图片

管理员设置IP白名单,在调用access_token接口的时候起到保护作用。

图片

管理员设置服务器配置。

图片

此时不用点击提交按钮,因为我们还没有开发响应的web监听服务。

03 开发

创建虚拟环境

python3 -m venv venv# 激活虚拟环境
source ./venv/bin/activate

创建app应用

python manager.py startapp userInfo

settings.py注册应用

INSTALLED_APPS = [...,'userInfo',
]

配置访问路由

# 修改template_message/template_message/urls.pyfrom django.urls import path, includeurlpatterns = [# path('admin/', admin.site.urls),path("template/", include('userInfo.urls'))
]

在userInfo应用中创建urls.py文件,并配置视图函数。

from django.conf.urls import url
from . import viewsurlpatterns = [url("message/$", views.Message.as_view(), name='message'),
]

编辑views.py文件进行微信公众号后台服务对接

对接之前,先安装wechatpy、djangorestframework

pip install wechatpy[cryptography]
pip install djangorestframework

修改settings.py

INSTALLED_APPS = [...,'rest-framework',
]

参考:

wechatpy使用文档:
http://docs.wechatpy.org/zh_CN/stable/index.html

微信公众号文档:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html

3.1用户信息获取

from rest_framework.views import APIView
from wechatpy.utils import check_signature
from wechatpy import parse_message, create_reply
from wechatpy.exceptions import InvalidSignatureExceptionclass Message(APIView):def get(self, request):signature = request.GET.get('signature', '')timestamp = request.GET.get('timestamp', '')nonce = request.GET.get('nonce', '')echostr = request.GET.get('echostr', '')token = wx_config.get("token")try:check_signature(token, signature, timestamp, nonce)except InvalidSignatureException:echostr = '错误的请求'response = HttpResponse(echostr)return responsedef post(self, request):msg = parse_message(request.body)wel_msg = "欢迎关注微信公众号:程序员9527"openid = msg.source  # 获取用户openidif msg.type == 'text':reply = create_reply(content, msg)elif msg.type == 'image':reply = create_reply(content, msg)elif msg.type == 'voice':reply = create_reply(content, msg)else:reply = create_reply(content, msg)if hasattr(msg, 'event') and msg.event == "subscribe":print("用户关注", openid)elif hasattr(msg, 'event') and msg.event == 'unsubscribe':print("取消关注", openid)response = HttpResponse(reply.render(), content_type="application/xml")return response

根据微信公众号文档的实例代码,对微信服务器推送的消息进行验证并返回。

from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureExceptiontry:check_signature(token, signature, timestamp, nonce)
except InvalidSignatureException:# 处理异常情况或忽略

解析微信服务器推送过来的xml

from wechatpy import parse_message
msg = parse_message(xml)

公共属性

namevalue
id消息 id, 64 位整型。
source消息的来源用户,即发送消息的用户。
target消息的目标用户。
create_time消息的发送时间,UNIX 时间戳
type消息的类型

成功启动微信公众号后台后配置access_token接口

在userInfo/urls.py中配置路由

from django.conf.urls import url
from . import viewsurlpatterns = [url("message/$", views.Message.as_view(), name='message'),url("access/token/$", views.AccessToken.as_view(), name='token'),
]
pip install redis

在项目的根目录下创建config.ini配置文件

[wechat]
token = 公众号token
appid = 公众号AppID
appsecret = 公众号AppSecret
token_exp = access_toke过期时间
token_url = access_token的访问地址

3.2 获取access_token

view.py

import redis
import requests
import configparserr = redis.Redis(host='localhost', port=6379, db=1, decode_responses=True)  # 创建redis对象
config = configparser.ConfigParser()
config.read(settings.WECHAT, encoding="utf-8")
wx_config = config.items("wechat")
wx_config = dict(map(lambda x: [x[0], x[1]], wx_config))
wx_config.update({"token_exp": int(wx_config.get("token_exp"))})class AccessToken(APIView):def get(self, request):access_token = r.get("access_token")  # 从redis中获取ACCESS_TOKENifnot access_token:appid = wx_config.get("appid")appsecret = wx_config.get("appsecret")token_api = wx_config.get("token_api")exp = wx_config.get("token_exp")api = token_api.format(appid=appid, secret=appsecret)response = requests.get(api, headers=settings.HEADER).json()access_token = response.get("access_token")r.setex('access_token', exp, access_token)return JsonResponse({"code": 1, "token": access_token})

使用redis缓存access_token,避免每次都调用公众号接口,详情请看接口权限

图片

调用接口,验证是否能获得access_token

图片

3.3模板消息

配置

在公众号中配置要发送的消息模板

图片

配置好模板ID以后,接下来使用celery进行任务执行。

pip install celery

创建celery_tasks包文件,配置相关celery信息

celery_tasks/main.py文件

from celery import Celerycelery_app = Celery('wechat_template')# 导入配置文件
celery_app.config_from_object('celery_tasks.config')# 自动注册celery任务
celery_app.autodiscover_tasks(['celery_tasks.sends'])

celery_tasks/config.py

broker_url = "redis://127.0.0.1/9"
result_backend = "redis://127.0.0.1/10"

创建celery_tasks/sends包,新建tasks.py

# -*-coding=utf-8 -*-
import json
import time
import requests
from celery_tasks.logs import Logger
from celery_tasks.main import celery_apptoken_url = "你自己的access_token"
# 模板消息api
model_url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={access_token}'def request_model(temp_dict):"""发送模板消息网络请求"""if temp_dict:token_str = requests.get(token_url).json()access_token = token_str.get('token')model_urlsend_url = model_url.format(access_token=access_token)try:for _ in range(3):response = requests.post(send_url, json=temp_dict)res_dict = json.loads(response.text)if res_dict.get('errcode') == 0:returnTrueelse:msg = '发送模板id:' + temp_dict.get("template_id") + "发送出错,错误信息为" + str(res_dict) + '\n'with open('msg.log', 'a+', encoding="utf-8") as f:f.write(msg)time.sleep(1)except Exception as e:log.logger.info(temp_dict.get("template_id") + "发送出错,错误信息为:" + str(e))return str(e)@celery_app.task(name='send_server_sign')
def send_server_sign(openid=None, temp_id=None, **kwargs):"""签约提醒"""temp_dict = {"touser": openid,"template_id": temp_id,"data": {"first": {"value": '尊敬的客户,您已成功购买我司产品!',"color": "#FF0000"},"keyword1": {"value": kwargs.get("name"),"color": "#FF0000"},"keyword2": {"value": "{}至{}".format(kwargs.get("start_time"), kwargs.get("end_time")),"color": "#000000"},"remark": {"value":  "如您有任何疑问或咨询,请联系我司客服人员。","color": "#000000"}}}status = request_model(temp_dict)return status

启动celery命令

celery multi start worker -A celery_tasks.main -l info --pool=gevent --concurrency=60 --logfile=celery.log

celery停止

celery multi stop worker -A celery_tasks.main -l info

views.py

from django.conf import settings
from rest_framework.views import APIView
from django.http import JsonResponse
from celery_tasks.sends.tasks import send_server_msg, send_server_signconfig = settings.EXPORT_CONFIGclass Complete(APIView):def get(self, request):items = {'url': 'http://www.baidu.com','name': '杂品','title': '基金收益优势凸显 吸引各家公募密集布局','about': '测试数据:11省份同比上涨,但涨幅低于全国'}openid = "asdasPh0AfSasdasddsadwf"status = send_server_msg.delay(openid=openid, temp_id=config.get("modelID").get("complete_msg"), **items)return JsonResponse({"code": 1, 'msg': str(status)})class SignMsg(APIView):def get(self, request):name = request.GET.get('name')  # 服务名称start_time = request.GET.get('start_time')  # 服务签约时间end_time = request.GET.get('end_time')  # 服务到期时间openid = request.GET.get('openid')  # 用户openiditems = {"name": name, "start_time": start_time, "end_time": end_time}model_server_sign = config.get("modelID").get("sign_msg")status = send_server_sign.delay(openid=openid, temp_id=model_server_sign, **items)return JsonResponse({"code": 1, 'msg': str(status), 'model_server_sign': model_server_sign})

执行结果

图片

 

以上就是用django和微信公众号开发的所有内容了,希望对大家有所帮助有问题可以联系作者。

感兴趣的可以关注作者微信公众号:程序员9527

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/142886.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

微信公众号开发流程

1、首先注册微信公众号,要根据实际需求考虑清楚应该申请哪一种公众号 以下是官方给出的建议,大家可以多参考参考 1)如果想简单的发送消息,达到宣传效果,建议可选择订阅号; 2)如果想用公众号获得…

微信公众号程序开发接入流程

文章目录 文章简介微信公众号程序介绍传统H5网页,无需微信支持建立在微信支持下开发的微信公众号程序第一步第二步 文章简介 公司常有微信公众号程序开发的项目,每次接入微信时都要四处查找以前的代码,百度接入微信公众号的流程。浪费大量时间…

微信公众号白名单配置

微信公众号白名单配置 微信公众号升级之后,在获取access_token的时候需要配置IP白名单,如下图: 那么这个白名单是干什么的呢?微信给的解释是:为了提高公众平台开发者接口调用的安全性,避免一旦开发者ID和密…

uni-app开发微信公众号

一、公众号JSSDK使用 【1】验证后端返回的签名是否正确 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?tjsapisign (1)jsapi_ticket获取方法:(注意把本地IP放入白名单) 1) https://api.weixin.qq.com…

微信公众号--发送模板消息

目录 一、登录微信公众平台二、开通模板消息三、增加及选择模板四、在项目中配置使用五、遇见的问题 一、登录微信公众平台 1、搜索微信公众平台 2、扫码登录后即可跳转 二、开通模板消息 1、在左侧菜单栏找到模板消息 若找不到则点击新的功能 2、点击新的功能后&#x…

SpringBoot微信公众号开发

SpringBoot微信公众号开发 环境准备 微信测试公众号申请 访问https://weixin.qq.com/,点击公众号,申请一个订阅号(个人能申请订阅号,服务号只有企业才能申请)。 公众号填写服务器配置 注意:服务器提交需要…

微信公众号接入开发

目录 前言: 一、公众号中配置 1、获取AppID、AppSecret: 2、配置IP白名单: 问题: 解决: 3、配置JS接口安全域名: 重要:认真阅读系统提示的注意事项: 问题: 解决…

电子科技大学编译原理复习笔记(三):控制结构

目录 前言 重点一览 语句级控制结构 单元级控制结构 四种单元级控制结构 本章小结 前言 本复习笔记基于张老师的课堂PPT,供自己期末复习与学弟学妹参考用。 重点一览 语句级控制结构 定义:用来构造各种语句执行顺序的机制 传统三种语句级控制结…

geotools简介

geotools简介 官网 https://docs.geotools.org/latest/userguide/index.html 架构图 特性 1. 主要特性 Geotools主要提供各种GIS算法,实现各种数据格式的读写和显示。在显示方面要差一些,只是用Swing实现了地图的简单查看和操作。用户可以根据Geoto…

Linux学习笔记 --- Linux基础命令Part2

2.9 查找命令(which、find) 目标:1. 掌握使用which命令查找命令的程序文件 2. 掌握使用find命令查找指定文件 which命令 我们在前面学习的Linux命令,其实它们的本体就是一个个的二进制可执行程序。 和Windows系统中的.exe文件&#x…

清除一键还原精灵开机热键F11的正确方法

刚开通博客园,就写我刚才才处理的一个问题吧。 先描述一下问题吧,我以前才装Win7系统的时候,想弄个还原,于是去下载了一个一键还原精灵,结果安装失败了,不过开机热键却保留了下来,每次开机都要提…

u深度重装系统详细教程_u深度一键还原精灵电脑重装系统使用教程

电脑已经是家家户户必备的电子产品,有了它可以为我们带来一系列不同的乐趣以及帮助。当然,电脑也有出差错的时候,在遇上电脑系统无法正常使用时,大多数人会使用附带有应急系统的u盘启动盘为电脑重装系统的操作。但是pe系统中附带的…

冰点还原精灵和惠普增霸卡安装软件的方法

还原系统无法安装东西 适用于冰点还原精灵和惠普增霸卡发现这个方法的经过 适用于冰点还原精灵和惠普增霸卡 在我们使用还原系统如健康上网专家或者惠普增霸卡这样的还原系统的时候,难免出现想后期安装点软件。但是安装后电脑重启后就被还原了,软件也就…

破解还原卡的方法总结

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 破解三茗还原卡还原卡及还原精灵的破解还原…

冰点还原精灵卸载

冰点还原是一个系统的保护软件,不论什么原因你的系统出现了故障,它都可以快速的恢复到你原先的状态和设置。它会随时记录你的操作,当前打开的文件,运行着的程序和各项设置。 但是当你有一天不想用他了,你是否懂…

冰点还原无法修改计算机时间,系统还原后无法更改系统时间?这个方法必须会...

原标题:系统还原后无法更改系统时间?这个方法必须会 对于公用电脑,为了防止乱装软件,都会安装了冰点还原精灵这类的系统还原软件来保护电脑系统。但是之后发现系统时间不对,双击修改时弹出“您没有适当的特级权&#x…

按键精灵 手机 oracle,按键精灵Android版:软件使用

1.1按键精灵Android版(APP) 1.1.1脚本管理器 按键精灵Android版的APP在界面功能层次上尽量扁平化,大多数操作均在脚本管理器内完成,界面由菜单栏、脚本列表及可伸缩的脚本操作栏组成,用户可以在这里直接进行脚本的创建、管理与编辑。(如图1) …

冰点还原精灵是怎么用的

有很多网友说装了冰点还原精灵后想卸载,可又不知道怎么卸?网上下的工具不是报毒就是用不了,在这里小编详细图文教您们一遍。 冰点是利用驱动的形式加入操作系统的内核模块中来实现其还原功能的,它必须依附于原来的系统,一旦进入另外一个系统…

冰点还原精灵有什么作用

冰点还原精灵是一款超强大的系统还原软件,可使计算机配置免遭破坏,从而将 IT帮助台收到的求助数量和耗费的成本降低 75%。它可以确保每个台式机、笔记本和服务器始终处于部署该软件之初的最佳运行状态。 公司/组织的计算机的可靠性得以显著提…

分享一款好用的电脑背单词软件

推荐一下这款单词风暴,虽然看起来很老了,但是好用,功能多。 下载地址 单词风暴免费版下载_官方免费版_单词风暴官方网站 (wordstorming.com) 下面是主界面 需要登陆ID:285804755-QGJTE-HCUMQ 下面是词库 不过我最喜欢的功能是这里面可以…