热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

微信小程序订阅消息对接详细记录

起因由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈官方要取消消息模板,使用订阅消息。为了方便大家容易学 PythonFlask构建微信小程序订餐系统 课程。

起因

由于我录制过一个小程序的课程,里面有消息模板的讲解。最近有几位同学反馈 官方要 取消消息模板,使用订阅消息。为了方便大家容易学 Python Flask构建微信小程序订餐系统  课程。我把订阅消息结合这个课程讲解下如何实现

微信小程序 订阅消息 对接详细记录

实现过程

其实对于我们来讲,对接第三方无非就是接口地址换了,或者流程上做一些调整。好,废话少说我们直接来通过实战讲解如何对接  订阅消息

第一步:阅读订阅消息官方文档

对接任何东西必然要先了解这个东西是什么?流程是什么样的?官方文档地址:点击这里传送门。

主要步骤就是 申请模板、获取发送权限、后端调用api发送。其中和模板消息最大的区别 就是要获取下发权限,这是最大的区别。也就是这个权限控制在用户手中了。

第二步:申请模板


微信小程序 订阅消息 对接详细记录

微信小程序 订阅消息 对接详细记录

微信小程序 订阅消息 对接详细记录

第三步:获取授权

这一步就需要有个界面明确让用户订阅消息,如果用户拒绝 就不能给用户发送消息了。需要改一下我们课程的小程序。对应API地址:点击这里传送门。


那我们来修改我们支付相关的代码。修改记录 总共需要修改三个文件

mina/pages/my/order_list.js

toPay:function( e ){
    var that = this;
    //这里增加获取用户订阅消息权限,需要将申请的模板id填写进来。这里填写你自己的
    var template_ids = ["gEWJzj_7_7bBej8grUY7V3ZWLLYU2sIp2jNSO5w2Fos" ];
    //默认不能发送消息,当用户明确选择了允许才可以发.
    var can_send = 0;
    var data = {
      order_sn: e.currentTarget.dataset.id,
      can_send: can_send
    };
    wx.requestSubscribeMessage({
      tmplIds: template_ids,
      success:function( res ){
        for (var tmp_id of template_ids ){
          if (res.hasOwnProperty(tmp_id) && res[tmp_id] == "accept"){
            can_send = 1;
          }  
        }
        data['can_send'] = can_send;
        //成功调用支付下单
        that.doPay( data );
      },
      fail:function( res ){
        //失败调用支付下单
        that.doPay(data);
      }
    });
},

doPay:function( data ){
  //新增加的方法
  wx.request({
    url: app.buildUrl("/order/pay"),
    header: app.getRequestHeader(),
    method: 'POST',
    data: data,
    success: function (res) {
      var resp = res.data;
      if (resp.code != 200) {
        app.alert({ "content": resp.msg });
        return;
      }
      var pay_info = resp.data.pay_info;
      wx.requestPayment({
        'timeStamp': pay_info.timeStamp,
        'nonceStr': pay_info.nonceStr,
        'package': pay_info.package,
        'signType': 'MD5',
        'paySign': pay_info.paySign,
        'success': function (res) {
        },
        'fail': function (res) {
        }
      });
    }
  });
}
web/controllers/api/Order.py:orderPay  最后几行
#保存prepay_id为了后面发模板消息
'''
如果对接了订阅消息,这个prepay_id 就没有用了
为了节省一个字段,就用这个自动存放 能不能发送吧
'''
#pay_order_info.prepay_id = pay_info['prepay_id']
pay_order_info.prepay_id = req['can_send'] if 'can_send' in req else 0
db.session.add( pay_order_info )
db.session.commit()
resp['data']['pay_info'] = pay_info
return jsonify(resp)
jobs/tasks/queue/index.py

