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

Кстати, несмотря на большое количество интернет-магазинов, оплата в которых осуществляется через PayPal, сервис PayPal Here до сих пор не доступен в российском сторе.
PayPal Here представляет собой мобильный терминал, через который можно оплачивать платежи, и является прямым конкурентом аналогичной программы от Square. Кроме проведения платежей посредством кредитных карт, PayPal Here может использоваться для оплаты чеками и для проверки финансовых транзакций за определенный период времени. Также, можно отправлять счета на электронную почту получателя через ПО от PayPal Here, и покупатель, получив счет, сможет его оплатить.
Я приведу пример интеграции для iOS и на Oblective-C. Если кого-то интересует Android, то его поддержка тоже имеется, но я с ней не работал.
К сожалению, PayPal не предоставляет какую-либо отдельную библиотеки для проведения операции непосредственно из своего приложения. Но безопасность превыше всего. Приходится вызывать стороннее приложение — составляем URL и делаем:
где pphUrl содержит все данные об оплате.
Далее создаем простой UIViewController для редактирования данных:
добавляем все необходимые поля запроса:
и переходим к завершающей стадии (здесь нам потребуется JSONKit):
после этого мы открываем приложение по pphUrl как описано выше.
Заключение
В этой схеме есть одно маленькое НО — пока что приложение PayPalHere не умеет делать обратный вызов вашего приложения после проведения платежа, но думаю, что разработчики это скоро исправят.
Лично я рекомендую заниматься сборкой необходимого url на сервере, так как гораздо меньше возни, да и выглядит устойчивее к ошибкам. Во всяком случае, я делал именно так.
Надеюсь, что кому-нибудь эта статья поможет, всем удачной интеграции!
Буду рад ответить на ваши вопросы и прочитать про ваш опыт.

Кстати, несмотря на большое количество интернет-магазинов, оплата в которых осуществляется через 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 на сервере, так как гораздо меньше возни, да и выглядит устойчивее к ошибкам. Во всяком случае, я делал именно так.
Надеюсь, что кому-нибудь эта статья поможет, всем удачной интеграции!
Буду рад ответить на ваши вопросы и прочитать про ваш опыт.
