@@ -58,7 +58,6 @@ - (void)paymentQueue:(SKPaymentQueue *)queue
58
58
} else {
59
59
RCTLogWarn (@" No callback registered for transaction with state purchased." );
60
60
}
61
- [[SKPaymentQueue defaultQueue ] finishTransaction: transaction];
62
61
break ;
63
62
}
64
63
case SKPaymentTransactionStateRestored:
@@ -76,6 +75,28 @@ - (void)paymentQueue:(SKPaymentQueue *)queue
76
75
}
77
76
}
78
77
78
+ RCT_EXPORT_METHOD (getPendingPurchases:(RCTResponseSenderBlock)callback)
79
+ {
80
+ NSMutableArray *transactionsArrayForJS = [NSMutableArray array ];
81
+ for (SKPaymentTransaction *transaction in [SKPaymentQueue defaultQueue ].transactions ) {
82
+ NSMutableDictionary *purchase = [NSMutableDictionary dictionaryWithDictionary: @{
83
+ @" transactionDate" : @(transaction.transactionDate .timeIntervalSince1970 * 1000 ),
84
+ @" transactionIdentifier" : transaction.transactionIdentifier ,
85
+ @" productIdentifier" : transaction.payment .productIdentifier ,
86
+ @" transactionReceipt" : [[transaction transactionReceipt ] base64EncodedStringWithOptions: 0 ],
87
+ @" transactionState" : StringForTransactionState (transaction.transactionState )
88
+ }];
89
+ SKPaymentTransaction *originalTransaction = transaction.originalTransaction ;
90
+ if (originalTransaction) {
91
+ purchase[@" originalTransactionDate" ] = @(originalTransaction.transactionDate .timeIntervalSince1970 * 1000 );
92
+ purchase[@" originalTransactionIdentifier" ] = originalTransaction.transactionIdentifier ;
93
+ }
94
+
95
+ [transactionsArrayForJS addObject: purchase];
96
+ }
97
+ callback (@[[NSNull null ], transactionsArrayForJS]);
98
+ }
99
+
79
100
RCT_EXPORT_METHOD (purchaseProductForUser:(NSString *)productIdentifier
80
101
username:(NSString *)username
81
102
callback:(RCTResponseSenderBlock)callback)
@@ -114,6 +135,24 @@ - (void) doPurchaseProduct:(NSString *)productIdentifier
114
135
}
115
136
}
116
137
138
+ RCT_EXPORT_METHOD (finishPurchase:(NSString *)transactionIdentifier
139
+ callback:(RCTResponseSenderBlock)callback)
140
+ {
141
+ for (SKPaymentTransaction *transaction in [SKPaymentQueue defaultQueue ].transactions ) {
142
+ if ([transaction.transactionIdentifier isEqualToString: transactionIdentifier]) {
143
+ if (transaction.transactionState == SKPaymentTransactionStatePurchased) {
144
+ [[SKPaymentQueue defaultQueue ] finishTransaction: transaction];
145
+ callback (@[[NSNull null ]]);
146
+ } else {
147
+ callback (@[@" invalid_purchase" ]);
148
+ }
149
+ return ;
150
+ }
151
+ }
152
+ callback (@[@" invalid_purchase" ]);
153
+ }
154
+
155
+
117
156
- (void )paymentQueue : (SKPaymentQueue *)queue
118
157
restoreCompletedTransactionsFailedWithError : (NSError *)error
119
158
{
@@ -270,5 +309,18 @@ - (void)dealloc
270
309
{
271
310
return [NSString stringWithFormat: @" %p " , instance];
272
311
}
312
+
313
+ static NSString *StringForTransactionState (SKPaymentTransactionState state)
314
+ {
315
+ switch (state) {
316
+ case SKPaymentTransactionStatePurchasing: return @" purchasing" ;
317
+ case SKPaymentTransactionStatePurchased: return @" purchased" ;
318
+ case SKPaymentTransactionStateFailed: return @" failed" ;
319
+ case SKPaymentTransactionStateRestored: return @" restored" ;
320
+ case SKPaymentTransactionStateDeferred: return @" deferred" ;
321
+ }
322
+
323
+ [NSException raise :NSGenericException format: @" Unexpected SKPaymentTransactionState." ];
324
+ }
273
325
274
326
@end
0 commit comments