?

应 Solon 技术交流群里小伙伴的要求,我分享下在 Solon 中使用 WxJava 的经验、类库。


具体实现

  1. 提供统一的 Yaml 配置
package cn.edu.hnuahe.mountain.common.providers;

import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Init;
import org.noear.solon.core.Aop;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml; /**
* @author 颖
*/
@Component
public class YamlProvider extends ServiceProvider { @Init
@Override
public void bootstrap() {
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
Aop.wrapAndPut(Yaml.class, new Yaml(options));
} }
  1. 提供 WxService 统一管理器
package cn.edu.hnuahe.mountain.common.utils;

import me.chanjar.weixin.cp.api.WxCpService;
import org.noear.solon.annotation.Component; import java.util.concurrent.ConcurrentHashMap; /**
* @author 颖
*/
@Component
public class WxCpClient extends ConcurrentHashMap<String, WxCpService> { public WxCpService get() {
return this.get("default");
} }
  1. WxConfigDefault 注入提供器
package cn.edu.hnuahe.mountain.common.providers;

import cn.edu.hnuahe.mountain.common.utils.WxCpClient;
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.api.impl.WxCpServiceImpl;
import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import me.chanjar.weixin.cp.message.WxCpMessageRouter;
import org.noear.solon.Solon;
import org.noear.solon.annotation.Component;
import org.noear.solon.annotation.Init;
import org.noear.solon.annotation.Inject;
import org.noear.solon.cloud.CloudClient;
import org.noear.solon.cloud.model.Config;
import org.noear.solon.core.Aop;
import org.yaml.snakeyaml.Yaml; import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; /**
* @author 颖
*/
@Component
public class WxCpServiceProvider extends ServiceProvider { @Inject
Yaml yaml;
@Inject
WxCpClient wxCpClient; public static class WxCpConfig extends ConcurrentHashMap<String, WxCpDefaultConfigImpl> {} @Init
@Override
public void bootstrap() {
Config rawConfig = CloudClient.config().pull(Solon.cfg().appGroup(), "wxCp.yaml");
WxCpConfig configs = this.yaml.loadAs(rawConfig.value(), WxCpConfig.class); configs.forEach((name, config) -> {
WxCpService service = new WxCpServiceImpl();
service.setWxCpConfigStorage(config);
// 注册到企业微信客户端管理器
this.wxCpClient.put(name, service);
}); WxCpMessageRouter router = new WxCpMessageRouter(
this.wxCpClient.get()
);
Aop.wrapAndPut(WxCpMessageRouter.class, router);
} }

[scode type="blue"]步骤2与步骤3共同解决了一个大问题,就是一个企业微信小程序可能需要拥有多种身份的问题。比如,访问企业微信通讯录就需要基于 通讯录同步 小程序的身份进行操作。[/scode]

  1. 一个 Test,用于生成需要的 wxCp.yaml 配置
package cn.edu.hnuahe.mountain.common.providers;

import me.chanjar.weixin.cp.config.impl.WxCpDefaultConfigImpl;
import me.chanjar.weixin.cp.config.impl.WxCpRedissonConfigImpl;
import org.junit.jupiter.api.Test;
import org.noear.solon.core.Aop;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml; import static org.junit.jupiter.api.Assertions.*; class WxCpServiceProviderTest { @Test
void generateConfig() {
DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
Yaml yaml = new Yaml(options); WxCpDefaultConfigImpl defaultConfig = new WxCpDefaultConfigImpl();
defaultConfig.setCorpId("123");
defaultConfig.setCorpSecret("456");
defaultConfig.setAgentId(789);
WxCpDefaultConfigImpl contactsConfig = new WxCpDefaultConfigImpl();
contactsConfig.setCorpId("987");
contactsConfig.setCorpSecret("654"); WxCpServiceProvider.WxCpConfig config = new WxCpServiceProvider.WxCpConfig();
config.put("default", defaultConfig);
config.put("contacts", contactsConfig); System.out.println(yaml.dump(config));
} }
  1. 一个简单的使用案例
package cn.edu.hnuahe.mountain.gateway.http.controller;

import cn.edu.hnuahe.mountain.common.entities.models.User;
import cn.edu.hnuahe.mountain.common.http.controller.BaseController;
import cn.edu.hnuahe.mountain.common.mappers.UserMapper;
import cn.edu.hnuahe.mountain.common.utils.WxCpClient;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.bean.Gender;
import me.chanjar.weixin.cp.bean.WxCpUser;
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.message.WxCpMessage;
import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
import org.noear.solon.annotation.Controller;
import org.noear.solon.annotation.Inject;
import org.noear.solon.annotation.Mapping;
import org.noear.solon.core.handle.MethodType; import java.util.List; /**
* @author 颖
*/
@Controller
@Mapping(value = "/wechat")
public class WeChatController { @Inject
WxCpClient wxCpClient; @Mapping(value = "sendMessage", method = MethodType.ALL)
public WxCpMessageSendResult sendMessage() throws WxErrorException {
NewArticle part1 = new NewArticle();
part1.setUrl("https://www.baidu.com/");
part1.setPicUrl("https://pc-index-skin.cdn.bcebos.com/hiphoto/56868369122.jpg?x-bce-process=image/crop,x_0,y_0,w_1728,h_1080");
part1.setDescription("Is Really A Happy Day");
part1.setTitle("Happy Day"); WxCpMessage message = WxCpMessage.NEWS()
.agentId(this.wxCpClient.get().getWxCpConfigStorage().getAgentId())
.toUser("2102160202008")
.addArticle(part1)
.build(); return this.wxCpClient.get()
.getMessageService()
.send(message); } }

散花~

WxJava for Solon - 咱也不知道为啥要写的更多相关文章

  1. 一个用消息队列 的人,不知道为啥用 MQ,这就有点尴尬

    消息队列 为什么写这篇文章? 博主有两位朋友分别是小A和小B: 小A,工作于传统软件行业(某社保局的软件外包公司),每天工作内容就是和产品聊聊需求,改改业务逻辑.再不然就是和运营聊聊天,写几个SQL, ...

  2. 天天都用消息队列,却不知道为啥要用MQ,这就有点尴尬了

    1.为什么要使用消息队列? 分析:一个用消息队列的人,不知道为啥用,有点尴尬.没有复习这点,很容易被问蒙,然后就开始胡扯了. 回答:这个问题,咱只答三个最主要的应用场景(不可否认还有其他的,但是只答三 ...

  3. idea的maven项目不知道为啥下载不下来jar包,看本地仓库只是下载了一下xml文件,没有jar包问题

    确认了私服上的jar包能直接下载下来,而且jar包是正常的:但是就是不能通过idea下载,通过idea下载到本地仓库的只生成了.lastUpdated文件,检查了setting.xml文件.网络,私服 ...

  4. 写了shell脚本想一键启动三台虚拟机的Zookeeper,却不知道为啥总是启动不了

    首先,一键启动的shell脚本是这样的 #! /bin/bash case $1 in "start"){ for i in node01 node02 node03 do ssh ...

  5. *****又错一道,不知道为啥。。。 ybt【例5.19】字符串判等

    [题目描述] 判断两个由大小写字母和空格组成的字符串在忽略大小写,且忽略空格后是否相等. [输入] 两行,每行包含一个字符串. [输出] 若两个字符串相等,输出YES,否则输出NO. 代码我觉得没啥问 ...

  6. Floyd | | jzoj[1218] | | [Usaco2009 Dec]Toll 过路费 | | BZOJ 1774 | | 我也不知道该怎么写

    写在前面:老师说这一道题是神题,事实上确实如此,主要是考察对Floyd的理解 ******************************题目.txt************************* ...

  7. web中的——作者也不知道这里面写的啥

    1.使用超链接<a href="/Default/Index">添加</a><a href="#">返回显示信息</a ...

  8. 学习Swift的点点滴滴

    1.类型标注 之前不知道为啥别人写的Swift语言的时候,定义常量或者变量的格式是 常量: let 常量名: 常量类型 = 常量值  或者 变量: var 变量名: 变量类型 = 初始值 原来书上有记 ...

  9. 合同主体列表添加两条合同主体,返回合并支付页面,支付总弹"请选择合同主体",删除后,竟然还能支付(改合并支付页面的字段状态)

    bug描述: 操作步骤:1.进入"商标续展"产品详情页面,点击立即购买(数量设为2),进入合并订单界面,选择合同主体,点击全部,清空所有合同主体2.新建合同主体保存,设置该合同主体 ...

  10. QLPreViewController的初步实用

    前一阵项目需要添加一个文档文件的查看功能,于是就各种找资料,一开始想实用webView,然而webView有的格式不支持,而且占内存太大了.找着找着就找到QLPreViewController.用了一 ...

随机推荐

  1. PostgreSQL 序列(Sequence)

    基本操作 --新增序列 CREATE SEQUENCE xxx_id_seq INCREMENT 1 -- 一次加多少 MINVALUE 1 -- 最小值 START 1 --从多少开始 CACHE ...

  2. vue 甘特图(附件):甘特图附件

    甘特图样式: .gantt_container { border-color: transparent !important; .gantt_right { top: 0% !important; d ...

  3. AdaBoost算法解密:从基础到应用的全面解析

    本文全面而深入地探讨了AdaBoost算法,从其基础概念和原理到Python实战应用.文章不仅详细解析了AdaBoost的优缺点,还通过实例展示了如何在Python中实现该算法. 关注TechLead ...

  4. JavaSE面试题01:自增变量

    JavaSE面试题:自增变量 来源:https://runwsh.com/ 代码 public static void main(String[] args) { int i=1; i=i++; in ...

  5. SQL Server 2000 创建角色,登陆用户,安全用户,批量授予权限

    前言 我在2011年刚入门学习的时候,是从 SQL Server 2008 开始学的,再加上这些年较少接触 SQL Server 2000,因此对它不是很熟. 之前都是在 SQL Server 200 ...

  6. vivado仿真(无需testbench)

    vivado仿真(无testbench) 实现步骤 新建一个工程并添加自己编写的Verilog文件 添加后vivado会自动识别文件中的module 创建block design文件,添加模块 添加前 ...

  7. 最全的VLOOKUP应用教程

    VLOOKUP是Excel中最常用的函数之一,它可以让我们在一个表格中查找指定值,并返回与该值匹配的另一个单元格中的内容. 在这篇文章中,我们将深入探讨VLOOKUP的使用方法,从而为您提供一份史上最 ...

  8. 国内 AI 成图第一案!你来你会怎么判?

    我国目前并未出台专门针对网络爬虫技术的法律规范,但在司法实践中,相关判决已屡见不鲜,K 哥特设了"K哥爬虫普法"专栏,本栏目通过对真实案例的分析,旨在提高广大爬虫工程师的法律意识, ...

  9. idea的maven

    在我学习springMvc时一直报一个错,后来发现是maven一直出错导致的 这个maven是idea系统自己的maven,用着用着发现依赖项不见了,怎么导入坐标都导不进去,导致在创建maven项目时 ...

  10. GIS系统想要实现Cesium For Unreal的视觉效果是否有捷径可走?

    对于大多数GIS开发人员来说,CesiumJS都是比较熟悉的引擎,但是相比较Cesium For Unreal而言,CesiumJS的视觉效果就显得差强人意了,因此一些GIS开发人员对Cesium F ...