react-native-iap 14.4.46 → 14.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/NitroIap.podspec +2 -2
  2. package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +134 -4
  3. package/ios/HybridRnIap.swift +73 -2
  4. package/ios/RnIapHelper.swift +8 -0
  5. package/lib/module/hooks/useIAP.js +9 -1
  6. package/lib/module/hooks/useIAP.js.map +1 -1
  7. package/lib/module/index.js +69 -1
  8. package/lib/module/index.js.map +1 -1
  9. package/lib/module/types.js +5 -0
  10. package/lib/module/types.js.map +1 -1
  11. package/lib/module/utils/errorMapping.js +32 -6
  12. package/lib/module/utils/errorMapping.js.map +1 -1
  13. package/lib/module/utils/type-bridge.js +19 -0
  14. package/lib/module/utils/type-bridge.js.map +1 -1
  15. package/lib/typescript/src/hooks/useIAP.d.ts +5 -1
  16. package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
  17. package/lib/typescript/src/index.d.ts +34 -1
  18. package/lib/typescript/src/index.d.ts.map +1 -1
  19. package/lib/typescript/src/specs/RnIap.nitro.d.ts +86 -26
  20. package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
  21. package/lib/typescript/src/types.d.ts +145 -55
  22. package/lib/typescript/src/types.d.ts.map +1 -1
  23. package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
  24. package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
  25. package/nitrogen/generated/android/c++/JFunc_void_NitroPurchase.hpp +2 -0
  26. package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +80 -0
  27. package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +2 -0
  28. package/nitrogen/generated/android/c++/JIapStore.hpp +65 -0
  29. package/nitrogen/generated/android/c++/JIapkitPurchaseState.hpp +80 -0
  30. package/nitrogen/generated/android/c++/JNitroPurchase.hpp +7 -1
  31. package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +11 -3
  32. package/nitrogen/generated/android/c++/JNitroReceiptValidationResultIOS.hpp +2 -0
  33. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAppleProps.hpp +57 -0
  34. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitGoogleProps.hpp +57 -0
  35. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitProps.hpp +70 -0
  36. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitResult.hpp +68 -0
  37. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderError.hpp +62 -0
  38. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderProps.hpp +70 -0
  39. package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderResult.hpp +94 -0
  40. package/nitrogen/generated/android/c++/JPurchase.hpp +2 -0
  41. package/nitrogen/generated/android/c++/JPurchaseAndroid.hpp +7 -1
  42. package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +7 -1
  43. package/nitrogen/generated/android/c++/JPurchaseVerificationProvider.hpp +59 -0
  44. package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +2 -0
  45. package/nitrogen/generated/android/c++/JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.hpp +2 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +8 -0
  47. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/IapStore.kt +23 -0
  48. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/IapkitPurchaseState.kt +28 -0
  49. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchase.kt +5 -2
  50. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseRequest.kt +9 -3
  51. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAppleProps.kt +36 -0
  52. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitGoogleProps.kt +36 -0
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitProps.kt +42 -0
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitResult.kt +42 -0
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderError.kt +39 -0
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderProps.kt +39 -0
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderResult.kt +42 -0
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseAndroid.kt +5 -2
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +5 -2
  60. package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseVerificationProvider.kt +21 -0
  61. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +8 -0
  62. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +156 -0
  63. package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +30 -0
  64. package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +46 -0
  65. package/nitrogen/generated/ios/swift/Func_void_NitroVerifyPurchaseWithProviderResult.swift +47 -0
  66. package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +2 -0
  67. package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +45 -0
  68. package/nitrogen/generated/ios/swift/IapStore.swift +48 -0
  69. package/nitrogen/generated/ios/swift/IapkitPurchaseState.swift +68 -0
  70. package/nitrogen/generated/ios/swift/NitroPurchase.swift +13 -2
  71. package/nitrogen/generated/ios/swift/NitroPurchaseRequest.swift +47 -1
  72. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitAppleProps.swift +35 -0
  73. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitGoogleProps.swift +35 -0
  74. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitProps.swift +100 -0
  75. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitResult.swift +57 -0
  76. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithProviderError.swift +65 -0
  77. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithProviderProps.swift +58 -0
  78. package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithProviderResult.swift +100 -0
  79. package/nitrogen/generated/ios/swift/PurchaseAndroid.swift +13 -2
  80. package/nitrogen/generated/ios/swift/PurchaseIOS.swift +13 -2
  81. package/nitrogen/generated/ios/swift/PurchaseVerificationProvider.swift +40 -0
  82. package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +2 -0
  83. package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +8 -0
  84. package/nitrogen/generated/shared/c++/IapStore.hpp +84 -0
  85. package/nitrogen/generated/shared/c++/IapkitPurchaseState.hpp +104 -0
  86. package/nitrogen/generated/shared/c++/NitroPurchase.hpp +8 -1
  87. package/nitrogen/generated/shared/c++/NitroPurchaseRequest.hpp +10 -2
  88. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitAppleProps.hpp +75 -0
  89. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitGoogleProps.hpp +75 -0
  90. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitProps.hpp +89 -0
  91. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitResult.hpp +87 -0
  92. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderError.hpp +80 -0
  93. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderProps.hpp +84 -0
  94. package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderResult.hpp +92 -0
  95. package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +8 -1
  96. package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +8 -1
  97. package/nitrogen/generated/shared/c++/PurchaseVerificationProvider.hpp +76 -0
  98. package/openiap-versions.json +3 -3
  99. package/package.json +1 -1
  100. package/src/hooks/useIAP.ts +32 -0
  101. package/src/index.ts +77 -5
  102. package/src/specs/RnIap.nitro.ts +117 -28
  103. package/src/types.ts +163 -61
  104. package/src/utils/errorMapping.ts +32 -4
  105. package/src/utils/type-bridge.ts +22 -0
package/NitroIap.podspec CHANGED
@@ -42,8 +42,8 @@ Pod::Spec.new do |s|
42
42
  s.dependency 'React-jsi'
43
43
  s.dependency 'React-callinvoker'
44
44
  # OpenIAP Apple for StoreKit 2 integration
45
- # Use ~> to allow patch updates (e.g., 1.2.30 -> 1.2.31, but not 1.3.0)
46
- s.dependency 'openiap', "~> #{apple_version}"
45
+ # Exact version match for consistent builds
46
+ s.dependency 'openiap', "#{apple_version}"
47
47
 
48
48
  install_modules_dependencies(s)
49
49
  end
@@ -549,7 +549,34 @@ class HybridRnIap : HybridRnIapSpec() {
549
549
  }
550
550
  }
551
551
  }
552
-
552
+
553
+ override fun hasActiveSubscriptions(subscriptionIds: Array<String>?): Promise<Boolean> {
554
+ return Promise.async {
555
+ initConnection(null).await()
556
+
557
+ RnIapLog.payload(
558
+ "hasActiveSubscriptions",
559
+ mapOf("subscriptionIds" to (subscriptionIds?.toList() ?: "all"))
560
+ )
561
+
562
+ try {
563
+ val hasActive = openIap.hasActiveSubscriptions(subscriptionIds?.toList())
564
+ RnIapLog.result("hasActiveSubscriptions", hasActive)
565
+ hasActive
566
+ } catch (e: Exception) {
567
+ RnIapLog.failure("hasActiveSubscriptions", e)
568
+ val error = OpenIAPError.ServiceUnavailable
569
+ throw OpenIapException(
570
+ toErrorJson(
571
+ error = error,
572
+ debugMessage = e.message,
573
+ messageOverride = "Failed to check active subscriptions: ${e.message}"
574
+ )
575
+ )
576
+ }
577
+ }
578
+ }
579
+
553
580
  // Transaction management methods (Unified)
