Django + Apache + 樹莓派 搭建內網微信公衆號服務器

  其實早在微信開放公衆號開發平臺時就想弄一個本身的公衆號服務器,奈何對web服務器搭建和開發一竅不通,只是註冊了一下開發者賬號,並無採起行動,萬惡的拖延症。html

前一年,開始接觸python,打開了神奇世界的大門,之前都是用C,C++寫程序,開發一個程序就像安裝一臺機器,有嚴格的說明書,一步一步不能有差。而用python開發,特別是python

本身用的助手程序,怎麼說呢,就像飛在空中通常,廣闊天空,任爾發揮。python的精彩在這裏不作贅述,本身也只是學了一點皮毛,還有更好玩的在後面等着去學,繼續努力哈。linux

  最初學python,是看的《python基礎教程》,對我而言是本不錯的書,第15章就是介紹python web開發,只須要簡單的代碼就能夠搭建一個簡單的服務器,而且也知道了python的程序員

網絡框架Django,再後來開始看《Django Web開發指南》,加上本身有一些需求,想定製本身的微信公衆號,給本身提供特定的功能,就有了用Django搭建本身的微信公衆號服務器的念頭。web

  Django和Apache 搭建web服務器,是比較簡單的,《Django Web 開發指南》上有,推薦到這個網站上去看一下 apache

http://www.ziqiangxuetang.com/django/django-deploy.html

這個網址專門講了Django開發,從初級到實踐,做者講的很好。這裏只是建議在開發階段把Django 的Debug 設置成True(默認就是True),這樣在訪問服務器出錯時,能夠在瀏覽器上看到出錯在哪裏,django

固然,在linux上,查看/var/log/apache2/error.log 也能夠查看出錯的日誌。json

  對於服務器來講,通常是不關機的,對我來講,一直開着臺式機好像有點浪費電,由於如今服務只提供給我的,在網上買個雲服務器也划不來,恰好有塊閒置的樹莓派二代,就想把服務器搭在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 #讓本身的配置生效

sudo /etc/init.d/apache2 restart #重啓apache服務器
重啓apache服務器後,會讓你輸入密碼,就是一開始建立CA簽名時輸入的密碼

在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",雖然只是簡單的一句話,但心裏仍是深深的知足感,這也許就是程序員的小知足。

  寫這份記錄,是對這個過程的一個筆記,用於本身往後查看,第二就是在搭建過程當中網上查到的資料和本身的一些體會整理一下,但願能給有相同需求的同窗給予一點點幫助。好了,屬於本身的服務器搭好了,藉着微信的強大平臺,定製本身的服務吧!

相關文章
相關標籤/搜索