Xavier-Lam / wechat-django

WeChat-Django旨在为接入微信公众平台的django开发者提供便捷的微信功能封装及最基本的后台管理支持
MIT License
198 stars 65 forks source link

期待增加模板消息的model. #4

Closed ramwin closed 5 years ago

ramwin commented 5 years ago

今天要添加模板消息里跳转到小程序的功能,本来想参考一下这个项目的model, 方便以后迁移.但是发现template下面好像只有一个Template模板的model, 缺少一个模板消息的model. 目前我正在的模板消息model:

class TemplateMessageNew(models.Model):
    """发送的模板消息"""
    # TODO 暂时只满足自己的要求。以后如果有需要再加
    # 为什么模板消息没有状态?因为你发出去就100%成功啊。
    # 失败了,说明你软件出大问题了啊。这时候你还指望我帮你处理?
    template = models.ForeignKey(Template, on_delete=models.CASCADE)
    touser = models.ForeignKey(OpenUser, on_delete=models.CASCADE)
    url = models.URLField("跳转的url", null=True)
    first = models.CharField("标题", default="", blank=True, max_length=31)
    keyword1 = models.CharField("变量1", default="", blank=True, max_length=31)
    keyword2 = models.CharField("变量2", default="", blank=True, max_length=31)
    keyword3 = models.CharField("变量3", default="", blank=True, max_length=31)
    keyword4 = models.CharField("变量4", default="", blank=True, max_length=31)
    keyword5 = models.CharField("变量5", default="", blank=True, max_length=31)
    keyword6 = models.CharField("变量6", default="", blank=True, max_length=31)
    remark = models.TextField("备注", default="", blank=True)
    createtime = models.DateTimeField(auto_now_add=True)
    msgid = models.CharField("微信返回的id", unique=True, null=True, max_length=31)

    def send(self):
        # 可以考虑写成classmethod, 然后通过post_save来回调. 这样当模板消息创建时就自动发送. (你说我想创建模板消息但是不发送? 那你创建什么模板消息啊)
        inner_data = {}
        for key in ["first", "keyword1", "keyword2", "keyword3", "keyword4",
                    "keyword5", "keyword6", "remark"]:
            value = getattr(self, key)
            if value:
                inner_data[key] = {
                    "value": value,
                    "color": "#000000",
                }
        message_obj = WeChatMessage(self.template.account.wechatpy_client)
        res = message_obj.send_template(
            user_id=self.touser.openid,
            template_id=self.template.templateid,
            data=inner_data,
        )
        # TODO 之后改成debug
        log.info(res)
        assert res["errcode"] == 0
        assert res["errmsg"] == "ok"
        self.msgid = res["msgid"]
        self.save()
        return res

因为我还没在自己的项目里引用wechat-django, 所以不方便修改后测试并提交PR, 希望作者能考虑加这个功能.并且在message_handle里面加上对应的处理.

Xavier-Lam commented 5 years ago

是指模板消息的日志吗,这个暂不考虑做成model,你可以根据你自己的业务做成一个model,然后加一个send方法,里面调用t = app.templates.get("你的模板名");t.send(**kwargs).把你的model转换为发送模板消息.

ramwin commented 5 years ago

好的,谢谢. 为了防止骚扰客户, 我这边设置了有些模板消息段时间内不多次通知(比如论坛里, 用户评论的通知.) 所以需要上次发送是什么时候,短时间内的多条回复就不逐条通知了. 所以个人认为这个功能还是有点意义的. 还可以根据推送的点击率来变更运营策略和文案.