资讯专栏INFORMATION COLUMN

微信公众号开发小记——2.80端口上的服务

frank_fun / 867人阅读

摘要:微信在做一些操作是需要用到生成二维码等而每天接口的调用上限为,需要自己做缓存文档讲了几种方式,我觉得放在中拿比较妥当。微信菜单会缓存分钟,你可以取消关注,然后在关注查看菜单变化效果。

描述

微信公众号开发基本分为2大种类型

1.用户直接做了某些操作(回复信息、订阅、扫码、发语音、点按钮等),此时这些信息微信会发送到微信服务器的80端口,这是一种开发类型;
2.通过连接(按钮、文章)引导用户到另一个网站,网站通过oauth实现微信的三方登录做到用户打通,然后提供更多服务

注意第二种类型的其他网站可以跟第一种类型(只提供80端口服务)的网站是一个server

80端口的服务开发

代码位置weixin_server tag:80-port-20160415

wechat对象以及缓存access_token

wechat sdk操作都需要一个wechat的东西,生成这玩意儿需要加载一个wechat_config,config里面包含了你的appid,appsecret,以及你消息加密解密的配置,为了简少根据加密方式造成的代码变更,我在配置里面添加了settings.WEIXIN_ENCRYPT_MODE,这样直接填写你的加密模式,就可以在任何用到wechat的地方直接import一个wechat变量,之所以要用get_wechat的方式实时生成是为了做access_token的缓存,下面会讲。

from .wechat import get_wechat

wechat = get_wechat()

微信在做一些操作是需要用到access_token(生成二维码等),而每天access_token接口的调用上限为2000,需要自己做缓存, sdk文档讲了几种方式,我觉得放在cache中拿比较妥当。

代码我不贴了,这是位置
weixin/config.py
weixin/wechat.py

handler各种微信post到80的事件

微信会在用户对公众号交互时像我们的服务器80端口post一些事件,sdk文档 message源码,大体看了下我写了个mixin

# -*- coding: utf-8 -*-
from weixin.wechat import get_wechat
from wechat_sdk.messages import MESSAGE_TYPES, EventMessage

wechat = get_wechat()

REVERSED_MESSAGE_TYPES = {value:key for key, value in MESSAGE_TYPES.iteritems()}

class WeixinDispatchMixin(object):

    def dispatch_weixin(self, request, *args, **kwargs):
        content = request.body
        signature = request.GET.get("signature", "")
        msg_signature = request.GET.get("msg_signature", "")
        timestamp = request.GET.get("timestamp", "")
        nonce = request.GET.get("nonce", "")
        try:
            wechat.parse_data(
                    content,
                    msg_signature=msg_signature,
                    timestamp=timestamp,
                    nonce=nonce)
        except ParseError:
            return HttpResponse("Invalid Body Text")
        handler_name = self.get_weixin_handler_name(request, wechat, *args, **kwargs)
        handler = getattr(self, handler_name, self.http_method_not_allowed)
        return handler(request, wechat, *args, **kwargs)

    def get_weixin_handler_name(self, request, parsed_wechat, *args, **kwargs):
        message = parsed_wechat.message
        if isinstance(message, EventMessage):
            event_name = REVERSED_MESSAGE_TYPES[type(message)]
            event_detail_name = "weixin_handler_{}_{}".format(event_name, message.type)
            if hasattr(self, event_detail_name):
                event_name = event_detail_name
                return event_name
        return u"weixin_handler_{}".format(REVERSED_MESSAGE_TYPES.get(type(message), "unsupport"))
        

mixin参考django的dispatch,这样在继承的类里面直接实现weixin_handler_xxx方法即可,然而event有更多的类型,如果是通用处理则直接实现weixin_handler_event,如果要更加细化,例如扫码的event,则实现weixin_handler_event_scan方法,可以参考weixin_server/views.py

菜单儿

菜单可以直接在admin定制,由于菜单类似一种配置,同一时间最多且只有1个,我就把edx的config_model拿过来了,自己定制了下admin,这样你可以直接在admin里面修改菜单,微信会生效。微信菜单会缓存5分钟,你可以取消关注,然后在关注查看菜单变化效果。

菜单这块儿的代码有点意思,感兴趣的可以看下。

weixin/models.py
weixin/admin.py

生成二维码

二维码的逻辑略有不同(相对于sdk的其他response_xxx),所以我写了个qrcode.py封装了一下,注意永久二维码只能生产10万张,业务场景不要乱用,二维码的这些id、url都是需要做本地存储的,我没接model就丢到缓存里了。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/45421.html

相关文章

  • 微信公众开发小记——4.两种邀请用户的方式 扫码&&链接

    摘要:借着这个需求体会了下微信开发的两种不同类型非端口的两种开发,以及的一些正确姿势。关于用户微信登录的事情我们通过已经解决了参考我的上一篇博客微信公众号开发小记接入三方登录,所以可以直接用的装饰器完成这种事情。 描述 假设的我们的服务号有这么一些功能,比如底部有按钮,点击会有一些复杂的功能,这时候可能就需要一个用户系统,有用户系统就经常想要做什么分享邀请新用户之类的,这时候就又有几种方式,...

    BDEEFE 评论0 收藏0
  • 微信公众开发小记——1.接入微信服务

    摘要:描述由于马上要做一波公众号开发,今天先调研,把基本的服务器接起来。手脚架地址文档微信公众号公众号开发首先你要有个公众号,这里就不说了按照流程申请。脚手架的说明微信公众号接入的时候要做很多事情,为了简化开发,提供一个版本的服务器。 描述 由于马上要做一波公众号开发,今天先调研,把基本的服务器接起来。微信公众号服务器在接入的时候要做一些烦躁的事情,改配置的时候要进行握手,api调用要做一些...

    sshe 评论0 收藏0
  • 微信公众开发小记——3.接入三方登录

    摘要:我接触已经很久了,其中微信的就是我贡献的代码,然而当时做的时候比较年轻,而且这个项目处于一个很大的代码重构中,借这次机会重新用正确的姿势接入了一下三方登录,可以当做一个学习接入三方的。 为什么要接入三方登录 如果你的微信服务器要做复杂的逻辑,比如html5、给用户提供高级的服务,并且有很好看的页面等等,这种时候你就需要一个正常的web服务器,用户打通就需要做三方登录了。 而如果你决定直...

    aisuhua 评论0 收藏0
  • 微信公众开发小记——5.python微信红包

    摘要:微信各个服务是独立的,比较蛋疼,要用红包功能,首先你需要注册一个微信商户平台账号。首先是微信证书,用的是,与这两个。写在最后微信开发者工具挺好用的,服务号里把自己加为开发者就能用了。 描述 有时候产品有这么一些需求,当用户满足一定条件时,给他发一定金额的红包。 微信各个服务是独立的,比较蛋疼,要用红包功能,首先你需要注册一个微信商户平台账号。 代码位置 分支pay-20160802 微...

    JerryZou 评论0 收藏0
  • 腾讯云Codeigniter小记

    摘要:前段时间为了抓取网络文本数据,申请了腾讯云学生机,用的框架弄了一段时间。这个用户既是不可登录的操作系统用户,也是数据库用户。设置数据库用户密码为了能够让和数据库相连接,需要设置数据库用户密码。 打读研之后,更加关注算法的学习,Web开发这一块便落下了,平时也通过微信公众号关注了些,常常感慨,技术的更迭真是日新月异。 前段时间为了抓取网络文本数据,申请了腾讯云学生机,用Python的Sc...

    Ocean 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<