Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions payments/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
plugins {
id 'myproject-convention'
}

dependencies {
implementation project(':shared')
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.commerce.payments;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
* Payments 마이크로서비스
* gRPC 서버로 동작
*/
@SpringBootApplication(scanBasePackages = {
"com.commerce.payments",
"com.commerce.shared"
})
public class PaymentsApplication {

public static void main(String[] args) {
SpringApplication.run(PaymentsApplication.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.commerce.payments.application.port.in;


public interface CustomerUseCase {
void registryPayCard(RegistryCardCommand command);
}
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
package com.commerce.platform.core.application.in;
package com.commerce.payments.application.port.in;

import com.commerce.platform.core.application.in.dto.RegistryCardCommand;
import com.commerce.platform.core.application.out.CustomerCardOutPort;
import com.commerce.platform.core.domain.aggreate.CustomerCard;
import com.commerce.platform.shared.exception.BusinessException;
import com.commerce.platform.shared.service.AesCryptoFacade;
import com.commerce.payments.application.port.out.CustomerCardOutPort;
import com.commerce.payments.domain.aggregate.CustomerCard;
import com.commerce.shared.exception.BusinessException;
import com.commerce.shared.service.AesCryptoFacade;
import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.stereotype.Service;

import static com.commerce.platform.shared.exception.BusinessError.DUPLICATED_REGISTRY_CARD;
import static com.commerce.platform.shared.exception.BusinessError.EXCEED_REGISTRY_CARD;
import static com.commerce.shared.exception.BusinessError.DUPLICATED_REGISTRY_CARD;
import static com.commerce.shared.exception.BusinessError.EXCEED_REGISTRY_CARD;

@Log4j2
@RequiredArgsConstructor
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.commerce.payments.application.port.in;


import com.commerce.payments.application.port.in.dto.PayCancelCommand;
import com.commerce.payments.application.port.in.dto.PayOrderCommand;

public interface PaymentUseCase {
void doApproval(PayOrderCommand command);
void doCancel(PayCancelCommand cancelCommand);
Long doPartCancel(PayCancelCommand cancelCommand);
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.commerce.platform.core.application.in.dto;
package com.commerce.payments.application.port.in;

import com.commerce.platform.core.domain.enums.PayProvider;
import com.commerce.platform.core.domain.vo.CustomerId;
import com.commerce.payments.domain.enums.PayProvider;
import com.commerce.shared.vo.CustomerId;

public record RegistryCardCommand(
CustomerId customerId,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.commerce.payments.application.port.in.dto;

import com.commerce.payments.domain.enums.PayMethod;
import com.commerce.payments.domain.enums.PayProvider;
import com.commerce.payments.domain.enums.PaymentStatus;
import com.commerce.payments.domain.enums.PgProvider;
import com.commerce.shared.vo.Money;
import com.commerce.shared.vo.OrderId;
import com.commerce.shared.vo.Quantity;
import lombok.*;

/**
* 전체/부분 취소 처리 객체
*/
@Setter
@Getter
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
public class PayCancelCommand {
private OrderId orderId;
private Long orderItemId; // 취소할 orderItem
private Quantity canceledQuantity; // 해당 orderItem의 취소 개수
private PaymentStatus paymentStatus;
private String cancelReason;

// 이후 계산 및 db데이터 기반으로 세팅됨]
private String pgTid; // pg 승인Tid
private Money canceledAmount;
private PayMethod payMethod;
private PayProvider payProvider;
private PgProvider pgProvider;

private RefundReceiveAccount refundReceiveAccount;

/**
* 환불 계좌 정보 (가상계좌 전용)
*/
@Getter
@AllArgsConstructor
public class RefundReceiveAccount {
private String bankCode;
private String accountNumber;
private String holderName;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.commerce.payments.application.port.in.dto;

import com.commerce.payments.domain.enums.PayMethod;
import com.commerce.payments.domain.enums.PayProvider;
import com.commerce.payments.domain.enums.PaymentStatus;
import com.commerce.shared.vo.Money;
import com.commerce.shared.vo.OrderId;
import lombok.*;

@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Getter
@Builder
public class PayOrderCommand {
private OrderId orderId;
private Money approvedAmount;
private int installment;
private PayMethod payMethod;
private PayProvider payProvider;
private final PaymentStatus paymentStatus = PaymentStatus.APPROVED;
private String jsonSubData; // pg사 요구 데이터
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.commerce.platform.core.application.out;
package com.commerce.payments.application.port.out;

import com.commerce.platform.core.domain.aggreate.CardBinPromotion;

import com.commerce.payments.domain.aggregate.CardBinPromotion;

import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.commerce.platform.core.application.out;
package com.commerce.payments.application.port.out;

import com.commerce.platform.core.domain.aggreate.CustomerCard;
import com.commerce.platform.core.domain.vo.CustomerId;
import com.commerce.payments.domain.aggregate.CustomerCard;
import com.commerce.shared.vo.CustomerId;

import java.util.Optional;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.commerce.platform.core.application.out;
package com.commerce.payments.application.port.out;

import com.commerce.platform.core.domain.aggreate.Payment;
import com.commerce.platform.core.domain.aggreate.PaymentPartCancel;
import com.commerce.platform.core.domain.vo.Money;
import com.commerce.platform.core.domain.vo.OrderId;
import com.commerce.platform.core.domain.vo.PaymentId;
import com.commerce.payments.domain.aggregate.Payment;
import com.commerce.payments.domain.aggregate.PaymentPartCancel;
import com.commerce.shared.vo.Money;
import com.commerce.shared.vo.OrderId;
import com.commerce.shared.vo.PaymentId;

import java.util.Optional;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.commerce.payments.application.port.out;


import com.commerce.payments.domain.vo.payments.PgPayCancelResponse;
import com.commerce.payments.domain.vo.payments.PgPayResponse;
import com.commerce.payments.application.port.in.dto.PayCancelCommand;
import com.commerce.payments.application.port.in.dto.PayOrderCommand;
import com.commerce.payments.domain.enums.PayMethod;
import com.commerce.payments.domain.enums.PgProvider;

/**
* PG사별 결제를 위한 메소드 정의
*/
public abstract class PgStrategy {

/**
* 승인
*/
public abstract PgPayResponse processApproval(PayOrderCommand command);

/**
* 취소
*/
public abstract PgPayCancelResponse processCancel(PayCancelCommand command);

/**
* PG사명
*/
public abstract PgProvider getPgProvider();

/**
* 결제유형
*/
public abstract PayMethod getPgPayMethod();

/**
* 결제창을 위한 초기화
*/
public abstract Object initPayment();

}
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.commerce.platform.core.domain.aggreate;
package com.commerce.payments.domain.aggregate;

import com.commerce.platform.core.domain.enums.PayProvider;
import com.commerce.platform.core.domain.vo.ValidPeriod;
import com.commerce.platform.core.domain.vo.promotion.BasePromotionData;
import com.commerce.platform.infrastructure.persistence.converter.PromotionDataConverter;
import com.commerce.payments.domain.enums.PayProvider;
import com.commerce.payments.domain.vo.promotion.BasePromotionData;
import com.commerce.payments.infrastructure.persistence.converter.PromotionDataConverter;
import com.commerce.shared.vo.ValidPeriod;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.commerce.platform.core.domain.aggreate;
package com.commerce.payments.domain.aggregate;

import com.commerce.platform.core.application.in.dto.RegistryCardCommand;
import com.commerce.platform.core.domain.enums.PayProvider;
import com.commerce.platform.core.domain.vo.CustomerId;
import com.commerce.platform.shared.service.AesCryptoFacade;
import com.commerce.payments.application.port.in.RegistryCardCommand;
import com.commerce.payments.domain.enums.PayProvider;
import com.commerce.shared.service.AesCryptoFacade;
import com.commerce.shared.vo.CustomerId;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package com.commerce.platform.core.domain.aggreate;

import com.commerce.platform.core.application.in.dto.PayOrderCommand;
import com.commerce.platform.core.application.out.dto.PgPayResponse;
import com.commerce.platform.core.domain.enums.PayMethod;
import com.commerce.platform.core.domain.enums.PayProvider;
import com.commerce.platform.core.domain.enums.PaymentStatus;
import com.commerce.platform.core.domain.enums.PgProvider;
import com.commerce.platform.core.domain.vo.Money;
import com.commerce.platform.core.domain.vo.OrderId;
import com.commerce.platform.core.domain.vo.PaymentId;
package com.commerce.payments.domain.aggregate;


import com.commerce.payments.domain.vo.payments.PgPayCancelResponse;
import com.commerce.payments.domain.vo.payments.PgPayResponse;
import com.commerce.payments.application.port.in.dto.PayOrderCommand;
import com.commerce.payments.domain.enums.PayMethod;
import com.commerce.payments.domain.enums.PayProvider;
import com.commerce.payments.domain.enums.PaymentStatus;
import com.commerce.payments.domain.enums.PgProvider;
import com.commerce.shared.vo.Money;
import com.commerce.shared.vo.OrderId;
import com.commerce.shared.vo.PaymentId;
import jakarta.persistence.*;
import lombok.*;

Expand All @@ -23,6 +25,7 @@
public class Payment {

@EmbeddedId
@AttributeOverride(name = "id", column = @Column(name = "id", nullable = false))
private PaymentId paymentId;

@Embedded
Expand All @@ -41,8 +44,8 @@ public class Payment {
@Column(name = "pay_provider", length = 10)
private PayProvider payProvider;

@Column(name = "installment", length = 2)
private String installment;
@Column(name = "installment", columnDefinition = "TINYINT")
private int installment;

// PG 정보
@Enumerated(EnumType.STRING)
Expand Down Expand Up @@ -96,10 +99,10 @@ public void approved(PgPayResponse pgResponse) {
this.paymentStatus = PaymentStatus.APPROVED;
}

public void canceled(PgPayResponse pgResponse) {
this.pgCancelTid = pgResponse.pgTid();
public void canceled(PgPayCancelResponse cancelResponse) {
this.pgCancelTid = cancelResponse.pgCcTid();

if(!pgResponse.isSuccess()) {
if(!cancelResponse.isSuccess()) {
this.paymentStatus = PaymentStatus.FAILED;
return;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.commerce.platform.core.domain.aggreate;
package com.commerce.payments.domain.aggregate;

import com.commerce.platform.core.domain.vo.Money;
import com.commerce.platform.core.domain.vo.PaymentId;
import com.commerce.shared.vo.Money;
import com.commerce.shared.vo.PaymentId;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Getter;
Expand All @@ -20,19 +20,27 @@ public class PaymentPartCancel {
private Long id;

@Embedded
@AttributeOverride(name = "id", column = @Column(name = "part_canceled_payment_id", nullable = false))
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "part_canceled_payment_id", nullable = false))
})
private PaymentId paymentPartCancelId;

@Embedded
@AttributeOverride(name = "id", column = @Column(name = "approved_payment_id", nullable = false))
@AttributeOverrides({
@AttributeOverride(name = "id", column = @Column(name = "approved_payment_id", nullable = false))
})
private PaymentId approvedPaymentId;

@Embedded
@AttributeOverride(name = "value", column = @Column(name = "canceled_amt"))
@AttributeOverrides({
@AttributeOverride(name = "value", column = @Column(name = "canceled_amt", nullable = false))
})
private Money canceledAmt;

@Embedded
@AttributeOverride(name = "value", column = @Column(name = "remain_amt"))
@AttributeOverrides({
@AttributeOverride(name = "value", column = @Column(name = "remain_amt", nullable = false))
})
private Money remainAmt;

@Column(name = "pg_cancel_tid", length = 100)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.commerce.platform.core.domain.enums;
package com.commerce.payments.domain.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand All @@ -8,7 +8,8 @@
public enum PayMethod {
CARD("카드결제"),
EASY_PAY("간편결제"),
PHONE("휴대폰결제");
PHONE("휴대폰결제"),
VIRTUAL_ACCOUNT("가상계좌결제");

private final String value;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.commerce.platform.core.domain.enums;
package com.commerce.payments.domain.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.commerce.platform.core.domain.enums;
package com.commerce.payments.domain.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.commerce.platform.core.domain.enums;
package com.commerce.payments.domain.enums;

import lombok.AllArgsConstructor;
import lombok.Getter;
Expand Down
Loading
Loading