支付宝小程序集成MQTT

简介: 支付宝小程序集成MQTT

支付宝小程序集成MQTT

1. 前言

由于支付宝只支持websocket连接,在尝试了很多npm安装mqtt亦或是使用paho-mqtt.js、重新编译过后的mqtt.js多方无果后,最终决定自己做一个桥接的websocket服务,来作为mqtt的Borker和小程序的websocket的中转服务。最终实现了支付宝小程序可以收到和发送mqtt消息的目的。

2. 处理流程

1. 搭建一个springboot的简易版websocket服务端,同时连接mqtt的Broker作为mqtt的客户端。简称中转服务。
2. 小程序使用websocket连接中转服务。
3. 小程序发送websocket服务到中转服务,中转服务把收到的消息发送给mqtt的Broker。
4. 中转服务收到mqtt发送的消息,查找对应的websocket小程序用户唯一id是否存在。如果存在就通过websocket发送给小程序。
5. 小程序收到websocket消息,做对应的处理。

本章主要介绍支付宝小程序的处理方式,下一章介绍如何搭建springboot的中转服务。

3. 接口详情

  1. wss地址
    这里是我们自己搭建的中转服务websocket地址。
wss://xxxx.cn/netgate/密钥/pid/sn/openid

参数说明

image.png

4. 代码详解

小程序示例UNIAPP方式

如果没有使用uniapp框架,使用原生技术

微信小程序: 需要把uni.替换成wx.

支付宝小程序:需要把uni.替换成my.


1. 新建ws.js文件

var ws = {};
const wsUrl= 'wss://xxxx.cn/netgate/密钥/';
var timeoutObj;
let connectStatus = 0;
//避免socket重复连接
let lockReconnect = false;
function heartCheck(){
    console.log('准备心跳检测')
    if(timeoutObj){
        clearInterval(timeoutObj);
    }
    timeoutObj = setInterval(function () {
         uni.sendSocketMessage({
            data: 'H', // 需要发送的内容
            success: (res) => {
                console.log('心跳O(∩_∩)O')
            },
        });
    }, 55000)
}
ws.initWs = (pid,sn,openid) => {
    uni.onSocketOpen(function() {
        // uni.showToast({title: 'WebSocket 连接已打开!'})
        console.log('WebSocket 连接已打开!');
        connectStatus = 1;
        heartCheck()
    });
    uni.onSocketError(function(res){
        // uni.showToast({title: 'WebSocket 连接打开失败,请检查!'})
        console.log('WebSocket 连接打开失败,请检查!');
        ws.reconnect()
    });
    uni.onSocketClose((res) => {
        uni.showToast({title: '连接已关闭'})
        ws.reconnect()
        console.log('连接已关闭')
    });
    uni.offSocketClose((res)=>{
        uni.showToast({title: '取消监听 WebSocket 关闭事件'})
        console.log('取消监听 WebSocket 关闭事件')
        connectStatus = 0;
    });
    uni.offSocketError((res) =>{
        uni.showToast({title: '取消监听 WebSocket 错误事件'})
        console.log('取消监听 WebSocket 错误事件')
        connectStatus =0;
    });
    uni.offSocketOpen((res)=>{
        uni.showToast({title: '取消监听 WebSocket 连接打开事件'})
        console.log('取消监听 WebSocket 连接打开事件')
        connectStatus = 0;
    });
    uni.offSocketMessage((res)=>{
        uni.showToast({title: '取消监听 WebSocket 接收到服务器的消息事件'})
        console.log('取消监听 WebSocket 接收到服务器的消息事件')
    });
    uni.connectSocket({
        url: wsUrl+ pid+ '/' +sn+ '/'+ openid,
        success: (res) => {
            console.log('连接成功')
            uni.showToast({title: '设备连接成功'})
        },
        fail:(res)=>{
            console.log('connect fail:'+JSON.stringify(res))
        }
    })
}
ws.disconnect = ()=> {
    console.log('关闭ws连接')
    uni.closeSocket()
    // 链接关闭后切断所有监听
    // 支付宝小程序的ws连接问题,关闭连接时需关闭对于接受,防止关闭失败
    uni.offSocketMessage();
    uni.offSocketError();
    uni.offSocketOpen();
    uni.offSocketClose();
}
ws.reconnect = ()=> {
    console.log('正在准备重新连接')
    if (lockReconnect) return;
    console.log('重新连接')
    lockReconnect = true;
    let self = this;
    setTimeout(function () { //没连接上会一直重连,设置延迟避免请求过多
        self.connect();
        lockReconnect = false;
    }, 2000);
}
ws.sendMsg = function(msg) {
    console.log('准备发送消息')
    uni.sendSocketMessage({
        data: msg, // 需要发送的内容
        success: (res) => {
            console.log('消息发送成功==='+msg)
        },
    });
}
export default ws;

