Перейти к содержанию
Fire Monkey от А до Я
  • 0

Apple PAy


FeLDMARShaL

Вопрос

Требуется реализовать поддержу Apple Pay. Договор с процессинговым центром уже есть. Ему необходимо передать Token запроса, который можно получить используя SDK PassKit

Штатных заголовков нет, поэтому я выгрузил iOSapi.PassKit.pas с самого SDK, в итоге получил вот следующий файл.

Что было выяснено:

1) Необходимо сгенерировать запрос на платеж PKPaymentRequest (ГОТОВО, правда почему то пока не получается добавить потдерживаемые платежные системы (setSupportedNetworks) и строки позиций (setPaymentSummaryItems) но на текущем этапе это не так важно и может подождать)

2) Необходимо создать PKPaymentAuthorizationViewController и обрабатывать результат его работы в PKPaymentAuthorizationViewControllerDelegate. А вот с этим возникли трудности из за отсутствия опыта. Может быть есть у кого нибуlь опыт по работе с SDK iOS.

т.е. у нас есть

PKPaymentAuthorizationViewControllerClass = interface(UIViewControllerClass)

PKPaymentAuthorizationViewController = interface(UIViewController)

TPKPaymentAuthorizationViewController = class

PKPaymentAuthorizationViewControllerDelegate = interface(IObjectiveC)

и их надо как то вместе соединить.

На текущий момент у меня получилось примерно следующее:

Цитата

procedure TApplePay.test;
var
  LocalPKPaymentRequest: PKPaymentRequest;
  LocalPKPaymentAuthorizationViewController: PKPaymentAuthorizationViewController;
  LocalPKPaymentSummaryItem: PKPaymentSummaryItem;

  LocalPKPaymentAuthorizationControllerDelegate: PKPaymentAuthorizationControllerDelegate;

  FMainWindow: UIWindow;

  supportedNetworks: NSMutableArray;
  paymentSummaryItems: NSMutableArray;
begin
  LocalPKPaymentRequest := TPKPaymentRequest.Wrap(TPKPaymentRequest.Alloc.init);
  LocalPKPaymentAuthorizationViewController := TPKPaymentAuthorizationViewController.Wrap(TPKPaymentAuthorizationViewController.Alloc.init);
  LocalPKPaymentAuthorizationControllerDelegate := TPKPaymentAuthorizationControllerDelegate.Wrap(TPKPaymentAuthorizationControllerDelegate.Alloc.init);

  if not Assigned(LocalPKPaymentRequest) or not Assigned(LocalPKPaymentAuthorizationViewController) then
    Exit;

  LocalPKPaymentRequest.setMerchantIdentifier(NSStr('merchant.ru.ХХХ.ХХХХХХХ'));

  {//нехатит добавляться типы платежных систем
  supportedNetworks := TNSMutableArray.Create;
  supportedNetworks.addObject(PKPaymentNetworkMasterCard);
  supportedNetworks.addObject(PKPaymentNetworkMasterCard);
  supportedNetworks.addObject(PKPaymentNetworkAmex);
  LocalPKPaymentRequest.setSupportedNetworks(supportedNetworks);}

  LocalPKPaymentRequest.setMerchantCapabilities(PKMerchantCapability3DS);
  LocalPKPaymentRequest.setCountryCode(NSStr('RU'));
  LocalPKPaymentRequest.setCurrencyCode(NSStr('RUB'));

  {//нехатит добавляться позиции
  LocalPKPaymentSummaryItem := TPKPaymentSummaryItem.Wrap(TPKPaymentSummaryItem.Alloc.init);
  LocalPKPaymentSummaryItem.setLabel(NSStr('qwe'));
  LocalPKPaymentSummaryItem.setAmount(TNSDecimalNumber.Wrap(TNSDecimalNumber.OCClass.numberWithFloat(10.2)));
  LocalPKPaymentSummaryItem.setType(1);
  paymentSummaryItems := TNSMutableArray.Create;
  paymentSummaryItems.addObject(LocalPKPaymentSummaryItem);
  LocalPKPaymentRequest.setPaymentSummaryItems(paymentSummaryItems);}

  LocalPKPaymentAuthorizationViewController.initWithPaymentRequest(LocalPKPaymentRequest);
  FMainWindow := TUIApplication.Wrap(TUIApplication.OCClass.sharedApplication).keyWindow;
  if Assigned( FMainWindow ) and Assigned(FMainWindow.rootViewController) then
    FMainWindow.rootViewController.presentViewController(LocalPKPaymentAuthorizationViewController, True, ViewControllerCompletion);