554
581
  override fun finishTransaction(params: NitroFinishTransactionParams): Promise<Variant_Boolean_NitroPurchaseResult> {
555
582
  return Promise.async {
@@ -895,6 +922,7 @@ class HybridRnIap : HybridRnIapSpec() {
895
922
  transactionDate = purchase.transactionDate,
896
923
  purchaseToken = purchase.purchaseToken,
897
924
  platform = IapPlatform.ANDROID,
925
+ store = mapIapStore(purchase.store),
898
926
  quantity = purchase.quantity.toDouble(),
899
927
  purchaseState = mapPurchaseState(purchase.purchaseState),
900
928
  isAutoRenewing = purchase.isAutoRenewing,
@@ -943,7 +971,16 @@ class HybridRnIap : HybridRnIapSpec() {
943
971
  dev.hyo.openiap.PurchaseState.Unknown -> PurchaseState.UNKNOWN
944
972
  }
945
973
  }
946
-
974
+
975
+ private fun mapIapStore(store: dev.hyo.openiap.IapStore): IapStore {
976
+ return when (store) {
977
+ dev.hyo.openiap.IapStore.Apple -> IapStore.APPLE
978
+ dev.hyo.openiap.IapStore.Google -> IapStore.GOOGLE
979
+ dev.hyo.openiap.IapStore.Horizon -> IapStore.HORIZON
980
+ dev.hyo.openiap.IapStore.Unknown -> IapStore.UNKNOWN
981
+ }
982
+ }
983
+
947
984
  // Billing error messages handled by OpenIAP
948
985
 
949
986
  // iOS-specific method - not supported on Android
@@ -1078,7 +1115,7 @@ class HybridRnIap : HybridRnIapSpec() {
1078
1115
  )
1079
1116
 
1080
1117
  Variant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.Second(result)
1081
-
1118
+
1082
1119
  } catch (e: Exception) {
1083
1120
  val debugMessage = e.message
1084
1121
  val error = OpenIAPError.InvalidReceipt
@@ -1092,7 +1129,69 @@ class HybridRnIap : HybridRnIapSpec() {
1092
1129
  }
1093
1130
  }
1094
1131
  }
1095
-
1132
+
1133
+ override fun verifyPurchaseWithProvider(params: NitroVerifyPurchaseWithProviderProps): Promise<NitroVerifyPurchaseWithProviderResult> {
1134
+ return Promise.async {
1135
+ try {
1136
+ // Convert Nitro enum to string (e.g., IAPKIT -> "iapkit")
1137
+ val providerString = params.provider.name.lowercase()
1138
+ RnIapLog.payload("verifyPurchaseWithProvider", mapOf("provider" to providerString))
1139
+
1140
+ // Build the props map for OpenIAP - use string value for provider
1141
+ val propsMap = mutableMapOf<String, Any?>("provider" to providerString)
1142
+ params.iapkit?.let { iapkit ->
1143
+ val iapkitMap = mutableMapOf<String, Any?>()
1144
+ iapkit.apiKey?.let { iapkitMap["apiKey"] = it }
1145
+ iapkit.google?.let { google ->
1146
+ iapkitMap["google"] = mapOf("purchaseToken" to google.purchaseToken)
1147
+ }
1148
+ iapkit.apple?.let { apple ->
1149
+ iapkitMap["apple"] = mapOf("jws" to apple.jws)
1150
+ }
1151
+ propsMap["iapkit"] = iapkitMap
1152
+ }
1153
+
1154
+ val props = dev.hyo.openiap.VerifyPurchaseWithProviderProps.fromJson(propsMap)
1155
+ val result = openIap.verifyPurchaseWithProvider(props)
1156
+
1157
+ RnIapLog.result("verifyPurchaseWithProvider", mapOf("provider" to result.provider, "hasIapkit" to (result.iapkit != null)))
1158
+
1159
+ // Convert result to Nitro types
1160
+ val nitroIapkitResult = result.iapkit?.let { item ->
1161
+ NitroVerifyPurchaseWithIapkitResult(
1162
+ isValid = item.isValid,
1163
+ state = mapIapkitPurchaseState(item.state.name),
1164
+ store = mapIapkitStore(item.store.name)
1165
+ )
1166
+ }
1167
+
1168
+ // Convert errors if present
1169
+ val nitroErrors = result.errors?.map { error ->
1170
+ NitroVerifyPurchaseWithProviderError(
1171
+ code = error.code,
1172
+ message = error.message
1173
+ )
1174
+ }?.toTypedArray()
1175
+
1176
+ NitroVerifyPurchaseWithProviderResult(
1177
+ iapkit = nitroIapkitResult,
1178
+ errors = nitroErrors,
1179
+ provider = mapPurchaseVerificationProvider(result.provider.name)
1180
+ )
1181
+ } catch (e: Exception) {
1182
+ RnIapLog.failure("verifyPurchaseWithProvider", e)
1183
+ val error = OpenIAPError.VerificationFailed
1184
+ throw OpenIapException(
1185
+ toErrorJson(
1186
+ error = error,
1187
+ debugMessage = e.message,
1188
+ messageOverride = "Verification failed: ${e.message ?: "unknown reason"}"
1189
+ )
1190
+ )
1191
+ }
1192
+ }
1193
+ }
1194
+
1096
1195
  // iOS-specific methods - Not applicable on Android, return appropriate defaults
