其實早在微信開放公眾號開發平台時就想弄一個自己的公眾號服務器,奈何對web服務器搭建和開發一竅不通,只是注冊了一下開發者帳號,並沒有采取行動,萬惡的拖延症。
前一年,開始接觸python,打開了神奇世界的大門,以前都是用C,C++寫程序,開發一個程序就像安裝一台機器,有嚴格的說明書,一步一步不能有差。而用python開發,特別是
自己用的助手程序,怎么說呢,就像飛在空中一般,廣闊天空,任爾發揮。python的精彩在這里不做贅述,自己也只是學了一點皮毛,還有更好玩的在后面等着去學,繼續努力哈。
最初學python,是看的《python基礎教程》,對我而言是本不錯的書,第15章就是介紹python web開發,只需要簡單的代碼就可以搭建一個簡單的服務器,並且也知道了python的
網絡框架Django,再后來開始看《Django Web開發指南》,加上自己有一些需求,想定制自己的微信公眾號,給自己提供特定的功能,就有了用Django搭建自己的微信公眾號服務器的念頭。
Django和Apache 搭建web服務器,是比較簡單的,《Django Web 開發指南》上有,推薦到這個網站上去看一下
http://www.ziqiangxuetang.com/django/django-deploy.html
這個網址專門講了Django開發,從初級到實踐,作者講的很好。這里只是建議在開發階段把Django 的Debug 設置成True(默認就是True),這樣在訪問服務器出錯時,可以在瀏覽器上看到出錯在哪里,
當然,在linux上,查看/var/log/apache2/error.log 也可以查看出錯的日志。
對於服務器來說,一般是不關機的,對我來說,一直開着台式機好像有點浪費電,因為現在服務只提供給個人,在網上買個雲服務器也划不來,剛好有塊閑置的樹莓派二代,就想把服務器搭在pi上面,平時只要
用手機充電器供電即可。
搭建內網服務器,最主要的問題是如何讓外網能訪問家里的內網,我用的是在花生殼(http://hsk.oray.com/)上注冊一個帳號,它會免費提供一個動態域名,家里用的是TP_Link路由器,在“動態DNS”設置里面
填寫注冊的帳號和密碼,登錄,正常就會顯示連接成功,下面的域名信息就可以用作你服務器的域名。接下來就是配置外網訪問內網的端口號,通過配置路由器的轉發規則可以進行映射
上面的IP地址就是內網服務器的IP地址,服務器端口號就是外網訪問時的端口號,內部端口號就是映射到內網服務器監聽的端口號,就這樣外網可以通過域名訪問內網的服務器了,可以通過瀏覽器加端口號訪問測試,如
http://xxx.xicp.net/:443/
服務器訪問配置基本就這些了,接下來就是把服務器的信息添加到微信公眾號開發平台上,在自己的開發帳號中,開發--》基本配置 中,填寫服務器配置 URL就填寫上面的域名 http://xxx.xicp.net(下面會對這個進行修改),
Token(令牌),隨便填寫一個,在服務器端填成一致就可以了,消息加解密方式,開發階段填成明文模式就可以了,提交,顯示URl訪問超時!!! 這里是碰到的第一只攔路虎,一開始不明白為什么會訪問超時,因為查看其他人的教程,
都是這么配置的,並且用瀏覽器訪問服務器都是好的,當出現問題時,不要着急去網上找資料,先自己想想,查看一下配置步驟,看看官方的開發文檔。終於,看到微信公眾號平台支持兩個端口號80和443,如果在路由器上映射80端口的話,
會提示80端口被占用,是被電信占用了,沒辦法,只能映射443端口了,這就需要搭建apache ssl訪問了,因為443端口就是對應的https訪問。
apache 上搭建https訪問(謝謝網上的分享者):
1.sudo a2enmod ssl
2.sudo apt-get install openssl //安裝openssl (如果已經安裝了openssl,就不用安裝了,派上面應該已經安裝了)
3.openssl genrsa -des3 -out server.key 1024 //創建CA簽名, 會提示輸入密碼,密碼在后面啟動服務器時需要輸入
4.openssl req -new -key server.key -out server.csr //創建CSR
5.openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt //自己簽發證書
6.sudo cp server.crt /etc/ssl/certs //拷貝文件到ssl的目錄下
7.sudo cp server.key /etc/ssl/private
然后在apache服務器配置里面,需要添加一些東西,在/etc/apache2/sites-available/ 這個目錄下,有我的之前的apache配置web.conf,這個是自己創建的,
我的配置如下
<VirtualHost *:443> #修改成443
ServerName you.xicp.net #你的服務器域名
ServerAlias you.xicp.net
ServerAdmin admin
SSLEngine On
SSLOptions +StrictRequire
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key
#下面的配置和你的Django工程有關,配置說明參照 http://www.ziqiangxuetang.com/django/django-deploy.html
Alias /media/ /home/pi/project/media/
Alias /static/ /home/pi/project/static/
<Directory /home/pi/project/media>
Require all granted
</Directory>
<Directory /home/pi/project/static>
Require all granted
</Directory>
WSGIScriptAlias / /home/pi/project/wsgi.py
<Directory /home/pi/project/app>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>
紅色的是配置https訪問加上的內容
然后
sudo a2ensite web.conf #讓自己的配置生效
在Django工程代碼中添加url訪問
url(r'^$',comm_view.index),
comm_view.index 是你自己的view訪問函數,我的代碼如下
#coding=utf-8 from django.shortcuts import render from django.http import HttpResponse # Create your views here. import hashlib import json from django.utils.encoding import smart_str from django.views.decorators.csrf import csrf_exempt WX_TOKEN = "yourtoken" @csrf_exempt def index(request): print("wx request") if request.method == "GET": signature = request.GET.get("signature",None) timestamp = request.GET.get("timestamp",None) nonce = request.GET.get("nonce",None) echostr = request.GET.get("echostr",None) token = WX_TOKEN tmp_list =[token,timestamp,nonce] tmp_list.sort() tmp_str = "%s%s%s" % tuple(tmp_list) tmp_str = hashlib.sha1(tmp_str.encode("unicode_escape")).hexdigest() if tmp_str == signature: return HttpResponse(echostr) else:return HttpResponse("sucess")
再去微信公眾號開發平台上配置服務器配置,URL這時候要改成https://xxx.xicp.net,其他配置不變,提交后,服務器正常工作的話,就會提示成功!!!。然后 在“修改配置”的邊上點擊“啟用”配置。
這樣微信公眾號這邊也就配置完成了。
再回到上面的代碼,上面的代碼可以看到是一個“GET”請求,是微信公眾號訪問我們的服務器驗證,如果訂閱的人提交消息給我們的公眾號,則微信服務器會把消息POST給我們的服務器,我們服務器要做的
就是對POST請求進行處理,返回結果給微信公眾號服務器再顯示到用戶微信上。
一開始,我是這樣寫的 (接上面代碼)
elif request.method == "POST": HttpResponse("ok,hello")
用自己的微信進行測試時提示“該公眾號暫時無法提供服務,請稍候再試”,但是用瀏覽器訪問又是正常的,用開發平台提供的怎么都沒想明白,只能繼續看開發文檔,公眾號的開發文檔還是寫的很好的(十分感謝),看到文檔給的例子是接收時對xml進行解析,返回時組成xml格式,在想是不是一定要組成xml格式文檔才行,用開發文檔提供的例子(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5&token=&lang=zh_CN),返回時組成xml格式,再試試,成功了!!當然也不是一次就成功的~~,這中間把收到的ToUserName和FromUserName 賦值給了返回的ToUserName和FromUserName,導致用開發平台的工具(http://mp.weixin.qq.com/debug)調試時,能正常收到回應,而用自己的微信號發送消息還是失敗,后來仔細檢查了一下代碼才發現,收到消息時的ToUserName賦值給了回應消息時的FromUserName,這樣微信公眾號不混亂才怪,互調之后,終於成功。看着微信上回應"OK KO",雖然只是簡單的一句話,但內心還是深深的滿足感,這也許就是程序員的小滿足。
寫這份記錄,是對這個過程的一個筆記,用於自己日后查看,第二就是在搭建過程中網上查到的資料和自己的一些體會整理一下,希望能給有相同需求的同學給予一點點幫助。好了,屬於自己的服務器搭好了,借着微信的強大平台,定制自己的服務吧!