PaymentOperations
class PaymentOperations (View source)
결제 준비·확정·환불 흐름을 조율하는 서비스.
Billable이 호출하는 진입점으로, 실제 상태 계산은 PaymentLifecycle, 저장은 PaymentLedger, 외부 호출은 PaymentGateway가 맡는다.
Methods
No description
결제 ID만으로 결제를 확정한다. 웹훅처럼 소유 Billable을 모를 때 쓴다.
결제 ID로 레코드를 찾아 PortOne의 취소 상태를 반영한다(취소 동기화).
오래된 PENDING 결제 1건을 PortOne에 확인해 PAID 또는 EXPIRED로 바꾼다.
Details
__construct(CustomerRegistry $customers, PaymentLedger $payments, PaymentGateway $gateway, PaymentLifecycle $lifecycle)
No description
Payment
prepare(Model $billable, int $amount, string $orderName)
결제 레코드를 미리 만든다. PortOne을 호출하지 않는다.
고객 레코드 확보와 결제 생성을 하나의 트랜잭션으로 처리한다. 실패하면 고객 레코드도 남지 않는다.
Payment
complete(Model $billable, string $paymentId)
결제를 확정한다. 레코드에 배타 접근을 걸고 PortOne 조회를 수행한다.
PENDING·EXPIRED가 아닌 레코드는 PortOne을 호출하지 않고 그대로 반환한다. EXPIRED 레코드는 만료 뒤에 결제된 경우를 복구하기 위해 다시 조회한다. 실결제액이 준비 금액과 다르면 PortOne 결제를 전액 취소하고 결과를 저장한 뒤 AmountMismatchException을 던진다. 이미 금액 불일치로 저장된 레코드는 PortOne을 다시 부르지 않고 같은 예외를 던진다. 로컬 저장 실패 시 같은 값으로 최대 3회까지 다시 시도한다.
Payment
completeByPaymentId(string $paymentId)
결제 ID만으로 결제를 확정한다. 웹훅처럼 소유 Billable을 모를 때 쓴다.
portone_payments의 billable_type·billable_id가 가리키는 모델의 결제로 보고, complete()와 같은 잠금·멱등성·예외 규칙을 따른다.
Payment
syncByPaymentId(string $paymentId)
결제 ID로 레코드를 찾아 PortOne의 취소 상태를 반영한다(취소 동기화).
소유 Billable은 따지지 않는다. refund()와 같은 배타 접근을 잡고, PAID·PARTIALLY_CANCELLED· AMOUNT_MISMATCH 레코드만 PortOne에 조회한다. PortOne이 CANCELLED·PARTIAL_CANCELLED이고 취소 총액이 맞을 때만 status와 cancelled_amount를 바꾸며, 그 밖에는 그대로 둔다. 같은 PortOne 상태로 다시 호출해도 결과가 같다. 취소 웹훅(Transaction.Cancelled·Transaction.PartialCancelled)도 이 메서드를 쓴다.
void
expire(string $billableType, string $billableId, string $paymentId)
오래된 PENDING 결제 1건을 PortOne에 확인해 PAID 또는 EXPIRED로 바꾼다.
레코드가 없거나 더 이상 PENDING이 아니면 아무것도 하지 않는다. 판단할 수 없는 조회 결과면 그대로 두어 다음 만료 검사에서 다시 확인한다. 실결제액이 준비 금액과 다르면 complete()와 같이 자동 전액 취소한다. 취소가 성공하면 예외 없이 끝나고, 실패하면 AMOUNT_MISMATCH를 저장한 뒤 PortOne 예외를 전파한다. 설정 누락·PortOne 실패·저장 실패는 감싸지 않고 전파한다. 저장한 결과는 커밋 뒤에 이벤트로 알린다: EXPIRED면 PaymentExpired, PAID면 PaymentPaidOnExpiry, 금액 불일치면 PaymentAmountMismatchedOnExpiry(wasCancelled). 저장한 것이 없으면 보내지 않는다.
Payment
refund(Model $billable, string $paymentId, string $reason, int|null $amount = null)
PortOne 취소를 먼저 승인받은 뒤 로컬 레코드에 반영한다.
환불 결과는 PortOne 호출 전에 미리 계산되며, 로컬 저장 실패 시 같은 값으로 최대 3회까지 다시 시도한다(PortOne 재호출 없음).