def handlePay(self,item ):
    data = json.loads( item.data )
    if 'member_id' not in data or 'pay_order_id' not in data:
        return False

    oauth_bind_info = OauthMemberBind.query.filter_by(member_id=data['member_id']).first()
    if not oauth_bind_info:
        return False

    pay_order_info = PayOrder.query.filter_by( id = data['pay_order_id']).first()
    if not pay_order_info:
        return False

    #更新销售总量
    pay_order_items = PayOrderItem.query.filter_by( pay_order_id = pay_order_info.id ).all()
    notice_content = []
    if pay_order_items:
        date_from = datetime.datetime.now().strftime( "%Y-%m-01 00:00:00" )
        date_to = datetime.datetime.now().strftime( "%Y-%m-31 23:59:59" )
        for item in pay_order_items:
            tmp_food_info = Food.query.filter_by( id = item.food_id ).first()
            if not tmp_food_info:
                continue

            notice_content.append( "%s %s份"%( tmp_food_info.name,item.quantity) )

            #当月数量
            tmp_stat_info = db.session.query(FoodSaleChangeLog, func.sum(FoodSaleChangeLog.quantity).label("total")) \
                .filter( FoodSaleChangeLog.food_id  == item.food_id )\
                .filter( FoodSaleChangeLog.created_time >= date_from,FoodSaleChangeLog.created_time <= date_to ).first()
            tmp_month_count = tmp_stat_info[ 1 ] if tmp_stat_info[ 1 ] else 0
            tmp_food_info.total_count += 1
            tmp_food_info.month_count = tmp_month_count
            db.session.add( tmp_food_info )
            db.session.commit()

    if pay_order_info.prepay_id != "1":
        #当prepay_id == 1表示用户接受发订阅消息
        app.logger.info("skip notice~~")
        return

    ##发订阅消息
    keyword1_val = pay_order_info.order_number
    keyword2_val = "、".join( notice_content )
    keyword3_val = "总价:" + str( pay_order_info.total_price )
    if pay_order_info.express_info:
        express_info = json.loads( pay_order_info.express_info )
        keyword3_val += "快递信息:" + str( express_info['address'] )
    #发送模板消息
    target_wechat = WeChatService( )
    access_token = target_wechat.getAccessToken()
    headers = {'Content-Type': 'application/json'}
    url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=%s"%access_token
    params = {
        "touser": oauth_bind_info.openid,
        "template_id":"gEWJzj_7_7bBej8grUY7V3ZWLLYU2sIp2jNSO5w2Fos",
        "page": "pages/my/order_list",
        "data": {
            "number1": {
                "value": keyword1_val
            },
            "thing2": {
                "value": keyword2_val
            },
            "thing3": {
                "value": keyword3_val
            }
        }
    }

    r = requests.post(url=url, data= json.dumps( params ).encode('utf-8'), headers=headers)
    r.encoding = "utf-8"
    app.logger.info(r.text)
    return True

效果截图

微信小程序 订阅消息 对接详细记录

微信小程序 订阅消息 对接详细记录


源代码提供

课程官方已经上传对应的源码补丁包:点击这里传送门


原文地址:微信小程序 订阅消息 对接详细记录
标签:微信   python   flask   

智能推荐

  • 【Demo】微信上墙
  • 号外!! Python Flask 从入门到精通 上线啦
  • 使用Python Flask 开发微信机器人
  • 【课程章节更新】突破 没有支付权限的小程序 完成支付闭环
  • 【框架发布】Python Flask CMS V2

推荐阅读
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了django中视图函数的使用方法,包括如何接收Web请求并返回Web响应,以及如何处理GET请求和POST请求。同时还介绍了urls.py和views.py文件的配置方式。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 本文总结了在开发中使用gulp时的一些技巧,包括如何使用gulp.dest自动创建目录、如何使用gulp.src复制具名路径的文件以及保留文件夹路径的方法等。同时介绍了使用base选项和通配符来保留文件夹路径的技巧,并提到了解决带文件夹的复制问题的方法,即使用gulp-flatten插件。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法
    本文介绍了解决nginx启动报错epoll_wait() reported that client prematurely closed connection的方法,包括检查location配置是否正确、pass_proxy是否需要加“/”等。同时,还介绍了修改nginx的error.log日志级别为debug,以便查看详细日志信息。 ... [详细]
author-avatar
小文662502914775
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有