본문으로 건너뛰기
버전: 5.11.9

IsValidateOneStorePurchase

public BackendReturnObject IsValidateOneStorePurchase(bool isGlobal, string productId, string purchaseToken, string receiptDescription);

사용 불가능한 특수문자

특수문자한글명
'작은 따옴표
\ 역슬래시

사용 가능한 특수문자

특수문자한글명
.마침표
,쉼표
"큰따옴표
()괄호
!느낌표
?물음표
~물결
@골뱅이
*곱하기
+더하기
-빼기
/슬래시

표기가 되지 않은 특수문자를 사용할 경우에는 영수증 검증이 정상적으로 진행되는지 확인 후 적용해주세요.

파라미터

ValueTypeDescription
isGlobalbool결제가 국외에서 발생했을 경우 true, 국내에서 발생했을 경우 false
productIdstringOneStore.Purchasing.PurchaseData.purchase.ProductId
purchaseTokenstringOneStore.Purchasing.PurchaseData.purchase.PurchaseToken
receiptDescriptionstring추가로 저장하고자 하는 내용

설명

원스토어에서 지원하는 인앱 결제 서비스의 IPurchaseCallback.OnConsumeSucceeded()에서 구매한 상품에 대한 영수증을 받아 뒤끝 서버를 통해 영수증 검증을 받을 수 있습니다.

  • 뒤끝은 영수증 자체의 유효성과, 구매한 productId를 검증합니다.
  • 뒤끝 로그인 없이 뒤끝 영수증 검증 기능을 사용하는 것은 불가능합니다.

Example

동기

    public void BuyButton(int i)
{
string productId = "gold";

// 결제 로직
ProductType productType = ProductType.INAPP;
var purchaseFlowParams = new PurchaseFlowParams.Builder()
.SetProductId(productId) // 추가 필수
.SetProductType(productType) // 추가 필수
.SetDeveloperPayload("따로 메모할만한 정보 여기에 넣기") // 선택사항
.Build();
purchaseClient.Purchase(purchaseFlowParams);
}

public void OnPurchaseSucceeded(List<PurchaseData> purchases)
{
bool isGlobal = false; // 원스토어에 국내에서만 앱을 출시하였을 경우

/*
뒤끝 영수증 검증 처리
*/
for(int i = 0; i < purchases.Count; i++) {

BackendReturnObject validation = Backend.Receipt.IsValidateOneStorePurchase(isGlobal, purchases[i].ProductId, purchases[i].PurchaseToken, "receiptDescription");

// 영수증 검증에 성공한 경우
if (validation.IsSuccess()) {
Debug.Log($"ProcessPurchase: PASS. Product: {purchases[i].ProductId}");

if (purchases[i].ProductId == "gold") {
// 골드 지급
}

} else {
Debug.Log($"ProcessPurchase: FAIL. Unrecognized product: {purchases[i].ProductId}");
}
}
}

비동기

    public void BuyButton(int i)
{
string productId = "gold";

// 결제 로직
ProductType productType = ProductType.INAPP;
var purchaseFlowParams = new PurchaseFlowParams.Builder()
.SetProductId(productId) // 추가 필수
.SetProductType(productType) // 추가 필수
.SetDeveloperPayload("따로 메모할만한 정보 여기에 넣기") // 선택사항
.Build();
purchaseClient.Purchase(purchaseFlowParams);
}

public void OnPurchaseSucceeded(List<PurchaseData> purchases)
{
bool isGlobal = false; // 원스토어에 국내에서만 앱을 출시하였을 경우
/*
뒤끝 영수증 검증 처리
*/
for(int i = 0; i < purchases.Count; i++) {


Backend.Receipt.IsValidateOneStorePurchase(isGlobal, purchases[i].ProductId, purchases[i].PurchaseToken, "receiptDescription", (callback) =>
{
// 영수증 검증에 성공한 경우
if (callback.IsSuccess()) {
Debug.Log($"ProcessPurchase: PASS. Product: {purchases[i].ProductId}");

if (purchases[i].ProductId == "gold") {
// 골드 지급
}

} else {
Debug.Log($"ProcessPurchase: FAIL. Unrecognized product: {purchases[i].ProductId}");
}
});
}
}

SendQueue

    public void BuyButton(int i)
{
string productId = "gold";

// 결제 로직
ProductType productType = ProductType.INAPP;
var purchaseFlowParams = new PurchaseFlowParams.Builder()
.SetProductId(productId) // 추가 필수
.SetProductType(productType) // 추가 필수
.SetDeveloperPayload("따로 메모할만한 정보 여기에 넣기") // 선택사항
.Build();
purchaseClient.Purchase(purchaseFlowParams);
}

public void OnPurchaseSucceeded(List<PurchaseData> purchases)
{
bool isGlobal = false; // 원스토어에 국내에서만 앱을 출시하였을 경우

/*
뒤끝 영수증 검증 처리
*/
for(int i = 0; i < purchases.Count; i++) {

SendQueue.Enqueue(isGlobal, Backend.Receipt.IsValidateOneStorePurchase, purchases[i].ProductId, purchases[i].PurchaseToken, "receiptDescription", (callback) =>
{
// 영수증 검증에 성공한 경우
if (callback.IsSuccess()) {
Debug.Log($"ProcessPurchase: PASS. Product: {purchases[i].ProductId}");

if (purchases[i].ProductId == "gold") {
// 골드 지급
}

} else {
Debug.Log($"ProcessPurchase: FAIL. Unrecognized product: {purchases[i].ProductId}");
}
});
}
}

ReturnCase

Success cases

성공한 경우
statusCode : 201
message : Success
returnValue : {"usedDate":"2018-10-15T05:17:49Z"}

Error cases

콘솔에 원스토어 정보가 올바르지 않는 경우
statusCode : 400
errorCode : UndefinedParameterException
message : undefined onestore client_id, onestore client_id을(를) 확인할 수 없습니다

영수증 검증이 유효하지 않을 경우
statusCode : 400
errorCode : BadParameterException
message : bad token, 잘못된 token 입니다

영수증 토큰이 string.Empty일 경우
statusCode : 400
errorCode : BadParameterException
message : undefined token, token을(를) 확인할 수 없습니다

productId가 string.Empty일 경우
statusCode : 400
errorCode : BadParameterException
message : undefined productId, productId을(를) 확인할 수 없습니다

위변조된 영수증 토큰
statusCode : 400
errorCode : BadParameterException
message : bad token, 잘못된 token 입니다

이미 사용한 영수증 토큰
statusCode : 409
errorCode : UsedReceipt
message : This receipt has already been used. usedDate: 2018-02-15T04:01:50.000Z