Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PaymentMethod data is missing #13

Open
ramisalem opened this issue Sep 21, 2020 · 1 comment
Open

PaymentMethod data is missing #13

ramisalem opened this issue Sep 21, 2020 · 1 comment

Comments

@ramisalem
Copy link

ramisalem commented Sep 21, 2020

Hi I am integrating Payfort payment gateway but for some reason, the following data from the example do not come to me, they do not exist at all. Also, Checking on a real device. No errors occur

What is missing in the response from apple pay is paymentMethod

// paymentMethod example 
{ 
"paymentMethod": { "network": "MasterCard", "type": "credit", "displayName": "MasterCard 4248"

}

What comes to me:

'{
"paymentData": {
"version": "EC_v1",
"data": "string",
"signature": "string",
"header": {
"ephemeralPublicKey": "string",
"publicKeyHash": "string",
"transactionId": "string"
}
},
"transactionIdentifier": "string"
}  

Do you know what should I do to get paymentMethod ?
Thanks for the fixes

@mindnervestech
Copy link

mindnervestech commented Oct 8, 2020

Please change the below content in this file node_module/react-native-apay/ios/RNApplePay.m

#import "RNApplePay.h"
#import <React/RCTUtils.h>

@implementation RNApplePay

  • (dispatch_queue_t)methodQueue
    {
    return dispatch_get_main_queue();
    }
    RCT_EXPORT_MODULE()
  • (BOOL)requiresMainQueueSetup
    {
    return YES;
    }
  • (NSDictionary *)constantsToExport
    {
    return @{
    @"canMakePayments": @([PKPaymentAuthorizationViewController canMakePayments]),
    @"SUCCESS": @(PKPaymentAuthorizationStatusSuccess),
    @"FAILURE": @(PKPaymentAuthorizationStatusFailure),
    @"DISMISSED_ERROR": @"DISMISSED_ERROR",
    };
    }

RCT_EXPORT_METHOD(requestPayment:(NSDictionary *)props promiseWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
PKPaymentRequest *paymentRequest = [[PKPaymentRequest alloc] init];
paymentRequest.merchantCapabilities = PKMerchantCapability3DS;
paymentRequest.merchantIdentifier = props[@"merchantIdentifier"];
paymentRequest.countryCode = props[@"countryCode"];
paymentRequest.currencyCode = props[@"currencyCode"];
paymentRequest.supportedNetworks = [self getSupportedNetworks:props];
paymentRequest.paymentSummaryItems = [self getPaymentSummaryItems:props];

self.viewController = [[PKPaymentAuthorizationViewController alloc] initWithPaymentRequest: paymentRequest];
self.viewController.delegate = self;
dispatch_async(dispatch_get_main_queue(), ^{
    UIViewController *rootViewController = RCTPresentedViewController();
    [rootViewController presentViewController:self.viewController animated:YES completion:nil];
    self.requestPaymentResolve = resolve;
});

}

