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); + } }