diff --git a/build.gradle b/build.gradle index da4c127..f004856 100644 --- a/build.gradle +++ b/build.gradle @@ -38,13 +38,14 @@ dependencies { testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.springframework.kafka:spring-kafka' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'io.github.lotteon-maven:blooming-blooms-utils:202401091420' + implementation 'io.github.lotteon-maven:blooming-blooms-utils:202401140749' runtimeOnly 'com.h2database:h2' implementation 'mysql:mysql-connector-java:8.0.33' testImplementation 'org.mock-server:mockserver-netty:5.11.2' // 사용 중인 MockServer 버전 implementation 'org.springframework.cloud:spring-cloud-starter-openfeign' implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.1' implementation 'org.springframework.boot:spring-boot-starter-validation' + implementation 'io.micrometer:micrometer-registry-prometheus:1.12.2' } dependencyManagement { @@ -112,4 +113,4 @@ jacocoTestReport { ) } finalizedBy 'jacocoTestCoverageVerification' -} \ No newline at end of file +} diff --git a/src/main/java/kr/bb/payment/controller/clientcontroller/OrderClientController.java b/src/main/java/kr/bb/payment/controller/clientcontroller/OrderClientController.java index 447ae7c..f3fd563 100644 --- a/src/main/java/kr/bb/payment/controller/clientcontroller/OrderClientController.java +++ b/src/main/java/kr/bb/payment/controller/clientcontroller/OrderClientController.java @@ -1,5 +1,6 @@ package kr.bb.payment.controller.clientcontroller; +import bloomingblooms.domain.batch.SubscriptionBatchDtoList; import bloomingblooms.domain.payment.KakaopayApproveRequestDto; import bloomingblooms.domain.payment.KakaopayReadyRequestDto; import bloomingblooms.domain.payment.KakaopayReadyResponseDto; @@ -54,4 +55,16 @@ CommonResponse cancel(@RequestBody KakaopayCancelRequestDto cancelRequestD kakaopayService.cancelPayment(cancelRequestDto); return CommonResponse.success(null); } + + @PostMapping(value = "/subscription") + CommonResponse subscription(@RequestBody SubscriptionBatchDtoList subscriptionBatchDtolist){ + kakaopayService.renewSubscription(subscriptionBatchDtolist); + return CommonResponse.success(null); + } + + @PostMapping(value = "/subscription/cancel") + CommonResponse cancelSubscription(@RequestBody KakaopayCancelRequestDto cancelRequestDto){ + kakaopayService.cancelSubscription(cancelRequestDto); + return CommonResponse.success(null); + } } diff --git a/src/main/java/kr/bb/payment/dto/response/KakaopayCancelSubscriptionResponseDto.java b/src/main/java/kr/bb/payment/dto/response/KakaopayCancelSubscriptionResponseDto.java new file mode 100644 index 0000000..a072bc2 --- /dev/null +++ b/src/main/java/kr/bb/payment/dto/response/KakaopayCancelSubscriptionResponseDto.java @@ -0,0 +1,20 @@ +package kr.bb.payment.dto.response; + +import java.time.LocalDateTime; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class KakaopayCancelSubscriptionResponseDto { + private String status; + private LocalDateTime created_at; + private LocalDateTime inactivated_at; + private LocalDateTime last_approved_at; +} diff --git a/src/main/java/kr/bb/payment/repository/SubscriptionRepository.java b/src/main/java/kr/bb/payment/repository/SubscriptionRepository.java index e95d6a7..c3c68b6 100644 --- a/src/main/java/kr/bb/payment/repository/SubscriptionRepository.java +++ b/src/main/java/kr/bb/payment/repository/SubscriptionRepository.java @@ -1,8 +1,10 @@ package kr.bb.payment.repository; +import java.util.Optional; import kr.bb.payment.entity.Subscription; import org.springframework.data.jpa.repository.JpaRepository; public interface SubscriptionRepository extends JpaRepository { Subscription findBySubscriptionSid(String subscriptionSid); + Optional findByOrderSubscriptionId(String orderSubscriptionId); } diff --git a/src/main/java/kr/bb/payment/service/KakaopayService.java b/src/main/java/kr/bb/payment/service/KakaopayService.java index e243fdf..477f4f4 100644 --- a/src/main/java/kr/bb/payment/service/KakaopayService.java +++ b/src/main/java/kr/bb/payment/service/KakaopayService.java @@ -14,7 +14,9 @@ import kr.bb.payment.dto.request.KakaopayCancelRequestDto; import kr.bb.payment.dto.response.KakaopayApproveResponseDto; import kr.bb.payment.dto.response.KakaopayCancelResponseDto; +import kr.bb.payment.dto.response.KakaopayCancelSubscriptionResponseDto; import kr.bb.payment.entity.Payment; +import kr.bb.payment.entity.Subscription; import kr.bb.payment.feign.DeliveryServiceClient; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; @@ -94,17 +96,22 @@ public void renewSubscription(SubscriptionBatchDtoList subscriptionBatchDtoList) Map oldDeliveryIdsMap = new HashMap<>(); // <결제기록id, old 배송id> for(SubscriptionBatchDto subscriptionBatchDto : subscriptionBatchDtoList.getSubscriptionBatchDtoList()){ + Long userId = subscriptionBatchDto.getUserId(); + String orderSubscriptionId = subscriptionBatchDto.getOrderSubscriptionId(); + + Subscription subscription = paymentService.getSubscriptionEntity( + subscriptionBatchDto.getOrderSubscriptionId()); + MultiValueMap parameters = new LinkedMultiValueMap<>(); - parameters.add("cid", subscriptionBatchDto.getCid()); - parameters.add("sid", subscriptionBatchDto.getSid()); - parameters.add("partner_order_id", String.valueOf(subscriptionBatchDto.getPartnerOrderId())); - parameters.add("partner_user_id", String.valueOf(subscriptionBatchDto.getPartnerUserId())); - parameters.add("quantity", String.valueOf(subscriptionBatchDto.getQuantity())); - parameters.add("total_amount", String.valueOf(subscriptionBatchDto.getTotalAmount())); + parameters.add("cid", subscription.getSubscriptionCid()); + parameters.add("sid", subscription.getSubscriptionSid()); + parameters.add("partner_order_id", String.valueOf(orderSubscriptionId)); + parameters.add("partner_user_id", String.valueOf(userId)); + parameters.add("quantity", String.valueOf(subscription.getSubscriptionQuantity())); + parameters.add("total_amount", String.valueOf(subscription.getSubscriptionTotalAmount())); parameters.add("tax_free_amount", String.valueOf(0)); - HttpEntity> requestEntity = new HttpEntity<>(parameters, this.getHeaders()); @@ -139,6 +146,21 @@ public void cancelPayment(KakaopayCancelRequestDto cancelRequestDto){ restTemplate.postForObject(url, requestEntity, KakaopayCancelResponseDto.class); } + public void cancelSubscription(KakaopayCancelRequestDto cancelRequestDto ){ + Subscription subscription = paymentService.getSubscriptionEntity(cancelRequestDto.getOrderId()); + + MultiValueMap parameters = new LinkedMultiValueMap<>(); + + parameters.add("cid", subscription.getSubscriptionCid()); + parameters.add("sid", subscription.getSubscriptionSid()); + + HttpEntity> requestEntity = new HttpEntity<>(parameters, this.getHeaders()); + + String url = "https://kapi.kakao.com/v1/payment/manage/subscription/inactive"; + + restTemplate.postForObject(url, requestEntity, KakaopayCancelSubscriptionResponseDto.class); + } + @NotNull private HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); diff --git a/src/main/java/kr/bb/payment/service/PaymentService.java b/src/main/java/kr/bb/payment/service/PaymentService.java index 9f248e0..6d55748 100644 --- a/src/main/java/kr/bb/payment/service/PaymentService.java +++ b/src/main/java/kr/bb/payment/service/PaymentService.java @@ -109,4 +109,9 @@ public String getPaymentDate(String orderGroupId){ public Payment getPaymentEntity(String orderGroupId){ return paymentRepository.findByOrderId(orderGroupId); } + + @Transactional + public Subscription getSubscriptionEntity(String orderSubscriptionId) { + return subscriptionRepository.findByOrderSubscriptionId(orderSubscriptionId).orElseThrow(EntityNotFoundException::new); + } } diff --git a/src/test/java/kr/bb/payment/service/KakaopaySubscriptionTest.java b/src/test/java/kr/bb/payment/service/KakaopaySubscriptionTest.java index eb1651b..9193a1e 100644 --- a/src/test/java/kr/bb/payment/service/KakaopaySubscriptionTest.java +++ b/src/test/java/kr/bb/payment/service/KakaopaySubscriptionTest.java @@ -89,14 +89,7 @@ public void batchSubscription() { } private SubscriptionBatchDto createSubscriptionBatchDto() { - return SubscriptionBatchDto.builder() - .cid("TCSUBSCRIP") - .sid("sid 고유번호") - .partnerOrderId("partner_order_id_1") - .partnerUserId("1") - .quantity(1L) - .totalAmount(44500L) - .build(); + return SubscriptionBatchDto.builder().userId(1L).orderSubscriptionId("구독 주문 id").build(); } private SubscriptionRecords createSubscriptionRecords() { @@ -105,7 +98,7 @@ private SubscriptionRecords createSubscriptionRecords() { private Subscription createSubscription() { return Subscription.builder() - .orderSubscriptionId("주문 id") + .orderSubscriptionId("구독 주문 id") .subscriptionCid("TCSUBSCRIP") .subscriptionTid("tid 고유번호") .subscriptionSid("sid 고유번호")