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

推荐阅读
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 微信民众号商城/小顺序商城开源项目介绍及使用教程
    本文介绍了一个基于WeiPHP5.0开发的微信民众号商城/小顺序商城的开源项目,包括前端和后端的目录结构,以及所使用的技术栈。同时提供了项目的运行和打包方法,并分享了一些调试和开发经验。最后还附上了在线预览和GitHub商城源码的链接,以及加入前端交流QQ群的方式。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • JavaWeb中读取文件资源的路径问题及解决方法
    在JavaWeb开发中,读取文件资源的路径是一个常见的问题。本文介绍了使用绝对路径和相对路径两种方法来解决这个问题,并给出了相应的代码示例。同时,还讨论了使用绝对路径的优缺点,以及如何正确使用相对路径来读取文件。通过本文的学习,读者可以掌握在JavaWeb中正确找到和读取文件资源的方法。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • 微信小程序导航跟随的实现方法
    本文介绍了在微信小程序中实现导航跟随的方法。通过设置导航的position属性和绑定滚动事件,可以实现页面向下滚动到导航位置时,导航固定在页面最上方;页面向上滚动到导航位置时,导航恢复到原始位置;点击导航可以平滑跳转到相应位置。代码示例也给出了具体实现方法。 ... [详细]
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社区 版权所有