程序可以实现很多美好的事情,如果有好的Idea,微信开发实现的功能完全可以替代电脑程序或手机APP。
偶然听同事聊天,说关注了某一电影资源微信公众号,只需在对话框回复电影名称,对方公众号便可直接推送这部电影的下载链接。
我便梳理了一下这个流程,这就相当于将电影网站的搜索框的功能,移植到了微信公众平台上面了。具体的实现思路应该是:
- 利用微信提供的接口,获取用户发送的消息
- 处理用户发来的消息,通过在事先准备好的数据库中匹配到对应的电影资源
- 再次通过消息回复接口发送给用户
上面第二部功能部分就不讲了,本文主要介绍对接微信公众平台的消息接口,然后实现简单消息自动回复的功能。
开发前的准备
需要准备两个东西:申请好的微信订阅号和一台云服务器。目前市面上为大家所熟知的云服务器包括:阿里云、新浪SAE和腾讯云。因为本人很早便申请了新浪云的服务器,所以本文是基于在SAE上测试的。
如果你需要申请SAE,可以使用我的专属推荐链接:http://t.cn/R5p4gRu,如果申请成功,对于我们两人都会有奖励。
另外:本文使用Python的Flask来开发。
新浪SAE的配置
因为微信后台配置时,需要验证自己事先设置好的服务器,所以这里先简单介绍一下新浪SAE的配置,和简单的微信验证代码。
进入自己的新浪云后台,选择创建新应用,然后开发语言选择Python,运行环境选择标准环境,填写自己唯一想要的二级域名和自己的应用名称,之后点击右边的创建应用按钮,即可创建成功。
下图为我已经创建好的应用:
之后便可以使用Git在自己电脑上编辑好代码,然后传至自己已经申请好的云应用中。
Git代码部署说明
在你应用的git代码目录里,添加一个新的git远程仓库 sae
$ git remote add sae https://git.sinacloud.com/jikenow
编辑代码并将代码部署到 sae
的版本1。
$ git add .
$ git commit -m 'Init my first app'
$ git push sae master:1
SAE支持Git、SVN、代码打包上传三种提交方式,具体请参考:http://www.sinacloud.com/doc/sae/tutorial/code-deploy.html#git
下面我给出的代码,也是通过以上git
方法传到云应用中,如果不是很清楚,可以阅读上面给出的帮助文档。
微信验证代码
当在微信后台配置自己的云服务器时,微信的服务器会发送GET请求至我们提供的URL,这时需要我们通过一些判断来确认其确实是由微信发起的请求,如果确认ok,就返还给微信echostr参数内容
。具体Python-Flask代码如下:
#coding:utf-8
from flask import Flask,request,make_response
import time,hashlib,re,requests
import xml.etree.ElementTree as ET
app = Flask(__name__)
@app.route('/weixin',methods = ['GET','POST'])
def weixin():
# 微信验证
if request.method == 'GET':
token = 'weixin'
query = request.args
signature = query.get('signature','')
timestamp = query.get('timestamp','')
nonce = query.get('nonce','')
echostr = query.get('echostr','')
s = [timestamp,nonce,token]
s.sort()
s = ''.join(s)
if hashlib.sha1(s).hexdigest() == signature:
return make_response(echostr)
注意我上面路由设置的是/weixin
后缀,所以我之后向微信后台添加的配置URL就是http://jikenow.applinzi.com/weixin
,前面的网址便是我申请的二级域名。
参考网址:微信接入指南
附逻辑流程图:
写好了之后保存为main.py
,然后还需要新建一个index.wsgi
的文件,是SAE要用到,文件内容如下:
import sae
from main import app
application = sae.create_wsgi_app(app)
保存好之后,将以上两个文件通过Git
传至云应用中。
微信公众平台后台开发者配置
- 进入微信公众平台后台,选择开发选项下的基本配置
- 之后可以看到服务器配置选项,点击修改配置
- 填写对应的服务器URL(http://jikenow.applinzi.com/weixin)和Token参数(本人用的是weixin,你可以设置自己唯一的字符),为了方便开发,加解密方式设置为明文模式,提交
- 此时微信便会发送GET请求至我们的服务器URL中,我们之前已设置好,所以应该会通过验证
- 点击启用即可成功
下图显示已启用(验证成功):
重头戏:被动回复用户消息
上面说了一大堆,只是一些准备工作而已,如果上面的准备工作有所不明白的,你可以参考我在文章末给出的几个链接文章。
回归正题,现在需要编写一个很简单的小程序,模仿用户说话,也就是用户向你发送什么文本内容,你原样返回给用户此文本内容即可。
流程有下面三点:
- 接收用户发送的普通文本消息,微信会通过POST方式将XML数据包发送给我们的URL中
- 复制此文本消息且生成回复的XML格式的数据
- 被动消息回复给微信服务器,然后即发送给用户
上面三点的逻辑清楚了,代码也就不难理解了,接着上面的微信验证代码来:
def weixin():
# 微信验证
# 上面给出
# 被动回复消息
else: # 即如果为POST请求执行下面的代码
xmlData = ET.fromstring(request.stream.read())
msg_type = xmlData.find('MsgType').text
if msg_type == 'text':
ToUserName = xmlData.find('ToUserName').text
FromUserName = xmlData.find('FromUserName').text
Content = xmlData.find('Content').text
reply = '''
%s
'''
response = make_response( reply % (FromUserName, ToUserName, str(int(time.time())), Content ) )
response.content_type = 'application/xml'
return response
搞好之后,保存main.py
文件,上传至服务器。至此,我们的微信模仿用户说话的小功能已经做好了。
功能虽小,但是已经迈出了第一步,之后的所有更强大的功能,都会在此基础上延伸。
参考网址
- 微信入门指引
- 微信消息对应的借口:接受普通消息和被动回复用户消息
- Flask+SAE快速打造微信公众帐号(有码)
- python,flask,SAE(新浪云),搭建开发微信公众账号