PG 결제
Hive IAP v4는 PC와 모바일 환경에서 PG 결제를 지원합니다. PC 환경에서는 아래와 같은 결제 요청 화면이 새창으로 노출됩니다.
PG 결제를 적용하기에 앞서 Hive PG 결제 정책을 확인하고, PG 결제 콘솔 가이드 사전 작업 내용에 따라 콘솔에 필요한 정보를 등록하세요.
PG 결제 특징¶
Hive PG 결제의 주요 특징은 아래와 같습니다.
-
Hive PG 결제는 Hive IAP v4와 PG 결제 API를 기반으로 동작하며, 결제 대행사(PG)에서 제공하는 웹 브라우저를 통해 비동기 방식으로 처리됩니다.
-
사전에 콘솔에 등록한 정보는 상점 구성에 필요한 상품 가격 및 상품 정보에 반영되며, 상품에 대한 정보는 Hive SDK v4를 통해 전달됩니다.
-
콘솔에 결제 결과를 받을 URL을 등록한 경우, 해당 URL로 결제 결과가 전송됩니다. 결제 수단에 따라 결제 결과를 즉시 전달할 수 없는 상황이 존재합니다. (예: 가상 계좌 입금)
-
지급이 완료된 주문은 반드시
transactionFinish(marketPid)
API를 통해 상품 지급 완료 처리를 해야 합니다.-
결제는 완료되었으나 지급 완료 처리가 되지 않은 상품을 재구매하고자 할 때에는 결제가 진행되지 않습니다. 이전 구매 상품의 지급 완료 처리 후에 재구매할 수 있습니다.
-
결제를 완료하지 않은 상태에서 여러 개의 결제창을 띄워 결제를 시도하는 경우와 같이 지급 완료 처리되지 않은 상품의 추가 구매를 시도하면 최초 1건의 결제만 완료되며, 나머지 구매 건은 결제가 되더라도 자동 취소됩니다.
-
지급 완료 처리 요청을 하더라도 게임 서버의 판단에 따라 결제가 취소될 수 있습니다.
-
PG 결제 동작 과정¶
Hive SDK를 적용한 PG 결제 동작 과정은 아래와 같습니다.
hive.IAPV4.purchase(marketPid, iapPayload, onIAPV4PurchaseCB)
를 호출하여 구매 요청-
구매 완료 후,
onIAPV4PurchaseCB
인자를 통해bypassInfo
형태의 영수증 정보를 게임 서버에 전달Note
Hive SDK 25.1.0 부터는 IAP 서버가 아닌 SDK에서 구매 완료 신호를 전달합니다.
-
Hive IAP 서버에서 영수증 검증을 진행
Note
콘솔에 결제 결과를 받을 URL을 등록한 경우, SDK로부터 구매 완료 신호을 중복으로 받게 되므로 콘솔에 결제 결과를 받을 URL을 등록하지 않거나, 영수증 중복 처리가 필요합니다.
-
hive.IAPV4.transactionFinish(marketPid)
를 호출하여 상품 지급 완료 처리
다중 수량 구매¶
Hive PG 결제는 다중 수량 구매를 지원합니다. 구매 요청 시 수량을 지정하도록 하여, 한 번의 결제 시에 동일한 앱 내 상품을 두 개 이상 구매할 수 있습니다.
Hive SDK에서는 수량을 지정할 수 있는 quantity
파라미터가 포함된 hive.IAPV4.purchase(marketPid, iapPayload, quantity, onIAPV4PurchaseCB)
를 호출합니다.
Note
다중 수량 구매는 소모성 인앱 상품 혹은 구매, 소비, 재구매가 가능한 상품에 한한 것입니다. 의도된 상품을 반복적으로 구매하지 않도록 주의하세요.
다중 수량 구매를 요청하는 예제 코드는 아래와 같습니다.
API Reference: hive .IAPV4.purchase
using hive;
String marketPid = "{YOUR_PRODUCT_MARKET_PID}";
String iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
int quantity = 3;
IAPV4.purchase(marketPid, iapPayload, quantity, (ResultAPI result, IAPV4Receipt receipt) => {
if (result.isSuccess()) {
// TODO: Request verification of receipt with received receipt
}
});
#include "HiveIAPV4.h"
FString MarketPid = TEXT("YOUR_PRODUCT_MARKET_PID");
FString IapPayload = TEXT("YOUR_CUSTOM_PAYLOAD");
int32 Quantity = 3;
FHiveIAPV4::Purchase(MarketPid, IapPayload, Quantity, FHiveIAPV4OnPurchaseDelegate::CreateLambda([this](const FHiveResultAPI& Result, const FHiveIAPV4Receipt& Receipt) {
if (Result.IsSuccess()) {
// API 호출 성공
}
}));
API Reference: IAPV4 ::purchase
#include <HIVE_SDK_Plugin/HIVE_CPP.h>
using namespace std;
using namespace hive;
string marketPid = "{YOUR_PRODUCT_MARKET_PID}";
string iapPayload = "{YOUR_CUSTOM_PAYLOAD}";
int quantity = 3;
IAPV4::purchase(marketPid, iapPayload, quantity, [=](ResultAPI const & result, IAPV4Receipt const & receipt) {
if (result.isSuccess()) {
// TODO: Request verification of receipt with received receipt
}
});
API Reference: com.hive.IAPV4.purchase
import com.hive.IAPV4
import com.hive.ResultAPI
val marketPid = "{YOUR_PRODUCT_MARKET_PID}"
val iapPayload = "{YOUR_CUSTOM_PAYLOAD}"
val quantity = 3
IAPV4.purchase(marketPid, iapPayload, quantity, object : IAPV4.IAPV4PurchaseListener {
override fun onIAPV4Purchase(result: ResultAPI, iapV4Receipt: IAPV4.IAPV4Receipt?) {
if (result.isSuccess) {
// call successful
}
}
})
API Reference: com .hive.IAPV4.purchase
API Reference: HIVEIAPV4::purchase:additionalInfo:handler:
API Reference: HIVEIAPV4::purchase:additionalInfo:handler:
#import <HIVEService/HIVEService-Swift.h>
NSString *marketPid = @"{YOUR_PRODUCT_MARKET_PID}";
NSString *iapPayload = @"{YOUR_CUSTOM_PAYLOAD}";
NSNumber quantity = 3;
[HIVEIAPV4 purchase: marketPid iapPayload: iapPayload quantity handler: ^(HIVEResultAPI *result, HIVEIAPV4Receipt *receipt) {
if ([result isSuccess]) {
// TODO: Request verification of receipt with received receipt
}
}];