|
@@ -2,6 +2,8 @@ package com.zanxiang.game.back.serve.service.impl;
|
|
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
|
+import com.zanxiang.erp.base.ErpServer;
|
|
|
|
+import com.zanxiang.erp.base.rpc.IDingTalkMsgRpc;
|
|
import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameCallbackMapper;
|
|
import com.zanxiang.game.back.serve.dao.mapper.GameTencentMiniGameCallbackMapper;
|
|
import com.zanxiang.game.back.serve.pojo.dto.GameTencentCallbackDTO;
|
|
import com.zanxiang.game.back.serve.pojo.dto.GameTencentCallbackDTO;
|
|
import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameCallback;
|
|
import com.zanxiang.game.back.serve.pojo.entity.GameTencentMiniGameCallback;
|
|
@@ -23,6 +25,8 @@ import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.stereotype.Service;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.LocalDate;
|
|
import java.time.LocalDate;
|
|
|
|
+import java.time.LocalDateTime;
|
|
|
|
+import java.util.Map;
|
|
import java.util.Optional;
|
|
import java.util.Optional;
|
|
|
|
|
|
@Slf4j
|
|
@Slf4j
|
|
@@ -36,6 +40,9 @@ public class GameTencentMiniGameCallbackServiceImpl extends ServiceImpl<GameTenc
|
|
@DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
|
|
@DubboReference(providedBy = ServerInfo.SERVER_DUBBO_NAME)
|
|
private IAgentRpc agentRpc;
|
|
private IAgentRpc agentRpc;
|
|
|
|
|
|
|
|
+ @DubboReference(providedBy = ErpServer.SERVER_DUBBO_NAME)
|
|
|
|
+ private IDingTalkMsgRpc dingTalkMsgRpc;
|
|
|
|
+
|
|
@Autowired
|
|
@Autowired
|
|
private KafkaProducer<String, String> kafkaProducer;
|
|
private KafkaProducer<String, String> kafkaProducer;
|
|
|
|
|
|
@@ -66,28 +73,81 @@ public class GameTencentMiniGameCallbackServiceImpl extends ServiceImpl<GameTenc
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
- public String getCallBackUrl(String wechatOpenid, String clickId) {
|
|
|
|
|
|
+ public boolean callback(Map<String, Object> paramMap) {
|
|
|
|
+ GameTencentMiniGameCallback callback = null;
|
|
try {
|
|
try {
|
|
|
|
+ callback = JsonUtil.toObj(JsonUtil.toString(paramMap), GameTencentMiniGameCallback.class);
|
|
|
|
+ AgentRpcVO agent = agentRpc.getByTencentAccountId(callback.getAccountId()).getData();
|
|
|
|
+ if (agent != null) {
|
|
|
|
+ callback.setAgentKey(agent.getAgentKey());
|
|
|
|
+ callback.setGameId(agent.getGameId());
|
|
|
|
+ callback.setWechatAppId(agent.getAppId());
|
|
|
|
+ } else {
|
|
|
|
+ callback.setAgentKey("-");
|
|
|
|
+ callback.setGameId(-1L);
|
|
|
|
+ log.error("腾讯检测链接数据找不到渠道, callback :{}, paramMap : {}", JsonUtil.toString(callback), JsonUtil.toString(paramMap));
|
|
|
|
+ }
|
|
|
|
+ callback.setDay(callback.getClickTime() == null || callback.getClickTime() < 1000 ? LocalDate.now() : DateUtil.secondToLocalDate(callback.getClickTime()));
|
|
|
|
+ save(callback);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("接收到腾讯监测链接数据保存异常, paramMap : {}, errorMsg : {}", JsonUtil.toString(paramMap), e.getMessage(), e);
|
|
|
|
+ //发送钉钉消息通知开发
|
|
|
|
+ dingTalkMsgRpc.sendByUserId(220L, DateUtil.formatLocalDateTime(LocalDateTime.now()) + " : 腾讯小游戏监测链接数据入库异常");
|
|
|
|
+ }
|
|
|
|
+ if (callback != null) {
|
|
|
|
+ try {
|
|
|
|
+ kafkaProducer.send(new ProducerRecord<>(tencentCallbackTopic, callback.getAccountId().toString(), JsonUtil.toString(callback)));
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Override
|
|
|
|
+ public String getCallBackUrl(Long gameId, String wechatOpenid, String clickId, LocalDateTime registerTime, boolean matchTime) {
|
|
|
|
+ try {
|
|
|
|
+ //1. 精准匹配, openId 必须匹配, requestId, clickId, impressionId, 有一个匹配上即可
|
|
GameTencentMiniGameCallback tencentMiniGameCallback = super.getOne(
|
|
GameTencentMiniGameCallback tencentMiniGameCallback = super.getOne(
|
|
new LambdaQueryWrapper<GameTencentMiniGameCallback>()
|
|
new LambdaQueryWrapper<GameTencentMiniGameCallback>()
|
|
|
|
+ .eq(GameTencentMiniGameCallback::getGameId, gameId)
|
|
.eq(GameTencentMiniGameCallback::getWechatOpenid, wechatOpenid)
|
|
.eq(GameTencentMiniGameCallback::getWechatOpenid, wechatOpenid)
|
|
.and(qw -> qw.eq(GameTencentMiniGameCallback::getImpressionId, clickId)
|
|
.and(qw -> qw.eq(GameTencentMiniGameCallback::getImpressionId, clickId)
|
|
.or().eq(GameTencentMiniGameCallback::getRequestId, clickId)
|
|
.or().eq(GameTencentMiniGameCallback::getRequestId, clickId)
|
|
- .or().eq(GameTencentMiniGameCallback::getClickId, clickId)
|
|
|
|
- )
|
|
|
|
|
|
+ .or().eq(GameTencentMiniGameCallback::getClickId, clickId))
|
|
.orderByDesc(GameTencentMiniGameCallback::getClickTime)
|
|
.orderByDesc(GameTencentMiniGameCallback::getClickTime)
|
|
.last("limit 1"));
|
|
.last("limit 1"));
|
|
|
|
+ //2. 模糊匹配, 分别使用 requestId, clickId, impressionId 匹配, 有一个匹配上即可, 加上注册时间距离最近条件
|
|
|
|
+ if (tencentMiniGameCallback == null) {
|
|
|
|
+ tencentMiniGameCallback = super.getOne(new LambdaQueryWrapper<GameTencentMiniGameCallback>()
|
|
|
|
+ .eq(GameTencentMiniGameCallback::getGameId, gameId)
|
|
|
|
+ .and(qw -> qw.eq(GameTencentMiniGameCallback::getImpressionId, clickId)
|
|
|
|
+ .or().eq(GameTencentMiniGameCallback::getRequestId, clickId)
|
|
|
|
+ .or().eq(GameTencentMiniGameCallback::getClickId, clickId))
|
|
|
|
+ .le(matchTime, GameTencentMiniGameCallback::getClickTime, DateUtil.localDateTimeToSecond(registerTime))
|
|
|
|
+ .orderByDesc(GameTencentMiniGameCallback::getClickTime)
|
|
|
|
+ .last("limit 1"));
|
|
|
|
+ }
|
|
|
|
+ //3. 兜底逻辑, 只用openId匹配
|
|
|
|
+ if (tencentMiniGameCallback == null) {
|
|
|
|
+ tencentMiniGameCallback = super.getOne(new LambdaQueryWrapper<GameTencentMiniGameCallback>()
|
|
|
|
+ .eq(GameTencentMiniGameCallback::getGameId, gameId)
|
|
|
|
+ .eq(GameTencentMiniGameCallback::getWechatOpenid, wechatOpenid)
|
|
|
|
+ .orderByDesc(GameTencentMiniGameCallback::getClickTime)
|
|
|
|
+ .last("limit 1"));
|
|
|
|
+ }
|
|
|
|
+ //判断监测链接数据
|
|
String callBack = Optional.ofNullable(tencentMiniGameCallback)
|
|
String callBack = Optional.ofNullable(tencentMiniGameCallback)
|
|
.map(GameTencentMiniGameCallback::getCallback)
|
|
.map(GameTencentMiniGameCallback::getCallback)
|
|
.orElse(null);
|
|
.orElse(null);
|
|
if (Strings.isBlank(callBack)) {
|
|
if (Strings.isBlank(callBack)) {
|
|
- log.error("匹配监测链接为空, wechatOpenid : {}, clickId : {}", wechatOpenid, clickId);
|
|
|
|
|
|
+ log.error("匹配监测链接为空, gameId : {}, wechatOpenid : {}, clickId : {}", gameId, wechatOpenid, clickId);
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|
|
//返回匹配回传地址
|
|
//返回匹配回传地址
|
|
return URIUtil.decodeURIComponent(callBack);
|
|
return URIUtil.decodeURIComponent(callBack);
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
- log.error("匹配监测链接异常, wechatOpenid : {}, clickId : {}", wechatOpenid, clickId);
|
|
|
|
|
|
+ log.error("匹配监测链接异常, gameId : {}, wechatOpenid : {}, clickId : {}", gameId, wechatOpenid, clickId);
|
|
}
|
|
}
|
|
return null;
|
|
return null;
|
|
}
|
|
}
|