<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              频道栏目
              首页 > 微信学院 > 微信公众平台开发 > 正文
              基于Django的微信公众号开发之实现消息的接收与发送
              2017-12-20 10:32:55         来源yuuuuchang的博客  
              收藏   我要投稿

              基于Django的微信公众号开发之实现消息的接收与发送

              准备工作

              在正式开始之前,需要做一些准备:

              a: 安装好wechat_sdk;

              b: 成功通过了微信公众号的开发者?#29616;?

              c: 新建一个应用(不是必须的), 我新建了一个dict应用.

              需要注意的事项

              在正式动手之前,首先我要说一下要注意的事(我踩过的坑):

              a: 微信公众号服务器在收?#25509;?#25143;在公众号输入的信息之后, 只会转发到一个url上(就是你开发者?#29616;?#26102;所填的那个url,所以只能通过这个url来接收信息)

              b: 公众号收?#25509;?#25143;的信息之后, 将会把它打包成规定的xml的模式通过你注册的url发送到你的服务器上, 你发送给用户的消息同样要包装成同样格式的xml才能成功, 否则公众号服 务器一律拒绝并在用户端返回"该公众号提供的服务出现?#25910;? 请?#38498;?#20877;试"的提示(?#20197;?#30340;是在wechat_sdk已经有打包这种xml的方法了, 如果你想了解, 你可以看看公众号的开发文档)

              c: 返回给用户的文字一定要用utf-8格式

              d: ?#30475;?#21457;送的消息长度长度不能超过2048字节, 由于采用utf-8编码, 所以请留意每个汉字都算作3个字节, 超长就要记得截断发两次了

              调试技巧

              无论你的服务器在调试过程中出了什么错, 在用户端都是提示"该公众号提供的服务出现?#25910;? 请?#38498;?#20877;试"的提示, 所以想只靠一个测试账号来调试明显是很不靠谱的. 在公众号平台上有一个调试 工具, 但是他也只会返回访问的错误代码(200/500之类的), 并没有给出提示, 同样也是很不靠谱, 那么我们该怎么样知道我的服务器跟微信发送消息这部分出了什?#27425;?#39064;呢?

              我在开发过程中发现了一个技巧, 我们的服务器从公众号服务器接收了一个包含xml格式的包, 并且开始读取处理, 最后把处理结果(返回给用户的文字)打包成xml包发送给公众号服务器. 原理是这样子. 那么我们只要伪造一个用户发送信息的xml段, 保存在一个xml文件里面, 需要用的时候就读取这个xml文件, 在后台控制台调试输出包装好的xml就行了 (当然你得先排除网络连接的问题,因为网络连接导致你的服务器接收不了,或者发送不了都有可能发生的). 需要发送不同的信息的时候, 写个函数修改xml里面的消息部分就可以了.

              开发过程

              首先, 我们现在可以把用于通过微信公众号验证的代码给注释掉了(最好不要删除), 然后我们新建一个相同名字的函数

              下面是我的一些代码(为了更了解整个基本的结构, 代码有所删减, 主要是获取数据部分跟格式组?#23433;?#20998;)

              # 这是段代码是我dict应用的返回微信消息响应部分, 主要功能是获取消息->做出对应反应->返回消息
              # 为了方便大家理解, 有一部分我将会用"(--tips--)"的格式进行简化, 只保留必要部分
              # 代码开始
              
              
              # -*- coding: utf-8 -*-
              
              # 这段是需要添加的,主要是为了添加path,保证django的正常运行
              # (因为我的django用的是自己的包嘛)
              import os
              import sys
              root = os.path.dirname(__file__)
              sys.path.insert(0, os.path.join(root, '../site-packages/Django-1.9.7-py2.7.egg'))
              os.environ['DJANGO_SETTINGS_MODULE'] = 'yuuuuchang.settings'
              
              from django.shortcuts import render
              from django.http.response import HttpResponse, HttpResponseBadRequest
              from django.views.decorators.csrf import csrf_exempt
              
              from wechat_sdk import WechatBasic
              from wechat_sdk.exceptions import ParseError
              from wechat_sdk.messages import TextMessage, VoiceMessage, ImageMessage, VideoMessage, LinkMessage, LocationMessage, \
              	EventMessage
              
              # (-- 个人数据的调用, 自定义返回格式的组装, 跟数据库查询的入口 --)
              
              # wechat_sdk需要初始化一些数据
              wechat = WechatBasic(token=WECHAT_TOKEN, appid=WEIXIN_APPID, appsecret=WEIXIN_APPSECRET)
              
              # def wechat_message(request):
              # 	""" 微信?#29616;?"""
              # 	if request.method == 'GET':
              # 	signature = request.GET.get('signature')
              # 		timestamp = request.GET.get('timestamp')
              # 		nonce = request.GET.get('nonce')
              #
              # 		if not wechat.check_signature(signature=signature, timestamp=timestamp, nonce=nonce):
              # 			return HttpResponseBadRequest('Verify Failed')
              # 		else:
              # 			return HttpResponse(request.GET.get('echostr', ''), content_type='text/plain')
              
              
              def wechat_message(request):
              	""" 消息入口,用户通过输入框发送的消息都发到这里处理 """
              
              	# 解析本次请求的 XML 数据
              	try:
              		wechat.parse_data(data=request.body)
              	except ParseError:
              		return HttpResponseBadRequest('无效的xml数据')
              
              	# 获取解析好的微信请求信息
              	message = wechat.get_message()
              
              	# 假如信息是文本格式
              	# (TextMessage是wechat_sdk定义的一个文本消息类,下面还有语音类之类的,经过上面解析的消息都会归属到这些类中)
              	if isinstance(message, TextMessage):
              		context = message.content.strip()
              		
              		# 假设用户输入的是什么文字,然后做出相应反应
              		if context == '?#22987;?#39; or context == 'blog':
              			tips = '这里设置你需要发给用户的文字'
              
              		elif context == '学习' or context == 'study':
              			tips = '这里设置你需要发给用户的文字'
              
              		elif context == 'help':
              			tips = '这里设置你需要发给用户的文字'
              			
              		else:
              			# (-- 获取到context, 并且用这个context作为查询条件在数据库中查找相应结果 --)
              			# (-- 如果你也有从数据库获取数据然后返回的操作,记得把结果转utf-8格式 --)
              
              			# 没有查询结果
              			if len(foundword) == 0:
              				tips = '未查询到结果,换个词试试?'
              
              			# 查询到一个
              			elif len(foundword) == 1:
              				# (-- 将结果用自定义的格式打包好(主要是换行跟缩进),然后放到tips里面  --)
              
              			# 查询到多个结果
              			else:
              				# (-- 将结果用自定义的格式打包好(主要是换行跟缩进),然后放到tips里面  --)
              	
              	# 如果收?#25509;?#38899;信息
              	if isinstance(message, VoiceMessage):
              		tips = '打字啦,语音消息我听不懂~'
              	
              	# 如果收到图片信息(下面看提示就知道了,不多说)
              	if isinstance(message, ImageMessage):
              		tips = '虽然有点看不懂~但是我?#19981;?#36825;张图!'
              
              	if isinstance(message, VideoMessage):
              		tips = '这个是..视频消息?怎么打开教教我嘛~'
              
              	if isinstance(message, LinkMessage):
              		tips = '不要发奇怪的地址给我,我真的看不懂咧'
              
              	if isinstance(message, LocationMessage):
              		tips = '这个...哪边是北?(路痴专用懵X表情)'
              	
              	# 这里是定义用户对公众号所做的事(事件,比如关注,取消关注等)
              	if isinstance(message, EventMessage):
              		# 公众号?#36824;?#27880;的时候
              		if message.type == 'subscribe':
              			tips = '''?#34892;?#20320;关注"鱼肠?#22987;?quot;! balabala...'''
              		else:
              			(-- 省略 --)
              			
              	# 最后, 经过前面诸多处理, 我们得出了一个tips的文本信息, 这就是我们想对用户说的, 我们需要打包, 然后以规定格式返回
              	# 首先是打包, wechat_sdk已经做了一个方法了
              	result = wechat.response_text(content=tips)
              	
              	# 然后是返回,记得规定是xml格式返回
              	return HttpResponse(result, content_type='application/xml')	
              

              基本上的要点就是这样了, 太偏远的我已经剔除掉

              你可以下手玩玩, 祝你玩得愉快~

              以上!

              点击复制链接 与好友分享!回本站首页
              上一篇微信公众号创建二维码ticket的2种方式讲解
              下一篇一起艳学Springboot开发微信公众号(二)
              相关文章
              图文推荐
              点击排行

              关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

              版权所有: 红黑联盟--致力于做实用的IT技术学习网站

              ٷͧü
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>