RCT_EXPORT_METHOD(complete:(NSNumber *_Nonnull)status promiseWithResolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
if (self.completion != NULL) {
self.completeResolve = resolve;
if ([status isEqualToNumber: self.constantsToExport[@"SUCCESS"]]) {
self.completion(PKPaymentAuthorizationStatusSuccess);
} else {
self.completion(PKPaymentAuthorizationStatusFailure);
}
self.completion = NULL;
}
}

  • (NSArray *_Nonnull)getSupportedNetworks:(NSDictionary *_Nonnull)props
    {
    NSMutableDictionary *supportedNetworksMapping = [[NSMutableDictionary alloc] init];

    if (@available(iOS 8, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkAmex forKey:@"amex"];
    [supportedNetworksMapping setObject:PKPaymentNetworkMasterCard forKey:@"mastercard"];
    [supportedNetworksMapping setObject:PKPaymentNetworkVisa forKey:@"visa"];
    }

    if (@available(iOS 9, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkDiscover forKey:@"discover"];
    [supportedNetworksMapping setObject:PKPaymentNetworkPrivateLabel forKey:@"privatelabel"];
    }

    if (@available(iOS 9.2, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkChinaUnionPay forKey:@"chinaunionpay"];
    [supportedNetworksMapping setObject:PKPaymentNetworkInterac forKey:@"interac"];
    }

    if (@available(iOS 10.1, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkJCB forKey:@"jcb"];
    [supportedNetworksMapping setObject:PKPaymentNetworkSuica forKey:@"suica"];
    }

    if (@available(iOS 10.3, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkCarteBancaire forKey:@"cartebancaires"];
    [supportedNetworksMapping setObject:PKPaymentNetworkIDCredit forKey:@"idcredit"];
    [supportedNetworksMapping setObject:PKPaymentNetworkQuicPay forKey:@"quicpay"];
    }

    if (@available(iOS 11.0, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkCarteBancaires forKey:@"cartebancaires"];
    }

    if (@available(iOS 12.0, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkMaestro forKey:@"maestro"];

    }

    if (@available(iOS 12.1.1, *)) {
    [supportedNetworksMapping setObject:PKPaymentNetworkMada forKey:@"mada"];
    }

    NSArray *supportedNetworksProp = props[@"supportedNetworks"];
    NSMutableArray *supportedNetworks = [NSMutableArray array];
    for (NSString *supportedNetwork in supportedNetworksProp) {
    if(supportedNetworksMapping[supportedNetwork] != nil){
    [supportedNetworks addObject: supportedNetworksMapping[supportedNetwork]];
    }
    }

    return supportedNetworks;
    }

  • (NSArray<PKPaymentSummaryItem *> *_Nonnull)getPaymentSummaryItems:(NSDictionary *_Nonnull)props
    {
    NSMutableArray <PKPaymentSummaryItem *> * paymentSummaryItems = [NSMutableArray array];

    NSArray *displayItems = props[@"paymentSummaryItems"];
    if (displayItems.count > 0) {
    for (NSDictionary *displayItem in displayItems) {
    NSDecimalNumber *amount = [NSDecimalNumber decimalNumberWithString:displayItem[@"amount"]];
    NSString *label = displayItem[@"label"];
    [paymentSummaryItems addObject: [PKPaymentSummaryItem summaryItemWithLabel:label amount:amount]];
    }
    }

    return paymentSummaryItems;
    }

  • (void) paymentAuthorizationViewController:(PKPaymentAuthorizationViewController *)controller
    didAuthorizePayment:(PKPayment *)payment
    completion:(void (^)(PKPaymentAuthorizationStatus))completion
    {
    self.completion = completion;
    if (self.requestPaymentResolve != NULL) {
    NSString *paymentData = [[NSString alloc] initWithData:payment.token.paymentData encoding:NSUTF8StringEncoding];
    NSMutableDictionary *paymentResponse = [[NSMutableDictionary alloc]initWithCapacity:4];
    [paymentResponse setObject:paymentData forKey:@"paymentData"];
    [paymentResponse setObject:payment.token.transactionIdentifier forKey:@"transactionId"];
    [paymentResponse setObject:payment.token.paymentMethod.displayName forKey:@"displayName"];
    [paymentResponse setObject:payment.token.paymentMethod.network forKey:@"network"];
    NSString *type = nil;
    switch (payment.token.paymentMethod.type) {
    case PKPaymentMethodTypeDebit:
    type = @"debit";
    break;
    case PKPaymentMethodTypeStore:
    type = @"store";
    break;
    case PKPaymentMethodTypeCredit:
    type = @"credit";
    break;
    case PKPaymentMethodTypePrepaid:
    type = @"prepaid";
    break;
    case PKPaymentMethodTypeUnknown:
    type = @"unknown";
    break;
    default:
    break;
    }
    [paymentResponse setObject:type forKey:@"type"];
    NSError *error;
    NSData *json = [NSJSONSerialization dataWithJSONObject:paymentResponse options:NSJSONWritingPrettyPrinted error: &error];

      self.requestPaymentResolve([[NSString alloc] initWithData:json encoding:NSUTF8StringEncoding]);
      self.requestPaymentResolve = NULL;
    

    }
    }

  • (void)paymentAuthorizationViewControllerDidFinish:(nonnull PKPaymentAuthorizationViewController *)controller {
    dispatch_async(dispatch_get_main_queue(), ^{
    [controller dismissViewControllerAnimated:YES completion:^void {
    if (self.completeResolve != NULL) {
    self.completeResolve(nil);
    self.completeResolve = NULL;
    }
    if (self.requestPaymentResolve != NULL) {
    self.requestPaymentResolve(nil);
    self.requestPaymentResolve = NULL;
    }
    }];
    });
    }

@EnD

Then you will get complete data, which you have required.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants