Skip to content

Commit

Permalink
fix: 배치 정기결제 로직 수정 및 정기결제 취소 API 추가
Browse files Browse the repository at this point in the history
  • Loading branch information
binarywoo27 committed Jan 14, 2024
1 parent 6973c99 commit e51afd6
Show file tree
Hide file tree
Showing 7 changed files with 74 additions and 18 deletions.
5 changes: 3 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -112,4 +113,4 @@ jacocoTestReport {
)
}
finalizedBy 'jacocoTestCoverageVerification'
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -54,4 +55,16 @@ CommonResponse<Void> cancel(@RequestBody KakaopayCancelRequestDto cancelRequestD
kakaopayService.cancelPayment(cancelRequestDto);
return CommonResponse.success(null);
}

@PostMapping(value = "/subscription")
CommonResponse<Void> subscription(@RequestBody SubscriptionBatchDtoList subscriptionBatchDtolist){
kakaopayService.renewSubscription(subscriptionBatchDtolist);
return CommonResponse.success(null);
}

@PostMapping(value = "/subscription/cancel")
CommonResponse<Void> cancelSubscription(@RequestBody KakaopayCancelRequestDto cancelRequestDto){
kakaopayService.cancelSubscription(cancelRequestDto);
return CommonResponse.success(null);
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
Original file line number Diff line number Diff line change
@@ -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, Long> {
Subscription findBySubscriptionSid(String subscriptionSid);
Optional<Subscription> findByOrderSubscriptionId(String orderSubscriptionId);
}
36 changes: 29 additions & 7 deletions src/main/java/kr/bb/payment/service/KakaopayService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -94,17 +96,22 @@ public void renewSubscription(SubscriptionBatchDtoList subscriptionBatchDtoList)
Map<Long, Long> 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<String, String> 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<MultiValueMap<String, String>> requestEntity =
new HttpEntity<>(parameters, this.getHeaders());

Expand Down Expand Up @@ -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<String, String> parameters = new LinkedMultiValueMap<>();

parameters.add("cid", subscription.getSubscriptionCid());
parameters.add("sid", subscription.getSubscriptionSid());

HttpEntity<MultiValueMap<String, String>> 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();
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/kr/bb/payment/service/PaymentService.java
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -105,7 +98,7 @@ private SubscriptionRecords createSubscriptionRecords() {

private Subscription createSubscription() {
return Subscription.builder()
.orderSubscriptionId("주문 id")
.orderSubscriptionId("구독 주문 id")
.subscriptionCid("TCSUBSCRIP")
.subscriptionTid("tid 고유번호")
.subscriptionSid("sid 고유번호")
Expand Down

0 comments on commit e51afd6

Please sign in to comment.