使用语言和框架:本人后端开发使用的Python的DRF(Django REST framework)框架

需求:在微信公众号开发时,需要实现自动回复,即被关注回复、收到消息回复、关键词回复

发现问题:按照微信公众号的开发文档,在写完逻辑代码后,测试时发现:Content回复的消息内容,使用"\n",预期效果应该是文字内容有换行效果,微信的文档也说明了换行可以使用"\n"换行符,但是实际测试的效果是没有换行。这个问题纠结了一天,最后发现是我响应给微信服务器的数据类型错误了。

问题分析过程:微信公众号文档里的原话(当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。)

文档已经说得很明白,在接收到微信的Post请求后,处理完具体的业务逻辑后,要对微信服务器作响应回复,如果需要特定的回复则返回特定XML结构,如果不作任何处理推荐方式直接回复success

根本原因:因为使用的是DRF框架,自然而然的在响应的时候使用了rest_framework.response.Response,但其实响应给微信服务器的是一个响应体数据,而我使用Response响应给微信服务器的是响应对象

解决方案:使用django.http.HttpResponse响应返回数据

代码演示:

#使用的是类视图APIView

defpost(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 = """

{CreateTime}

"""

#根据判断是否返回回复文本消息还是不作任何处理

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

java推送微信消息换行_微信公众号开发被动回复用户消息,回复内容Content使用了\n换行符还是没有换行...相关推荐

  1. 为何公众号推送会延迟发送_关于公众号推送延迟更新的说明

    关于公众号推送延迟更新的说明 亲爱的朋友: 我们是红星公众号自创立以来,得到了很多朋友们的支持,经常与我们互动,在这里非常感谢各位! 最近公众号更新出现了"不定时"的情况,相信您也 ...

  2. 使用Python进行微信公众号开发(三)回复消息

    写在前面 <使用Python进行微信公众号开发>系列文章将与大家分享如何使用Python一步步搭建微信公众号后台服务器. 效果体验 扫码"是雯子吖"公众号进行体验 配置 ...

  3. springboot推送告警消息至企业微信

    0.前言 需求:实现告警信息推送到企业微信群 1).机器人推送消息 2).企业微信支持 自建应用 推送消息 1.代码截图 2.pom <?xml version="1.0" ...

  4. java推送叮叮消息,叮叮叮!请及时签收入门学习Java导航路线

    原标题:叮叮叮!请及时签收入门学习Java导航路线 引言 想必有很多像我一样刚学习Java会有很迷茫的人吧,今天给小伙伴们整理了一些资料,有需要的小伙伴们可以私信我,顺便推荐一个免费学习的Qqun,里 ...

  5. 4 微信公众号开发 被动回复消息 回复没有反应怎么办

    接收到用户的消息,我们需要做出反馈. 文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543 官方返回的数 ...

  6. 公众号开发(4) —— 使用Senparc.Weixin SDK进行模板消息推送

    微信公众号支持推送模板消息给特定用户,只要获取到公众号用户的openid向微信提供的接口发送post请求即可向特定用户推送模板消息,以下记录简单记录使用Senparc.Weixin SDK进行模板消息 ...

  7. java上传图文消息_微信公众号开发之上传图文消息素材(十二)

    群发消息太重要了,公众号管理员需要定期通过公众号群发一些消息,用户通过推送的消息可以定期了解公众号的最新信息. 群发图文消息的过程如下: 首先,预先将图文消息中需要用到的图片,使用上传图文消息内图片接 ...

  8. 微信公众号开发之上传图文消息素材(十二)

    群发消息太重要了,公众号管理员需要定期通过公众号群发一些消息,用户通过推送的消息可以定期了解公众号的最新信息. 群发图文消息的过程如下: 首先,预先将图文消息中需要用到的图片,使用上传图文消息内图片接 ...

  9. 微信公众号开发--图文消息发送不显示图片的问题

    使用微信公众号接口实现图文消息推送,遇到问题,不显示图片,且content内容中有英文双引号也不行 1.微信不允许有外链的图片,所以会自动过滤 2."双引号格式问题. 前端把双引号传给后端后 ...

最新文章

  1. JavaScript高级程序设计(第3版)第六章读书笔记
  2. Java将mysql输出csv,如何从Java中的Access数据库导出表并将其保存到.csv
  3. LeetCode刷题-7
  4. Android开发工具之Android Studio--调用系统隐藏方法之操作aidl文件步骤
  5. PyCharm入门教程——在编辑器中选择文本
  6. 1.8 编程基础之多维数组 11 图像旋转 4分 python
  7. linux mysql dump命令_linux下mysql命令
  8. prefetch 和preload_preload_prefetch
  9. 【收藏】ASP.NET英文技术文章推荐[11/4 - 11/11]
  10. [LeetCode]Count and Say
  11. C4认证Java基础Excel练习题
  12. Xcode MacOS与clang c++版本关系
  13. 樊登读书会用事实说话读后感_樊登读书《用事实说话》读书笔记
  14. c++01(数据类型 运算符 选择结构)
  15. 掘金 AMA:听闲鱼客户端架构师--邬吉风聊 Flutter 和移动端开发那些事
  16. 开尔文夹接线图解_什么是开尔文四线检测|Kelvin Four-terminal sensing|开尔文|Kelvin 4|开尔文四线电阻检测-产品知识-资讯-深圳华壬电子...
  17. 迷宫问题寻找最短路径(BFS)
  18. 论文翻译-Densely Connected Convolutional Networks
  19. S5_笔记(树,二叉树)
  20. 高合汽车是汽车界的“苹果”,还是鳄鱼皮外壳的8848?

热门文章

  1. 谈谈高并发秒拍系统架构设计
  2. html导出excel表头多了一行空行,Excel中批量插入空行的技巧,会用2个算你厉害
  3. 360加固助手实现多渠道打包终极讲解
  4. X86指令编码内幕 --- 指令 Opcode 码
  5. Box-Muller 与 ziggurat
  6. python 识别excel 公式_python – pandas读取excel值而不是公式
  7. JAVA导出excel表格标题加粗,【excle特定文字加粗】java如何设置excel单元格中部分文字加粗 例如:标题(加粗): 内容(不加粗)...
  8. MATLAB Appdesigner实用技巧(三):在App中实现示波器效果/动态波形效果
  9. div 设置a4大小_设计适用于打印的CSS样式
  10. sdut算法分析oj题目整合