赞
踩
更新时间:2020年3月7日
微信公众号开发的硬件必备条件:(1)申请一个公众号 (2)有公网ip的服务器(最好是阿里云,腾讯云等的云服务器)(3)解析到(2)中服务器地址的域名(阿里云,腾讯云购买即可)。
个人可申请订阅号,申请教程参考:https://jingyan.baidu.com/article/020278113d07531bcc9ce5a5.html
微信公众号只是相当于流量转发,而具体功能的实现需要在后端服务器上去具体实现。而微信公众号开始只支持域名访问(不支持ip直接访问,这也是为什么要域名的原因),只支持80端口(http)或者443端口(https)
后端服务器需要有软件提供网页服务器功能,我们采用nginx,比较方便。
安装流程:
(1)安装gcc(使用gcc -v可以查看gcc是否安装):
yum -y install gcc
(2)安装依赖:
yum install -y pcre pcre-devel
yum install -y zlib zlib-devel
yum install -y openssl openssl-devel
(3) 下载nginx
wget http://nginx.org/download/nginx-1.9.9.tar.gz
(4)解压与安装
tar -zxvf nginx-1.9.9.tar.gz
解压完成后进入该文件夹
cd nginx-1.9.9
安装,管理员账户下运行:
./configure
make
make install
在浏览器输入域名:www.xxxxx.cn 后:
(5)nginx配置
因为微信公众号只能利用80端口或者433端口,所以我们可以使用nginx做端口转发,使得服务器得到充分利用。
在nginx.conf文件中(vim /usr/local/nginx/conf/nginx.conf
)加入下面代码:
# hsb_signal_tower
location /data/hsb_signal_tower {
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Scheme $scheme;
proxy_pass http://127.0.0.1:8000;
}
这样 访问www.xxxx.cn/data/hsb_signal_tower 就会转发到8000端口,之后在8000端口部属自己的开发服务.
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel
# 下载文件后执行下面的操作 #释放文件: tar -xvzf Python-3.5.1.tgz #进入目录: cd Python-3.5.1/ # 添加配置: ./configure --prefix=/usr/local/python3 # 这里配置自己的安装目录,接下来编译源码: make # 执行安装: make install # 重新建立连接 mv /usr/bin/python /usr/bin/python.bak ln -s /usr/local/python3/bin/python3 /usr/bin/python #配置yum,因为yum是基于python2的 vim /usr/bin/yum 把#! /usr/bin/python修改为#! /usr/bin/python2 vim /usr/libexec/urlgrabber-ext-down 把#! /usr/bin/python 修改为#! /usr/bin/python2 # 添加环境量 vim .bashrc export PATH=/usr/local/python3/bin:$PATH # pip3 软连接到pip ln -s /usr/local/python3/bin/pip3 /usr/bin/pip
这一块儿分两部分,相当于微信公众号与后端服务器的通信验证。微信公众号端有唯一的token,在服务器端验证这个token来完成整个通讯验证工作。token是惟一的,所以一定要保密。
(1)进入公众号拉到最下面,进入基本配置。
(2)填写信息
(a) url填写域名,一定要与nginx配置中一致
(b)token中自己填写,这是公众号开发的唯一识别符,请牢记。
(c)第三个点随机生成。
填完之后先不要提交,接下来在服务器端构建一个验证服务。
本实例使用flask构建web应用
python代码如下,文件名为:wechat.py.需要修改的是使用自己的token。:
# coding:utf-8 from flask import Flask, request, abort, render_template import hashlib import xmltodict import time # 用它可以访问http请求地址 import urllib.request as urllib2 import urllib import json # 微信的token令牌 WECHAT_TOKEN = 'your token' app = Flask(__name__) @app.route("/data/hsb_signal_tower", methods=["GET", "POST"]) def wechat(): """验证服务器地址的有效性""" # 开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带四个参数: # signature:微信加密, signature结合了开发者填写的token参数和请求中的timestamp参数 nonce参数 # timestamp:时间戳(chuo这是拼音) # nonce: 随机数 # echostr: 随机字符串 # 接收微信服务器发送参数 signature = request.args.get("signature") timestamp = request.args.get("timestamp") nonce = request.args.get("nonce") # 校验参数 # 校验流程: # 将token、timestamp、nonce三个参数进行字典序排序 # 将三个参数字符串拼接成一个字符串进行sha1加密 # 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if not all([signature, timestamp, nonce]): # 抛出400错误 abort(400) # 按照微信的流程计算签名 li = [WECHAT_TOKEN, timestamp, nonce] # 排序 li.sort() # 拼接字符串 tmp_str = "".join(li) tmp_str = tmp_str.encode('utf-8') # 进行sha1加密, 得到正确的签名值 sign = hashlib.sha1(tmp_str).hexdigest() # 将自己计算的签名值, 与请求的签名参数进行对比, 如果相同, 则证明请求来自微信 if signature != sign: # 代表请求不是来自微信 # 弹出报错信息, 身份有问题 abort(403) else: # 表示是微信发送的请求 if request.method == "GET": # 表示第一次接入微信服务器的验证 echostr = request.args.get("echostr") # 校验echostr if not echostr: abort(400) return echostr elif request.method == "POST": # 表示微信服务器转发消息过来 # 拿去xml的请求数据 xml_str = request.data # 当xml_str为空时 if not xml_str: abort(400) # 对xml字符串进行解析成字典 xml_dict = xmltodict.parse(xml_str) xml_dict = xml_dict.get("xml") # MsgType是消息类型 这里是提取消息类型 msg_type = xml_dict.get("MsgType") if msg_type == "text": # 表示发送文本消息 # 够造返回值, 经由微信服务器回复给用户的消息内容 # 回复消息 # ToUsername: (必须传) 接收方账号(收到的OpenID) # FromUserName: (必须传) 开发者微信号 # CreateTime: (必须传) 消息创建时间(整形) # MsgType: (必须传) 消息类型 # Content: (必须传) 回复消息的内容(换行:在Content中能够换行, 微信客户端就支持换行显示) resp_dict = { "xml":{ "ToUserName":xml_dict.get("FromUserName"), "FromUserName":xml_dict.get("ToUserName"), "CreateTime":int(time.time()), "MsgType":"text", "Content":xml_dict.get("Content") } } else: resp_dict = { "xml": { "ToUserName": xml_dict.get("FromUserName"), "FromUserName": xml_dict.get("ToUserName"), "CreateTime": int(time.time()), "MsgType": "text", "Content": "对不起,不能识别您发的内容!" } } # 将字典转换为xml字符串 resp_xml_str = xmltodict.unparse(resp_dict) # 返回消息数据给微信服务器 return resp_xml_str if __name__ == '__main__': app.run(port=8000, debug=True)
以上代码参考大神的博客,原博客使用python2,上面代码适用于python3。再使用命令: python wechat.py
没有报错且出现以下信息则表示没有问题:
之后在(1)的配置页面点击提交按钮,如果验证失败则会提示验证token失败,此时服务器端会有相应的错误。如果验证成功,则用户可以在公众号中发送信息,公众号会返回发送信息。
希望大家耐心调试。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。