文档章节

使用python一步一步搭建微信公众平台(一)

Kevin_Yang
 Kevin_Yang
发布于 2013/09/04 22:32
字数 1569
阅读 15W
收藏 476

最近无聊,想玩玩微信的公众平台,后来发现乐趣无穷啊~

使用的工具,python 新浪SAE平台,微信的公众平台

你需要先在微信的公众平台与新浪SAE平台上各种注册,微信平台注册的时候需要你拍张手持身份证的照片,还有几天的审核期

微信公众平台:http://mp.weixin.qq.com

新浪SAE:http://sae.sina.com.cn/

等待微信公众审核通过后,登录公众平台后,点击高级功能。将会看到需要提供一个接入信息:

微信接口配置

微信接口配置

那么我们需要一个网址作为接口(这时就需要SAE上搭建Python的一个应用),Token呢,就是相当于我们和微信之间约定的“密码”,这里可以随便填写英文或者数字,但实测输入纯数字有时会有问题,所以还是字符串比较靠谱。

第一步,在SAE上搭建python的应用,在下图的应用里选择python应用。

iELK05K8pJTk2

 

填好二级域名和应用名称等,选择好语言。这里我们使用Python开发选择web应用。创建好应用之后,在代码管理中创建一个新的版本。而后我们可以选择编辑代码。能够实现在线编辑,根本用不着配置本地环境,SVN等等。当然像这种轻量级的应用在线编辑器就可以了,SVN的话还不如在线编辑好用

第二步,编写index.wsgi

因为我们使用的是web.py框架,因为其良好的xml解析,想了解web.py的童鞋可以移步 http://webpy.org/docs/0.3/tutorial.zh-cn

首先编写config.yaml


name: yangyanxing
version: 1

libraries:
- name: webpy 
  version: "0.36"

- name: lxml
  version: "2.3.4"

...

注意严格的缩进,差一个空格你就废了!而且调试的时候很不好发现问题。。。 

接着我们继续编写index.wsgi

# coding: UTF-8
import os

import sae
import web

from weixinInterface import WeixinInterface

urls = (
'/weixin','WeixinInterface'
)

app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, 'templates')
render = web.template.render(templates_root)

app = web.application(urls, globals()).wsgifunc()        
application = sae.create_wsgi_app(app)

简单解释一下,

from weixinInterface import WeixinInterface

这里我们需要再创建一个weixinInterface的py文件,你也可以将这个类写在index.wsgi文件中,只是这样看起来会乱乱的

新建一个weixinInterface.py文件,注意大小写,写入以下代码

# -*- coding: utf-8 -*-
import hashlib
import web
import lxml
import time
import os
import urllib2,json
from lxml import etree

class WeixinInterface:

    def __init__(self):
        self.app_root = os.path.dirname(__file__)
        self.templates_root = os.path.join(self.app_root, 'templates')
        self.render = web.template.render(self.templates_root)

    def GET(self):
        #获取输入参数
        data = web.input()
        signature=data.signature
        timestamp=data.timestamp
        nonce=data.nonce
        echostr=data.echostr
        #自己的token
        token="yangyanxing" #这里改写你在微信公众平台里输入的token
        #字典序排序
        list=[token,timestamp,nonce]
        list.sort()
        sha1=hashlib.sha1()
        map(sha1.update,list)
        hashcode=sha1.hexdigest()
        #sha1加密算法        

        #如果是来自微信的请求,则回复echostr
        if hashcode == signature:
            return echostr

这里定义了一个GET方法,是根据微信公众平台的要求,进行的token验证,因为这里我们定义了templates_root为根目录下的templates,所以还要在根目录下创建一个目录templates的目录

1 开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
2  
3 signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
4  
5 加密/校验流程:
6 1. 将token、timestamp、nonce三个参数进行字典序排序
7 2. 将三个参数字符串拼接成一个字符串进行sha1加密
8 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

因为微信是将验证信息GET发出去的,所以这里使用了GET方法来取得值并且返回相应用值

保存全部,现在回到微信的公众平台高级管理界面

微信接口配置

在url里面填写你在新浪SAE里应用名称并且加上/weixin,如:http://XXXX.sinaapp.com/weixin token随便输入,只要注意更改weixinInterface.py中的token就行了,输入好了以后点击提交,如果没有什么问题的话就会通过验证!

 

第三步,新建一个简单的自动回复的方法,鹦鹉学舌,就是用户说什么,它也回复什么,没什么用,只是随便玩玩!

在weixinInterface.py里继续添加代码

def POST(self):        
        str_xml = web.data() #获得post来的数据
        xml = etree.fromstring(str_xml)#进行XML解析
        content=xml.find("Content").text#获得用户所输入的内容
        msgType=xml.find("MsgType").text
        fromUser=xml.find("FromUserName").text
        toUser=xml.find("ToUserName").text
        return self.render.reply_text(fromUser,toUser,int(time.time()),u"我现在还在开发中,还没有什么功能,您刚才说的是:"+content)

 

这个def 是和上一个GET同级的,注意缩进

接着我们在templates目录下创建reply_text.xml模板文件,写入以下代码

$def with (toUser,fromUser,createTime,content)
<xml>
<ToUserName><![CDATA[$toUser]]></ToUserName>
<FromUserName><![CDATA[$fromUser]]></FromUserName>
<CreateTime>$createTime</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[$content]]></Content>
</xml>

 

注意这里的toUser与fromUser是刚才post的是相反的,因为这里的toUser也就是POST函数里的fromUser,这里的fromUser也就是POST函数里的toUser,msgType是text 

全部保存,现在就在用你的个人微信关注一下你创建的公众微信号,然后随便输入些内容,如果没有什么问题,你将会收到一条鹦鹉学舌的回复内容!

接下来,我们利用有道的翻译api做一个翻译的小工具

使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具

使用python一步一步搭建微信公众平台(三)----添加用户关注后的欢迎信息与听音乐功能

使用python一步一步搭建微信公众平台(四)----将小黄鸡引入微信自动回复

使用python一步一步搭建微信公众平台(五)----使用mysql服务来记录用户的反馈

 

参考文章:http://www.nilday.com/%E5%88%A9%E7%94%A8sae%E6%90%AD%E5%BB%BA%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%B9%B3%E5%8F%B0%EF%BC%88%E4%B8%80%EF%BC%89web-py%E5%AE%9E%E7%8E%B0%E7%9A%84sae-hello-world/



© 著作权归作者所有

Kevin_Yang
粉丝 261
博文 38
码字总数 50238
作品 0
通州
私信 提问
加载中

评论(132)

r
rudy123

引用来自“rudy123”的评论

- Traceback (most recent call last):\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 237, in process\n return self.handle()\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 228, in handle\n return self._delegate(fn, self.fvars, args)\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 409, in _delegate\n return handle_class(cls)\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 385, in handle_class\n return tocall(*args)\n File \"/data1/www/htdocs/808/csxwxapp/1/weixinInterface.py\", line 26, in GET\n echostr=data.echostr\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/utils.py\", line 76, in __getattr__\n raise AttributeError, k\nAttributeError: 'echostr' yq34

引用来自“rudy123”的评论

博主,这是环境问题吗?需要 pip install Pillow吗?
解决啦,是在线编辑式,python代码缩进的问题。把代码copy到本地,重新编辑,在贴到SAE就好啦。谢谢,博主的思路和代码。
r
rudy123

引用来自“rudy123”的评论

- Traceback (most recent call last):\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 237, in process\n return self.handle()\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 228, in handle\n return self._delegate(fn, self.fvars, args)\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 409, in _delegate\n return handle_class(cls)\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 385, in handle_class\n return tocall(*args)\n File \"/data1/www/htdocs/808/csxwxapp/1/weixinInterface.py\", line 26, in GET\n echostr=data.echostr\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/utils.py\", line 76, in __getattr__\n raise AttributeError, k\nAttributeError: 'echostr' yq34
博主,这是环境问题吗?需要 pip install Pillow吗?
r
rudy123
- Traceback (most recent call last):\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 237, in process\n return self.handle()\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 228, in handle\n return self._delegate(fn, self.fvars, args)\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 409, in _delegate\n return handle_class(cls)\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/application.py\", line 385, in handle_class\n return tocall(*args)\n File \"/data1/www/htdocs/808/csxwxapp/1/weixinInterface.py\", line 26, in GET\n echostr=data.echostr\n File \"/usr/local/sae/python/lib/python2.7/site-packages/web/utils.py\", line 76, in __getattr__\n raise AttributeError, k\nAttributeError: 'echostr' yq34
l
liwx123456
楼主你好,我看微信公众号提交后:token验证失败
下面是debug日志:
- - [2018/03/05 15:04:00] einsuweb 882 1 - Traceback (most recent call last):\n File \"/data1/www/htdocs/882/einsuweb/1/index.wsgi\", line 7, in <module>\n from weixinInterface import WeixinInterface\nImportError: No module named weixinInterface yq30
- - [2018/03/05 15:01:23] einsuweb 882 1 - Traceback (most recent call last):\n File \"/data1/www/htdocs/882/einsuweb/1/index.wsgi\", line 7, in <module>\n from weixinInterface import WeixinInterface\nImportError: No module named weixinInterface yq34
- - [2018/03/05 14:58:01] einsuweb 882 1 - Traceback (most recent call last):\n File \"/data1/www/htdocs/882/einsuweb/1/index.wsgi\", line 7, in <module>\n from weixinInterface import WeixinInterface\nImportError: No module named weixinInterface yq34
- - [2018/03/05 14:52:18] einsuweb 882 1 - Traceback (most recent call last):\n File \"/data1/www/htdocs/882/einsuweb/1/index.wsgi\", line 7, in <module>\n from weixinInterface import Weixin
安卓_王座
安卓_王座
# coding: UTF-8
#index.wgsi文件
import os
import sae
import web
import hashlib
from lxml import etree

#config.yaml文件
version: 1

labraries:
- name: lxml
version: "2.3.4"
- name: webpy
version: "0.36"

报错:
from lxml import etree
ImportError: No module named lxml
求大神解答。在网上找了很多都没有找到解答,是不是因为sae还需要配置什么呢?方便加个QQ吗?感谢
j
jizhongwei
请问为什么代码上传不了呢?git commit 操作失败 =>on branch 1 your branch is ahead of .............
ebichuT
ebichuT
你好,我按照你的流程一步步来的,可是不知道为什么总是token验证失败。不知道方不方便给个联系方式帮忙看一下。实在不好意思麻烦你了。
c
chao_yue_
你好,我完全按照你说的去做,但是Token总是验证失败,不知道是怎么回事。我的是个人账号,与这个有关吗?
谢谢!
xmisspuff
xmisspuff
都没有说要提交代码
xmisspuff
xmisspuff
s
使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具

距离上次写使用python一步一步搭建微信公众平台(一)已经有几个月了,当中自已也搭建了一个中英文互译的小应用,可是由于英文翻中文好弄,中文翻译成英文一直有问题,知道是编码的问题,但是...

Kevin_Yang
2014/01/19
2.4W
39
使用python一步一步搭建微信公众平台(五)----使用mysql服务来记录用户的反馈

经过前几篇教程的学习,相信你对于微信的操作与SAE和webpy都有了些了解,那么这次我想加一个功能,通过mysql来记录用户的反馈,如用户输入fk+内容,然后通过一个页面来显示,最终的效果如下 ...

Kevin_Yang
2014/02/14
2.2W
20
使用python一步一步搭建微信公众平台(三)----添加用户关注后的欢迎信息与听音乐功能

在使用python一步一步搭建微信公众平台(二)中最后我们留下了一个问题,就是单引号的content在render到xml中时,返回给用户的信息会被转码,如‘<>&’会被转为<>&用户在收到有<>&等内容的时...

Kevin_Yang
2014/01/31
3W
30
使用python一步一步搭建微信公众平台(四)----将小黄鸡引入微信自动回复

通过前三篇的教程,相信大家基本上了解了微信开发的基本流程,先判断用户传入数据的类型MsgType,然后再获取用户输入的内容content,再对content进行处理,再返回给用户 现在我们来加点料,在...

Kevin_Yang
2014/02/09
2.1W
21
Django搭建微信公众平台详解 二

微信公众平台官方手册:http://mp.weixin.qq.com/wiki/home/index.html Python版本:2.7.10 Django版本:1.5 开发平台:新浪SAE 前提:了解django基本创建应用的步骤。根据微信公众平台官方手...

卜星星
2015/12/06
1.4K
1

没有更多内容

加载失败,请刷新页面

加载更多

微盟被员工删库,这事到底多严重?该如何解决?

此举直接给公司带来数10亿的市值蒸发损失!在这个"远程办公”的节骨眼出事了。竟然是因为内部人员因个人精神、生活等原因对公司数据库进行了恶意的破坏! 面对这种情况我们应该如何解决呢? ...

欢乐马在开源
30分钟前
97
0
浅谈Chatbot的架构模型和响应机制

不知您是否已注意到:人工智能已经不再是少数科技公司的初级原型产品了。在许多服务类行业中,带有人工智能的聊天机器人(Chatbot)正在逐步取代人工客服,提供及时、周到、互动的服务。通过机...

Java进阶程序员xx
32分钟前
42
0
IT 老程序员的重要性

很多单位,会认为程序员年龄大了,不能高强度工作,价格比新人高,用新人便宜。 新闻上 各种IT企业各种 比如删库,传密码到git等等。不用想,大多都是新人。 不是不用新人,新人经验的积累是...

mellen
36分钟前
39
0
全文搜索引擎 Elasticsearch 入门:集群搭建

本文主要介绍什么是 ElasticSearch 以及为什么需要它,如何在本机安装部署 ElasticSearch 实例,同时会演示安装 ElasticSearch 插件,以及如何在本地部署多实例集群,方便在日后学习分布式相...

武培轩
37分钟前
46
0
Redis的两种持久化方式

RDB 我们所谓的RDB持久化就是指的讲当前进程的数据生成快照存入到磁盘中,触发RDB机制又分为手动触发与自动触发 AOF AOF持久化是以独立的日志记录每次写命令,重启Redis的时候再重新执行AOF...

无名氏的程序员
38分钟前
41
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部