1. 概述:

在本篇教程中,你将学会使用华为云弹性云服务器(以下简称 ECS)搭建微信公众号处理后台,使用Python语言编写对应的微信消息处理逻辑代码,接收从微信服务端转发过来的消息,并返回处理结果给最终用户。整个处理流程如下图所示:

您需要了解的背景知识有: CentOS(Linux)操作系统、PHP语言、Web.py框架、HTTP/XML协议。

1.1 准备事项

申请微信公众号

微信公众号申请链接:https://mp.weixin.qq.com/cgi-bin/loginpage?t=wxm2-login&lang=zh_CN

考虑到申请便利性,本教程中使用订阅号“云图说”为例说明。

购买华为弹性云服务

华为弹性云服务购买链接:https://console.huaweicloud.com/ecm/?region=cn-east-2#/ecs/createVm

如果没有华为云账号,需先注册华为云账号并完成实名认证。

本教程中,使用公共镜像CentOS 7.4

建议同时购买弹性IP,后面需要再微信公众号上配置服务地址需要公网IP。

2. 操作步骤:

2.1 基础软件安装

本教程中使用Python+Web.py组合完成微信公众号开发,需要安装如下软件:

升级默认Python版本

CentOS 7.4自带Python版本比较老,建议升级到Python3。

1、  查看Python版本,使用命令:

  python --version

2、  下载Python安装包,这里以Python 3.6.0版本为例,使用命令:

  wget https://www.python.org/ftp/python/3.6.0/Python-3.6.0a1.tar.xz

3、  解压安装包,使用命令:

  tar xvf Python-3.6.0a1.tar.xz

4、  执行命令:

  ./configure

执行成功出现类似如下提示:

如果出现类似“configure: error: no acceptable C compiler found in $PATH”提示,是因为未安装合适的编译器。

解决方法:安装/升级gcc及其他依赖的包,使用命令:

  sudo yum install gcc-c++

并在随后提示安装包是否OK是,输入y并回车。出现类似如下提示说明依赖的包安装成功:

再重新执行./configure 命令即可。

5、  执行命令:

  make && make install

执行成功,提示pip错误,原因是我的系统中少了openssl-devel包,可以先忽略。

6、  查看python3版本,使用命令:

<span style="color:#333333">  python3 --version</span>

7、  再使用命令:

<span style="color:#333333">   python3</span>

出现类似如下提示,则说明python3安装成功。

升级默认pip版本

pip通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。Python3安装成功后自带pip3,但版本比较老,建议升级到pip最新版本。同时前面安装python3提示“Ignoring ensurepip failure: pip 8.1.1 requires SSL/TLS”错误,导致pip未成功安装。

1、先安装openssl-devel包,使用命令:

<span style="color:#333333"> yum install openssl-devel -y</span>

2、重新执行命令:

<span style="color:#333333">  make && make install</span>

出现如下提示说明安装pip成功:

3、升级pip3,使用命令:

<span style="color:#333333">  pip3 install --upgrade pip</span>

出现如下提示说明升级pip到最新版本了:

安装Web.py框架

这里为和微信公众技术平台教程保持一致,也使用Web.py框架。Web.py官方教程地址:http://webpy.org/,使用如下命令安装web.py:

<span style="color:#333333">pip3 install web.py==0.40.dev0</span>

安装WinSCP

通常情况下,我们在本地Windows操作系统上编辑代码,完成后再上传至弹性云服务器上(CentOS Linux系统)。WinSCP 是一个 Windows 环境下使用的 SSH 的开源图形化 SFTP 客户端, 同时支持 SCP 协议。它的主要功能是在本地与远程计算机间安全地复制文件,并且可以直接编辑文件。

WinSCP安装链接:https://winscp.net/eng/docs/lang:chs

2.2 上传代码

1、新建main.py文件,拷贝如下代码:

# -*- coding: utf-8 -*-
# filename: main.py
import web
from handle import Handle urls = (
'/wx', 'Handle',
) if __name__ == '__main__':
app = web.application(urls, globals())
app.run()

2、新建handle.py文件,拷贝如下代码:

