一、微信公眾號的准備:
- 注冊
訪問地址:https://mp.weixin.qq.com/
按照提示注冊即可
注意:本文樣例使用個人公眾號,由於個人公眾號沒有接口權限,自定義菜單無法進行開發,同學們不要注冊錯!

2. 配置
需要准備好自己的服務器地址,可以使用騰訊雲阿里雲京東雲等等皆可,沒有域名用IP也可以。
在公眾平台官網的開發-基本設置頁面,勾選協議成為開發者,點擊“修改配置”按鈕,填寫服務器地址(URL)、Token和EncodingAESKey,其中URL是開發者用來接收微信消息和事件的接口URL。Token可由開發者可以任意填寫,用作生成簽名(該Token會和接口URL中包含的Token進行比對,從而驗證安全性)。EncodingAESKey由開發者手動填寫或隨機生成,將用作消息體加解密密鑰。
詳細配置文檔:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

3. 連接
服務器配置提交后,微信服務器發送GET請求到填寫的服務器地址URL上,GET請求攜帶參數包括signature、timestamp、nonce、echostr,服務端程序通過檢驗signature對請求進行校驗(下面有校驗方式)。若確認此次GET請求來自微信服務器,請原樣返回echostr參數內容給微信服務器確認后接入生效。加密/校驗流程如下,下文中有代碼具體實現:
1)將token、timestamp、nonce三個參數進行字典序排序
2)將三個參數字符串拼接成一個字符串進行sha1加密
3)開發者獲得加密后的字符串可與signature對比,標識該請求來源於微信
二、基於Django開發微信公眾號后台的步驟:
1.准備工作
- 新建 django project,項目名暫定devnav
django-admin.py startproject devnav
- 新建 app
進入項目目錄下,cd project_wechat 然后執行下面的命令
python manage.py startapp wechat
或
django-admin.py startapp wechat
- 修改settings.py加入剛才創建的wechat應用
INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'wechat',
)
- 修改項目同名app內的urls.py,添加新的app wechat的路由解析跳轉
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^wx/', include('wechat.urls',namespace="wechat")),
]
2.編寫wechat應用的urls.py
修改app wechat內的urls.py,添加針對視圖函數的解析,默認訪問指向視圖函數的weixin_main方法,若有其他方法可參考注釋中的startmymenu方法來編寫
app_name = 'wechat'
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^$', views.weixin_main, name='weixin_main'),
#url(r'^startmymenu$', views.startmymenu, name='startmymenu'),
]
3.編寫wechat應用的views.py
get方法做校驗,post方法傳xml數據,解析和拼湊xml數據實現自動回復功能
# Create your views here.
# -*- coding: utf-8 -*-
import hashlib
import json
from django.utils.encoding import smart_str
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
#django默認開啟csrf防護,這里使用@csrf_exempt去掉防護
@csrf_exempt
def weixin_main(request):
if request.method == "GET":
#接收微信服務器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
token = '寫你的token在這里'
#把參數放到list中排序后合成一個字符串,再用sha1加密得到新的字符串與微信發來的signature對比,如果相同就返回echostr給服務器,校驗通過
hashlist = [token, timestamp, nonce]
hashlist.sort()
hashstr = ''.join([s for s in hashlist])
hashstr = hashlib.sha1(hashstr).hexdigest()
if hashstr == signature:
return HttpResponse(echostr)
else:
return HttpResponse("field")
else:
othercontent = autoreply(request)
return HttpResponse(othercontent)
#微信服務器推送消息是xml的,根據利用ElementTree來解析出的不同xml內容返回不同的回復信息,就實現了基本的自動回復功能了,也可以按照需求用其他的XML解析方法
import xml.etree.ElementTree as ET
def autoreply(request):
try:
webData = request.body
xmlData = ET.fromstring(webData)
msg_type = xmlData.find('MsgType').text
ToUserName = xmlData.find('ToUserName').text
FromUserName = xmlData.find('FromUserName').text
CreateTime = xmlData.find('CreateTime').text
MsgType = xmlData.find('MsgType').text
MsgId = xmlData.find('MsgId').text
toUser = FromUserName
fromUser = ToUserName
if msg_type == 'text':
content = "您好,歡迎來到Python大學習!希望我們可以一起進步!"
replyMsg = TextMsg(toUser, fromUser, content)
print "成功了!!!!!!!!!!!!!!!!!!!"
print replyMsg
return replyMsg.send()
elif msg_type == 'image':
content = "圖片已收到,謝謝"
replyMsg = TextMsg(toUser, fromUser, content)
return replyMsg.send()
elif msg_type == 'voice':
content = "語音已收到,謝謝"
replyMsg = TextMsg(toUser, fromUser, content)
return replyMsg.send()
elif msg_type == 'video':
content = "視頻已收到,謝謝"
replyMsg = TextMsg(toUser, fromUser, content)
return replyMsg.send()
elif msg_type == 'shortvideo':
content = "小視頻已收到,謝謝"
replyMsg = TextMsg(toUser, fromUser, content)
return replyMsg.send()
elif msg_type == 'location':
content = "位置已收到,謝謝"
replyMsg = TextMsg(toUser, fromUser, content)
return replyMsg.send()
else:
msg_type == 'link'
content = "鏈接已收到,謝謝"
replyMsg = TextMsg(toUser, fromUser, content)
return replyMsg.send()
except Exception, Argment:
return Argment
class Msg(object):
def __init__(self, xmlData):
self.ToUserName = xmlData.find('ToUserName').text
self.FromUserName = xmlData.find('FromUserName').text
self.CreateTime = xmlData.find('CreateTime').text
self.MsgType = xmlData.find('MsgType').text
self.MsgId = xmlData.find('MsgId').text
import time
class TextMsg(Msg):
def __init__(self, toUserName, fromUserName, content):
self.__dict = dict()
self.__dict['ToUserName'] = toUserName
self.__dict['FromUserName'] = fromUserName
self.__dict['CreateTime'] = int(time.time())
self.__dict['Content'] = content
def send(self):
XmlForm = """
<xml>
<ToUserName><![CDATA[{ToUserName}]]></ToUserName>
<FromUserName><![CDATA[{FromUserName}]]></FromUserName>
<CreateTime>{CreateTime}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{Content}]]></Content>
</xml>
"""
return XmlForm.format(**self.__dict)
4.效果展示

5.項目文件截圖

6.進一步的功能擴展
由於本人的公眾號為個人公眾號,不能做自定義菜單等等功能,所以不再提供其他功能的代碼實例,有需要的同學可以在本文的基礎上參照官方文檔做進一步的開發
地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432基於Django進行簡單的微信開發
注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權
