CocoaPods является менеджером фреймворков/зависимостей для проектов Cocoa. вы можете установить его с помощью следующей команды::
$ gem install cocoapods
Для интеграции P2P Core в Ваш Xcode проект используя CocoaPods, укажите его в Вашем Podfile
:
pod 'P2PCore'
'0.2.2' # Swift 3.2 (Поддержка только на банковских карт)
'~> 0.2.6' # Swift 4.0 (Поддержка только на банковских карт)
'~> 0.3' # Swift 4.0 (Поддержка разных платежных средств (Карты, Альфа-Клик, Qiwi и т.д.))
P2PCore - предназначен для выполнения сетевых запросов
pod 'P2PUI'
'0.2.2' # Swift 3.2 (Поддержка только на банковских карт)
'~> 0.2.6' # Swift 4.0 (Поддержка только на банковских карт)
'~> 0.3' # Swift 4.0 (Поддержка разных платежных средств (Карты, Альфа-Клик, Qiwi и т.д.))
P2PUI - содержит в себе интерфейсную часть выбора, добавления банковской карты, а так же экран истории выплат и возвратов денежных средтсв.
Затем, запустите команду:
$ pod install
После установки импортируйте модули во всех файлах, где они будут использоваться:
import P2PCore
import P2PUI
Рассмотрим в качестве примера фрилансиг площадку.
В файле AppDelegate, добавьте конфигурацию в метод application:didFinishLaunchingWithOptions
P2PCore.setPlatform(id: "PLATFORM_ID", signatureKey: "PLATFORM_SIGNATURE_KEY")
Значения PLATFORM_ID
и PLATFORM_SIGNATURE_KEY
вы получите при регистрации в сервисе P2P Wallet One.
После авторизации пользователя в приложении, необходимо записать в конфигурацию его данные.
Если пользователь выступает в роли заказчика:
P2PCore.setPayer(id: "PLATFORM_USER_ID", title: "PLATFORM_USER_TITLE", phoneNumber: "PLATFORM_USER_PHONE_NUMBER")
Если пользователь выступает в роли исполнителя:
P2PCore.setBenificiary(id: "PLATFORM_USER_ID", title: "PLATFORM_USER_TITLE", phoneNumber: "PLATFORM_USER_PHONE_NUMBER")
Где:
PLATFORM_USER_ID
- Идентификатор пользователя в Вашей системе.
PLATFORM_USER_TITLE
- Имя пользователя в Вашей системе.
PLATFORM_USER_PHONE_NUMBER
- Номер телефона пользователя в Вашей системе.
Если заказчиком во время создания заказа был указан метод расчета "Безопасная сделка (P2P Wallet One)", то когда исполнитель подает заявку на исполнение заказа, он дожен добавить (выбрать) карту, на которую будет зачислен платеж после выполнения.
Имеется 2 способа добавления (выбора) платежного средства:
Способ 1 (Используя готовое решение из P2PUI):
let vc = PaymentToolsViewController(owner: .benificiary)
vc.delegate = self // PaymentToolsViewControllerDelegate
Показать модально, в новом UINavigationController
(Modal):
let nc = UINavigationController(rootViewController: vc)
self.present(nc, animated: true)
Показать в текущем UINavigationController
(Push):
self.navigationController?.pushViewController(vc, animated: true)
После выбора платежного средства, будет вызван метод делегата PaymentToolsViewControllerDelegate
:
func paymentToolsViewController(_ vc: PaymentToolsViewController, didSelect paymentTool: PaymentTool)
В
PaymentToolsViewController
имеется встроенная возможность добавить новое платежное средство.
Способ 2 (Построить свой View Controller с добавлением, списком платежных средств):
Получение списка платежных средств исполнителя:
P2PCore.beneficiariesPaymentTools.paymentTools { paymentTools, error in
// paymentTools: [PaymentTool]? - Массив объектов [PaymentTool]. Будет nil в случае ошибки запроса
// error: NSError - Будет nil в случае успешного запроса.
}
Если у исполнителя нет привязанных раннее платежных средств, то необходимо его добавить используя UIWebView.
вы можете использовать готовый LinkPaymentToolViewController
.
let vc = LinkPaymentToolViewController(delegate: self)
self.navigationController?.pushViewController(vc, animated: true)
После того, как исполнитель добавит платежное средство, будет вызван метод делегата LinkPaymentToolViewControllerDelegate
:
func linkPaymentToolViewControllerComplete(_ vc: LinkPaymentToolViewController)
После добавления платежного средства, Вам необходимо получить его id
. Для это воспользуйтесь методом получения списка платежных средств (см. выше).
Еслы вы хотите сделать собственный View Controller добавления платежного средства, то для получения URLRequest
используйте следующий код:
let request = P2PCore.beneficiariesPaymentTools.linkNewPaymentToolRequest(returnUrl: "RETURN_URL")
Где:
RETURN_URL
- URL на который произойдет переадресация, после завершения добавления.
ВНИМАНИЕ! выбранный идентификатор платежного средства
paymentTool.id
Вам необходимо записать в заявку исполнителя к задаче. Идентификатор платежного средства исполнителя понадобится при принятии завки заказчиком.
Когда заказчик выбрал оптимальное для него предложение исполнителя, необходимо создать сделку на стороне P2P Wallet One и оплатить ее (поставить средства в HOLD на платежном средстве заказчика).
Для оплаты необходимо выбрать уже привязанное платежное средство или добавить новое.
выбор платежного средства:
Способ 1 (Используя готовое решение из P2PUI):
let vc = PaymentToolsViewController(owner: .payer)
vc.delegate = self // PaymentToolsViewControllerDelegate
Презентовать его можно аналогично двумя способоми, в текущем UINavigationController
(Push) и в модальном (Modal). Эти способы описаны выше.
Если заказчик выбрал привязанное ранее платежное средство, то вызовится метод делегата PaymentToolsViewControllerDelegate
:
func paymentToolsViewController(_ vc: PaymentToolsViewController, didSelect paymentTool: PaymentTool)
После выбора платежного средства необходимо создать сделку на стороне P2P Wallet One:
P2PCore.deals.create(
dealId: "PLATFORM_DEAL_ID",
beneficiaryId: "PLATFORM_BENEFICIARY_ID",
payerPaymentToolId: selectedPaymentTool.id, // опицоинальный
beneficiaryPaymentToolId: BENEFICIARY_PAYMENT_TOOL_ID,
amount: 100,
currencyId: .rub,
shortDescription: "PLATFORM_DEAL_SHORT_DESCRIPTION",
fullDescription: "PLATFORM_DEAL_FULL_DESCRIPTION",
deferPayout: true,
complete: { (deal, error) in
if let error = error {
// process error
} else if let deal = deal {
// Pay deal
}
}
)
Где:
PLATFORM_DEAL_ID
- Идентификатор заявки/сделки в Вашей системе.
PLATFORM_BENEFICIARY_ID
- Идентификатор исполнителя.
BENEFICIARY_PAYMENT_TOOL_ID
- Идентификатор карты исполнителя, записанные при создании заявки исполнителем.
PLATFORM_DEAL_SHORT_DESCRIPTION
- Краткое описание сделки. Напимер "Создание сайта".
PLATFORM_DEAL_FULL_DESCRIPTION
- Полное описание сделки.
Для оплаты сделки можете использовать готовый View Controller:
let vc = PayDealViewController(dealId: deal.id, redirectToPaymentToolAddition: redirectToPaymentToolAddition)
vc.delegate = self
У PayDealViewController
имеется опциональный параметр authData
. вы можете у пользоателся предварительно запросить CVV выбраной карты и инициализировать контроллер оплаты вместе с CVV. В таком случае пользователю не будет предложено ввести CVV на странице оплаты.
Если у пользователя нет приявзанных платежных средств и он на странице списка выберет "Использовать новое платежное средство" то вызовется метод делегата:
func paymentToolsViewControllerDidSelectLinkNew(_ vc: PaymentToolsViewController)
В таком случае, при создании сделки не нужно указывать параметр payerPaymentToolId
или установите значение nil
.
Способ 2 (Построить свой View Controller с добавлением, списком карт):
Получение списка платежных средств зказчика:
P2PCore.payersPaymentTools.paymentTools { paymentTools, error in
// paymentTools: [PaymentTool]? - Массив объектов [PaymentTool]. Будет nil в случае ошибки запроса
// error: NSError - Будет nil в случае успешного запроса.
}
Если у заказчика нет привязанных раннее платежных средств, то необходимо оплатить с нового используя UIWebView.
Для получения URLRequest
оплаты используйте следующий код:
let request = P2PCore.deals.payRequest(dealId: "PLATFORM_DEAL_ID", redirectToPaymentToolAddition: true, authData: "CVV/CVC", returnUrl: "RETURN_URL")
Где:
PLATFORM_DEAL_ID
- Идентификатор заявки/сделки в Вашей системе
CVV/CVC
- Если пользователь выбрал привязанную карту, вы можете нативно запросить у него CVV/CVC карты. В таком случае, заказчику не будет предложено на странице оплаты вводить CVC/CVV.
RETURN_URL
- URL на который произойдет переадресация, после завершения оплаты.
После оплаты сделки, вы можете узнать статус оплаты используя следующий код:
P2PCore.deals.status(dealId: self.deal.id) { deal, error
switch deal.dealStateId {
case DealStateIdPaymentProcessing:
// В процессе оплаты. Тут необходимо проверить статус еще раз через некоторое время
case DealStateIdPaymentProcessError:
// Возникает в случае ошики оплаты. Например недостаточно средств на карте заказчика
case DealStateIdPaid:
// Средства успешно зарезевированы
default:
break
}
}
Статусы сделаны не
enum: String
для поддержки Objective-C
После выполнения работы фрилансером, ему необходимо перевести средства и завершить сделку.
Завершить сделку можно использую следующий код:
P2PCore.deals.complete(dealId: self.deal.id, complete: { deal, error in
if let error = error {
// process error
} else if let deal = deal {
switch deal.dealStateId {
case DealStateIdPayoutProcessing:
// выплата в процессе
case DealStateIdPayoutProcessError:
// Возникла ошибка во время выплаты. Например карта исполнителя заблокирована
case DealStateIdCompleted:
// выплптп прошла успешно
default:
break
}
}
})
Если Заказчик не удовлетворен работой, то он может отменить оплату:
P2PCore.deals.cancel(dealId: self.deal.id, complete: { deal, error in
if let error = error {
// process error
} else if let deal = deal {
// Process canelation
}
})
Получить список выплат исполнителю можно двумя способами:
Способ 1 (Используя готовое решение из P2PUI):
let vc = PayoutsViewController(dealId: nil)
navigationController?.pushViewController(vc, animated: true)
Где dealId
можно получить выплату по конкретной сделке.
Способ 2 (Построить свой View Controller):
P2PCore.payouts.payouts(pageNumber: pageNumber, itemsPerPage: itemsPerPage, dealId: dealId) { result, error in
// result: [Payout]? - Массив с объектами выплат
// error: NSError? - nil в случае успешного запроса
}
Получить список возвратов заказчику можно двумя способами:
Способ 1 (Используя готовое решение из P2PUI):
let vc = RefundsViewController(dealId: nil)
navigationController?.pushViewController(vc, animated: true)
Где dealId
можно получить выплату по конкретной сделке.
Способ 2 (Построить свой View Controller):
P2PCore.refunds.refunds(pageNumber: pageNumber, itemsPerPage: itemsPerPage, dealId: dealId) { result, error in
// result: [Payout]? - Массив с объектами выплат
// error: NSError? - nil в случае успешного запроса
}
В P2PCore
имеется возможность массово завершить сделки.
P2PCore.dealsManager.complete(dealIds: [String], paymentToolId: String) { result, error in
// result: [Deal]? - Массив с объектами сделок
// error: NSError? - nil в случае успешного запроса
}
Полный сценарий работы сервиса Вы можете посмотреть в проекте. Таргет P2PExample
.