頻道欄目
首頁 > 微信學院 > 微信公眾平臺開發 > 正文
基于Django的微信公眾號開發之實現消息的接收與發送
2017-12-20 10:32:55         來源:yuuuuchang的博客  
收藏   我要投稿

基于Django的微信公眾號開發之實現消息的接收與發送

準備工作

在正式開始之前,需要做一些準備:

a: 安裝好wechat_sdk;

b: 成功通過了微信公眾號的開發者認證;

c: 新建一個應用(不是必須的), 我新建了一個dict應用.

需要注意的事項

在正式動手之前,首先我要說一下要注意的事(我踩過的坑):

a: 微信公眾號服務器在收到用戶在公眾號輸入的信息之后, 只會轉發到一個url上(就是你開發者認證時所填的那個url,所以只能通過這個url來接收信息)

b: 公眾號收到用戶的信息之后, 將會把它打包成規定的xml的模式通過你注冊的url發送到你的服務器上, 你發送給用戶的消息同樣要包裝成同樣格式的xml才能成功, 否則公眾號服 務器一律拒絕并在用戶端返回"該公眾號提供的服務出現故障, 請稍后再試"的提示(幸運的是在wechat_sdk已經有打包這種xml的方法了, 如果你想了解, 你可以看看公眾號的開發文檔)

c: 返回給用戶的文字一定要用utf-8格式

d: 每次發送的消息長度長度不能超過2048字節, 由于采用utf-8編碼, 所以請留意每個漢字都算作3個字節, 超長就要記得截斷發兩次了

調試技巧

無論你的服務器在調試過程中出了什么錯, 在用戶端都是提示"該公眾號提供的服務出現故障, 請稍后再試"的提示, 所以想只靠一個測試賬號來調試明顯是很不靠譜的. 在公眾號平臺上有一個調試 工具, 但是他也只會返回訪問的錯誤代碼(200/500之類的), 并沒有給出提示, 同樣也是很不靠譜, 那么我們該怎么樣知道我的服務器跟微信發送消息這部分出了什么問題呢?

我在開發過程中發現了一個技巧, 我們的服務器從公眾號服務器接收了一個包含xml格式的包, 并且開始讀取處理, 最后把處理結果(返回給用戶的文字)打包成xml包發送給公眾號服務器. 原理是這樣子. 那么我們只要偽造一個用戶發送信息的xml段, 保存在一個xml文件里面, 需要用的時候就讀取這個xml文件, 在后臺控制臺調試輸出包裝好的xml就行了 (當然你得先排除網絡連接的問題,因為網絡連接導致你的服務器接收不了,或者發送不了都有可能發生的). 需要發送不同的信息的時候, 寫個函數修改xml里面的消息部分就可以了.

開發過程

首先, 我們現在可以把用于通過微信公眾號驗證的代碼給注釋掉了(最好不要刪除), 然后我們新建一個相同名字的函數

下面是我的一些代碼(為了更了解整個基本的結構, 代碼有所刪減, 主要是獲取數據部分跟格式組裝部分)

# 這是段代碼是我dict應用的返回微信消息響應部分, 主要功能是獲取消息->做出對應反應->返回消息
# 為了方便大家理解, 有一部分我將會用"(--tips--)"的格式進行簡化, 只保留必要部分
# 代碼開始


# -*- coding: utf-8 -*-

# 這段是需要添加的,主要是為了添加path,保證django的正常運行
# (因為我的django用的是自己的包嘛)
import os
import sys
root = os.path.dirname(__file__)
sys.path.insert(0, os.path.join(root, '../site-packages/Django-1.9.7-py2.7.egg'))
os.environ['DJANGO_SETTINGS_MODULE'] = 'yuuuuchang.settings'

from django.shortcuts import render
from django.http.response import HttpResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt

from wechat_sdk import WechatBasic
from wechat_sdk.exceptions import ParseError
from wechat_sdk.messages import TextMessage, VoiceMessage, ImageMessage, VideoMessage, LinkMessage, LocationMessage, \
	EventMessage

# (-- 個人數據的調用, 自定義返回格式的組裝, 跟數據庫查詢的入口 --)

