# 결제 승인

가맹점 화면이 point3 결제창으로부터 결제 승인 준비 신호를 받으면, 가맹점 서버가 결제 승인 API를 호출해 결제를 확정합니다.

| 연동 방식 | 승인 준비 신호 |
| --- | --- |
| 웹, 하이브리드 앱 | `successUrl`로 이동하며 `orderId`, `payerId` 전달 |
| 앱 | `successUrl`로 이동하려는 것을 앱이 받아 `orderId`, `payerId` 전달 |

<Callout type="caution" title="승인 준비 신호는 결제 성공이 아닙니다">
  성공 URL 이동만으로 상품을 지급하거나 성공 화면을 표시하지 마세요.
</Callout>

## 승인 요청

```http
POST https://api.point3.io/capture/v2/{sessionId}
Authorization: Bearer {API 키}
```

- `{sessionId}`에는 주문에 저장한 `sessionId`를 사용합니다. 화면에서 받은 값은 주문에 저장한 값과 같은지 확인한 뒤에만 사용합니다.
- 요청 본문은 없습니다. `payerId`는 승인 API에 전달하지 않습니다.

`payerId`는 승인 응답에 포함되지 않습니다. 결제 세션 조회 응답의 `payerId`를 회원 정보에 저장하세요. 자세한 내용은 [구매자 아이디](/payer-id)를 참고하세요.

### 승인 기한

결제 승인 API는 **구매자가 결제 의사를 확정한 당일 자정(KST)까지** 호출해야 합니다. 기한이 지나면 승인 API가 `422` `paymentCaptureExpired`를 반환하며, 새 결제 세션으로 처음부터 다시 시작해야 합니다.

매일 23:30부터 다음 날 00:30까지(KST)는 EOB 점검 시간으로 결제 진행이 제한됩니다. 자세한 내용은 [EOB 점검 시간](/operations#eob-점검-시간)을 참고하세요.

## 승인 응답

| 응답 | `status` | 처리 |
| --- | --- | --- |
| `200` | `captured` | 결제 성공. 주문 완료 처리 |
| `200` | `failed` | 결제 실패. `outcome.code`를 기록하고 실패 안내 |
| `202` | `processing` | 처리 중. 잠시 기다렸다가 결제 세션 조회 |
| `5xx`, 네트워크 오류, 타임아웃 | - | 결과 미확정. 같은 `sessionId`로 다시 승인 요청하거나 결제 세션 조회 |
| `422` | - | 승인 기한 만료. 새 결제 세션으로 다시 시작 |
| `400`, `401`, `404` | - | 연동 오류. 요청값과 인증 정보 확인 |

`outcome.code`별 의미는 [에러 코드](/error-codes#결제-승인-결과-코드)에서 확인하세요.

## 최종 결과 확인

승인 응답이 `processing`이거나 응답을 받지 못했다면 결제 세션을 조회합니다. 정상 조회는 HTTP `200`으로 반환되며, 응답 본문의 `status`로 최종 결과를 판단합니다.

```http
GET https://api.point3.io/payment/v3/session/{sessionId}
```

| 응답 | 처리 |
| --- | --- |
| `200` + `status: captured` | 결제 성공 |
| `200` + `status: failed` | 결제 실패 |
| `200` + `status: processing` | 잠시 기다렸다가 같은 세션을 다시 조회 |
| `200` + `status: created`, `identified`, `initiated`, `committed` | 결제가 끝난 상태가 아니므로 상품을 지급하지 않음 |
| `5xx`, 네트워크 오류, 타임아웃 | 잠시 기다렸다가 같은 세션을 다시 조회 |
| `400` | 요청 형식을 수정한 뒤 요청 |
| `401` | API 키 확인 |
| `404` | 존재하지 않는 결제 세션 |

<Callout type="note" title="처리 중이거나 응답을 받지 못했다면">
  결제 승인 API는 멱등합니다. 같은 `sessionId`로 다시 호출해도 결제가 중복되지 않습니다. `captured`를 확인하기 전에는 상품을 지급하지 마세요.
</Callout>

`captured` 확인 후 취소가 필요하면 [결제 취소](/payment-cancellation)를 확인하세요. 요청·응답 전체 스키마는 [결제 API 레퍼런스](/api-reference/payment)에 있습니다.