1097
1196
  override fun subscriptionStatusIOS(sku: String): Promise<Array<NitroSubscriptionStatus>?> {
1098
1197
  return Promise.async {
@@ -1324,6 +1423,37 @@ class HybridRnIap : HybridRnIapSpec() {
1324
1423
  }
1325
1424
  }
1326
1425
 
1426
+ // Helper functions to map OpenIAP enum values to Nitro enum values
1427
+ private fun mapIapkitPurchaseState(stateName: String): IapkitPurchaseState {
1428
+ return when (stateName.uppercase()) {
1429
+ "ENTITLED" -> IapkitPurchaseState.ENTITLED
1430
+ "PENDING_ACKNOWLEDGMENT", "PENDING-ACKNOWLEDGMENT" -> IapkitPurchaseState.PENDING_ACKNOWLEDGMENT
1431
+ "PENDING" -> IapkitPurchaseState.PENDING
1432
+ "CANCELED" -> IapkitPurchaseState.CANCELED
1433
+ "EXPIRED" -> IapkitPurchaseState.EXPIRED
1434
+ "READY_TO_CONSUME", "READY-TO-CONSUME" -> IapkitPurchaseState.READY_TO_CONSUME
1435
+ "CONSUMED" -> IapkitPurchaseState.CONSUMED
1436
+ "INAUTHENTIC" -> IapkitPurchaseState.INAUTHENTIC
1437
+ else -> IapkitPurchaseState.UNKNOWN
1438
+ }
1439
+ }
1440
+
1441
+ private fun mapIapkitStore(storeName: String): IapStore {
1442
+ return when (storeName.uppercase()) {
1443
+ "APPLE" -> IapStore.APPLE
1444
+ "GOOGLE" -> IapStore.GOOGLE
1445
+ "HORIZON" -> IapStore.HORIZON
1446
+ else -> IapStore.UNKNOWN
1447
+ }
1448
+ }
1449
+
1450
+ private fun mapPurchaseVerificationProvider(providerName: String): PurchaseVerificationProvider {
1451
+ return when (providerName.uppercase()) {
1452
+ "IAPKIT" -> PurchaseVerificationProvider.IAPKIT
1453
+ else -> PurchaseVerificationProvider.NONE
1454
+ }
1455
+ }
1456
+
1327
1457
  private fun toErrorResult(
1328
1458
  error: OpenIAPError,
1329
1459
  productId: String? = null,
@@ -265,7 +265,22 @@ class HybridRnIap: HybridRnIapSpec {
265
265
  }
266
266
  }
267
267
  }
