热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在SAE上搭建微信公众平台账号消息服务器

利用微信公众平台提供的消息接口,搭建自己的消息处理服务器,消息的处理和回复将更加灵活,以期给订阅用户提供更加定制化和个性化的信息。本文将结合SAE,基于PythonFlask框架,搭建一个公众账号“

利用微信公众平台提供的消息接口,搭建自己的消息处理服务器,消息的处理和回复将更加灵活,以期给订阅用户提供更加定制化和个性化的信息。本文将结合SAE,基于Python Flask框架,搭建一个公众账号“豆米查书”(微信号doumibook)的消息服务器。该公众号的基本功能是:输入书籍标题、作者或者isbn条码号等关键字,查询书籍的基本信息。书籍数据来源豆瓣网,使用了douban api v2。

一、申请微信公众平台账号

到这里注册微信公众平台账号,登陆,设置必要的名称、地区和用户信息等内容。在“高级功能”中开启“开发模式”。

仔细阅读微信公众平台的官方文档。

二、在SAE上创建Python应用

创建Python应用,二级域名和应用名称为doumibook,那么基本地址为http://doumibook.sinaapp.com。

三、申请消息接口并验证

1,消息接口配置

到“高级功能”-->“开发模式”-->“成为开发者”中填写接口配置信息,有URL和Token,URL用于接口验证和消息推送,本例中填写步骤二中的接入地址,Token用于接口验证,任意填写即可,例如填写“doumitest”。

2,消息接口验证(网址接入)

信息填写完成后,点击提交,会提示认证“服务器未正确响应的Token验证”,这是正常的,因为我们虽然创建了SAE应用,但没有处理接口验证消息。点击提交时,微信服务器会发送一条Http GET请求,携带signature、timestamp、nouce和echostr四个参数,对URL进行合法性的校验(参考微信官方的详细文档的“网址接入”小节)。如下是flask中处理接口验证的代码:

import hashlib

@app.route('/weixin', methods=['GET'])
def weixin_verify():
signature = request.args.get('signature')
timestamp = request.args.get('timestamp')
nOnce= request.args.get('nonce')
echostr = request.args.get('echostr')

token = 'doumitest' #和申请消息接口时的Token一致
tmplist = [token, timestamp, nonce]
tmplist.sort()
tmpstr = ''.join(tmplist)
hashstr = hashlib.sha1(tmpstr).hexdigest()

if hashstr == signature:
return echostr #success
return 'access verification fail' #fail


四、消息推送和消息回复

1,消息推送

URL接口验证以后,公众平台账号收到的消息将由微信服务器使用HTTP POST推送至该URL。消息内容为XML格式,消息类型有文本、图片和地理位置等,例如文本消息由以下几个部分组成。




1348831860



其中,ToUserName和FromUserName分别为公众帐号和用户帐号的表识串。MsgType标识消息类型,“text”表明消息是文本消息,文本内容放置在Content字段。其他类型消息的xml结构请参照官方文档。

使用下面的代码片段,解析xml数据,以dict形式保存:

import xml.etree.ElementTree as ET

def parse_msg(rawmsgstr):
root = ET.fromstring(rawmsgstr)
msg = {}
for child in root:
msg[child.tag] = child.text
return msg

2,用户订阅消息

当有新用户关注公众号时,微信服务器会发送一条通知消息到消息服务器,消息服务器可以返回初次订阅的欢迎和帮助信息。目前,微信启用了新的用户订阅通知方法,即使用事件推送。

事件推送的MsgType为“event”,是微信4.5版开始支持的一种消息格式,可以发送用户订阅( subscribe)、退订(unsubscribe)以及自定义菜单点击(CLICK)等事件消息。消息格式为:




123456789




微信官方已经发布通告,在2013年3月26日起由原来的发送一条内容为“Hello2BizUser”的订阅消息,切换至事件推送方法。

3,书籍信息获取

简单起见,目前仅支持微信用户发送书籍isbn条码号给doumibook,来查询作者和书名。使用douban api v2版接口,获取书籍信息,douban返回的json数据。代码片段如下:

import urllib2
import json

bookurlbase = 'http://api.douban.com/v2/book/isbn/'
DOUBAN_APIKEY = '' #豆瓣上申请的APIKEY

def query_book_info(isbn):
url = '%s%s?apikey=%s' % (bookurlbase, isbn, DOUBAN_APIKEY)
resp = urllib2.urlopen(url)
book = json.loads(resp.read())
info = ''.join(book['author']) + ': ' + book['title']
return info

4,消息回复

查询到书籍信息之后,消息服务器响应微信服务器的消息推送,回复内容结构同样是XML,假设我们回复文本消息,基本结构如下:




12345678


0

其中的ToUserName和FromUserName与消息推送中的相关。

构造回复消息代码片段如下:

def response_msg(recvmsg, content):
textTpl = """


%s


0
"""
echostr = textTpl % (recvmsg['FromUserName'], recvmsg['ToUserName'], recvmsg['CreateTime'], recvmsg['MsgType'], content)
return echostr

注意到,回复文本消息,内容比较单一,这里可以使用MsgType为“news”的图文消息格式进行回复,这里不再赘述,请参考官方文档以及本文末尾给出的源代码链接。

4,综合

消息推送HTTP POST请求的处理代码如下:

@app.route('/weixin', methods=['POST'])
def weixin_msg():
data = request.data
msg = parse_msg(data)
cOntent= 'not found'
if msg.has_key('Content'):
cOntent= query_book_info(msg['Content'])
return response_msg(msg, content)

五、总结

本文以doumibook为例,使用Python Flask框架,介绍了在SAE上搭建微信公众平台账号消息服务器的基本步骤。

需要看完整代码的同学,请移步这里:https://github.com/gzb1985/doumibook_weixin。

doumibook目前仅实现了很简单的功能,还没有实用的价值,例如输入“浪潮之巅”,则返回:





完整代码:https://github.com/gzb1985/doumibook_weixin




推荐阅读
  • 建立服务器与微信公众平台的链接,首先要有一个默认首页提供程序的链接支持,该方法主要是获取微信提供过来的4个参数,供比较是否可链接使用。 其次,要有一个服务器地址与一个token(为英文或 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 前言用了一早上的时间,成功实现了PHP抓取csdn博客信息,并且通过公众平台实现了自动回复。实现效果:用户在我的公众平台上输入“博客”,自动返回实时的博客访问量等信息,这里边有两个重要的部分,一个是微 ... [详细]
author-avatar
我的双宝宝_486
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有