end;

Валится на строчке FMainWindow.rootViewController.presentViewController(LocalPKPaymentAuthorizationViewController, True, ViewControllerCompletion);

 

Буду рад любой помощи, даже ссылкам на документы которые позволят мне в этом разобраться.

iOSapi.PassKit.rar

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

Немного изменил подход. Создал свой класс

Цитата

  TMyViewDelegate = class(TOCLocal, PKPaymentAuthorizationViewControllerDelegate)
  private

  public
    [MethodName
      ('paymentAuthorizationViewController:didAuthorizePayment:completion:')]
    procedure paymentAuthorizationViewControllerDidAuthorizePaymentCompletion
      (controller: PKPaymentAuthorizationViewController;
      didAuthorizePayment: PKPayment; completion: TPassKitCompletion1); cdecl;
    procedure paymentAuthorizationViewControllerDidFinish
      (controller: PKPaymentAuthorizationViewController); cdecl;
    procedure paymentAuthorizationViewControllerWillAuthorizePayment
      (controller: PKPaymentAuthorizationViewController); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectShippingMethod:completion:')
      ]
    procedure paymentAuthorizationViewControllerDidSelectShippingMethodCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectShippingMethod: PKShippingMethod;
      completion: TPassKitCompletion2); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectShippingAddress:completion:')
      ]
    procedure paymentAuthorizationViewControllerDidSelectShippingAddressCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectShippingAddress: ABRecordRef;
      completion: TPassKitCompletion3); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectShippingContact:completion:')
      ]
    procedure paymentAuthorizationViewControllerDidSelectShippingContactCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectShippingContact: PKContact;
      completion: TPassKitCompletion3); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectPaymentMethod:completion:')]
    procedure paymentAuthorizationViewControllerDidSelectPaymentMethodCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectPaymentMethod: PKPaymentMethod;
      completion: TPassKitCompletion4); cdecl;
  end;

Класс интерфейс PKPaymentAuthorizationViewControllerDelegate полученный посредством SdkTransform.exe:

Скрытый текст

  PKPaymentAuthorizationViewControllerDelegate = interface(IObjectiveC)
    ['{85490555-3B8A-4850-8A8D-2F51032A531F}']
    [MethodName
      ('paymentAuthorizationViewController:didAuthorizePayment:completion:')]
    procedure paymentAuthorizationViewControllerDidAuthorizePaymentCompletion
      (controller: PKPaymentAuthorizationViewController;
      didAuthorizePayment: PKPayment; completion: TPassKitCompletion1); cdecl;
    procedure paymentAuthorizationViewControllerDidFinish
      (controller: PKPaymentAuthorizationViewController); cdecl;
    procedure paymentAuthorizationViewControllerWillAuthorizePayment
      (controller: PKPaymentAuthorizationViewController); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectShippingMethod:completion:')
      ]
    procedure paymentAuthorizationViewControllerDidSelectShippingMethodCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectShippingMethod: PKShippingMethod;
      completion: TPassKitCompletion2); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectShippingAddress:completion:')
      ]
    procedure paymentAuthorizationViewControllerDidSelectShippingAddressCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectShippingAddress: ABRecordRef;
      completion: TPassKitCompletion3); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectShippingContact:completion:')
      ]
    procedure paymentAuthorizationViewControllerDidSelectShippingContactCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectShippingContact: PKContact;
      completion: TPassKitCompletion3); cdecl;
    [MethodName
      ('paymentAuthorizationViewController:didSelectPaymentMethod:completion:')]
    procedure paymentAuthorizationViewControllerDidSelectPaymentMethodCompletion
      (controller: PKPaymentAuthorizationViewController;
      didSelectPaymentMethod: PKPaymentMethod;
      completion: TPassKitCompletion4); cdecl;
  end;

Процедура (одна из):

Цитата

TPassKitCompletion1 = procedure(param1: PKPaymentAuthorizationStatus) of object;

При попытке создать экземпляр класса LDelegate := TMyViewDelegate.Create; выскакивает ошибка

Цитата

TPassKitCompletion1=procedure (param1: Integer) is not a valid ObjectiveC type

Я так понимаю что SdkTransform.exe неправильно создал заголовки нативных функций, и надо вручную их поправить. Есть идеи как это сделать?

В инете нашел решение изменить объявление процедур на TPassKitCompletion1 = procedure(param1: PKPaymentAuthorizationStatus); cdecl; но мне это не помогло, ошибка остается

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...