268
-
268
+
269
+ func hasActiveSubscriptions(subscriptionIds: [String]?) throws -> Promise<Bool> {
270
+ return Promise.async {
271
+ try self.ensureConnection()
272
+ do {
273
+ RnIapLog.payload("hasActiveSubscriptions", subscriptionIds ?? [])
274
+ let hasActive = try await OpenIapModule.shared.hasActiveSubscriptions(subscriptionIds)
275
+ RnIapLog.result("hasActiveSubscriptions", hasActive)
276
+ return hasActive
277
+ } catch {
278
+ RnIapLog.failure("hasActiveSubscriptions", error: error)
279
+ throw error
280
+ }
281
+ }
282
+ }
283
+
269
284
  func finishTransaction(params: NitroFinishTransactionParams) throws -> Promise<Variant_Bool_NitroPurchaseResult> {
270
285
  return Promise.async {
271
286
  guard let iosParams = params.ios else { return .first(true) }
@@ -305,7 +320,7 @@ class HybridRnIap: HybridRnIapSpec {
305
320
  return Promise.async {
306
321
  do {
307
322
  RnIapLog.payload("validateReceiptIOS", ["sku": params.sku])
308
- let props = try OpenIapSerialization.receiptValidationProps(from: ["sku": params.sku])
323
+ let props = try OpenIapSerialization.verifyPurchaseProps(from: ["sku": params.sku])
309
324
  let result = try await OpenIapModule.shared.validateReceiptIOS(props)
310
325
  var encoded = RnIapHelper.sanitizeDictionary(OpenIapSerialization.encode(result))
311
326
  if encoded["receiptData"] != nil {
@@ -334,6 +349,62 @@ class HybridRnIap: HybridRnIapSpec {
334
349
  }
335
350
  }
336
351
 
352
+ func verifyPurchaseWithProvider(params: NitroVerifyPurchaseWithProviderProps) throws -> Promise<NitroVerifyPurchaseWithProviderResult> {
353
+ return Promise.async {
354
+ do {
355
+ RnIapLog.payload("verifyPurchaseWithProvider", ["provider": params.provider.stringValue])
356
+ // Convert Nitro params to OpenIAP props using JSONSerialization (same as expo-iap)
357
+ // Use stringValue for enum to get proper string representation ("iapkit" instead of numeric rawValue)
358
+ var propsDict: [String: Any] = ["provider": params.provider.stringValue]
359
+ if let iapkit = params.iapkit {
360
+ var iapkitDict: [String: Any] = [:]
361
+ if let apiKey = iapkit.apiKey {
362
+ iapkitDict["apiKey"] = apiKey
363
+ }
364
+ if let apple = iapkit.apple {
365
+ iapkitDict["apple"] = ["jws": apple.jws]
366
+ }
367
+ if let google = iapkit.google {
368
+ iapkitDict["google"] = ["purchaseToken": google.purchaseToken]
369
+ }
370
+ propsDict["iapkit"] = iapkitDict
371
+ }
372
+ // Use JSONSerialization + JSONDecoder like expo-iap does
373
+ let jsonData = try JSONSerialization.data(withJSONObject: propsDict)
374
+ let props = try JSONDecoder().decode(VerifyPurchaseWithProviderProps.self, from: jsonData)
375
+ let result = try await OpenIapModule.shared.verifyPurchaseWithProvider(props)
376
+ RnIapLog.result("verifyPurchaseWithProvider", ["provider": result.provider, "hasIapkit": result.iapkit != nil])
377
+ // Convert result to Nitro types
378
+ var nitroIapkitResult: NitroVerifyPurchaseWithIapkitResult? = nil
379
+ if let item = result.iapkit {
380
+ nitroIapkitResult = NitroVerifyPurchaseWithIapkitResult(
381
+ isValid: item.isValid,
382
+ state: IapkitPurchaseState(fromString: item.state.rawValue) ?? .unknown,
383
+ store: IapStore(fromString: item.store.rawValue) ?? .unknown
384
+ )
385
+ }
386
+ // Convert errors if present
387
+ var nitroErrors: [NitroVerifyPurchaseWithProviderError]? = nil
388
+ if let errors = result.errors {
389
+ nitroErrors = errors.map { error in
390
+ NitroVerifyPurchaseWithProviderError(
391
+ code: error.code,
392
+ message: error.message
393
+ )
394
+ }
395
+ }
396
+ return NitroVerifyPurchaseWithProviderResult(
397
+ iapkit: nitroIapkitResult,
398
+ errors: nitroErrors,
399
+ provider: PurchaseVerificationProvider(fromString: result.provider.rawValue) ?? .iapkit
400
+ )
401
+ } catch {
402
+ RnIapLog.failure("verifyPurchaseWithProvider", error: error)
403
+ throw PurchaseError.make(code: .receiptFailed, message: error.localizedDescription)
404
+ }
405
+ }
406
+ }
407
+
337
408
  func getStorefront() throws -> Promise<String> {
338
409
  return Promise.async {
339
410
  do {
@@ -109,6 +109,14 @@ enum RnIapHelper {
109
109
  purchase.platform = .ios
110
110
  }
111
111
 
112
+ // Set store field
113
+ if let storeString = dictionary["store"] as? String,
114
+ let store = IapStore(fromString: storeString) {
115
+ purchase.store = store
116
+ } else {
117
+ purchase.store = .apple
118
+ }
119
+
112
120
  if let quantity = doubleValue(dictionary["quantity"]) { purchase.quantity = quantity }
113
121
  if let purchaseStateString = dictionary["purchaseState"] as? String,
114
122
  let state = PurchaseState(fromString: purchaseStateString) {
@@ -6,7 +6,7 @@ import { Platform } from 'react-native';
6
6
  import { RnIapConsole } from "../utils/debug.js";
7
7
 
8
8
  // Internal modules
9
- import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, getActiveSubscriptions, hasActiveSubscriptions, restorePurchases as restorePurchasesTopLevel, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid } from "../index.js";
9
+ import { initConnection, purchaseErrorListener, purchaseUpdatedListener, promotedProductListenerIOS, getAvailablePurchases, finishTransaction as finishTransactionInternal, requestPurchase as requestPurchaseInternal, fetchProducts, validateReceipt as validateReceiptInternal, verifyPurchase as verifyPurchaseTopLevel, verifyPurchaseWithProvider as verifyPurchaseWithProviderTopLevel, getActiveSubscriptions, hasActiveSubscriptions, restorePurchases as restorePurchasesTopLevel, getPromotedProductIOS, requestPurchaseOnPromotedProductIOS, checkAlternativeBillingAvailabilityAndroid, showAlternativeBillingDialogAndroid, createAlternativeBillingTokenAndroid, userChoiceBillingListenerAndroid } from "../index.js";
10
10
 
11
11
  // Types
12
12
  import { ErrorCode } from "../types.js";
@@ -138,6 +138,12 @@ export function useIAP(options) {
138
138
  androidOptions
139
139
  });
140
140
  }, []);
141
+ const verifyPurchase = useCallback(async options => {
142
+ return verifyPurchaseTopLevel(options);
143
+ }, []);
144
+ const verifyPurchaseWithProvider = useCallback(async options => {
145
+ return verifyPurchaseWithProviderTopLevel(options);
146
+ }, []);
141
147
  const initIapWithSubscriptions = useCallback(async () => {
142
148
  // Register listeners BEFORE initConnection to avoid race condition
143
149
  subscriptionsRef.current.purchaseUpdate = purchaseUpdatedListener(async purchase => {
@@ -222,6 +228,8 @@ export function useIAP(options) {
222
228
  fetchProducts: fetchProductsInternal,
223
229
  requestPurchase,
224
230
  validateReceipt,
231
+ verifyPurchase,
232
+ verifyPurchaseWithProvider,
225
233
  restorePurchases: async () => {
226
234
  try {
227
235
  await restorePurchasesTopLevel();
@@ -1 +1 @@
1
- {"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","getActiveSubscriptions","hasActiveSubscriptions","restorePurchases","restorePurchasesTopLevel","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","ErrorCode","normalizeErrorCodeFromNative","useIAP","options","connected","setConnected","products","setProducts","subscriptions","setSubscriptions","availablePurchases","setAvailablePurchases","promotedProductIOS","setPromotedProductIOS","activeSubscriptions","setActiveSubscriptions","optionsRef","connectedRef","mergeWithDuplicateCheck","existingItems","newItems","getKey","merged","forEach","newItem","isDuplicate","some","existingItem","push","current","subscriptionsRef","subscriptionsRefState","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","error","getAvailablePurchasesInternal","_skus","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","sku","androidOptions","initIapWithSubscriptions","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","mappedError","code","message","productId","undefined","InitConnection","onPurchaseError","OS","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","config","alternativeBillingModeAndroid","remove","currentSubscriptions"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["useCallback","useEffect","useState","useRef","Platform","RnIapConsole","initConnection","purchaseErrorListener","purchaseUpdatedListener","promotedProductListenerIOS","getAvailablePurchases","finishTransaction","finishTransactionInternal","requestPurchase","requestPurchaseInternal","fetchProducts","validateReceipt","validateReceiptInternal","verifyPurchase","verifyPurchaseTopLevel","verifyPurchaseWithProvider","verifyPurchaseWithProviderTopLevel","getActiveSubscriptions","hasActiveSubscriptions","restorePurchases","restorePurchasesTopLevel","getPromotedProductIOS","requestPurchaseOnPromotedProductIOS","checkAlternativeBillingAvailabilityAndroid","showAlternativeBillingDialogAndroid","createAlternativeBillingTokenAndroid","userChoiceBillingListenerAndroid","ErrorCode","normalizeErrorCodeFromNative","useIAP","options","connected","setConnected","products","setProducts","subscriptions","setSubscriptions","availablePurchases","setAvailablePurchases","promotedProductIOS","setPromotedProductIOS","activeSubscriptions","setActiveSubscriptions","optionsRef","connectedRef","mergeWithDuplicateCheck","existingItems","newItems","getKey","merged","forEach","newItem","isDuplicate","some","existingItem","push","current","subscriptionsRef","subscriptionsRefState","fetchProductsInternal","params","warn","requestType","type","debug","skus","result","items","prevSubscriptions","subscription","id","newProducts","filter","item","newSubscriptions","prevProducts","product","error","getAvailablePurchasesInternal","_skus","alsoPublishToEventListenerIOS","onlyIncludeActiveItemsIOS","getActiveSubscriptionsInternal","subscriptionIds","hasActiveSubscriptionsInternal","args","requestObj","sku","androidOptions","initIapWithSubscriptions","purchaseUpdate","purchase","e","onPurchaseSuccess","purchaseError","mappedError","code","message","productId","undefined","InitConnection","onPurchaseError","OS","onPromotedProductIOS","onUserChoiceBillingAndroid","userChoiceBillingAndroid","details","config","alternativeBillingModeAndroid","remove","currentSubscriptions"],"sourceRoot":"../../../src","sources":["hooks/useIAP.ts"],"mappings":"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","ignoreList":[]}
@@ -8,6 +8,7 @@ import { NitroModules } from 'react-native-nitro-modules';
8
8
 
9
9
  // Internal modules
10
10
 
11
+ import { ErrorCode } from "./types.js";
11
12
  import { convertNitroProductToProduct, convertNitroPurchaseToPurchase, convertProductToProductSubscription, validateNitroProduct, validateNitroPurchase, convertNitroSubscriptionStatusToSubscriptionStatusIOS } from "./utils/type-bridge.js";
12
13
  import { parseErrorStringToJsonObj } from "./utils/error.js";
13
14
  import { normalizeErrorCodeFromNative, createPurchaseError } from "./utils/errorMapping.js";
@@ -1010,7 +1011,7 @@ export const consumePurchaseAndroid = async purchaseToken => {
1010
1011
  * Validate receipt on both iOS and Android platforms
1011
1012
  * @param sku - Product SKU
1012
1013
  * @param androidOptions - Android-specific validation options (required for Android)
1013
- * @returns Promise<ReceiptValidationResultIOS | ReceiptValidationResultAndroid> - Platform-specific receipt validation result
1014
+ * @returns Promise<VerifyPurchaseResultIOS | VerifyPurchaseResultAndroid> - Platform-specific receipt validation result
1014
1015
  */
1015
1016
  export const validateReceipt = async options => {
1016
1017
  const {
@@ -1075,6 +1076,73 @@ export const validateReceipt = async options => {
1075
1076
  }
1076
1077
  };
1077
1078
 
1079
+ /**
1080
+ * Verify purchase with the configured providers
1081
+ *
1082
+ * This function uses the native OpenIAP verifyPurchase implementation
1083
+ * which validates purchases using platform-specific methods.
1084
+ * This is an alias for validateReceipt for API consistency with OpenIAP.
1085
+ *
1086
+ * @param options - Receipt validation options containing the SKU
1087
+ * @returns Promise resolving to receipt validation result
1088
+ */
1089
+ export const verifyPurchase = validateReceipt;
1090
+
1091
+ /**
1092
+ * Verify purchase with a specific provider (e.g., IAPKit)
1093
+ *
1094
+ * This function allows you to verify purchases using external verification
1095
+ * services like IAPKit, which provide additional validation and security.
1096
+ *
1097
+ * @param options - Verification options including provider and credentials
1098
+ * @returns Promise resolving to provider-specific verification result
1099
+ *
1100
+ * @example
1101
+ * ```typescript
1102
+ * const result = await verifyPurchaseWithProvider({
1103
+ * provider: 'iapkit',
1104
+ * iapkit: {
1105
+ * apiKey: 'your-api-key',
1106
+ * apple: { jws: purchase.purchaseToken },
1107
+ * google: { purchaseToken: purchase.purchaseToken },
1108
+ * },
1109
+ * });
1110
+ * ```
1111
+ */
1112
+ export const verifyPurchaseWithProvider = async options => {
1113
+ try {
1114
+ const result = await IAP.instance.verifyPurchaseWithProvider({
1115
+ provider: options.provider,
1116
+ iapkit: options.iapkit ?? null
1117
+ });
1118
+ // Validate provider - Nitro spec allows 'none' for compatibility, but this function only supports 'iapkit'
1119
+ if (result.provider !== 'iapkit') {
1120
+ throw createPurchaseError({
1121
+ code: ErrorCode.DeveloperError,
1122
+ message: `Unsupported provider: ${result.provider}. Only 'iapkit' is supported.`
1123
+ });
1124
+ }
1125
+ return {
1126
+ provider: result.provider,
1127
+ iapkit: result.iapkit ? {
1128
+ isValid: result.iapkit.isValid,
1129
+ state: result.iapkit.state,
1130
+ store: result.iapkit.store
1131
+ } : null,
1132
+ errors: result.errors ?? null
1133
+ };
1134
+ } catch (error) {
1135
+ RnIapConsole.error('[verifyPurchaseWithProvider] Failed:', error);
1136
+ const parsedError = parseErrorStringToJsonObj(error);
1137
+ throw createPurchaseError({
1138
+ code: parsedError.code,
1139
+ message: parsedError.message,
1140
+ responseCode: parsedError.responseCode,
1141
+ debugMessage: parsedError.debugMessage
1142
+ });
1143
+ }
1144
+ };
1145
+
1078
1146
  /**
1079
1147
  * Sync iOS purchases with App Store (iOS only)
1080
1148
  * @returns Promise<boolean>