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.
- package/NitroIap.podspec +2 -2
- package/android/src/main/java/com/margelo/nitro/iap/HybridRnIap.kt +134 -4
- package/ios/HybridRnIap.swift +73 -2
- package/ios/RnIapHelper.swift +8 -0
- package/lib/module/hooks/useIAP.js +9 -1
- package/lib/module/hooks/useIAP.js.map +1 -1
- package/lib/module/index.js +69 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types.js +5 -0
- package/lib/module/types.js.map +1 -1
- package/lib/module/utils/errorMapping.js +32 -6
- package/lib/module/utils/errorMapping.js.map +1 -1
- package/lib/module/utils/type-bridge.js +19 -0
- package/lib/module/utils/type-bridge.js.map +1 -1
- package/lib/typescript/src/hooks/useIAP.d.ts +5 -1
- package/lib/typescript/src/hooks/useIAP.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +34 -1
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/specs/RnIap.nitro.d.ts +86 -26
- package/lib/typescript/src/specs/RnIap.nitro.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +145 -55
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/errorMapping.d.ts.map +1 -1
- package/lib/typescript/src/utils/type-bridge.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JFunc_void_NitroPurchase.hpp +2 -0
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.cpp +80 -0
- package/nitrogen/generated/android/c++/JHybridRnIapSpec.hpp +2 -0
- package/nitrogen/generated/android/c++/JIapStore.hpp +65 -0
- package/nitrogen/generated/android/c++/JIapkitPurchaseState.hpp +80 -0
- package/nitrogen/generated/android/c++/JNitroPurchase.hpp +7 -1
- package/nitrogen/generated/android/c++/JNitroPurchaseRequest.hpp +11 -3
- package/nitrogen/generated/android/c++/JNitroReceiptValidationResultIOS.hpp +2 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitAppleProps.hpp +57 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitGoogleProps.hpp +57 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitProps.hpp +70 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithIapkitResult.hpp +68 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderError.hpp +62 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderProps.hpp +70 -0
- package/nitrogen/generated/android/c++/JNitroVerifyPurchaseWithProviderResult.hpp +94 -0
- package/nitrogen/generated/android/c++/JPurchase.hpp +2 -0
- package/nitrogen/generated/android/c++/JPurchaseAndroid.hpp +7 -1
- package/nitrogen/generated/android/c++/JPurchaseIOS.hpp +7 -1
- package/nitrogen/generated/android/c++/JPurchaseVerificationProvider.hpp +59 -0
- package/nitrogen/generated/android/c++/JRequestPurchaseResult.hpp +2 -0
- package/nitrogen/generated/android/c++/JVariant_NitroReceiptValidationResultIOS_NitroReceiptValidationResultAndroid.hpp +2 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/HybridRnIapSpec.kt +8 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/IapStore.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/IapkitPurchaseState.kt +28 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchase.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroPurchaseRequest.kt +9 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitAppleProps.kt +36 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitGoogleProps.kt +36 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitProps.kt +42 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithIapkitResult.kt +42 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderError.kt +39 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderProps.kt +39 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/NitroVerifyPurchaseWithProviderResult.kt +42 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseAndroid.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseIOS.kt +5 -2
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/iap/PurchaseVerificationProvider.kt +21 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.cpp +8 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Bridge.hpp +156 -0
- package/nitrogen/generated/ios/NitroIap-Swift-Cxx-Umbrella.hpp +30 -0
- package/nitrogen/generated/ios/c++/HybridRnIapSpecSwift.hpp +46 -0
- package/nitrogen/generated/ios/swift/Func_void_NitroVerifyPurchaseWithProviderResult.swift +47 -0
- package/nitrogen/generated/ios/swift/HybridRnIapSpec.swift +2 -0
- package/nitrogen/generated/ios/swift/HybridRnIapSpec_cxx.swift +45 -0
- package/nitrogen/generated/ios/swift/IapStore.swift +48 -0
- package/nitrogen/generated/ios/swift/IapkitPurchaseState.swift +68 -0
- package/nitrogen/generated/ios/swift/NitroPurchase.swift +13 -2
- package/nitrogen/generated/ios/swift/NitroPurchaseRequest.swift +47 -1
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitAppleProps.swift +35 -0
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitGoogleProps.swift +35 -0
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitProps.swift +100 -0
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithIapkitResult.swift +57 -0
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithProviderError.swift +65 -0
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithProviderProps.swift +58 -0
- package/nitrogen/generated/ios/swift/NitroVerifyPurchaseWithProviderResult.swift +100 -0
- package/nitrogen/generated/ios/swift/PurchaseAndroid.swift +13 -2
- package/nitrogen/generated/ios/swift/PurchaseIOS.swift +13 -2
- package/nitrogen/generated/ios/swift/PurchaseVerificationProvider.swift +40 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.cpp +2 -0
- package/nitrogen/generated/shared/c++/HybridRnIapSpec.hpp +8 -0
- package/nitrogen/generated/shared/c++/IapStore.hpp +84 -0
- package/nitrogen/generated/shared/c++/IapkitPurchaseState.hpp +104 -0
- package/nitrogen/generated/shared/c++/NitroPurchase.hpp +8 -1
- package/nitrogen/generated/shared/c++/NitroPurchaseRequest.hpp +10 -2
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitAppleProps.hpp +75 -0
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitGoogleProps.hpp +75 -0
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitProps.hpp +89 -0
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithIapkitResult.hpp +87 -0
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderError.hpp +80 -0
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderProps.hpp +84 -0
- package/nitrogen/generated/shared/c++/NitroVerifyPurchaseWithProviderResult.hpp +92 -0
- package/nitrogen/generated/shared/c++/PurchaseAndroid.hpp +8 -1
- package/nitrogen/generated/shared/c++/PurchaseIOS.hpp +8 -1
- package/nitrogen/generated/shared/c++/PurchaseVerificationProvider.hpp +76 -0
- package/openiap-versions.json +3 -3
- package/package.json +1 -1
- package/src/hooks/useIAP.ts +32 -0
- package/src/index.ts +77 -5
- package/src/specs/RnIap.nitro.ts +117 -28
- package/src/types.ts +163 -61
- package/src/utils/errorMapping.ts +32 -4
- 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
|
-
#
|
|
46
|
-
s.dependency 'openiap', "
|
|
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,
|
package/ios/HybridRnIap.swift
CHANGED
|
@@ -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.
|
|
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 {
|
package/ios/RnIapHelper.swift
CHANGED
|
@@ -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":";;AAAA;AACA,SAAQA,WAAW,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,QAAO,OAAO;AAC9D,SAAQC,QAAQ,QAAO,cAAc;AACrC,SAAQC,YAAY,QAAO,mBAAgB;;AAE3C;AACA,SACEC,cAAc,EACdC,qBAAqB,EACrBC,uBAAuB,EACvBC,0BAA0B,EAC1BC,qBAAqB,EACrBC,iBAAiB,IAAIC,yBAAyB,EAC9CC,eAAe,IAAIC,uBAAuB,EAC1CC,aAAa,EACbC,eAAe,IAAIC,uBAAuB,EAC1CC,sBAAsB,EACtBC,sBAAsB,EACtBC,gBAAgB,IAAIC,wBAAwB,EAC5CC,qBAAqB,EACrBC,mCAAmC,EACnCC,0CAA0C,EAC1CC,mCAAmC,EACnCC,oCAAoC,EACpCC,gCAAgC,QAC3B,aAAK;;AAEZ;AACA,SAAQC,SAAS,QAAO,aAAU;
|
|
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":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -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<
|
|
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>
|