매입을 분리해 결제 구현하기
온라인 결제를 구현할 때 결제 승인과 매입을 분리할 수 있습니다. 대금 정산을 늦춰야 하거나 결제 금액이 변동될 수 있는 가능성에 대비해 결제 승인과 매입을 분리할 수 있습니다.
대만에서는 자동 매입이 기본 결제 방식이며, 사전 신청 없이 매입을 분리해 결제할 수 없습니다. 대만에서 매입을 분리해 결제하려면, LINE Pay 담당자에게 연락하세요.
결제 승인과 매입을 분리해 결제하는 흐름은 다음과 같습니다.
매입을 분리하려면 가맹점 서버에서 다음을 구현하세요.
매입
결제 승인과 매입을 분리하려면 결제를 요청할 때 자동 매입 여부를 설정하는 필드(options.payment.capture
)의 값을 false
로 설정하세요. 다음은 결제 승인과 매입을 분리해 결제 요청 API을 호출하는 코드입니다.
온라인 API를 호출할 때 필요한 자격 증명 정보를 얻는 방법은 API 자격 증명 준비를 참고하세요. 이 페이지에 설명된 코드 예제는 API 자격 증명 준비 코드 예제에 정의된
requestOnlineAPI()
함수를 이용합니다.
try {
// 결제 승인과 매입을 분리하도록 결제를 요청
let response = await requestOnlineAPI({
method: "POST",
baseUrl: targetAPIServer,
apiPath: "/v3/payments/request",
data: {
amount: 1000,
currency: "TWD",
// ...
options: {
payment: {
capture: false,
},
},
},
});
console.log("Response: ", response);
} catch (error) {
console.log(error);
}
위와 같이 요청한 결제를 승인하면, 해당 결제를 매입하거나 결제 승인을 취소할 수 있는 상태가 됩니다. 고객과 거래가 정상적으로 이뤄졌고, 정산해야 할 금액이 확정됐다면 매입을 요청하세요. 매입 요청 시 대상이 되는 결제 승인 건은 결제 승인 요청 API를 호출한 후 전달받은 결제 트랜잭션 ID(info.transactionId
)로 명시하세요. 다음은 매입을 요청하는 예입니다.
try {
// 결제 승인 요청
let confirmationResponse = await requestOnlineAPI({
method: "POST",
baseUrl: targetAPIServer,
apiPath: `/v3/payments/${requestTransactionId}/confirm`,
data: {
amount: 1000,
currency: "TWD",
},
});
console.log("Confirmation response: ", confirmationResponse);
let captureResponse = await requestOnlineAPI({
method: "POST",
baseUrl: targetAPIServer,
apiPath: `/v3/payments/authorizations/${confirmationResponse.info.transactionId}/capture`,
data: {
amount: 800,
currency: "TWD",
},
});
console.log("Capture response: ", captureResponse);
} catch (error) {
console.log(error);
}
매입을 분리해 결제 승인을 요청하면 LINE Pay 서버는 결제 승인 만료 일시 정보(
info.authorizationExpireDate
)를 응답에 포함시킵니다. 결제 승인 만료 일시 전까지 매입하지 않으면 승인된 결제가 자동 취소됩니다. 또는, 직접 결제 승인을 취소할 수도 있습니다.
트랜잭션 ID 정보를 다룰 때 서비스 구현 언어에 따라 트랜잭션 ID를 문자열로 처리해야 할 수도 있습니다. 자세한 설명은 트랜잭션 ID를 참고하세요.
매입을 완료하면 아래와 같은 응답을 받습니다.
{
"returnCode": "0000",
"returnMessage": "OK",
"info": {
"transactionId": 2023042201206549440,
"orderId": "EXAMPLE_ORDER_20230422_1000002",
"payInfo": [
{
"method": "BALANCE",
"amount": 20
}
]
}
}
결제 요청에 입력했던 결제 금액보다 큰 금액을 매입할 수 없고, 결제 금액과 같거나 적은 금액을 매입할 수 있습니다. 결제 금액보다 적은 금액을 매입하면 부분 매입으로 처리되며, 매입되지 않은 금액은 부분 취소 처리됩니다. 매입이 완료되면 승인 취소할 수 없으며, 환불 처리해야 합니다.
승인 취소
매입을 분리해 결제를 진행할 때, 결제 승인 이후 매입을 진행하지 않고 결제 승인을 취소할 수도 있습니다. 결제 승인을 취소하는 작업은 다음과 같이 진행됩니다.
매입할 때와 같이 결제 승인 요청 API 호출 후 전달받은 결제 트랜잭션 ID(info.transactionId
)의 값을 사용해 승인 취소 API를 호출하세요. 다음은 결제 승인을 취소하는 예입니다.
try {
// ...
// 승인 취소 요청
let voidResponse = await requestOnlineAPI({
method: "POST",
baseUrl: targetAPIServer,
apiPath: `/v3/payments/authorizations/${confirmationResponse.info.transactionId}/void`,
});
console.log("Response: ", voidResponse);
} catch (error) {
console.log(error);
}
승인 취소가 정상 처리됐다면 다음과 같은 응답을 받게 됩니다.
{
"returnCode": "0000",
"returnMessage": "Success"
}
매입이 완료되거나 승인이 완료된 결제의 결제 내역을 조회할 수 있습니다.