Commit 55e93835 by 吕明尚

增加小程序消息推送类

parent 592ab3bd
...@@ -5,7 +5,8 @@ public enum ReceiptRdeisEnum { ...@@ -5,7 +5,8 @@ public enum ReceiptRdeisEnum {
PREPARE(1, "TUANGOU.RECEIPT.PREPARE."), PREPARE(1, "TUANGOU.RECEIPT.PREPARE."),
MT_SESSION_KEY(2, "MT_SESSION_KEY"), MT_SESSION_KEY(2, "MT_SESSION_KEY"),
MT_SESSION_OBJECT_KEY(3, "MT_SESSION_OBJECT_KEY"), MT_SESSION_OBJECT_KEY(3, "MT_SESSION_OBJECT_KEY"),
ORDER_NO_KEY(4, "ORDER_NO_KEY."); ORDER_NO_KEY(4, "ORDER_NO_KEY."),
ACCESS_TOKEN_KEY(5, "ACCESS_TOKEN_KEY.");
private Integer code; private Integer code;
......
package share.web.controller.common; package share.web.controller.common;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaSubscribeService;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.hutool.core.date.LocalDateTimeUtil;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.bean.subscribemsg.TemplateInfo;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import share.common.core.domain.AjaxResult;
import share.system.service.WxMsgPushConService;
import share.system.util.WXMsgPushUtils; import share.system.util.WXMsgPushUtils;
import java.util.Map; import java.util.Map;
/** /**
* 微信小程序 模板消息推送 * 微信小程序 模板消息推送
**/ **/
@RestController @RestController
@Slf4j
@RequestMapping("/weixinpublic") @RequestMapping("/weixinpublic")
public class WxMsgPushController { public class WxMsgPushController {
@Value("${wechat.token}") @Value("${wechat.token}")
private String token; private String token;
@Autowired
private WxMsgPushConService wxMsgPushConService;
/** /**
* 正确响应微信发送的Token验证,注意 这里是 get请求 * 正确响应微信发送的Token验证,注意 这里是 get请求
**/ **/
...@@ -43,4 +61,12 @@ public class WxMsgPushController { ...@@ -43,4 +61,12 @@ public class WxMsgPushController {
// 验证成功 将 echostr 原格式返回 ,即可完成验证 // 验证成功 将 echostr 原格式返回 ,即可完成验证
return echostr; return echostr;
} }
@GetMapping("/api/zphs/sendZbhsMsg")
@ApiOperation("传openId发送微信服务通知")
public AjaxResult<Boolean> sendMsg(String openID) throws WxErrorException {
wxMsgPushConService.sendSmallMsg(openID);
return AjaxResult.success(true);
}
} }
package share.web.core.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@Data
@ConfigurationProperties(prefix = "wx.miniapp")
public class WxMaProperties {
private List<Config> configs;
@Data
public static class Config {
/**
* 设置微信小程序的appid
*/
private String appid;
/**
* 设置微信小程序的Secret
*/
private String secret;
/**
* 设置微信小程序消息服务器配置的token
*/
private String token;
/**
* 设置微信小程序消息服务器配置的EncodingAESKey
*/
private String aesKey;
/**
* 消息格式,XML或者JSON
*/
private String msgDataFormat;
}
}
package share.web.interceptor;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
import com.google.common.collect.Lists;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.error.WxRuntimeException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import share.web.core.config.WxMaProperties;
import java.io.File;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Configuration
@EnableConfigurationProperties(WxMaProperties.class)
public class WxMaConfiguration {
private final WxMaProperties properties;
@Autowired
public WxMaConfiguration(WxMaProperties properties) {
this.properties = properties;
}
@Bean
public WxMaService wxMaService() {
List<WxMaProperties.Config> configs = this.properties.getConfigs();
if (configs == null) {
throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!");
}
WxMaService maService = new WxMaServiceImpl();
maService.setMultiConfigs(
configs.stream()
.map(a -> {
WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
// WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
// 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常
config.setAppid(a.getAppid());
config.setSecret(a.getSecret());
config.setToken(a.getToken());
config.setAesKey(a.getAesKey());
config.setMsgDataFormat(a.getMsgDataFormat());
return config;
}).collect(Collectors.toMap(WxMaDefaultConfigImpl::getAppid, a -> a, (o, n) -> o)));
return maService;
}
@Bean
public WxMaMessageRouter wxMaMessageRouter(WxMaService wxMaService) {
final WxMaMessageRouter router = new WxMaMessageRouter(wxMaService);
router
.rule().handler(logHandler).next()
.rule().async(false).content("订阅消息").handler(subscribeMsgHandler).end()
.rule().async(false).content("文本").handler(textHandler).end()
.rule().async(false).content("图片").handler(picHandler).end()
.rule().async(false).content("二维码").handler(qrcodeHandler).end();
return router;
}
private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> {
service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder()
.templateId("此处更换为自己的模板id")
.data(Lists.newArrayList(
new WxMaSubscribeMessage.MsgData("keyword1", "339208499")))
.toUser(wxMessage.getFromUser())
.build());
return null;
};
private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
log.info("收到消息:" + wxMessage.toString());
service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
.toUser(wxMessage.getFromUser()).build());
return null;
};
private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> {
service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
.toUser(wxMessage.getFromUser()).build());
return null;
};
private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {
try {
WxMediaUploadResult uploadResult = service.getMediaService()
.uploadMedia("image", "png",
ClassLoader.getSystemResourceAsStream("tmp.png"));
service.getMsgService().sendKefuMsg(
WxMaKefuMessage
.newImageBuilder()
.mediaId(uploadResult.getMediaId())
.toUser(wxMessage.getFromUser())
.build());
} catch (WxErrorException e) {
e.printStackTrace();
}
return null;
};
private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {
try {
final File file = service.getQrcodeService().createQrcode("123", 430);
WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
service.getMsgService().sendKefuMsg(
WxMaKefuMessage
.newImageBuilder()
.mediaId(uploadResult.getMediaId())
.toUser(wxMessage.getFromUser())
.build());
} catch (WxErrorException e) {
e.printStackTrace();
}
return null;
};
}
...@@ -21,7 +21,14 @@ wechat: ...@@ -21,7 +21,14 @@ wechat:
mchId: 1658895429 mchId: 1658895429
signKey: ZEKu56XCezuESfNEdM4zVZEN3cz2PuHz signKey: ZEKu56XCezuESfNEdM4zVZEN3cz2PuHz
certPath: /Users/project/pseer/apiclient_cert.p12 certPath: /Users/project/pseer/apiclient_cert.p12
wx:
miniapp:
configs:
- appid: wxdd170b8783edf7a0
secret: 7339f117e85876a0dfe10ea1ed47340e
token: coujio token: coujio
aesKey: zf8vTHbI0ZDPTkkCXHEuwh9EbtVtOn6n4vQjMb9OFrS
msgDataFormat: JSON
# 开发环境配置 # 开发环境配置
server: server:
# 服务器的HTTP端口,默认为8080 # 服务器的HTTP端口,默认为8080
......
package share.quartz.task; package share.quartz.task;
import cn.hutool.json.JSONObject; import cn.hutool.json.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.dianping.openapi.sdk.api.oauth.entity.CustomerRefreshTokenResponse; import com.dianping.openapi.sdk.api.oauth.entity.CustomerRefreshTokenResponse;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -17,6 +25,7 @@ import share.system.service.ISConsumerCouponService; ...@@ -17,6 +25,7 @@ import share.system.service.ISConsumerCouponService;
import share.system.service.ISOrderService; import share.system.service.ISOrderService;
import share.system.service.QPService; import share.system.service.QPService;
import java.io.IOException;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
...@@ -26,17 +35,28 @@ import java.util.concurrent.TimeUnit; ...@@ -26,17 +35,28 @@ import java.util.concurrent.TimeUnit;
public class RedisTask { public class RedisTask {
@Autowired @Autowired
private ISConsumerCouponService isConsumerCouponService; private ISConsumerCouponService isConsumerCouponService;
@Autowired @Autowired
private QPService qpService; private QPService qpService;
@Autowired @Autowired
private RedisTemplate redisTemplate; private RedisTemplate redisTemplate;
@Autowired @Autowired
private RedisUtil redisUtil; private RedisUtil redisUtil;
@Autowired @Autowired
private ISCleanRecordsService isCleanRecordsService; private ISCleanRecordsService isCleanRecordsService;
@Autowired @Autowired
private ISOrderService isOrderService; private ISOrderService isOrderService;
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.secret}")
private String secret;
public void AuToReceiptCode() { public void AuToReceiptCode() {
//获取redis中所有以tuangou.receipt.prepare开头的key //获取redis中所有以tuangou.receipt.prepare开头的key
Set<String> keys = redisTemplate.keys(ReceiptRdeisEnum.PREPARE.getValue() + "*"); Set<String> keys = redisTemplate.keys(ReceiptRdeisEnum.PREPARE.getValue() + "*");
...@@ -73,6 +93,20 @@ public class RedisTask { ...@@ -73,6 +93,20 @@ public class RedisTask {
} }
} }
public void AutoWXAccessToken() throws IOException {
Boolean b = redisTemplate.hasKey(ReceiptRdeisEnum.ACCESS_TOKEN_KEY.getValue());
if (!b) {
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
HttpClient httpClient = HttpClients.createDefault();
HttpGet httpGet = new HttpGet(url);
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
String strEntity = EntityUtils.toString(entity, "UTF-8");
JSONObject jsonObject = new JSONObject(strEntity);
redisUtil.set(ReceiptRdeisEnum.ACCESS_TOKEN_KEY.getValue(), jsonObject.getStr("access_token"), Long.valueOf(jsonObject.getInt("expires_in") - 60 * 30), TimeUnit.SECONDS);
}
}
//自动添加保洁记录 //自动添加保洁记录
public void AutoAddSCleanRecords() { public void AutoAddSCleanRecords() {
Set<String> keys = redisTemplate.keys(ReceiptRdeisEnum.ORDER_NO_KEY.getValue() + "*"); Set<String> keys = redisTemplate.keys(ReceiptRdeisEnum.ORDER_NO_KEY.getValue() + "*");
......
...@@ -99,13 +99,6 @@ ...@@ -99,13 +99,6 @@
<systemPath>${project.basedir}/src/lib/dianping-openapi-java-sdk-qa-1.1.240-sources.jar</systemPath> <systemPath>${project.basedir}/src/lib/dianping-openapi-java-sdk-qa-1.1.240-sources.jar</systemPath>
</dependency> </dependency>
<dependency> <dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/commons-codec-1.9.jar</systemPath>
</dependency>
<dependency>
<groupId>com.google.guava</groupId> <groupId>com.google.guava</groupId>
<artifactId>guava</artifactId> <artifactId>guava</artifactId>
<version>28.2-android</version> <version>28.2-android</version>
...@@ -144,6 +137,12 @@ ...@@ -144,6 +137,12 @@
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
</dependency> </dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
<scope>compile</scope>
</dependency>
</dependencies> </dependencies>
</project> </project>
\ No newline at end of file
package share.system.service;
public interface WxMsgPushConService {
void sendSmallMsg(String openID);
}
package share.system.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
import cn.hutool.core.date.LocalDateTimeUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import share.system.service.WxMsgPushConService;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@Service
public class WxMsgPushConServiceeImpl implements WxMsgPushConService {
@Autowired
private WxMaService wxMaService;
/**
* 跳转的小程序页面
*/
private static final String PAGES_ZP = "pages/draft-review/list/list";
@Override
public void sendSmallMsg(String openID) {
Map<String, String> map = new HashMap<>();
map.put("thing4", "预约门店");
map.put("thing7", "服务名称");
map.put("date3", LocalDateTimeUtil.format(LocalDateTime.now(), "yyyy-MM-dd HH:mm:ss"));
map.put("thing5", "地址");
WxMaSubscribeMessage wxMaSubscribeMessage = WxMaSubscribeMessage.builder()
.toUser(openID)
.templateId("oTc000e4NHkoc7v9OLBZiwM6Q6SFzguemrx6d0iuVS8")
.page(PAGES_ZP)
.build();
// 设置将推送的消息
map.forEach((k, v) -> {
wxMaSubscribeMessage.addData(new WxMaSubscribeMessage.MsgData(k, v));
});
try {
log.info("开始发送消息!!!!");
wxMaService.getMsgService().sendSubscribeMsg(wxMaSubscribeMessage);
log.info("消息发送成功!!!!");
} catch (WxErrorException e) {
e.printStackTrace();
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment