给Flutter包私有仓库pub_server增加企业微信机器人消息

本文介绍了如何为Flutter包私有仓库pub_server添加企业微信机器人消息通知功能,通过拦截器中间件实现代码解耦,确保在package上传成功后自动推送给企业微信群。详细阐述了代码实现过程、中间件设计以及使用方法。
摘要由CSDN通过智能技术生成

给Flutter包私有仓库pub_server增加企业微信机器人消息

本文相关代码地址:github

效果:
在这里插入图片描述

功能说明

默认的私有仓库pub_server服务程序在package上传成功后只是在命令行中输出了一行成功日志,缺少必要的消息通知,包发布成功了开发人员也不知道。
因为工作中企业微信使用较多,而且其中的群机器人可以方便的在工作群中推送消息,因此想着将上传成功的消息通过群机器人推送到群中。

企业微信群机器人的接入方法参看:群机器人配置说明

代码分析

相关类

修改代码前还是先完整看了一下pub_server的实现代码。

shelf_pubserver.dart文件ShelfPubServer类,该类负责服务端各接口的具体处理逻辑。在requestHandler方法中就可以得到每个接口的请求和反馈报文。其中package包上传功能涉及到/api/packages/versions/newUpload/api/packages/versions/newUploadFinish两个接口,第一个接口的职责说具体的上传逻辑,第二个接口只是完成上传操作。第一个接口处理成功后会返回一个302请求,让客户端直接请求第二个接口。

cow_repository.dart文件CopyAndWriteRepository类,该类是整个服务的核心,ShelfPubServer类所有的处理操作最终都是交给本类处理。其中,该类持有了file_repository.dart文件的FileRepository类负责实际的上传操作。

理论上,在ShelfPubServer类、CopyAndWriteRepository类、FileRepository类这三个类的相关代码中我们都可以监控到package上传成功的消息,可以在相关的代码位置向企业微信的群机器人发送消息请求。

初始方案

我原本是计划在ShelfPubServer类的_finishUploadSimple方法中,/api/packages/versions/newUploadFinish接口返回Successfully uploaded package.信息时直接发送机器人消息。
但是后面发现两个问题:第一,在/api/packages/versions/newUploadFinish接口的请求参数中并未携带上传的package包的信息,所以没办法发送相关的通知文本;第二,在ShelfPubServer类的代码中塞入给群机器人发送消息的代码就污染了原本逻辑代码,造成了不必要的代码耦合,如果我们后面需要增加邮件通知、钉钉通知,那是不是还要新增代码?

其中第一个问题可以通过修改/api/packages/versions/newUpload接口返回报文的方法实现,不过算是对原逻辑代码的改动,暂时不采用;思考第二个问题时,准备自己实现一个请求处理拦截器进行代码解耦,然后发现了一段代码:

  // 启动一个http服务
  return shelf_io.serve(
      const Pipeline()
          .addMiddleware(logRequests()) // 日志中间件
          .addHandler(server.requestHandler), // 请求处理器
      host,
      port);

这是基于shelf框架启动http服务的代码,其中addMiddleware(logRequests())是给接口请求和反馈增加日志输出的中间件。
我没有写过后端接口,看了下Pipeline的代码后觉得,正好可以使用中间件的方式来实现这个功能。

实现

添加一个通用的拦截器中间件

新增拦截器中间件interceptor_middleware.dart

Middleware interceptorMiddleware({Function beforeHandler, Function successHandler, Function errorHandler})

该中间件支持业务代码在每个请求处理前,处理成功后,处理失败后分别执行自己的逻辑。

添加企业微信群机器人中间件

新增机器人中间件qywx_robot_middleware.dart

Middleware qywxRobotMiddleware(String qywxkey, {MsgBuilder msgBuilder})

该中间件封装了[interceptorMiddleware],其中qywxkey是企业微信开放平台的key,msgBuilder是群机器人发送消息的消息体构造器,具体参看群机器人配置说明消息类型及数据格式

中间件的实现代码中拦截了/api/packages/versions/newUpload接口请求,当接口处理成功,且statusCode为302时,则调用相关API发送群机器人消息。