# wechat_sdk需要初始化一些數據
wechat = WechatBasic(token=WECHAT_TOKEN, appid=WEIXIN_APPID, appsecret=WEIXIN_APPSECRET)

# def wechat_message(request):
# 	""" 微信認證 """
# 	if request.method == 'GET':
# 	signature = request.GET.get('signature')
# 		timestamp = request.GET.get('timestamp')
# 		nonce = request.GET.get('nonce')
#
# 		if not wechat.check_signature(signature=signature, timestamp=timestamp, nonce=nonce):
# 			return HttpResponseBadRequest('Verify Failed')
# 		else:
# 			return HttpResponse(request.GET.get('echostr', ''), content_type='text/plain')


def wechat_message(request):
	""" 消息入口,用戶通過輸入框發送的消息都發到這里處理 """

	# 解析本次請求的 XML 數據
	try:
		wechat.parse_data(data=request.body)
	except ParseError:
		return HttpResponseBadRequest('無效的xml數據')

	# 獲取解析好的微信請求信息
	message = wechat.get_message()

	# 假如信息是文本格式
	# (TextMessage是wechat_sdk定義的一個文本消息類,下面還有語音類之類的,經過上面解析的消息都會歸屬到這些類中)
	if isinstance(message, TextMessage):
		context = message.content.strip()
		
		# 假設用戶輸入的是什么文字,然后做出相應反應
		if context == '筆記' or context == 'blog':
			tips = '這里設置你需要發給用戶的文字'

		elif context == '學習' or context == 'study':
			tips = '這里設置你需要發給用戶的文字'

		elif context == 'help':
			tips = '這里設置你需要發給用戶的文字'
			
		else:
			# (-- 獲取到context, 并且用這個context作為查詢條件在數據庫中查找相應結果 --)
			# (-- 如果你也有從數據庫獲取數據然后返回的操作,記得把結果轉utf-8格式 --)

			# 沒有查詢結果
			if len(foundword) == 0:
				tips = '未查詢到結果,換個詞試試?'

			# 查詢到一個
			elif len(foundword) == 1:
				# (-- 將結果用自定義的格式打包好(主要是換行跟縮進),然后放到tips里面  --)

			# 查詢到多個結果
			else:
				# (-- 將結果用自定義的格式打包好(主要是換行跟縮進),然后放到tips里面  --)
	
	# 如果收到語音信息
	if isinstance(message, VoiceMessage):
		tips = '打字啦,語音消息我聽不懂~'
	
	# 如果收到圖片信息(下面看提示就知道了,不多說)
	if isinstance(message, ImageMessage):
		tips = '雖然有點看不懂~但是我喜歡這張圖!'

	if isinstance(message, VideoMessage):
		tips = '這個是..視頻消息?怎么打開教教我嘛~'

	if isinstance(message, LinkMessage):
		tips = '不要發奇怪的地址給我,我真的看不懂咧'

	if isinstance(message, LocationMessage):
		tips = '這個...哪邊是北?(路癡專用懵X表情)'
	
	# 這里是定義用戶對公眾號所做的事(事件,比如關注,取消關注等)
	if isinstance(message, EventMessage):
		# 公眾號被關注的時候
		if message.type == 'subscribe':
			tips = '''感謝你關注"魚腸筆記"! balabala...'''
		else:
			(-- 省略 --)
			
	# 最后, 經過前面諸多處理, 我們得出了一個tips的文本信息, 這就是我們想對用戶說的, 我們需要打包, 然后以規定格式返回
	# 首先是打包, wechat_sdk已經做了一個方法了
	result = wechat.response_text(content=tips)
	
	# 然后是返回,記得規定是xml格式返回
	return HttpResponse(result, content_type='application/xml')	

基本上的要點就是這樣了, 太偏遠的我已經剔除掉

你可以下手玩玩, 祝你玩得愉快~

以上!

點擊復制鏈接 與好友分享!回本站首頁
上一篇:微信公眾號創建二維碼ticket的2種方式講解
下一篇:一起艷學Springboot開發微信公眾號(二)
相關文章
圖文推薦
文章
推薦
點擊排行

關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

重庆快乐十分开奖记录