SDK를 통한 구매 수행
구매 정보를 검색하고 플레이어가 구매한 상품의 구매 상태를 결정합니다.
읽는 시간 1분최근 업데이트: 11일 전
Unity IAP는 애플리케이션이 플레이어가 구매한 것을 인식하고 이를 이행할 수 있도록 스토어에서 구매 정보를 가져옵니다. 이렇게 하면 게임이 앱 외부 또는 다른 기기에서 아이템을 구매한 경우에도 구매 이력을 기반으로 콘텐츠나 자격을 사용자에게 제공할 수 있습니다.
구매는
OrderOrder구매 검색
사용자가 구매한 상품은 스토어에서 가져올 수 있습니다. 그러나 스토어에서 이미 충족된 소모품을 반환하지 않으므로 소모품은 소모된 후 애플리케이션에서 트래킹해야 합니다. 비소비성 제품 및 구독의 경우,FetchPurchasesCheckEntitlement구매 상태 확인
다음 두 가지 방법으로 구매 상태를 결정할 수 있습니다.- 를 사용하여
Order가Order,PendingOrder,ConfirmedOrder또는DeferredOrder인지 확인합니다.FailedOrder - 를 사용하여
CheckEntitlement,EntitledButNotFinished,EntitledUntilConsumed,FullyEntitled또는NotEntitled를 반환하는Unknown를 수신합니다.EntitlementStatus
구매 속성
속성 | 설명 |
|---|---|
| 구매에 대한 고유 ID입니다. |
| 구매한 제품입니다. |
| 구매한 제품의 양입니다. |
| 스토어에서 구매를 확인하기 위한 영수증 데이터입니다. |
구매 상태
State | 설명 |
|---|---|
| 구매가 지급되었지만 아직 이행되지 않았습니다. |
| 구매가 이행되고 확인되었습니다. |
| 오류로 인해 구매가 실패했습니다. |
| 구매가 결제를 대기 중입니다. |
구매 프로세스
OnPurchasePendingOnPurchasePendingOnPurchasePending// Handle restore on initializationprivate async void Start(){ // Setup, e.g. add listeners to your StoreController... m_StoreController.OnPurchasePending += OnPurchasePending; m_StoreController.OnPurchasesFetched += OnPurchasesFetched; await m_StoreController.Connect(); // Fetch previous purchases (includes confirmed orders) m_StoreController.FetchPurchases();}// Handle new purchases and pending transactionsprivate void OnPurchasePending(PendingOrder 순서){ ProcessPurchase(order);}// Handle fetched purchases (includes previously confirmed orders)private void OnPurchasesFetched(정렬 주문){ Foreach (var confirmedOrder in orders.ConfirmedOrders) { if (confirmedOrder.CartOrdered.Items().FirstOrDefault()?.Product.definition.type != ProductType.Consumable) { // Mark non-consumable and subscription products as entitled on fetch, as they only need to be granted once MarkAsEntitled(confirmedOrder.CartOrdered.Items().FirstOrDefault().Product); } }}// Your ProcessPurchase logicprivate void ProcessPurchase(PendingOrder 순서){ Foreach (var product in order.CartOrdered.Items()) { // Grant product GrantProduct(product); } // Confirm the order to finalize the transaction m_StoreController.ConfirmPurchase(order);}
구매 확인 및 신뢰성
Unity IAP에서는 네트워크 중단 또는 애플리케이션 크래시 중에도 구매가 신뢰할 수 있도록 구매를 명시적으로 확인해야 합니다. 구매에 대한 지급이 이루어지지만 이행되지 않으면 Unity IAP는 다음에 애플리케이션이 초기화될 때 구매를 애플리케이션에 제공합니다. 이 프로세스는 구매 흐름이 중단되거나 애플리케이션이 오프라인 상태일 때 구매가 완료될 때 구매가 손실되는 것을 방지합니다. 구매가 성공적으로 완료되면 해당PendingOrderConfirmPurchase클라우드에 대한 지속적인 구매 확인
소모품 구매를 클라우드에 저장하는 경우 구매가 성공적으로 지속되면ConfirmPurchasePending구매 복원
사용자가 앱을 다시 설치하거나 디바이스를 전환할 때 이전에 소유한 제품과 구독에 대한 액세스 권한을 다시 얻을 수 있습니다. IAP가 자격 기록을 가져오고 액세스 권한을 부여하는 방법을 이해합니다.- 사용자가 애플리케이션을 다시 설치하면 Unity IAP는 첫 번째 호출 시 소유 제품을 복원합니다.
StoreController.FetchPurchases() - IAP는 모든 구매(모든 상태)를 포함하는 객체를 사용하여
Orders리스너를 호출합니다.OnPurchasesFetched - 설정이
PurchaseService.ProcessPendingOrdersOnPurchasesFetched로 설정된 경우 IAP는 실행되지 않은 각 구매에 대해true리스너를 호출합니다.OnPurchasePending - 동일한 세션에서 후속 호출은 동일한 세션에서 이미 본 주문의
FetchPurchases()를 트리거하지 않습니다.OnPurchasePending
SDK와 함께 서버 측 확인 사용
Unity IAP(In-App Purchases) SDK를 사용하는 동안 백엔드 API 호출할 수 있습니다. 이 하이브리드 접근 방식으로 서버는 플레이어에게 보상을 제공하기 전에 Unity 기록에 대한 거래를 직접 확인하여 권한을 부여할 수 있습니다. 표준 백엔드 API 메서드와는 달리, 웹후크에 대한 공용 엔드포인트를 노출할 필요가 없으므로 공격 표면을 줄이고 서버 인프라를 단순화할 수 있습니다.클라이언트 측 구현
구매가 시작되면 SDK는PendingOrderOrderInfo.TransactionId백엔드 인증
서비스 계정의 키 ID와 비밀 키를 사용하여 토큰 교환을 수행하여 상태 비보존 토큰을 받습니다. 자세한 내용은 상태 비보존 토큰을 사용하여 API 인증하는 방법을 참고하십시오.
다음 토큰 교환 엔드포인트를 참조하십시오.
POST https://services.api.unity.com/auth/v1/token-exchange?projectId={projectId}&environmentId={envId}
순서 확인
백엔드에 Bearer 토큰이 있으면 다음 요청을 통해 Unity IAP Order 서비스를 쿼리하십시오.GET https://iap.services.api.unity.com/v1/projects/{projectId}/environments/{envId}/orders/{orderId}
orderIdTransactionId- 항목을 승인하기 전에 가
status여야 합니다.paid - 에는 Stripe 대시보드에서 교차 참조에 필요한 기본 Stripe Checkout 세션 ID가 포함되어 있습니다.
paymentProviderResourceId
주문 수행 및 완료
서버 권한으로 주문을 완료하려면 다음 워크플로를 참고하십시오.- 상태가 유료되고 productSku가 예상 아이템과 일치하는지 확인합니다.
- 플레이어의 데이터베이스를 새 권한으로 업데이트합니다.
- 백엔드가 클라이언트에 성공 코드를 반환하면 다음 방법 중 하나를 사용하여 Unity IAP 시스템에서 거래를 완료합니다.
- API로 직접 주문 업데이트
- 클라이언트 호출 를 만듭니다.
m_StoreController.ConfirmPurchase(order)