react-native-hyperpay-sdk 1.0.3 → 1.0.5
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/ios/HyperPay.h +4 -1
- package/ios/HyperPay.m +140 -44
- package/package.json +1 -1
package/ios/HyperPay.h
CHANGED
|
@@ -3,8 +3,11 @@
|
|
|
3
3
|
#import <OPPWAMobile/OPPWAMobile.h>
|
|
4
4
|
#import <React/RCTBridgeModule.h>
|
|
5
5
|
#import <React/RCTEventEmitter.h>
|
|
6
|
+
#import <PassKit/PassKit.h>
|
|
6
7
|
|
|
7
|
-
@interface HyperPay : RCTEventEmitter <RCTBridgeModule>
|
|
8
|
+
@interface HyperPay : RCTEventEmitter <RCTBridgeModule, OPPCheckoutProviderDelegate, PKPaymentAuthorizationViewControllerDelegate>
|
|
9
|
+
|
|
10
|
+
@property(nonatomic, strong) OPPCheckoutProvider *checkoutProvider;
|
|
8
11
|
|
|
9
12
|
@end
|
|
10
13
|
|
package/ios/HyperPay.m
CHANGED
|
@@ -3,12 +3,21 @@
|
|
|
3
3
|
#import "HyperPay.h"
|
|
4
4
|
#import <React/RCTLog.h>
|
|
5
5
|
|
|
6
|
+
@interface HyperPay ()
|
|
7
|
+
@property (nonatomic, copy) NSString *checkoutID;
|
|
8
|
+
@property (nonatomic, copy) NSString *resourcePath;
|
|
9
|
+
@property (nonatomic, copy) NSString *redirectURL;
|
|
10
|
+
@property (nonatomic, copy) RCTPromiseResolveBlock _resolve;
|
|
11
|
+
@property (nonatomic, copy) RCTPromiseRejectBlock _reject;
|
|
12
|
+
@end
|
|
13
|
+
|
|
6
14
|
@implementation HyperPay
|
|
7
15
|
|
|
8
16
|
OPPPaymentProvider *provider;
|
|
9
17
|
NSString *shopperResultURL = @"";
|
|
10
18
|
NSString *merchantIdentifier = @"";
|
|
11
19
|
NSString *countryCode = @"";
|
|
20
|
+
NSString *currencyCode = @"";
|
|
12
21
|
NSString *mode=@"TestMode";
|
|
13
22
|
NSArray *supportedNetworks;
|
|
14
23
|
NSString *companyName=@"";
|
|
@@ -17,7 +26,7 @@ RCT_EXPORT_MODULE(HyperPay)
|
|
|
17
26
|
|
|
18
27
|
-(instancetype)init
|
|
19
28
|
{
|
|
20
|
-
|
|
29
|
+
|
|
21
30
|
self = [super init];
|
|
22
31
|
if (self) {
|
|
23
32
|
provider = [OPPPaymentProvider paymentProviderWithMode:OPPProviderModeTest];
|
|
@@ -33,7 +42,6 @@ RCT_EXPORT_MODULE(HyperPay)
|
|
|
33
42
|
React Native functions
|
|
34
43
|
*/
|
|
35
44
|
|
|
36
|
-
|
|
37
45
|
RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(setup: (NSDictionary*)options) {
|
|
38
46
|
shopperResultURL=[options valueForKey:@"shopperResultURL"];
|
|
39
47
|
if ([options valueForKey:@"merchantIdentifier"])
|
|
@@ -42,6 +50,8 @@ RCT_EXPORT_BLOCKING_SYNCHRONOUS_METHOD(setup: (NSDictionary*)options) {
|
|
|
42
50
|
companyName=[options valueForKey:@"companyName"];
|
|
43
51
|
if ([options valueForKey:@"countryCode"])
|
|
44
52
|
countryCode=[options valueForKey:@"countryCode"];
|
|
53
|
+
if ([options valueForKey:@"currencyCode"])
|
|
54
|
+
currencyCode=[options valueForKey:@"currencyCode"];
|
|
45
55
|
if ([options valueForKey:@"supportedNetworks"])
|
|
46
56
|
supportedNetworks=[options valueForKey:@"supportedNetworks"];
|
|
47
57
|
if ([[options valueForKey:@"mode"] isEqual:@"LiveMode"])
|
|
@@ -70,13 +80,13 @@ RCT_EXPORT_METHOD(createPaymentTransaction: (NSDictionary*)options resolver:(RCT
|
|
|
70
80
|
|
|
71
81
|
} else {
|
|
72
82
|
params.shopperResultURL =shopperResultURL;
|
|
73
|
-
|
|
83
|
+
|
|
74
84
|
OPPTransaction *transaction = [OPPTransaction transactionWithPaymentParams:params];
|
|
75
85
|
|
|
76
86
|
[provider submitTransaction:transaction completionHandler:^(OPPTransaction * _Nonnull transaction, NSError * _Nullable error) {
|
|
77
87
|
NSDictionary *transactionResult;
|
|
78
88
|
if (transaction.type == OPPTransactionTypeAsynchronous) {
|
|
79
|
-
|
|
89
|
+
|
|
80
90
|
transactionResult = @{
|
|
81
91
|
@"redirectURL":transaction.redirectURL.absoluteString,
|
|
82
92
|
@"status":@"pending",
|
|
@@ -99,50 +109,136 @@ RCT_EXPORT_METHOD(createPaymentTransaction: (NSDictionary*)options resolver:(RCT
|
|
|
99
109
|
}
|
|
100
110
|
|
|
101
111
|
|
|
102
|
-
|
|
103
112
|
RCT_EXPORT_METHOD(applePay:(NSDictionary*)params resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject){
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
113
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
114
|
+
self.checkoutID = [params valueForKey:@"checkoutID"];
|
|
115
|
+
self.resourcePath = nil;
|
|
116
|
+
self._resolve = resolve;
|
|
117
|
+
self._reject = reject;
|
|
118
|
+
|
|
119
|
+
NSString *merchant = [params valueForKey:@"merchantIdentifier"] ?: merchantIdentifier;
|
|
120
|
+
NSString *country = [params valueForKey:@"countryCode"] ?: countryCode;
|
|
121
|
+
NSString *currency = [params valueForKey:@"currencyCode"] ?: currencyCode;
|
|
122
|
+
NSString *company = [params valueForKey:@"companyName"] ?: companyName;
|
|
123
|
+
NSString *amountStr = [params valueForKey:@"amount"] ?: @"0.00";
|
|
124
|
+
|
|
125
|
+
PKPaymentRequest *paymentRequest = [OPPPaymentProvider paymentRequestWithMerchantIdentifier:merchant countryCode:country];
|
|
126
|
+
paymentRequest.currencyCode = currency;
|
|
127
|
+
|
|
128
|
+
NSArray *rawNetworks = [params valueForKey:@"supportedNetworks"] ?: supportedNetworks;
|
|
129
|
+
if (rawNetworks.count > 0 && [rawNetworks[0] isKindOfClass:[NSString class]]) {
|
|
130
|
+
NSMutableArray *mapped = [NSMutableArray array];
|
|
131
|
+
NSDictionary *networkMap = @{
|
|
132
|
+
@"visa": PKPaymentNetworkVisa,
|
|
133
|
+
@"mastercard": PKPaymentNetworkMasterCard,
|
|
134
|
+
@"amex": PKPaymentNetworkAmex,
|
|
135
|
+
@"mada": PKPaymentNetworkMada,
|
|
136
|
+
};
|
|
137
|
+
for (NSString *name in rawNetworks) {
|
|
138
|
+
PKPaymentNetwork net = networkMap[[name lowercaseString]];
|
|
139
|
+
if (net) [mapped addObject:net];
|
|
140
|
+
}
|
|
141
|
+
paymentRequest.supportedNetworks = mapped.count ? mapped : rawNetworks;
|
|
142
|
+
} else {
|
|
143
|
+
paymentRequest.supportedNetworks = rawNetworks;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:amountStr];
|
|
147
|
+
paymentRequest.paymentSummaryItems = @[ [PKPaymentSummaryItem summaryItemWithLabel:company amount:amount] ];
|
|
148
|
+
|
|
149
|
+
if (![OPPPaymentProvider canSubmitPaymentRequest:paymentRequest]) {
|
|
150
|
+
reject(@"applePay", @"Apple Pay is not supported on this device", nil);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
143
153
|
|
|
154
|
+
PKPaymentAuthorizationViewController *vc = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest:paymentRequest];
|
|
155
|
+
if (!vc) {
|
|
156
|
+
reject(@"applePay", @"Failed to initialise Apple Pay sheet", nil);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
vc.delegate = self;
|
|
160
|
+
|
|
161
|
+
UIViewController *topVC = [UIApplication sharedApplication].delegate.window.rootViewController;
|
|
162
|
+
while (topVC.presentedViewController) topVC = topVC.presentedViewController;
|
|
163
|
+
[topVC presentViewController:vc animated:YES completion:^{
|
|
164
|
+
[self sendEventWithName:@"onProgress" body:@(YES)];
|
|
165
|
+
}];
|
|
166
|
+
});
|
|
144
167
|
}
|
|
145
168
|
|
|
169
|
+
- (void)paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
|
|
170
|
+
didAuthorizePayment:(PKPayment *)payment
|
|
171
|
+
handler:(void (^)(PKPaymentAuthorizationResult *))completion
|
|
172
|
+
API_AVAILABLE(ios(11.0)) {
|
|
173
|
+
NSError *error = nil;
|
|
174
|
+
OPPApplePayPaymentParams *appleParams =
|
|
175
|
+
[[OPPApplePayPaymentParams alloc] initWithCheckoutID:self.checkoutID
|
|
176
|
+
tokenData:payment.token.paymentData
|
|
177
|
+
error:&error];
|
|
178
|
+
if (!appleParams) {
|
|
179
|
+
completion([[PKPaymentAuthorizationResult alloc]
|
|
180
|
+
initWithStatus:PKPaymentAuthorizationStatusFailure
|
|
181
|
+
errors:error ? @[error] : nil]);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
appleParams.shopperResultURL = shopperResultURL;
|
|
186
|
+
OPPTransaction *transaction = [OPPTransaction transactionWithPaymentParams:appleParams];
|
|
187
|
+
|
|
188
|
+
__weak typeof(self) weakSelf = self;
|
|
189
|
+
[provider submitTransaction:transaction completionHandler:^(OPPTransaction *transaction, NSError *submitError) {
|
|
190
|
+
__strong typeof(weakSelf) _self = weakSelf;
|
|
191
|
+
if (!_self) {
|
|
192
|
+
completion([[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusFailure errors:nil]);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (submitError) {
|
|
196
|
+
completion([[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusFailure errors:nil]);
|
|
197
|
+
_self.resourcePath = nil;
|
|
198
|
+
_self._reject(@"applePay", submitError.localizedDescription, submitError);
|
|
199
|
+
_self._reject = nil;
|
|
200
|
+
_self._resolve = nil;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
_self.resourcePath = transaction.resourcePath;
|
|
205
|
+
_self.redirectURL = transaction.redirectURL.absoluteString;
|
|
206
|
+
completion([[PKPaymentAuthorizationResult alloc] initWithStatus:PKPaymentAuthorizationStatusSuccess errors:nil]);
|
|
207
|
+
}];
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
- (void)paymentAuthorizationViewControllerDidFinish:(PKPaymentAuthorizationViewController *)controller {
|
|
211
|
+
__weak typeof(self) weakSelf = self;
|
|
212
|
+
[controller dismissViewControllerAnimated:YES completion:^{
|
|
213
|
+
__strong typeof(weakSelf) _self = weakSelf;
|
|
214
|
+
if (!_self) return;
|
|
215
|
+
|
|
216
|
+
[_self sendEventWithName:@"onProgress" body:@(NO)];
|
|
217
|
+
|
|
218
|
+
if (!_self._resolve && !_self._reject) return;
|
|
219
|
+
|
|
220
|
+
if (_self.resourcePath || _self.redirectURL) {
|
|
221
|
+
_self._resolve(@{
|
|
222
|
+
@"resourcePath": _self.resourcePath ?: @"",
|
|
223
|
+
@"checkoutId": _self.checkoutID ?: @"",
|
|
224
|
+
@"redirectURL": _self.redirectURL ?: @"",
|
|
225
|
+
});
|
|
226
|
+
} else {
|
|
227
|
+
_self._reject(@"applePay", @"cancel", nil);
|
|
228
|
+
}
|
|
229
|
+
_self.resourcePath = nil;
|
|
230
|
+
_self._resolve = nil;
|
|
231
|
+
_self._reject = nil;
|
|
232
|
+
}];
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
#pragma mark - OPPCheckoutProviderDelegate
|
|
236
|
+
|
|
237
|
+
- (void)checkoutProvider:(OPPCheckoutProvider *)checkoutProvider
|
|
238
|
+
continueSubmitting:(OPPTransaction *)transaction
|
|
239
|
+
completion:(void (^)(NSString * _Nullable, BOOL))completion {
|
|
240
|
+
completion(nil, YES);
|
|
241
|
+
}
|
|
146
242
|
|
|
147
243
|
@end
|
|
148
244
|
|