diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java index 98f9d78a..f7ea7855 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManager.java @@ -34,5 +34,6 @@ void handleAppleTransactionError(ResponseEntity respons SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(String payload); - void reSubscribeApple(AppleNotificationPayloadVO payloadVO); + void reSubscribeApple(AppleNotificationPayloadVO payloadVO, String notificationType); + void expiredSubscribe(AppleNotificationPayloadVO payloadVO); } diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java index 4a6168e3..d14f609b 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseManagerImpl.java @@ -3,9 +3,7 @@ import static com.yello.server.global.common.ErrorCode.APPLE_TOKEN_SERVER_EXCEPTION; import static com.yello.server.global.common.ErrorCode.GOOGLE_SUBSCRIPTIONS_SUBSCRIPTION_EXCEPTION; import static com.yello.server.global.common.ErrorCode.NOT_FOUND_TRANSACTION_EXCEPTION; -import static com.yello.server.global.common.util.ConstantUtil.REFUND_FIVE_TICKET; -import static com.yello.server.global.common.util.ConstantUtil.REFUND_ONE_TICKET; -import static com.yello.server.global.common.util.ConstantUtil.REFUND_TWO_TICKET; +import static com.yello.server.global.common.util.ConstantUtil.*; import com.fasterxml.jackson.databind.ObjectMapper; import com.yello.server.domain.purchase.dto.apple.AppleNotificationPayloadVO; @@ -118,16 +116,21 @@ public void changeSubscriptionStatus(AppleNotificationPayloadVO payloadVO) { .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); User user = purchaseData.purchase().getUser(); - if (payloadVO.subtype().equals(ConstantUtil.APPLE_SUBTYPE_AUTO_RENEW_DISABLED) + if(payloadVO.subtype().equals(APPLE_SUBTYPE_AUTO_RENEW_ENABLED)) { + user.setSubscribe(Subscribe.ACTIVE); + purchase.setPurchaseState(PurchaseState.ACTIVE); + return; + } + + if (payloadVO.subtype().equals(APPLE_SUBTYPE_AUTO_RENEW_DISABLED) && !user.getSubscribe().equals(Subscribe.NORMAL)) { user.setSubscribe(Subscribe.CANCELED); purchase.setPurchaseState(PurchaseState.CANCELED); + return; } - if (payloadVO.subtype().equals(ConstantUtil.APPLE_SUBTYPE_VOLUNTARY)) { - user.setSubscribe(Subscribe.NORMAL); - purchase.setPurchaseState(PurchaseState.PAUSED); - } + user.setSubscribe(Subscribe.CANCELED); + purchase.setPurchaseState(PurchaseState.CANCELED); } @Override @@ -141,48 +144,40 @@ public void refundAppleInApp(AppleNotificationPayloadVO payloadVO) { switch (purchaseData.purchase().getProductType()) { case YELLO_PLUS -> { user.setSubscribe(Subscribe.NORMAL); - purchase.setPurchaseState(PurchaseState.INACTIVE); + purchase.setPurchaseState(PurchaseState.PAUSED); } case ONE_TICKET -> { validateTicketCount(REFUND_ONE_TICKET, user); - purchase.setPurchaseState(PurchaseState.INACTIVE); + purchase.setPurchaseState(PurchaseState.PAUSED); } case TWO_TICKET -> { validateTicketCount(REFUND_TWO_TICKET, user); - purchase.setPurchaseState(PurchaseState.INACTIVE); + purchase.setPurchaseState(PurchaseState.PAUSED); } case FIVE_TICKET -> { validateTicketCount(REFUND_FIVE_TICKET, user); - purchase.setPurchaseState(PurchaseState.INACTIVE); + purchase.setPurchaseState(PurchaseState.PAUSED); } } } @Override - public SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(String payload) { - AppleNotificationPayloadVO payloadVO = decodeApplePayload(payload); - Purchase purchase = decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); - - return SlackAppleNotificationResponse.of(payloadVO, purchase); - } - - @Override - public void reSubscribeApple(AppleNotificationPayloadVO payloadVO) { + public void reSubscribeApple(AppleNotificationPayloadVO payloadVO, String notificationType) { - if (!payloadVO.subtype().equals(ConstantUtil.APPLE_SUBTYPE_RESUBSCRIBE)) { + if (notificationType.equals(APPLE_NOTIFICATION_SUBSCRIBED) && !payloadVO.subtype().equals(APPLE_SUBTYPE_RESUBSCRIBE)) { return; } AppleJwsTransactionResponse appleJwtDecode = - decodeAppleDataPayload(payloadVO.data().signedTransactionInfo()); + decodeAppleDataPayload(payloadVO.data().signedTransactionInfo()); Purchase purchase = - purchaseRepository.findByTransactionId(appleJwtDecode.originalTransactionId()) - .orElseThrow(() -> new PurchaseConflictException(NOT_FOUND_TRANSACTION_EXCEPTION)); + purchaseRepository.findByTransactionId(appleJwtDecode.originalTransactionId()) + .orElseThrow(() -> new PurchaseConflictException(NOT_FOUND_TRANSACTION_EXCEPTION)); Purchase reSubscribePurchase = - createSubscribe(purchase.getUser(), Gateway.APPLE, appleJwtDecode.transactionId(), null, - PurchaseState.ACTIVE, appleJwtDecode.toString()); + createSubscribe(purchase.getUser(), Gateway.APPLE, appleJwtDecode.transactionId(), null, + PurchaseState.ACTIVE, appleJwtDecode.toString()); purchase.setPurchaseState(PurchaseState.INACTIVE); reSubscribePurchase.setPurchaseState(PurchaseState.ACTIVE); @@ -190,6 +185,25 @@ public void reSubscribeApple(AppleNotificationPayloadVO payloadVO) { purchaseRepository.save(reSubscribePurchase); } + @Override + public void expiredSubscribe(AppleNotificationPayloadVO payloadVO) { + ApplePurchaseVO purchaseData = getPurchaseData(payloadVO); + Purchase purchase = + purchaseRepository.findByTransactionId(purchaseData.transactionId()) + .orElseThrow(() -> new PurchaseNotFoundException(NOT_FOUND_TRANSACTION_EXCEPTION)); + User user = purchaseData.purchase().getUser(); + user.setSubscribe(Subscribe.NORMAL); + purchase.setPurchaseState(PurchaseState.INACTIVE); + } + + @Override + public SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(String payload) { + AppleNotificationPayloadVO payloadVO = decodeApplePayload(payload); + Purchase purchase = decodeAppleNotificationData(payloadVO.data().signedTransactionInfo()); + + return SlackAppleNotificationResponse.of(payloadVO, purchase); + } + public void validateTicketCount(int ticketCount, User user) { if (user.getTicketCount() >= ticketCount) { user.addTicketCount(-Math.abs(ticketCount)); diff --git a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java index 197cf608..7001db8a 100644 --- a/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java +++ b/src/main/java/com/yello/server/domain/purchase/service/PurchaseService.java @@ -20,16 +20,7 @@ import static com.yello.server.global.common.ErrorCode.NOT_FOUND_TRANSACTION_EXCEPTION; import static com.yello.server.global.common.ErrorCode.PURCHASE_TOKEN_NOT_FOUND_PURCHASE_EXCEPTION; import static com.yello.server.global.common.ErrorCode.SUBSCRIBE_ACTIVE_EXCEPTION; -import static com.yello.server.global.common.util.ConstantUtil.APPLE_NOTIFICATION_CONSUMPTION_REQUEST; -import static com.yello.server.global.common.util.ConstantUtil.APPLE_NOTIFICATION_EXPIRED; -import static com.yello.server.global.common.util.ConstantUtil.APPLE_NOTIFICATION_REFUND; -import static com.yello.server.global.common.util.ConstantUtil.APPLE_NOTIFICATION_SUBSCRIBED; -import static com.yello.server.global.common.util.ConstantUtil.APPLE_NOTIFICATION_SUBSCRIPTION_STATUS_CHANGE; -import static com.yello.server.global.common.util.ConstantUtil.APPLE_NOTIFICATION_TEST; -import static com.yello.server.global.common.util.ConstantUtil.FIVE_TICKET_ID; -import static com.yello.server.global.common.util.ConstantUtil.ONE_TICKET_ID; -import static com.yello.server.global.common.util.ConstantUtil.TWO_TICKET_ID; -import static com.yello.server.global.common.util.ConstantUtil.YELLO_PLUS_ID; +import static com.yello.server.global.common.util.ConstantUtil.*; import com.google.gson.Gson; import com.google.gson.JsonObject; @@ -336,20 +327,24 @@ public void appleNotification(AppleNotificationRequest request) { }); switch (payloadVO.notificationType()) { - case APPLE_NOTIFICATION_CONSUMPTION_REQUEST: - break; - case APPLE_NOTIFICATION_SUBSCRIPTION_STATUS_CHANGE, APPLE_NOTIFICATION_EXPIRED: + case APPLE_NOTIFICATION_SUBSCRIPTION_STATUS_CHANGE -> { purchaseManager.changeSubscriptionStatus(payloadVO); - break; - case APPLE_NOTIFICATION_REFUND: + } + case APPLE_NOTIFICATION_EXPIRED ->{ + purchaseManager.expiredSubscribe(payloadVO); + } + case APPLE_NOTIFICATION_REFUND -> { purchaseManager.refundAppleInApp(payloadVO); - break; - case APPLE_NOTIFICATION_SUBSCRIBED: - purchaseManager.reSubscribeApple(payloadVO); - case APPLE_NOTIFICATION_TEST: + } + case APPLE_NOTIFICATION_SUBSCRIBED, APPLE_NOTIFICATION_DID_RENEW -> { + purchaseManager.reSubscribeApple(payloadVO, payloadVO.notificationType()); + } + case APPLE_NOTIFICATION_TEST -> { return; - default: + } + default -> { throw new PurchaseNotFoundException(NOT_FOUND_NOTIFICATION_TYPE_EXCEPTION); + } } } diff --git a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java index f99143ad..36140c33 100644 --- a/src/main/java/com/yello/server/global/common/util/ConstantUtil.java +++ b/src/main/java/com/yello/server/global/common/util/ConstantUtil.java @@ -60,9 +60,11 @@ public class ConstantUtil { public static final String APPLE_NOTIFICATION_EXPIRED = "EXPIRED"; public static final String APPLE_NOTIFICATION_TEST = "TEST"; public static final String APPLE_NOTIFICATION_SUBSCRIBED = "SUBSCRIBED"; + public static final String APPLE_NOTIFICATION_DID_RENEW = "DID_RENEW"; public static final String APPLE_SUBTYPE_AUTO_RENEW_DISABLED = "AUTO_RENEW_DISABLED"; public static final String APPLE_SUBTYPE_VOLUNTARY = "VOLUNTARY"; public static final String APPLE_SUBTYPE_AUTO_RENEW_ENABLED = "AUTO_RENEW_ENABLED"; + public static final String APPLE_SUBTYPE_BILLING_RECOVERY = "BILLING_RECOVERY"; public static final String APPLE_SUBTYPE_RESUBSCRIBE = "RESUBSCRIBE"; public static final int REFUND_ONE_TICKET = 1; public static final int REFUND_TWO_TICKET = 2; diff --git a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java index e0782369..714f5b46 100644 --- a/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java +++ b/src/test/java/com/yello/server/domain/purchase/FakePurchaseManager.java @@ -89,7 +89,12 @@ public SlackAppleNotificationResponse checkPurchaseDataByAppleSignedPayload(Stri } @Override - public void reSubscribeApple(AppleNotificationPayloadVO payloadVO) { + public void reSubscribeApple(AppleNotificationPayloadVO payloadVO, String notificationType) { + + } + + @Override + public void expiredSubscribe(AppleNotificationPayloadVO payloadVO) { } }