微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行
使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架
需求:在微信公众号开发时,需要实现自动回复,即被关注回复、收到消息回复、关键词回复
发现问题:按照微信公众号的开发文档,在写完逻辑代码后,测试时发现:Content回复的消息内容,使用"\n",预期效果应该是文字内容有换行效果,微信的文档也说明了换行可以使用"\n"换行符,但是实际测试的效果是没有换行。这个问题纠结了一天,最后发现是我响应给微信服务器的数据类型错误了。
问题分析过程:微信公众号文档里的原话(当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。)
文档已经说得很明白,在接收到微信的Post请求后,处理完具体的业务逻辑后,要对微信服务器作响应回复,如果需要特定的回复则返回特定XML结构,如果不作任何处理推荐方式直接回复success
根本原因:因为使用的是DRF框架,自然而然的在响应的时候使用了rest_framework.response.Response,但其实响应给微信服务器的是一个响应体数据,而我使用Response响应给微信服务器的是响应对象
解决方案:使用django.http.HttpResponse响应返回数据
代码演示:
# 使用的是类视图APIView
def post(self, request):
"""接收微信Post数据,并处理"""
data = request.body.decode("utf-8")
doc = xmltodict.parse(data) # 解析xml数据
to_user = doc["xml"]["ToUserName"] # 开发者微信号
from_user = doc["xml"]["FromUserName"] # 发送方帐号(一个OpenID) if doc["xml"]["MsgType"] == "text": # 文本消息处理
dict = {
"ToUserName" = from_user
"FromUserName" = to_user
"CreateTime" = int(time.time())
"Content" = "欢迎关注公众号!\n新人好礼等你来拿"
}
# 返回回复文本消息特定XML结构
xml_form = """
<xml>
<ToUserName><![CDATA[{ToUserName}]]></ToUserName>
<FromUserName><![CDATA[{FromUserName}]]></FromUserName>
<CreateTime>{CreateTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{Content}]]></Content>
</xml>
"""
# 根据判断是否返回回复文本消息还是不作任何处理
if ....:
# 回复文本消息
return HttpResponse(xml_form.format(**dict))
else:
# 不作任何处理
return HttpResponse("success")
django.http.HttpResponse和rest_framework.response.Response的区别:
1、HttpResponse
可以使用django.http.HttpResponse来构造响应对象,HttpResponse对象由开发人员创建,适用于返回图片,视频,音频等二进制文件
格式:HttpResponse(content=响应体, content_type=响应体数据MIME类型, status=状态码)
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型:
text/html html
text/plain 普通文本
application/json json
响应头设置: 可以直接将HttpResponse对象当做字典进行响应头键值对的设置
response = HttpResponse('响应内容')
response['Itcast'] = 'Python' # 自定义响应头Itcast, 值为Python
2、Response
REST framework提供的一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
格式:Response(data, status=None, headers=None, content_type=None)
参数说明:
data: 字典类型,为响应准备的序列化处理后的数据;
status: 状态码,默认200;
headers: 用于存放响应头信息的字典;
content_type: 响应数据的Content-Type,通常此参数无需传递,REST framework会根据前端所需类型数据来设置该参数。
补充:JsonResponse对象是HttpResponse 的常用子类
帮助我们将数据转换为json字符串,再返回给客户端,会设置响应头 Content-Type 为 application/json
from django.http import JsonResponse
def resp(request):
return JsonResponse({'city': 'beijing', 'subject': 'python'})
当包含的内容中包含中文时,会返回该中文对应的编码,例如:
def resp(request):
# 最终看到的效果是: {"name": "\u5f20\u4e09"}
response = JsonResponse({"name":"张三"})
return response
解决:JsonResponse(data, json_dumps_params={'ensure_ascii':False})
JsonResponse可以接收非字典数据,需要指定 safe=False
微信公众号开发被动回复用户消息,回复内容Content使用了"\n"换行符还是没有换行的更多相关文章
- 微信公众号开发之网页中及时获取当前用户Openid及注意事项
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...
- 微信公众号开发及时获取当前用户Openid及注意事项
目录 (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及 ...
- C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 3.微信公众号开发:配置与微信公众平台服务器交互的URL接口地址
微信开发基本原理: 1.首先有3个对象 分别是微信用户端 微信公众平台服务器 开发者服务器(也就是放自己代码的服务器) 三者间互相交互 2.微信公众平台服务器 充当中间者角色 (以被动回复消息为例) ...
- 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...
- .net微信公众号开发——消息与事件
作者:王先荣 本文介绍如何处理微信公众号开发中的消息与事件,包括:(1)消息(事件)概况:(2)验证消息的真实性:(3)解析消息:(4)被动回复消息:(5)发送其他消息. 开源项目地址:h ...
- C#微信公众号开发系列教程五(接收事件推送与消息排重)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- C#微信公众号开发系列教程四(接收普通消息)
微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...
- 微信公众号开发C#系列-7、消息管理-接收事件推送
1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...
随机推荐
- android 每个块半径不同的扇形图,自定义view
1.首先看效果图 2.自定义PieChartView,继承自View,下边为PieChartView代码 package com.yingjinbao.im.peach.customview; imp ...
- JS数组与对象的遍历方法大全
本文简单解析各种数组和对象属性的遍历方法: 原生for循环.for-in及forEach ES6 for-of方法遍历类数组集合 Object.key()返回键名的集合 jQuery的$.each() ...
- 12 tensorflow实战:修改三维tensor矩阵的某个剖面
# -*- coding: utf-8 -*- """ Created on Mon Apr 22 21:02:02 2019 @author: a "&quo ...
- font-family:中文字体的英文名称 (宋体 微软雅黑)
宋体 SimSun 黑体 SimHei 微软雅黑 Microsoft YaHei 微软正黑体 Microsoft JhengHei 新宋体 NSimSun 新细明体 PMingLiU 细明体 Ming ...
- SQL Server ->> 查询添加XLOCK表提示不阻塞其他线程
BEGIN TRAN BEGIN END DROP TABLE IF EXISTS tempdb..#t CREATE TABLE #t ( spid int, dbid int, ObjId int ...
- 获取WebService的请求信息
一个已经写好的项目中有多个WebService,由于之前没有记录请求信息的,有时候需要查错等需要找到当次的请求信息,所以需要加入记录请求信息的功能. 首先想到的是在每一个带有WebMethod特性的方 ...
- windows下npm安装vue
一.使用之前,我们先来掌握3个东西是用来干什么的. npm: Nodejs下的包管理器. webpack: 它主要的用途是通过CommonJS的语法把所有浏览器端需要发布的静态资源做相应的准备,比如资 ...
- Shell中, 退出整个脚本
常规做法 cat >test.sh<<EOF'' #!/bin/bash exit_script(){ exit 1 } echo "before exit" e ...
- 【记录】有趣的python模块记录
1. paramiko: 基于SSH用于连接远程服务器并执行相关操作,公钥私钥登录等等
- 4-2 R语言函数 apply
#apply函数,沿着数组的某一维度处理数据 #例如将函数用于矩阵的行或列 #与for/while循环的效率相似,但只用一句话可以完成 #apply(参数):apply(数组,维度,函数/函数名) & ...