본문으로 건너뛰기
페이싱크 개발자센터
Esc
↑↓이동↵열기⌘J미리보기
이 페이지에서

invoice.paid

주문이 결제 완료되면 보내는 이벤트예요. paidTrigger로 자동 매칭, 수동 매칭, 수동 승인, API 호출을 구분해요.

주문이 결제 완료로 바뀌면 보내요. data.paidTrigger로 어떤 경로로 결제 완료됐는지 알 수 있어요.

paidTrigger

paidTrigger 발생 조건
AUTOMATIC_MATCHING 입금이 들어와 페이싱크가 주문에 자동으로 매칭했어요. 매칭 어시스트로 매칭한 경우도 포함해요.
MANUAL_MATCHING 대시보드 입금 내역에서 입금을 주문에 직접 매칭했어요.
MANUAL_APPROVE 대시보드 주문에서 입금 없이 결제 완료로 바꿨어요.
API_CALL 주문 결제 완료 처리 API를 호출했어요.

페이로드

data는 결제 완료된 주문 페이로드예요. status는 PAID예요.

{
  "id": "evt_f1g2h3i4j5k6l7m8n9o0p1q2",
  "type": "invoice.paid",
  "timestamp": "2026-04-28T03:20:12Z",
  "data": {
    "id": "ivc_a1b2c3d4e5f6g7h8i9j0k1l2",
    "number": 1043,
    "status": "PAID",
    "customer": {
      "name": "홍길동",
      "email": "hong@example.com",
      "phoneNumber": "01012345678"
    },
    "amount": 50000,
    "paidAmount": 50000,
    "amountDiff": null,
    "bankAccountIds": [],
    "cashReceipt": null,
    "metadata": { "orderId": "ORDER-2026-0001" },
    "source": "API",
    "createdAt": "2026-04-28T03:14:15Z",
    "updatedAt": "2026-04-28T03:20:12Z",
    "expiresAt": "2026-04-29T03:14:15Z",
    "paidAt": "2026-04-28T03:20:12Z",
    "paidTrigger": "AUTOMATIC_MATCHING",
    "matchedTransactionId": "trx_m1n2o3p4q5r6s7t8u9v0w1x2",
    "canceledAt": null,
    "cancelReason": null,
    "expiredAt": null,
    "reopenedAt": null
  }
}

입금 계좌나 입금자명이 필요하면 matchedTransactionId로 입금 단건 조회를 하세요. 입금 없이 결제 완료된 주문은 matchedTransactionId가 null이에요.

금액이 조금 달라도 매칭으로 결제 완료됐다면 paidAmount가 amount와 다르고, 차이가 amountDiff에 와요. 받은 금액이 모자란 주문을 따로 처리해야 한다면 amountDiff를 확인하세요.

처리 예시

const event = JSON.parse(body);

if (event.type === "invoice.paid") {
  const invoice = event.data;
  const orderId = invoice.metadata.orderId;

  // 이미 처리한 주문이면 건너뛰어요.
  if (orderId && !(await db.isOrderPaid(orderId))) {
    await db.markOrderPaid(orderId, {
      invoiceId: invoice.id,
      paidAmount: invoice.paidAmount,
      trigger: invoice.paidTrigger,
    });
  }
}

res.sendStatus(200);

paidTrigger는 자동 매칭 비율이나 수동 처리 건수를 집계할 때 쓰기 좋아요. 주문 처리 로직은 보통 paidTrigger와 관계없이 같아요.

자주 묻는 질문

금액 일부만 입금돼도 이벤트가 오나요?

기본 설정에서는 오지 않아요. 입금 금액이 주문 금액과 같아야 자동 매칭돼요. 매칭 어시스트에서 금액이 조금 달라도 매칭을 켜면 정한 범위 안의 차이는 매칭하고 이 이벤트가 와요.

현금영수증은 언제 발급되나요?

cashReceipt가 있는 주문은 결제 완료와 함께 현금영수증 발급을 요청해요. 발급 결과는 웹훅으로 보내지 않으니 현금영수증 목록 조회에서 invoiceId로 확인하세요.

결제 완료된 주문이 다시 결제 대기로 돌아갈 수 있나요?

돌아갈 수 있어요. 대시보드에서 잘못된 매칭을 해제하면 invoice.reopened가 가요. 그 뒤 다른 입금이 매칭되면 invoice.paid가 다시 와요.

이 페이지가 도움이 되었나요?