基於Django進行簡單的微信開發


代碼地址如下:
http://www.demodashi.com/demo/11756.html

一、微信公眾號的准備:

  1. 注冊

訪問地址: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.准備工作

  1. 新建 django project,項目名暫定devnav
django-admin.py startproject devnav
  1. 新建 app
    進入項目目錄下,cd project_wechat 然后執行下面的命令
python manage.py startapp wechat

django-admin.py startapp wechat
  1. 修改settings.py加入剛才創建的wechat應用
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'wechat',
)
  1. 修改項目同名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進行簡單的微信開發

代碼地址如下:
http://www.demodashi.com/demo/11756.html

注:本文著作權歸作者,由demo大師代發,拒絕轉載,轉載需要作者授權


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM