UDP 패키지로 인앱 구매 구현
UDP용 게임에서 인앱 구매를 구현하려면 다음 단계를 따르십시오.
- 파트너 스토어의 인벤토리를 쿼리합니다.
- IAP 상품을 구매합니다.
- 구매 상품을 소비합니다.
- 클라이언트 측 통합을 확인합니다.
- 서버에서 구매를 확인합니다.
- IAP 카탈로그를 작성합니다.
이 단계를 완료하면 게임 빌드 단계로 이동할 수 있습니다.
파트너 스토어의 인벤토리 쿼리
초기화에 성공하면 QueryInventory
메서드를 호출합니다. 이 메서드는 파트너 스토어의 인벤토리를 쿼리합니다.
이 메서드로 다음 작업을 수행할 수 있습니다.
- 소비되지 않은 IAP 상품 확인
- 제공되지 않은 구매 상품 확인
- 상품 세부 정보 쿼리
이 메서드는 아직 소비되지 않은 비소비성 구매와 소비성 구매에 대한 상품 정보(상품 이름, ID, 가격, 설명)를 반환합니다.
이를 통해 앱 크래시 후 소비되지 않은 구매를 복원할 수 있습니다.
게임에서 UDP 인벤토리로 쿼리 보내기
상품 ID를 지정하면 지정된 IAP 상품에 대한 상품 정보를 가져올 수 있습니다.
StoreService.QueryInventory(List<string> productIds, IPurchaseListener listener);
상품 ID를 지정하지 않으면 모든 IAP 상품에 대한 상품 정보를 가져옵니다.
StoreService.QueryInventory(IPurchaseListener listener);
구매 서비스와 관련된 이벤트의 리스너를 구현합니다.
다음은 그에 대한 예시입니다.
public class PurchaseListener : IPurchaseListener
{
public void OnPurchase(PurchaseInfo purchaseInfo)
{
// The purchase has succeeded.
// If the purchased product is consumable, you should consume it here.
// Otherwise, deliver the product.
}
public void OnPurchaseFailed(string message, PurchaseInfo purchaseInfo)
{
Debug.Log("Purchase Failed: " + message);
}
public void OnPurchaseRepeated(string productCode)
{
// Some stores don't support queryInventory.
}
public void OnPurchaseConsume(PurchaseInfo purchaseInfo)
{
// The consumption succeeded.
// You should deliver the product here.
}
public void OnPurchaseConsumeFailed(string message, PurchaseInfo purchaseInfo)
{
// The consumption failed.
}
public void OnQueryInventory(Inventory inventory)
{
// Querying inventory succeeded.
}
public void OnQueryInventoryFailed(string message)
{
// Querying inventory failed.
}
}
IAP 상품 구매
게임에서 구매 요청을 시작하려면 사용자가 아이템을 구매할 때 Purchase 메서드를 호출하십시오. UDP는 구매 영수증을 자동으로 확인하여 구매가 유효한지 확인합니다.
게임에서 UDP로 구매 요청 보내기
Purchase 메서드를 호출하면 다음이 제공됩니다.
productId
- 플레이어가 구매하려는 IAP 상품의 고유 식별자입니다.developerPayload
- UDP SDK로 보낼 정보입니다.IPurchaseListener
- 모든 구매 관련 이벤트의 결과를 알려주는 리스너입니다.
예제:
StoreService.Purchase(string productId, string developerPayload, IPurchaseListener listener);
참고: IAP가 있는 게임에는 Purchase
메서드가 포함되어야 합니다.
구매가 완료되면 UDP는 게임에 정보를 반환합니다.
일부 파트너 스토어의 결제 게이트웨이는 실시간으로 결제 콜백을 가져올 수 없습니다. 이로 인해 UDP가 결제 SUCCESS 또는 FAILED 콜백을 빨리 수신할 수 없게 됩니다. 이 경우 UDP는 콜백을 FAILED로 간주합니다. 이 문제를 해결하기 위해 Unity는 서버에서 주문을 쿼리하여 최신 상태를 가져올 것을 권장합니다.
온라인 게임의 경우 콜백 알림을 통해 게임 서버에서 구매를 확인할 수 있습니다. UDP는 UDP 설정에서 지정한 URL로 콜백 알림을 보냅니다.
상품 소비
소비성 상품의 경우 게임은 UDP SDK에 ‘소비’ 요청을 전송해야 합니다. 게임은 상품이 소비된 후 상품을 제공해야 합니다. 이렇게 하면 상품의 중복 제공을 방지할 수 있습니다.
참고: OnPurchase는 PurchaseInfo를 반환합니다.
‘PurchaseListener' 클래스의 'OnPurchase' 이벤트에서 아이템이 소비성인지 확인합니다. 아이템이 소비성이면 아이템을 소비하고 'PurchaseListener' 클래스의 'OnPurchaseConsume'이벤트에서 구매 완료에 대한 게임 로직을 구현합니다. 예를 들면 다음과 같습니다.
StoreService.ConsumePurchase(PurchaseInfo, IPurchaseListener);
// implement game logic for purchase
게임에서 UDP로 소비 요청 보내기
클라이언트 측 통합 확인
UDP는 클라이언트 측 확인을 자동으로 수행합니다. 사용자가 IAP 상품을 구매하면 파트너 스토어가 페이로드와 서명을 반환합니다. 그러고 나면 UDP SDK가 서명을 확인합니다. 확인에 실패하면 그에 따라 구매가 실패합니다.
서버에서 구매 확인
다음 방법 중 하나로 서버 측에서 구매를 확인할 수 있습니다.
참고: 콜백 알림은 현재 Huawei AppGallery 스토어에서 지원되지 않습니다.
UDP 샌드박스 환경에서 서버 측 구현을 테스트할 수 있습니다.
주문 쿼리
게임은 HTTP GET 요청을 호출하여 주문에 대한 UDP를 쿼리할 수 있습니다.
주문에 대한 UDP 쿼리
GET https://distribute.dashboard.unity.com/udp/developer/api/order?orderQueryToken=\
API는 다음과 같은 이유로 "미확인" 상태를 반환할 수 있습니다.
- 스토어에서 현재 주문 상태를 확인할 수 없습니다.
- 스토어가 실시간 주문 상태 쿼리를 지원하지 않습니다.
이 경우 일정 시간 간격을 두고 QueryOrder API를 다시 시도하십시오. 스토어는 거의 실시간으로 UDP에 콜백을 보내고 UDP는 게임에 상태를 반환할 수 있습니다.
주문 쿼리 파라미터에 대해 자세히 알아보십시오.
콜백 알림 수신
구매 성공 후 콜백 URL을 지정하면 UDP 서버는 게임 서버에 결제 결과를 알립니다. HTTP POST 요청을 구현하고 다음과 같은 JSON 형식의 요청 본문을 수락합니다.
속성 이름 | 포맷 | 필수/선택 사항 | 설명 |
---|---|---|---|
payload | JSON 문자열 | 필수 | 구매 주문서의 콘텐츠입니다. JSON 페이로드에 대해 자세히 알아보십시오. |
signature | String | 필수 | 페이로드의 PKCS1 v1.5 서명입니다. |
인증서 사용
인증서를 확인하려면 Unity 클라이언트 RSA 공용 키를 사용하십시오. 인증서가 확인을 통과하면 인증서에서 RSA 공개 키를 추출하고, 이 키를 사용하여 서명을 확인할 수 있습니다. 서명을 생성하려면 RSA-SHA1 알고리즘으로 페이로드를 암호화하십시오.
다음은 그에 대한 예시입니다.
공용 키:
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qxbtUqsrvwk2FZ+F2J0EkUDKLdZSVE3qPgxzKxOrgScGrCZULLav9CPzRP91HN9GccvmShH2bsegP3RVtMdwU1eV7C2JdOW1sylCyKIgylCT8tLdQeUMRaIlt7fOfl+k3bkUouWJx8WnrQYM6a7oDeCGklIlekvpQ2NcS1eg7Jp646vBzyu8FMBiuj5LZOhCJg/XXs0kRpvSOBAPndUu/HgqD9aFaXNZBxMN++efxq6PnAVRzRdTtRur+OZSBGjXxgaBKrdbXCkEM3fkMgXP9egq6vnzCiQhZ7UDFXtXQ3DPqviqrTY5WsR9t4X6JxCXo6yGlQAEK/ft9MWN13nrQIDAQAB
요청 본문:
{
"signature": "swWWZpg0/Y26XBohvqqC/for4nyhS5zwzru5s8AJI7YYC+ECHOk7KQjOyFw7cWxM3QNpd7N7E7Umy3vYwDXjV2Y4BLnuJy5gGIpO5jKU4xBNQf793FmI0Fk93YrU31QyiIjXymg1O/H1nKSJXqMz6bycBugiStqsuGp1/CctTHE0Dpv4hC6fZoNWIHYpPJQuKh4DyP1lgE32omcuKUh7IAQduRPDa+qiYJRCA8bV17xK6T8ajS3RlhKue9hjE2a21t8p017ViaOS5OWdzptUwgnWaFi6gs1k0cjdn7o/0QJEgk5j6a8WYE/S8F7YfsYcAwUQV4KY3ex0ULsH3GQEGA==",
"payload": "{\"ClientId\":\"Q_sX9CXfn-rTcWmpP9VEfw\",\"CpOrderId\":\"0bckmoqhel5yd13f\",\"ProductId\":\"com.mystudio.mygame.productid1\",\"ChannelType\":\"APTOIDE\",\"Currency\":\"APPC\",\"Amount\":\"1.01\",\"Country\":\"CHINA\",\"Quantity\":1,\"Rev\":\"0\",\"Status\":\"SUCCESS\",\"PaidTime\":\"2018-09-28T06:43:20Z\",\"Extension\":\"{\\\"key\\\":\\\"value\\\"}\"}"
}
Go에서 인증서를 확인하는 방법을 보여주는 코드 샘플:
func verify(data []byte, publicKey string, sign string) bool {
decodePublic, err := base64.StdEncoding.DecodeString(publicKey)
if err != nil {
panic(err)
}
pubInterface, err := x509.ParsePKIXPublicKey(decodePublic)
if err != nil {
panic(err)
}
pub := pubInterface.(*rsa.PublicKey)
decodeSign, err := base64.StdEncoding.DecodeString(sign)
if err != nil {
return false
}
sh1 := sha1.New()
sh1.Write(data)
hashData := sh1.Sum(nil)
err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, hashData, decodeSign)
if err != nil {
return false
}
return true
}
IAP 카탈로그 작성
Unity는 UDP 콘솔에서 IAP 상품을 추가할 것을 권장합니다. 이렇게 하면 IAP를 정의할 수 있는 더 많은 옵션이 제공됩니다. 하지만 Unity 에디터와 UDP 콘솔이 제대로 동기화되는지 테스트하기 위해 에디터에서 IAP를 하나 이상 생성하는 것이 좋습니다.
참고: 게임 클라이언트에서 IAP 카탈로그를 사용하지 않는 경우(예: IAP 아이템이 게임 서버에서만 유지되는 경우)에는 여전히 UDP 콘솔에서 IAP 카탈로그를 생성해야 합니다.
- Unity 에디터 버전 2019.4 이하에서는 UDP Settings 인스펙터 창을 엽니다.
Unity 에디터 버전 2020.1 이상에서는 IAP Catalog 창을 엽니다. - IAP Catalog 섹션에서 각 IAP 상품에 대한 상품 정보를 입력합니다.
- 상품 ID에 대한 요구 사항에 따라 앱 스토어에서 유효한지 확인합니다.
- 게임에서 정의한 IAP 상품이 IAP 카탈로그에서 설정된 것과 동일한 Product ID를 사용하는지 확인합니다.
- 개별 IAP 상품을 UDP 콘솔에 저장하려면 상품 옆에 있는 드롭다운에서 Push를 선택합니다.
- 모든 IAP 상품을 UDP 콘솔에 저장하려면 상단의 Push 버튼을 선택합니다.
- 모든 IAP 상품을 UDP 콘솔에 저장하려면 상단의 Push 버튼을 선택합니다.
- 더 많은 상품을 추가하려면 Add new IAP를 선택합니다.
IAP 카탈로그가 제대로 저장되었는지 확인하려면 추가한 아이템이 UDP 콘솔에 표시되는지 확인하십시오.
UDP를 구현하고 구성했으면 게임 빌드 단계를 따르시기 바랍니다.