Django搭建微信後端(1)---回覆消息和自定義菜單

版權聲明:http://blog.csdn.net/tangzongyu123/article/details/75269187

依賴包文檔位置
wechatpy文檔位置:http://wechatpy.readthedocs.io/zh_CN/master/install.html
微信文檔位置:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432
Django1.8中文文檔位置:http://python.usyiyi.cn/translate/django_182/index.html

本文是在自己做完了一個簡單的公衆號應用之後,希望把整個過程記錄下來,分享出來,

微信開發包用的是wechatpy,web後端用Django搭建,需要一定的Django基礎

一開始開發的是用測試號,因爲測試號擁有較爲完整的權限(不包含支付權限)

可以到 https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login申請一個測試號

(一)微信檢驗部分

1.微信接口編寫

微信每一次訪問服務器的時候,都會先訪問這個接口,以檢驗服務器的有效性,纔會進行其他請求,

這個接口主要是接受微信的get請求,並通過指定的加密算法回覆

views.py

def wexin(request):
    """
    所有的消息都會先進入這個函數進行處理,函數包含兩個功能,
    微信接入驗證是GET方法,
    微信正常的收發消息是用POST方法。
    """
    # 這個WEIXIN_TOKEN是在測試號的配置頁面中配置的,等會會講到
    WEIXIN_TOKEN = 'tangzongyu'
    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 = WEIXIN_TOKEN
        tmp_list = [token, timestamp, nonce]
        tmp_list.sort()
        tmp_str = "%s%s%s" % tuple(tmp_list)
        tmp_str = hashlib.sha1(tmp_str).hexdigest()
        if tmp_str == signature:
            return HttpResponse(echostr)
        else:
            return HttpResponse("error")

urls.py

 url(r'^wexin$',views.wexin,name='wexin'),

在這一步,之後需要把項目部署到服務器,部署文檔可以參看這篇文章http://www.open-open.com/lib/view/open1437358241849.html,應該是不難的

2.進入測試號界面進行配置

這裏寫圖片描述

說明:appID和appsecret是自動生成的,url是你部署的上述url,token即是代碼之前用到的WEIXIN_TOKEN

特別說明:這個url在配置的時候,一定要已經部署過有效的url,才能配置成功,而不是先配置再寫代碼,否則這個接口走不通,則配置失敗.

(二)收發消息和自定義菜單

1.處理簡單的文本消息

微信用戶向公衆號發消息的時候,會向我們剛纔配置的接口發送POST請求(當然還是先發送GET請求以檢驗接口),處理代碼接着上一段代碼:

from wechatpy import parse_message
from wechatpy.replies import TextReply

def wexin(request):
    """
    所有的消息都會先進入這個函數進行處理,函數包含兩個功能,
    微信接入驗證是GET方法,
    微信正常的收發消息是用POST方法。
    """
   #此處省略上面的那一段GET請求代碼
    else:
        xml = request.body
        msg = parse_message(xml)
        if msg.type == 'text':
            #獲取文本內容
            content = msg.content
            try:
                reply = TextReply(content=content,message=msg)
                r_xml = reply.render()
                # 獲取唯一標記用戶的openid,下文介紹獲取用戶信息會用到
                openid = msg.source
                return HttpResponse(r_xml)
            except Exception as e:
                #自行處理
                pass

2.創建自定義的菜單

微信文檔中對自定義菜單的說明如下:

1、click:點擊推事件用戶點擊click類型按鈕後,微信服務器會通過消息接口推送消息類型爲event的結構給開發者(參考消息接口指南),並且帶上按鈕中開發者填寫的key值,開發者可以通過自定義的key值與用戶進行交互;
2、view:跳轉URL用戶點擊view類型按鈕後,微信客戶端將會打開開發者在按鈕中填寫的網頁URL,可與網頁授權獲取用戶基本信息接口結合,獲得用戶基本信息。
3、scancode_push:掃碼推事件用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操作後顯示掃描結果(如果是URL,將進入URL),且會將掃碼的結果傳給開發者,開發者可以下發消息。
4、scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操作後,將掃碼的結果傳給開發者,同時收起掃一掃工具,然後彈出“消息接收中”提示框,隨後可能會收到開發者下發的消息。
5、pic_sysphoto:彈出系統拍照發圖用戶點擊按鈕後,微信客戶端將調起系統相機,完成拍照操作後,會將拍攝的相片發送給開發者,並推送事件給開發者,同時收起系統相機,隨後可能會收到開發者下發的消息。
6、pic_photo_or_album:彈出拍照或者相冊發圖用戶點擊按鈕後,微信客戶端將彈出選擇器供用戶選擇“拍照”或者“從手機相冊選擇”。用戶選擇後即走其他兩種流程。
7、pic_weixin:彈出微信相冊發圖器用戶點擊按鈕後,微信客戶端將調起微信相冊,完成選擇操作後,將選擇的相片發送給開發者的服務器,並推送事件給開發者,同時收起相冊,隨後可能會收到開發者下發的消息。
8、location_select:彈出地理位置選擇器用戶點擊按鈕後,微信客戶端將調起地理位置選擇工具,完成選擇操作後,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨後可能會收到開發者下發的消息。
9、media_id:下發消息(除文本消息)用戶點擊media_id類型按鈕後,微信服務器會將開發者填寫的永久素材id對應的素材下發給用戶,永久素材類型可以是圖片、音頻、視頻、圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳後獲得的合法id。
10、view_limited:跳轉圖文消息URL用戶點擊view_limited類型按鈕後,微信客戶端將打開開發者在按鈕中填寫的永久素材id對應的圖文消息URL,永久素材類型只支持圖文消息。請注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳後獲得的合法id。

我主要用到了兩種:

1.掃碼推事件(用戶掃平臺製作的二維碼,處理二維碼信息並反饋給用戶)

2.點擊跳轉網頁:最常用的方式,把用戶引向你的網頁,可以獲取用戶的基本信息

其他的原理類似

創建自定義菜單:

#-*- coding:UTF-8
#創建菜單
from wechatpy import WeChatClient
client =  WeChatClient('your_id','your_secret')
client.menu.create({
    'button':[
        {
            "type": "scancode_waitmsg",
            "name": "掃一掃條形碼",
            "key" : 'isbn_sao'
        },
        {
            "type": "view",
            "name": "我的網站",
            "url": "這個網址下文細說,這個字典可以暫時去掉"
        }
    ]
})

查看已有的菜單,你當然可以直接訪問公衆號查看

menu = client.menu.get()
print menu

創建結果:

這裏寫圖片描述

3.處理自定義菜單的事件消息(掃碼事件)

我這裏以掃碼事件舉例,其他的事件我在下篇文章介紹

同樣,用戶觸發這些事件的時候,微信訪問的仍然是上面說的那個接口

def wexin(request):
    """
    所有的消息都會先進入這個函數進行處理,函數包含兩個功能,
    微信接入驗證是GET方法,
    微信正常的收發消息是用POST方法。
    """
        #承接上段代碼
        elif msg.type == 'event':
            try:
                push = ScanCodeWaitMsgEvent(msg)
                #獲取二維碼信息,字符串
                content = msg.scan_result
                print content
                # 如何處理,自行處理,回覆一段文本或者圖文
                reply = TextReply(content="something", message=msg)
                r_xml = reply.render()
                return HttpResponse(r_xml)
            except Exception as e:
                #暫時不處理
                pass

到這裏,我們實現了啥:能回覆用戶信息,能處理用戶的事件,如點了到掃碼功能的按鈕,

點了能跳轉網頁的按鈕(獲取用戶信息尚未接受)

貌似還是簡單了點,已經入門了,下篇文章中我會介紹如何獲取用戶信息,獲取用戶地理位置,給用戶主動發消息通知,以及在配合前端網頁工作的一些接口,敬請期待。

版權聲明:http://blog.csdn.net/tangzongyu123/article/details/75269187

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章