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 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
- OPPCheckoutSettings *checkoutSettings = [[OPPCheckoutSettings alloc] init];
106
- PKPaymentRequest *paymentRequest = [OPPPaymentProvider paymentRequestWithMerchantIdentifier:merchantIdentifier countryCode:countryCode];
107
- paymentRequest.supportedNetworks = supportedNetworks;
108
-
109
-
110
- if ([params valueForKey:@"companyName"]){
111
- companyName=[params valueForKey:@"companyName"];
112
- }
113
- NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithMantissa:[[params valueForKey:@"amount"] intValue] exponent:-2 isNegative:NO];
114
- paymentRequest.paymentSummaryItems = @[[PKPaymentSummaryItem summaryItemWithLabel:companyName amount:amount]];
115
-
116
-
117
- checkoutSettings.shopperResultURL=shopperResultURL;
118
- checkoutSettings.applePayPaymentRequest = paymentRequest;
119
- OPPCheckoutProvider *checkoutProvider = [OPPCheckoutProvider checkoutProviderWithPaymentProvider:provider
120
- checkoutID:[params valueForKey:@"checkoutID"]
121
- settings:checkoutSettings];
122
-
123
- [checkoutProvider presentCheckoutWithPaymentBrand:@"APPLEPAY"
124
- loadingHandler:^(BOOL inProgress) {
125
- [self sendEventWithName:@"onProgress" body:@(inProgress)];
126
- // Executed whenever SDK sends request to the server or receives the response.
127
- // You can start or stop loading animation based on inProgress parameter.
128
- } completionHandler:^(OPPTransaction * _Nullable transaction, NSError * _Nullable error) {
129
- if (error) {
130
- // reject(@"applePay",checkoutID,error);
131
- reject(@"applePay",error.localizedDescription, error);
132
- // See code attribute (OPPErrorCode) and NSLocalizedDescription to identify the reason of failure.
133
- } else {
134
- if (transaction.redirectURL)
135
- resolve(@{@"redirectURL": transaction.redirectURL.absoluteString});
136
- else
137
- resolve(@{@"resourcePath": transaction.resourcePath});
138
- }
139
- } cancelHandler:^{
140
- reject(@"applePay",@"cancel",NULL);
141
- // Executed if the shopper closes the payment page prematurely.
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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-hyperpay-sdk",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "hyperpay",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",