diff --git a/pom.xml b/pom.xml
index 1ef0a40bc..965456436 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
4.0.0
manage
- 1.4.34
+ 1.4.35
UTF-8
1.8.0
diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailRSvcService.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailRSvcService.java
index 71651c2d0..1cf057525 100644
--- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailRSvcService.java
+++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/RetailRSvcService.java
@@ -16,5 +16,7 @@ public interface RetailRSvcService {
JSONObject setUpShopBySourceCode(String sourceCode, JSONObject params);
+ JSONObject appNotifyBySourceCode(String sourceCode, JSONObject params);
+
JSONObject getGeekSsoTokenInfo(String sourceCode, String clientMoniker);
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailRSvcServiceImpl.java b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailRSvcServiceImpl.java
index 52a213a94..a4f44f1d2 100644
--- a/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailRSvcServiceImpl.java
+++ b/src/main/java/au/com/royalpay/payment/manage/appclient/core/impls/RetailRSvcServiceImpl.java
@@ -4,11 +4,16 @@ import au.com.royalpay.payment.core.exceptions.InvalidShortIdException;
import au.com.royalpay.payment.manage.appclient.beans.RSvcMchBean;
import au.com.royalpay.payment.manage.appclient.core.RetailRSvcService;
import au.com.royalpay.payment.manage.appclient.extend.JWTUtil;
+import au.com.royalpay.payment.manage.mappers.log.AppMessageLogMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientConfigMapper;
+import au.com.royalpay.payment.manage.mappers.system.ClientDeviceTokenMapper;
import au.com.royalpay.payment.manage.mappers.system.ClientServicesApplyMapper;
import au.com.royalpay.payment.manage.merchants.core.ClientManager;
+import au.com.royalpay.payment.manage.pushMessage.bean.AppManagerMessageBuilder;
import au.com.royalpay.payment.tools.codec.AESCrypt;
import au.com.royalpay.payment.tools.device.DeviceSupport;
+import au.com.royalpay.payment.tools.device.message.AppMessage;
+import au.com.royalpay.payment.tools.device.message.AppMsgSender;
import au.com.royalpay.payment.tools.encryptalgorithm.SignUtils;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.NotFoundException;
@@ -25,13 +30,15 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
import java.security.Key;
-import java.util.Date;
-import java.util.UUID;
+import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
@Service
public class RetailRSvcServiceImpl implements RetailRSvcService {
private Logger logger = LoggerFactory.getLogger(getClass());
-
+ private Map senderMap = new HashMap<>();
@Resource
private ClientManager clientManager;
@Resource
@@ -42,6 +49,17 @@ public class RetailRSvcServiceImpl implements RetailRSvcService {
private ClientServicesApplyMapper clientServicesApplyMapper;
@Resource
private ClientConfigMapper clientConfigMapper;
+ @Resource
+ private ClientDeviceTokenMapper clientDeviceTokenMapper;
+ @Resource
+ private AppMessageLogMapper appMessageLogMapper;
+
+ private ThreadPoolExecutor sendingAppleMsgPool = new ThreadPoolExecutor(10, 30, 5, TimeUnit.SECONDS, new LinkedBlockingQueue());
+
+ @Resource
+ public void setAppMsgSenders(AppMsgSender[] senders) {
+ Arrays.stream(senders).forEach(appMsgSender -> senderMap.put(appMsgSender.devType(), appMsgSender));
+ }
@Override
public JSONObject findMchInfoBySourceCode(JSONObject device, String sourceCode, boolean debug) {
@@ -173,6 +191,42 @@ public class RetailRSvcServiceImpl implements RetailRSvcService {
return result;
}
+ @Override
+ public JSONObject appNotifyBySourceCode(String sourceCode, JSONObject params) {
+ JSONObject result = new JSONObject();
+ JSONObject svcInfo = commonIncrementalChannelMapper.findIncreamentalChannelBySourceCode(sourceCode);
+ try {
+ if (svcInfo == null || StringUtils.isEmpty(svcInfo.getString("channel_pub_key"))
+ || StringUtils.isEmpty(svcInfo.getString("platform_pub_key")) || StringUtils.isEmpty("platform_pri_key")) {
+ throw new BadRequestException("this channel config is wrong");
+ }
+ Key key = AESCrypt.fromKeyString(Base64.decodeBase64(params.getString("nonce_str")));
+ String signa = params.getString("sign");
+ params.remove("sign");
+ params = JSONObject.parseObject(JSON.toJSONString(params), Feature.OrderedField);
+ boolean checkSign = SignUtils.validSign(params.toJSONString(), signa, svcInfo.getString("channel_pub_key"));
+ if (!checkSign) {
+ throw new BadRequestException("sign is wrong");
+ }
+ String clientMoniker = decData(params.getString("partnerCode"), key, svcInfo.getString("platform_pri_key"));
+ logger.debug("geek {} app notify info :{}", clientMoniker,params.toJSONString());
+ JSONObject client = clientManager.getClientInfoByMoniker(clientMoniker);
+ if (client == null) {
+ throw new InvalidShortIdException();
+ }
+ String title = params.getString("title");
+ String body = params.getString("body");
+ String url = decData(params.getString("url"), key, svcInfo.getString("platform_pri_key"));
+ sendRServiceNotifyMessage(client,title,body,url);
+ result.put("result_status", "SUCCESS");
+ } catch (Exception e) {
+ logger.error("geek notify app fail:{} - {}",sourceCode,e.getMessage());
+ result.put("result_status", "SYSTEMERROR");
+ result.put("result_msg", e.getMessage());
+ }
+ return result;
+ }
+
@Override
public JSONObject getGeekSsoTokenInfo(String sourceCode, String clientMoniker) {
JSONObject svcInfo = commonIncrementalChannelMapper.findIncreamentalChannelBySourceCode(sourceCode);
@@ -198,6 +252,45 @@ public class RetailRSvcServiceImpl implements RetailRSvcService {
}};
}
+ private void sendRServiceNotifyMessage(JSONObject client, String title, String body, String url) {
+ logger.debug("sendAnnualMessage Begin");
+ JSONObject devToken = clientDeviceTokenMapper.getTestTokens();
+ Runnable task = () -> {
+ String token = devToken.getString("token");
+ JSONObject log = saveAppMessageLog(devToken.getString("dev_id"),
+ devToken.getIntValue("client_id"),
+ "annual_bill" + devToken.getString("client_type"),
+ token,
+ "跨境商城推送"
+ );
+ try {
+ JSONObject type = new JSONObject();
+ type.put("send_type", "annual_bill");
+ type.put("id", devToken.getString("dev_token_id"));
+ AppMsgSender sender = senderMap.get((devToken.getString("client_type")));
+ if (StringUtils.isBlank(token) || sender == null) {
+ return;
+ }
+ JSONObject managerMsg = new JSONObject();
+ managerMsg.put("title", title);
+ managerMsg.put("body", body);
+ managerMsg.put("type", type);
+ JSONObject messageData = new JSONObject();
+ messageData.put("url", url);
+ managerMsg.put("data", messageData);
+ managerMsg.put("msgType", "annual_bill");
+ AppMessage appMessage = new AppManagerMessageBuilder(managerMsg).buildMessage();
+ sender.sendMessage(appMessage, devToken);
+ log.put("status", 2);
+ appMessageLogMapper.update(log);
+ } catch (Exception e) {
+ logger.error("出错了:" + e.getMessage());
+ appMessageLogMapper.updateStatus(log.getString("send_id"), 1, e.getMessage());
+ }
+ };
+ sendingAppleMsgPool.execute(task);
+ }
+
private String encData(String data, Key key, String publicKey) {
String pubKeyEncData = SignUtils.encData(data, publicKey);
return org.apache.commons.codec.binary.Base64.encodeBase64String(AESCrypt.encrypt(pubKeyEncData.getBytes(StandardCharsets.UTF_8), key));
@@ -207,4 +300,17 @@ public class RetailRSvcServiceImpl implements RetailRSvcService {
String aesData = new String(AESCrypt.decrypt(Base64.decodeBase64(data), key), StandardCharsets.UTF_8);
return SignUtils.decData(aesData, privateKey);
}
+
+ private JSONObject saveAppMessageLog(String devId, int clientId, String messageType, String devToken, String remark) {
+ JSONObject log = new JSONObject();
+ log.put("dev_id", devId);
+ log.put("client_id", clientId);
+ log.put("msg_type", messageType);
+ log.put("dev_token", devToken);
+ log.put("remark", remark);
+ log.put("send_time", new Date());
+ appMessageLogMapper.save(log);
+ return log;
+
+ }
}
diff --git a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RsvcServiceController.java b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RsvcServiceController.java
index 73d28f932..099ec8609 100644
--- a/src/main/java/au/com/royalpay/payment/manage/appclient/web/RsvcServiceController.java
+++ b/src/main/java/au/com/royalpay/payment/manage/appclient/web/RsvcServiceController.java
@@ -22,4 +22,9 @@ public class RsvcServiceController {
public JSONObject setUpShopBySourceCode(@PathVariable String source_code, @RequestBody JSONObject params) {
return retailRSvcService.setUpShopBySourceCode(source_code, params);
}
+
+ @PostMapping(value = "/{source_code}/appNotify")
+ public JSONObject appNotifyBySourceCode(@PathVariable String source_code, @RequestBody JSONObject params) {
+ return retailRSvcService.appNotifyBySourceCode(source_code, params);
+ }
}