2. 页面使用

<script>
    import ws from "../../common/utils/ws";
  export default {
          onUnload(){
             ws.disconnect()
          },
          onLoad(){
            ws.initWs(this.curProId,this.curSn,userInfo.wxid)
            let self = this;
            uni.onSocketMessage(function(res) {
                self.deviceReceiveMsgWs(res.data)
            }) 
          },
          methods: {
              //接收消息
             deviceReceiveMsgWs(msgStr){
                console.log('ws收到了消息'+msgStr)
             },
              //发送消息
             sendMsg(){
                 ws.sendMsg('{"CMD":"STATE"}')
             }
          }
    }
</script>


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
3月前
|
消息中间件 弹性计算 Kubernetes
RabbitMQ与容器化技术的集成实践
【8月更文第28天】RabbitMQ 是一个开源消息代理和队列服务器,用于在分布式系统中存储、转发消息。随着微服务架构的普及,容器化技术(如 Docker 和 Kubernetes)成为了部署和管理应用程序的标准方式。本文将探讨如何使用 Docker 和 Kubernetes 在生产环境中部署和管理 RabbitMQ 服务,同时保证高可用性和弹性伸缩能力。
65 3
|
1月前
|
消息中间件 Java 数据库
新版 Seata 集成 RocketMQ事务消息,越来越 牛X 了!阿里的 Seata , yyds !
这里 借助 Seata 集成 RocketMQ 事务消息的 新功能,介绍一下一个新遇到的面试题:如果如何实现 **强弱一致性 结合**的分布式事务?
新版 Seata 集成 RocketMQ事务消息,越来越 牛X 了!阿里的 Seata , yyds !
|
5月前
|
消息中间件 运维 监控
ApsaraMQ Copilot for RocketMQ:消息数据集成链路的健康管家
阿里云消息队列 ApsaraMQ 始终围绕“高弹性低成本、更稳定更安全、智能化免运维”三大核心方向进行演进和拓展。在智能化免运维方面,通过 ApsaraMQ Copilot,为企业提供消息数据集成链路的健康管家,让消息服务走进智能化免运维的新时代。
71853 72
|
3月前
|
消息中间件 分布式计算 大数据
RabbitMQ与大数据平台的集成
【8月更文第28天】在现代的大数据处理架构中,消息队列作为数据传输的关键组件扮演着重要的角色。RabbitMQ 是一个开源的消息代理软件,它支持多种消息协议,能够为分布式系统提供可靠的消息传递服务。本篇文章将探讨如何使用 RabbitMQ 与 Hadoop 和 Spark 进行集成,以实现高效的数据处理和分析。
37 1
|
4月前
|
消息中间件 Java 测试技术
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
【RocketMQ系列八】SpringBoot集成RocketMQ-实现普通消息和事务消息
319 1
|
4月前
|
消息中间件 小程序 RocketMQ
消息队列 MQ使用问题之如何在小程序中引用paho-mqtt
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 Java 数据安全/隐私保护
Spring Boot与RabbitMQ的集成
Spring Boot与RabbitMQ的集成
|
4月前
|
消息中间件 Java RocketMQ
Spring Boot与RocketMQ的集成
Spring Boot与RocketMQ的集成
|
4月前
|
消息中间件 Java Spring
实现Spring Boot与RabbitMQ消息中间件的无缝集成
实现Spring Boot与RabbitMQ消息中间件的无缝集成
|
5月前
|
消息中间件 Java Spring
Spring Boot与RabbitMQ的集成应用
Spring Boot与RabbitMQ的集成应用