更新時間:2020年3月7日
微信公眾號開發的硬件必備條件:(1)申請一個公眾號 (2)有公網ip的服務器(最好是阿里云,騰訊云等的云服務器)(3)解析到(2)中服務器地址的域名(阿里云,騰訊云購買即可)。
1. 微信公眾號申請
個人可申請訂閱號,申請教程參考:https://jingyan.baidu.com/article/020278113d07531bcc9ce5a5.html
2. 后臺服務器配置
微信公眾號只是相當于流量轉發,而具體功能的實現需要在后端服務器上去具體實現。而微信公眾號開始只支持域名訪問(不支持ip直接訪問,這也是為什么要域名的原因),只支持80端口(http)或者443端口(https)
2.1 nginx的安裝與配置
后端服務器需要有軟件提供網頁服務器功能,我們采用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
安裝,管理員賬戶下運行:
./configuremakemake install
在瀏覽器輸入域名:www.xxxxx.cn 后:
(5)nginx配置
因為微信公眾號只能利用80端口或者433端口,所以我們可以使用nginx做端口轉發,使得服務器得到充分利用。
在nginx.conf文件中(vim /usr/local/nginx/conf/nginx.conf)加入下面代碼:
# hsb_signal_towerlocation /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端口部屬自己的開發服務.
2.2 python安裝
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.bakln -s /usr/local/python3/bin/python3 /usr/bin/python#配置yum,因為yum是基于python2的vim /usr/bin/yum把#! /usr/bin/python修改為#! /usr/bin/python2vim /usr/libexec/urlgrabber-ext-down把#! /usr/bin/python 修改為#! /usr/bin/python2# 添加環境量vim .bashrcexport PATH=/usr/local/python3/bin:$PATH# pip3 軟連接到pipln -s /usr/local/python3/bin/pip3 /usr/bin/pip
3 公眾號配置
這一塊兒分兩部分,相當于微信公眾號與后端服務器的通信驗證。微信公眾號端有唯一的token,在服務器端驗證這個token來完成整個通訊驗證工作。token是惟一的,所以一定要保密。
3.1 微信公眾號端配置
(1)進入公眾號拉到最下面,進入基本配置。
(2)填寫信息
(a) url填寫域名,一定要與nginx配置中一致
(b)token中自己填寫,這是公眾號開發的唯一識別符,請牢記。
(c)第三個點隨機生成。
填完之后先不要提交,接下來在服務器端構建一個驗證服務。
3.2 服務器端構建驗證服務
本實例使用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")# 校驗echostrif not echostr:abort(400)return echostrelif 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失敗,此時服務器端會有相應的錯誤。如果驗證成功,則用戶可以在公眾號中發送信息,公眾號會返回發送信息。
希望大家耐心調試。
總結
以上是生活随笔為你收集整理的python 微信公众号开发[1] 后台服务器端配置与公众号开发配置的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。