本中间件提供了一个默认的消息体构造器:

Map defaultMsgBuilder(PackageVersion packageVersion) {
  return {
    'msgtype': 'text',
    'text': {
      'content': 'OMG~我的天呐!Flutter Package ${packageVersion.packageName}的新品v${packageVersion.versionString}也太好看了吧!用它!用它!用它!',
      'mentioned_list': ['@all'],
    }
  };
}

可选择添加企业微信群机器人中间件

  var pipeline = Pipeline();
  if (qywxkey!=null && qywxkey.isNotEmpty) {
    pipeline = pipeline.addMiddleware(qywxRobotMiddleware(qywxkey)); // 企业微信机器人中间件  
  }
  pipeline = pipeline.addMiddleware(logRequests()); // 日志中间件
  // 启动一个http服务
  return shelf_io.serve(
      pipeline.addHandler(server.requestHandler), // 请求处理器
      host,
      port);

在启动HTTP服务时,当qywxkey存在时,则加载机器人中间件,否则不加载。
其中qywxkey通过命令行参数的形式传入:

ArgParser argsParser() {
  var parser = ArgParser();

  // 给参数解析器设置可支持的参数以及默认值
  parser.addOption('directory',
      abbr: 'd', defaultsTo: 'pub_server-repository-data');

  parser.addOption('host', abbr: 'h', defaultsTo: 'localhost');

  parser.addOption('port', abbr: 'p', defaultsTo: '8080');
  parser.addOption('qywxkey', abbr: 'q', defaultsTo: '');
  parser.addFlag('standalone', abbr: 's', defaultsTo: false);
  return parser;
}

完整代码地址

github

使用方法

cd ~/pub_server
dart example/example.dart -d ~/package-db -h 192.168.1.2 -p 8090 -q xxxx-xxxx-qywxkey

在启动服务时,在传入IP地址和接口外,额外传入qywxkey即可。

最终效果:
在这里插入图片描述

待优化细节

  • qywxRobotMiddleware中间件代码中拦截的是/api/packages/versions/newUpload接口,该接口只是上传操作,并没有上传成功,所以理论上还是要拦截/api/packages/versions/newUploadFinish接口;
  • /api/packages/versions/newUpload接口只返回了package的名称和版本号,没有该版本的修改内容;但是Package的官方指南中,更新说明是存在CHANGELOG.md文件中,所以想要读取版本更新说明,后面还需要解析MarkDown文件;
通过flutter的webview_flutter插件,我们可以在应用中嵌入支付宝和微信支付,并实现支付功能。使用webview_flutter的步骤如下: 1. 首先,在`pubspec.yaml`文件中引入webview_flutter插件。可以在dependencies部分添加`webview_flutter: ^2.0.0`,然后运行`flutter pub get`命令进行依赖安装。 2. 在需要嵌入支付功能的页面中,导入webview_flutter插件。在页面的顶部引入`import 'package:webview_flutter/webview_flutter.dart';`。 3. 在页面的主体中,创建一个WebView组件,并指定需要加载的URL。例如,在Container中使用WebView组件,可以使用如下代码: ```dart Container( child: WebView( initialUrl: 'https://www.alipay.com/', javascriptMode: JavascriptMode.unrestricted, ), ) ``` 4. 在支付宝和微信支付的URL中,传递相关的支付参数,例如订单号、支付金额等。 5. 在WebView组件中,可以通过注册一个JavaScript channel来监听网页中的支付回调信息。例如,在页面初始加载完成后,可以通过使用`onPageFinished`回调方法来执行一段JavaScript代码,监听支付结果。在该代码中,可以通过调用与原生平台交互的方法,将支付结果返回到Flutter中进行处理。 6. 在Flutter中,可以根据支付结果展示相关的提示信息,例如支付成功、支付失败等。 需要注意的是,支付宝和微信支付的具体接口和参数可能会根据版本的更新而有所变化,所以在代码实现中需要根据最新的文档进行调整。同时,为了确保支付过程的安全性,建议在应用中对支付接口进行适当的安全设置,例如使用HTTPS协议,并对支付参数进行加密处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值