Django搭建微信后端(1)---回复消息和自定义菜单

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Tangzongyu123/article/details/75269187

版权声明: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

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页