使用python django快速搭建微信公衆號後臺

前言

使用python語言,django web框架,以及wechatpy,快速完成微信公衆號後臺服務的簡易搭建,作記錄於此。html

wechatpy是一個python的微信公衆平臺sdk,封裝了被動消息和主動推送的各類api,作公衆平臺開發時只需關注消息內容,無需處理xml解析等工做。
項目地址:https://github.com/jxtech/wechatpy
文檔地址:http://docs.wechatpy.org/python

開始搭建

環境配置

首先固然是安裝django,安裝wechatpy。
可參照 http://docs.wechatpy.org/zh_CN/master/install.html 完成wechatpy及其依賴的安裝。git

配置url和view

項目urls.py中配置相應url,指定到本身的名爲mywechat應用中,如github

urlpatterns = [
    url(r'^wx/', include('mywechat.urls')),
]

mywechat應用中配置url指定到某個view:web

urlpatterns = [
    url(r'', views.handle_wx, name="wx"),
]

view處理微信請求

views.py中寫一個handle_wx方法,用於處理微信請求:django

from django.http import HttpResponse, HttpResponseRedirect
from django.views.decorators.csrf import csrf_exempt

from wechatpy import parse_message, create_reply
from wechatpy.utils import check_signature
from wechatpy.exceptions import InvalidSignatureException
from wechatpy.replies import BaseReply

# 如下兩個是本身定義的模塊,位於wechat.util包下,分別處理文本和事件消息
from mywechat.util import reply_text, reply_event

TOKEN = 'xxxxx'  # 這裏要指定一個token,後續填入到微信平臺中

@csrf_exempt
def handle_wx(request):
    # GET方式用於微信公衆平臺綁定驗證
    if request.method == 'GET':
        signature = request.GET.get('signature', '')
        timestamp = request.GET.get('timestamp', '')
        nonce = request.GET.get('nonce', '')
        echo_str = request.GET.get('echostr', '')
        try:
            check_signature(TOKEN, signature, timestamp, nonce)
        except InvalidSignatureException:
            echo_str = 'error'
        response = HttpResponse(echo_str, content_type="text/plain")
        return response
    # POST方式用於接受和返回請求
    else:
        reply = None
        msg = parse_message(request.body)
        # 判斷消息類型,文本消息則調用reply_text進行處理
        if msg.type == 'text':
            reply = reply_text.do_reply(msg)
        elif msg.type == 'event':
            reply = reply_event.do_reply(msg)
        else:
            pass
        if not reply or not isinstance(reply, BaseReply):
            reply = create_reply('暫不支持您所發送的消息類型喲~ 回覆「幫助」查看使用說明。', msg)
        response = HttpResponse(reply.render(), content_type="application/xml")
        return response

文本、圖片、語音等不少消息類型均支持,詳情參見:http://docs.wechatpy.org/zh_CN/master/messages.html#api

處理文本請求

新建reply_text.py,用於處理文本類消息。服務器

from wechatpy import parse_message, create_reply  
from wechatpy.replies import TextReply, ArticlesReply
from wechatpy.utils import check_signature  
from wechatpy.exceptions import InvalidSignatureException


def do_reply(msg):
    reply = None
    try:
        if msg.content == '天氣':
            # msg.content即爲消息內容
            reply = create_reply('相關回覆文本', msg)
        else:
            reply = create_reply('沒有此關鍵詞', msg)
    except Exception as e:
        print 'error:', e
    return reply

處理事件請求

能夠對用戶的關注、取關等事件進行處理。若是消息類型爲event,則會被view調用reply_event.py進行處理。微信

from wechatpy import create_reply

# 響應用戶關注/取關事件
def do_reply(msg):
    reply = None
    try:
        # 關注事件
        if msg.event == 'subscribe':
           reply = create_reply('你好呀', msg)
        elif msg.event == 'unsubscribe':
            # 用戶取關
            pass
        else:
            reply = create_reply('暫不支持您發送的內容', msg)
    except Exception as e:
        print('error:', e)
        reply = create_reply('出錯了', msg)
    return reply

支持更多類型的事件,詳細能夠查看wechatpy的文檔:http://docs.wechatpy.org/zh_CN/master/events.htmlapp

調試環境下的外網映射

完成以上代碼後,能夠處理簡單的關注和取關事件,並響應文字消息了。此時,須要先將調試環境映射到外網,能夠用花生殼這個軟件:http://hsk.oray.com/ , 可免費用來在測試程序時將本地服務映射到外網。

好比,綁定了 testwx.imwork.net 的域名(端口爲80),映射到 127.0.0.1:8000.

配置公衆號後臺

公衆號後臺也須要進行配置,進入「開發——基本配置」,填寫服務器配置。
url寫爲剛纔申請到的域名,並注意後面與django中的url同樣,即應當寫爲 http://testwx.imwork.net/wx/。
令牌(token)則是與上面view中的token相同。

可選擇明文方式的消息,也可根據須要選擇加密消息。
配置完成後,點擊保存時,公衆號後臺會向指定的url發送一次GET請求,若是代碼沒問題的話,則程序會返回預約的值,無誤後即完成綁定。

而後在公衆號中回覆文字,就能收到相應的消息了,公衆號後臺最基礎的開發就完成了。

這裏只簡略寫了最基本的配置,若是須要支持更多類型的事件或消息,或者主動經過api接口向公衆平臺推送,請參閱wechatpy的文檔吧,同時,有的操做也須要公衆號具備相應的權限才能夠。

ref.

http://www.cnblogs.com/ryhan/p/5011962.html

相關文章
相關標籤/搜索