废话不多说,直接上码,有问题请留言。该项目基于 python2.7 + django 1.11.3
url.py
#coding:utf8
from django.conf.urls import url
from app.views import *
urlpatterns = [
url(r'^wx_token$', weixin_main), #token 验证
url(r'^upImg$', upload_img), # 上传图片 template
url(r'^jsSDK$', js_sdk), # 前端获取微信验证数据
url(r'^serverId$', server_id), # 输出上传图片serverid
]
views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
import hashlib
import json
import uuid
import requests
from django.http import JsonResponse
from django.shortcuts import render,HttpResponse
import redis
import sys
tt = sys.platform
appId = 'wx6********4a15a'
keys = 'bdeb5a**********6ab2902a'
token = 'yi****dian'
# Create your views here.
if tt == "win32": # 判断操作系统 win32 为 Windows
pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True)
else:
pool = redis.ConnectionPool(host='localhost',port=6379,decode_responses=True,password='******')
r=redis.Redis(connection_pool=pool)
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 = """
{CreateTime}
"""
return XmlForm.format(**self.__dict)
# 微信验签名
class Sign:
def __init__(self, jsapi_ticket, url):
self.ret = {
'nonceStr': self.__create_nonce_str(),
'jsapi_ticket': jsapi_ticket,
'timestamp': self.__create_timestamp(),
'url': url,
}
def __create_nonce_str(self):
return str(uuid.uuid4())
def __create_timestamp(self):
return int(time.time())
def sign(self):
string = '&'.join(['%s=%s' % (key.lower(), self.ret[key]) for key in sorted(self.ret)])
self.ret['signature'] = hashlib.sha1(string.encode('utf-8')).hexdigest()
return self.ret
def js_sdk(request):
local_url = request.GET.get('localUrl','')
ticket = r.get('ticket')
if not ticket:
acc = r.get('access_token')
if not acc:
acc_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s'%(appId,keys)
acc = requests.get(acc_url, verify=False).json()['access_token']
r.set('access_token',acc)
r.expire('access_token',7100)
url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=%s&type=jsapi"%acc
t = requests.get(url,verify=False).text
tt = json.loads(t)['ticket']
r.set('ticket',tt)
r.expire('ticket',7100)
else:
tt = ticket
data = Sign(tt,local_url).sign()
data['appId']=appId
return JsonResponse(data)
def upload_img(request):
return render(request,'up.html')
def server_id(request):
serverid = request.GET.get('serverId',None)
print("img ID :>>>>> ",serverid)
return HttpResponse(status=200)
up.html
{% load staticfiles %}
Title