planetarium / NineChronicles.IAP

Nine Chronicles In-app Purchase Service
2 stars 4 forks source link

[상점] 패키지 구매 제한 횟수 소진 후 추가 구매 시도가 가능한 현상 #263

Closed QgamesGeonPyoNoh closed 5 months ago

QgamesGeonPyoNoh commented 5 months ago

APV version info

v200170

Client version info

v170.0.2

Device

Android, iOS

detailed device info

Android 12, iOS 17

account address info

0x3146FE0E47A1998e14cd8a33640e3648A5A90276

avatar address info

No response

purchase receipt info

No response

What happened?

[내용] 패키지 구매 제한 횟수 소진 후 추가 구매 시도가 가능한 현상 -재접속 시 해당 패키지가 다시 상점에 출력됩니다. -재구매 시 결제는 진행되나 결제 실패가 출력되며 아이템은 지급되지 않습니다. -Android / iOS 환경에서 확인하였습니다.

https://github.com/planetarium/NineChronicles/assets/150774808/cacf145e-384a-4655-bd53-db87ed84ee90

How to reproduce the issue

[재현스텝]

  1. 메인 로비 - 상점 진입
  2. 패키지 탭 - 구매 제한 패키지 구매
  3. 구매 제한 횟수 소진 후 재 접속
  4. 패키지 구매 제한 횟수 소진 후 추가 구매 시도가 가능한 현상 확인

[Should be] 패키지 구매 제한 횟수 소진 시 상점에서 영구히 삭제되어야 합니다.

Relevant log output

No response

jonny-jeahyunchoi commented 5 months ago

@QgamesGeonPyoNoh 관련 동작했을때 로그 화면 첨부 부탁드립니다~!

QgamesGeonPyoNoh commented 5 months ago

해당 이슈 발생 시 Error log 2건 첨부 드립니다.

HttpRequestException: 400 (Bad Request) System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode () (at <00000000000000000000000000000000>:0) NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient.ProcessResponseAsync (System.Net.Http.HttpResponseMessage res) (at <00000000000000000000000000000000>:0) System.Runtime.CompilerServices.AsyncTaskMethodBuilder1[TResult].Start[TStateMachine] (TStateMachine& stateMachine) (at <00000000000000000000000000000000>:0) NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient.ProcessResponseAsync (System.Net.Http.HttpResponseMessage res) (at <00000000000000000000000000000000>:0) NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient.PurchaseRequestAsync (NineChronicles.ExternalServices.IAPService.Runtime.Models.Store store, System.String receipt, System.String agentAddr, System.String avatarAddr, System.String planetId, System.String transactionId, System.String appleOriginalTransactionID) (at <00000000000000000000000000000000>:0) System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) (at <00000000000000000000000000000000>:0) System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run () (at <00000000000000000000000000000000>:0) UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke () (at <00000000000000000000000000000000>:0) UnityEngine.UnitySynchronizationContext.Exec () (at <00000000000000000000000000000000>:0) NineChronicles.ExternalServices.IAPService.Runtime.<ProcessResponseAsync>d__14:MoveNext() System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:Start(TStateMachine&) NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient:ProcessResponseAsync(HttpResponseMessage) NineChronicles.ExternalServices.IAPService.Runtime.d__9:MoveNext() UnityEngine.UnitySynchronizationContext:Exec()

QgamesGeonPyoNoh commented 5 months ago

Purchase failed: BadRequest, {"Payload":"{\"json\":\"{\\"orderId\\":\\"GPA.3305-7611-4512-69316\\",\\"packageName\\":\\"com.planetariumlabs.ninechroniclesmobile\\",\\"productId\\":\\"g_pkg_starter01\\",\\"purchaseTime\\":1713856229720,\\"purchaseState\\":0,\\"purchaseToken\\":\\"kdhenfgbjmgbfiakeeffjgdk.AO-J1Oz8_tRXsSHQZi_2xRYm1qkG-S4om5xFahzzLnX8uOaHmHIbkaB-F2HZefGYEz0uhXi3DPSZLpLiGj2GaqASSr6zd-YXgcpJ-ITINGcO4asjVOVAZP1dt5CHMk9Lr_KVc6DWVYQb\\",\\"quantity\\":1,\\"acknowledged\\":false}\",\"signature\":\"RJGsRU2GHWpNF0DYDwwnfXjmwf9AQxmrInTdCYuphJVKucarhYRt9neR4iEB87v4br8zh42biGJHgrxhF2nopvfU3TukJRFFQD6McN9m9JTAJhAwBsZuhx2q2ISdiccEkWIA7hVzFovOhCTDT71bRTH2WDXULaLUa8aXAAlp6cCrTe59hPW0WGAGC4bqpepNa0is76t0DDAq+LKcBycGWhtSqu0vpO+LG5Cw2vrYXtoPd6ZCSEbz4eom/KTr9yckvTLk3lUMMMOTvBFuTG76OeO4yhv5mMawgvyzSqPJgKOQNtfomfApfAy15zd1yKpXC9SdqwWcgjVymxR98ri7oQ==\",\"skuDetails\":[\"{\\"productId\\":\\"g_pkg_starter01\\",\\"type\\":\\"inapp\\",\\"title\\":\\"\uc2a4\ud0c0\ud130 \ud328\ud0a4\uc9c0 (\ub098\uc778 \ud06c\ub85c\ub2c8\ud074 M)\\",\\"name\\":\\"\uc2a4\ud0c0\ud130 \ud328\ud0a4\uc9c0\\",\\"iconUrl\\":\\"https:\\/\\/lh3.googleusercontent.com\\/Un3tWXBsSCEk4N-NXECBOps344Gy6KoLGYs6348CYxJpSn68iBL95BWHgvzFaY1-9h8\\",\\"description\\":\\"\uc2a4\ud0c0\ud130 \ud328\ud0a4\uc9c0\\",\\"price\\":\\"\u20a94,400\\",\\"price_amount_micros\\":4400000000,\\"price_currency_code\\":\\"KRW\\",\\"skuDetailsToken\\":\\"AEuhp4J_mfCJ3D_RjVggu-sfiKMB2VGLJfo6nNcnKXdQ2RYLpSbPx77D4sxjP-VS1rV7\\"}\"]}","Store":"GooglePlay","TransactionID":"kdhenfgbjmgbfiakeeffjgdk.AO-J1Oz8_tRXsSHQZi_2xRYm1qkG-S4om5xFahzzLnX8uOaHmHIbkaB-F2HZefGYEz0uhXi3DPSZLpLiGj2GaqASSr6zd-YXgcpJ-ITINGcO4asjVOVAZP1dt5CHMk9Lr_KVc6DWVYQb"}, 400 (Bad Request) at System.Net.Http.HttpResponseMessage.EnsureSuccessStatusCode () [0x00000] in <00000000000000000000000000000000>:0 at NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient.ProcessResponseAsync (System.Net.Http.HttpResponseMessage res) [0x00000] in <00000000000000000000000000000000>:0 at System.Runtime.CompilerServices.AsyncTaskMethodBuilder1[TResult].Start[TStateMachine] (TStateMachine& stateMachine) [0x00000] in <00000000000000000000000000000000>:0 at NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient.ProcessResponseAsync (System.Net.Http.HttpResponseMessage res) [0x00000] in <00000000000000000000000000000000>:0 at NineChronicles.ExternalServices.IAPService.Runtime.IAPServiceClient.PurchaseRequestAsync (NineChronicles.ExternalServices.IAPService.Runtime.Models.Store store, System.String receipt, System.String agentAddr, System.String avatarAddr, System.String planetId, System.String transactionId, System.String appleOriginalTransactionID) [0x00000] in <00000000000000000000000000000000>:0 at System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback, System.Object state, System.Boolean preserveSyncCtx) [0x00000] in <00000000000000000000000000000000>:0 at System.Runtime.CompilerServices.AsyncMethodBuilderCore+MoveNextRunner.Run () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.UnitySynchronizationContext+WorkRequest.Invoke () [0x00000] in <00000000000000000000000000000000>:0 at UnityEngine.UnitySynchronizationContext.Exec () [0x00000] in <00000000000000000000000000000000>:0 , , NineChronicles.ExternalServices.IAPService.Runtime.<PurchaseRequestAsync>d__16:MoveNext() System.Runtime.CompilerServices.AsyncTaskMethodBuilder1:SetResult(TResult) NineChronicles.ExternalServices.IAPService.Runtime.d__9:MoveNext() UnityEngine.UnitySynchronizationContext:Exec()

jonny-jeahyunchoi commented 5 months ago

@U-lis 이거 클라쪽에서는 구매버튼 누를시 프로덕트를 다시 요청해서 구매가능한상황인지 확인후 결제화면띄우는것으로 구현되어있어서 스타터패키지 구매완료처리가 서버에서 정상처리됬는지 확인이필요해보입니다~!

U-lis commented 5 months ago

@jonny-jeahyunchoi 요거 확인해보니 저번에 이슈가 있어서 bugfix 로 수정하고 있던 부분이 문제가 되고 있는 것으로 확인했습니다. 정식 PR 은 오늘 내로 만들어서 올리도록 하고, 일단 internal 에서 직접 수정해서 해당 현상 발생하지 않도록 조치했습니다.

@QgamesGeonPyoNoh 제보된 address 로 API 재확인했을 때 구매 불가한 것 확인했습니다. 다른 상품도 정상적으로 막혀야 하니 한번 더 테스트 부탁드립니다 :pray:

QgamesGeonPyoNoh commented 5 months ago

수정 내용 확인 완료되었습니다.

https://github.com/planetarium/NineChronicles.IAP/assets/150774808/6540a2a1-948f-4970-a58c-603016dbc615

[테스트 환경] Android.v200170-170.0.3 iOS.v170.0.3(52)

QgamesGeonPyoNoh commented 5 months ago

해당 이슈 재 발생했습니다. 확인 부탁드립니다.

https://github.com/planetarium/NineChronicles.IAP/assets/150774808/3f8e5fd5-5398-4993-8b29-3f2ae5abdf1c

[테스트 환경] Android.v200170-170.0.8 iOS.v170.0.8(57)

U-lis commented 5 months ago

내용 확인해보았습니다. 해당 내용은 수정 완료된 사항인데, 다른 버전을 테스트배포하는 과정에서 코드가 이전 버전으로 덮어씌워진 것으로 확인했습니다. 다시 새 버전 배포해 최신 코드로 돌려두었고, 해당 상품 노출되지 않는 것 확인했습니다.

QgamesGeonPyoNoh commented 5 months ago

수정 내용 확인 완료되었습니다.

https://github.com/planetarium/NineChronicles.IAP/assets/150774808/da78fa04-1ac7-4d31-b466-3694797833e4

[테스트 환경] Android.v200170-170.0.8 iOS.v170.0.8(57)