Интеграция PayPal Here в iOS-приложение

    Работая над одним проектом, я столкнулся с необходимостью интегрирования PayPal Here в приложения. PayPal вообще никогда не шел на встречу разработчикам, интегрироваться было достаточно сложно, но с PayPal Here дело обстоит несколько иначе (есть целый пример на gitHub’е). Одним словом, если вы владелец интернет-магазина, интернет-аукциона или вообще хотите проводить оплату в своем приложении, то вам будет интересно почитать о том, как можно интегрировать PayPal Here в iOS.

    image

    Кстати, несмотря на большое количество интернет-магазинов, оплата в которых осуществляется через PayPal, сервис PayPal Here до сих пор не доступен в российском сторе.



    Что такое PayPal Here?



    PayPal Here представляет собой мобильный терминал, через который можно оплачивать платежи, и является прямым конкурентом аналогичной программы от Square. Кроме проведения платежей посредством кредитных карт, PayPal Here может использоваться для оплаты чеками и для проверки финансовых транзакций за определенный период времени. Также, можно отправлять счета на электронную почту получателя через ПО от PayPal Here, и покупатель, получив счет, сможет его оплатить.

    Я приведу пример интеграции для iOS и на Oblective-C. Если кого-то интересует Android, то его поддержка тоже имеется, но я с ней не работал.

    Процесс интеграции.



    К сожалению, PayPal не предоставляет какую-либо отдельную библиотеки для проведения операции непосредственно из своего приложения. Но безопасность превыше всего. Приходится вызывать стороннее приложение — составляем URL и делаем:

    UIApplication *application = [UIApplication sharedApplication];
    if ([application canOpenURL:pphUrl]){
         [application openURL:pphUrl];
    } else {
         NSURL *url = [NSURL URLWithString:@"itms://itunes.apple.com/us/app/paypal-here/id505911015?mt=8"];
         [application openURL:url];
    }
    

    где pphUrl содержит все данные об оплате.

    Далее создаем простой UIViewController для редактирования данных:

    @interface PPViewController : UIViewController <UITextFieldDelegate>
     
    @property (weak, nonatomic) IBOutlet UITextField *priceField;
    @property (weak, nonatomic) IBOutlet UITextField *taxField;
    @property (weak, nonatomic) IBOutlet UITextField *nameField;
    @property (weak, nonatomic) IBOutlet UITextField *quantityField;
    @property (weak, nonatomic) IBOutlet UITextField *descriptionField;
     
    @end
    


    добавляем все необходимые поля запроса:

    NSMutableDictionary *shirt = [NSMutableDictionary dictionary];
    NSMutableDictionary *itemList = [NSMutableDictionary dictionary];
    NSMutableDictionary *invoice = [NSMutableDictionary dictionary];
       
    [shirt setObject:self.taxField.text forKey:@"taxRate"];
    [shirt setObject:self.priceField.text forKey:@"unitPrice"];
    [shirt setObject:self.quantityField.text forKey:@"quantity"];
    [shirt setObject:self.nameField.text forKey:@"name"];
    [shirt setObject:self.descriptionField.text forKey:@"description"];
    [shirt setObject:@"Tax" forKey:@"taxName"];
       
    NSMutableArray *items = [NSMutableArray arrayWithObject:shirt];
    [itemList setObject:items forKey:@"item"];
       
    [invoice setObject:@"DueOnReceipt" forKey:@"paymentTerms"];
    [invoice setObject:@"0" forKey:@"discountPercent"];
    [invoice setObject:@"USD" forKey:@"currencyCode"];
    [invoice setObject:@"merchant@ebay.com" forKey:@"merchantEmail"];
    [invoice setObject:@"foo@bar.com" forKey:@"payerEmail"];
    [invoice setObject:itemList forKey:@"itemList"];
    


    и переходим к завершающей стадии (здесь нам потребуется JSONKit):

    NSString *jsonInvoice = [invoice JSONString];
    NSString *encodedInvoice = [jsonInvoice stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
       
    NSString *encodedPaymentTypes = [@"cash,card,paypal" stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
       
    NSString *encodedReturnUrl = [@"myapp://handler?{result}?Type={Type}&InvoiceId={InvoiceId}&Tip={Tip}&Email={Email}&TxId={TxId}" stringByAddingPercentEscapesUsingEncoding:NSASCIIStringEncoding];
       
    NSString *pphUrlString = [NSString stringWithFormat:@"paypalhere://takePayment?accepted=%@&returnUrl=%@&invoice=%@&step=choosePayment",
                                  encodedPaymentTypes, encodedReturnUrl, encodedInvoice];
       
    NSURL *pphUrl = [NSURL URLWithString:pphUrlString];
    

    после этого мы открываем приложение по pphUrl как описано выше.

    Заключение



    В этой схеме есть одно маленькое НО — пока что приложение PayPalHere не умеет делать обратный вызов вашего приложения после проведения платежа, но думаю, что разработчики это скоро исправят.
    Лично я рекомендую заниматься сборкой необходимого url на сервере, так как гораздо меньше возни, да и выглядит устойчивее к ошибкам. Во всяком случае, я делал именно так.

    Надеюсь, что кому-нибудь эта статья поможет, всем удачной интеграции!
    Буду рад ответить на ваши вопросы и прочитать про ваш опыт.
    e-Legion
    Делаем приложения, которыми пользуются миллионы

    Similar posts

    Comments 9

      +2
      Есть ещё одно большое но. На самом деле, просто огромное. Как покупатель, я не готов засовывать свою карту в чей-то мобильник с подобным терминалом :)
        +2
        Вы же не проверяете в магазинах их терминалы, верно? Тот же черный ящик, только в профиль.
          +2
          Верно, не проверяю. Но если вдруг появятся подозрения на махинации с моей картой, то магазин я знаю, где искать. Где мне искать человека с айфоном и мобильным терминалом?

          Кроме того, у меня есть опыт обращения с терминалами в магазине — я знаю, как они выглядят и процедуру пользования. А как отличить этот мобильный терминал от скиммера? Пин-код опять же, как вводить, на личном телефоне чужого человека?
          0
          PayPal Here подразумевается иметь к своему личному смартфону
            0
            То есть, нужно купить какое-то устройство, чтобы заплатить? У меня уже есть смартфон и приложение мобильного банка. Зачем нужно что-то ещё?
          +1
          У меня вообще есть мысль, что вот эти мобильные терминалы это путь куда-то не туда. Зачем они?

          Давно уже есть для всех мобильных платформ приложения «интернет-банка», позволяющие управлять картой с телефона. Так вот, достаточно научить это приложение считывать с устройства продавца по bluetooth или nfc платёжные реквизиты продавца. Но только их: примитивный файлик с json, содержащий данные, необходимые для проведения платежа (но не более того). Далее, приложение формирует платёжку, я проверяю (или лучше даже сам её ввожу) сумму и получаю смску с кодом подтверждения операции и всё. Платёж проведён. Устройство продавца (кстати, не обязательно тоже смартфон, а вообще любое устройство, хоть тот же терминал) получает уведомление о платеже. Продавец сверяет сумму и всё. Зачем эти терминалы нужны вообще?
            0
            Достаточно просто сканирования QR-кода в этом плане, чтобы не «усложнять» с bluetooth или NFC (последнего в айфонах принципиально нет).
              0
              Да, отличный вариант.
                0
                На самом деле надо давно убить всю эту мертворожденную технологию с платежами через NFC (но с обязательным secure-модулем в телефоне, которых, дай бог, сейчас с десяток выпустили), paypass, идиотскими ридерами через вход для наушинков и т. д. Потому, что нет массовости, да и терминалы обновить по всей стране будет стоить огромных денег.

                У всех телефонов есть камера с автофокусом (даже столетних). Выпустили бекэнд, выпустили клиенты: один показывает, другой фотографирует и перечисляет деньги. Во всех продуктовых сетях кассовые аппараты давно подключены к интернету: выпускается прошивка, которая печатает QR-коды прямо на чеках (для интернет-магазинов — аддоны, которые будут показывать это же на экране монитора) — вы сканируете и оплачиваете (при чем, чем хотите: хоть пейпалом, хоть вебмани, хоть биткойнами мороженое). Для платежей с плохим интернетом, можно сделать лимит в 1000 р. (списываются, как только одна из сторон выходит в интернет).

                В общем, всё в воздухе; боюсь, лишь, что лобби визы/мастеркарда слишком сильно.

          Only users with full accounts can post comments. Log in, please.