热门标签 | 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

推荐阅读
  • 本文详细介绍了如何解决Uploadify插件在Internet Explorer(IE)9和10版本中遇到的点击失效及JQuery运行时错误问题。通过修改相关JavaScript代码,确保上传功能在不同浏览器环境中的一致性和稳定性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 优化联通光猫DNS服务器设置
    本文详细介绍了如何为联通光猫配置DNS服务器地址,以提高网络解析效率和访问体验。通过智能线路解析功能,域名解析可以根据访问者的IP来源和类型进行差异化处理,从而实现更优的网络性能。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 本文详细分析了JSP(JavaServer Pages)技术的主要优点和缺点,帮助开发者更好地理解其适用场景及潜在挑战。JSP作为一种服务器端技术,广泛应用于Web开发中。 ... [详细]
  • 本文详细介绍了Java中org.neo4j.helpers.collection.Iterators.single()方法的功能、使用场景及代码示例,帮助开发者更好地理解和应用该方法。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • Explore how Matterverse is redefining the metaverse experience, creating immersive and meaningful virtual environments that foster genuine connections and economic opportunities. ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文详细记录了在基于Debian的Deepin 20操作系统上安装MySQL 5.7的具体步骤,包括软件包的选择、依赖项的处理及远程访问权限的配置。 ... [详细]
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社区 版权所有