# -*- coding: utf-8 -*-
# filename: handle.py import hashlib
import web
import receive
import time
import os class Handle(object): 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):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "此处内容与公众号基本配置里Token字段取值保持一致" list = [token, timestamp, nonce]
list.sort()
s = list[0] + list[1] + list[2]
hashcode = hashlib.sha1(s.encode('utf-8')).hexdigest()
print( "handle/GET func: hashcode, signature: ", hashcode, signature)
if hashcode == signature:
return echostr
else:
return echostr
except (Exception) as Argument:
return Argument def POST(self):
try:
webData = web.data()
print("Handle Post webdata is:\n", webData)
#打印消息体日志
recMsg = receive.parse_xml(webData) if isinstance(recMsg, receive.Msg) and recMsg.MsgType == 'text':
toUser = recMsg.FromUserName
fromUser = recMsg.ToUserName
content = "欢迎关注云图说!" + str(recMsg.Content)
print('Reply message info:\n')
print('toUser =', toUser)
print('fromUser = ', fromUser)
print('content = ', content)
return self.render.reply_text(toUser, fromUser, int(time.time()), content)
else:
print("不支持的消息类型:",recMsg.MsgType)
return "success"
except (Exception) as Argment:
return Argment

3、新建receive.py文件,拷贝如下代码:

# -*- coding: utf-8 -*-
# filename: receive.py
import xml.etree.ElementTree as ET def parse_xml(web_data):
if len(web_data) == 0:
return None
xmlData = ET.fromstring(web_data)
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
return TextMsg(xmlData)
elif msg_type == 'image':
return ImageMsg(xmlData)
elif msg_type == 'location':
return LocationMsg(xmlData)
elif msg_type == 'event':
return EventMsg(xmlData) class Event(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.Eventkey = xmlData.find('EventKey').text class Msg(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.MsgId = xmlData.find('MsgId').text class TextMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Content = xmlData.find('Content').text class ImageMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.PicUrl = xmlData.find('PicUrl').text
self.MediaId = xmlData.find('MediaId').text class LocationMsg(Msg):
def __init__(self, xmlData):
Msg.__init__(self, xmlData)
self.Location_X = xmlData.find('Location_X').text
self.Location_Y = xmlData.find('Location_Y').text class EventMsg(Msg):
def __init__(self, xmlData):
Event.__init__(self, xmlData)
self.Event = xmlData.find('Event').text

4、新建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>

5、最终本地代码文件形成如下:

通过WinSCP工具将上述文件与目录上传至弹性云服务指定目录下:

2.3 启动服务

使用如下命令启动服务:

python3 main.py 80

未报错,则说明启动成功,参考如下:

2.4 启用开发者模式

1、公众平台官网登录之后,找到“开发”——>“基本配置”菜单栏,点击“修改配置”。

2、填写URL与Token取值,EncodingAESKey可以随机生成,加解密方式简单起见使用“明文模式”,点击“提交”。参考如下:

3、在弹出的提示框中,点击“确定”。

4、验证token成功,点击启用。

备注:如果token验证失败,请检查Token取值配置与handle.py中GET消息处理代码。

2.5 验证

使用微信关注公众号,任意发送一条文本消息,看是否能够收到回复。出现如下回复则表明系统处理正常。

Python微信公众号教程基础篇——收发文本消息的更多相关文章

  1. Python微信公众号开发—小白篇

    本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造专栏],欢迎大家关注. github仓库地址http ...

  2. Python微信公众号开发—小白篇(1)

    本文面向想通过Python学习公众号开发的同学.一站式解决新手开发微信公众号遇到的所有问题. 为了防止我的文章被到处转载,贴一下我的公众号[智能制造社区],欢迎大家关注. github仓库地址http ...

  3. PHP实现微信公众平台开发—基础篇

    PHP实现微信公众平台开发—基础篇 2 1课程介绍 2 2. 微信公众号账号介绍的申请流程详解 2 2.1微信三角色关系 2 2.2信息流的过程 2 2.4微信公众账号的认证 3 2.5订阅号的申请流 ...

  4. 微信公众号开发C#系列-7、消息管理-接收事件推送

    1.概述 在微信用户和公众号产生交互的过程中,用户的某些操作会使得微信服务器通过事件推送的形式通知到开发者在开发者中心处设置的服务器地址,从而开发者可以获取到该信息.其中,某些事件推送在发生后,是允许 ...

  5. python爬微信公众号前10篇历史文章(1)-思路概览

    作为程序员,要时刻保持一颗好奇心和想要学习的姿态. 练习怎样利用搜狗微信爬取某指定微信公众号的历史文章.爬取微信公众号本身难度非常大,感谢搜狗提供了一个可以爬取数据的平台. 代码部分参考于: http ...

  6. .net微信公众号开发——基础接口

    作者:王先荣    本文讲述微信公众号开发中基础接口的使用,包括以下内容:    (1)获取许可令牌(AccessToken):    (2)获取微信服务器地址:    (3)上传.下载多媒体文件:  ...

  7. Python微信公众号开发

    最近老大叫我学习开发微信,试着玩了下.网上查了下文档.有点过时. 简单步骤: 1)申请服务器并完成环境配置 去腾讯云购买云服务器.当然你也可以购买其他产品,比如阿里云.因为我是学生,有优惠110一年. ...

  8. python微信公众号开发学习记录

    网上有很多微信公众号的开发教程,但是都是好几年前的了,而且很多都是抄袭其他人的,内容几乎一模一样.真的无语了.只好自己总结一下开发的一些简单流程. 一先去注册个微信公众号,这个就不详细说了, 二登录后 ...

  9. nodejs 中koa框架下的微信公众号开发初始篇

    最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂 ...

随机推荐

  1. NOIP模拟 17

    这次.. 考场刚了T1T2两题的正解 然后T2A了,T1被毒瘤卡常 让skyh得了rank1,QMQ 话说这次考试体(r)验(p)极(yong)佳(jin) 也许是昨晚没玩狼人杀睡的比较好?(现场%苗 ...

  2. SP5150 JMFILTER - Junk-Mail Filte(并查集)

    直秒并查集.这题的难点就在于怎么删点.如果要删的是叶节点,那还好,直接刨掉即可 如果是中间节点甚至是根节点,那就不好办了..... solution: 对于独立一个点,我可以用邻接表模拟,然后用并查集 ...

  3. 用OpenGL画线

    . 两点之间的连线称之为线段,在屏幕上显示线段放在现在已经不是稀奇的事情,大多数高级图形API都可以轻松实现,我尝试用OpenGL画线,在这里记录一下收获. . OpenGL这个级别的图形API,通常 ...

  4. getchar()用法 【转】

    1.从缓冲区读走一个字符,相当于清除缓冲区 2.前面的scanf()在读取输入时会在缓冲区中留下一个字符'\n'(输入完s[i]的值后按回车键所致),所以如果不在此加一个getchar()把这个回车符 ...

  5. beacon帧字段结构最全总结(一)——beacon基本结构

    一.beacon帧主要结构 二.MAC  header 1.Version:版本号,目前为止802.11只有一个版本,所以协议编号为0 2.Type:定义802.11帧类型,802.11帧分为管理帧( ...

  6. jquery each循环遍历完再执行的方法

    jquery each循环遍历完再执行的方法 因为each是异步的 所以要加计数器. var eachcount=0; <pre> $(".emptytip").eac ...

  7. layaair和egret的区别

    egret缺点1 编译速度非常慢 2 就是强类型转换非常的麻烦 3 只能用ts 所以只能用他们的IDE 不能用sublime layaair唯一不足的就是 insepct太垃圾 占用游戏界面 所以建议 ...

  8. 接口测试专题(Java & jmeter & Linux基础)

    以下是我和两个朋友原创文章合集,主题是接口测试,有Java接口测试案例和jmeter的案例,还有接口测试相关服务器操作基础.欢迎点赞.关注和转发. 接口测试 httpclient处理多用户同时在线 h ...

  9. [剑指offer]删除链表中重复的结点(把重复的都删掉,1个不留)

    ①题目 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 ...

  10. 暑假CV-QKD的相关论文单词集(第一弹)

    CV-QKD  连续变量-量子秘钥分发 Quadrature  正交 Photon     光子 Coherent    连续的,连贯的 Reconciliation   调解 Cryptograph ...