Wallet One P2P
通过 Cocoapods 安装
CocoaPods 是用于 Cocoa 项目的框架/依赖项管理器。您可以通过以下命令来安装它:
$ gem install cocoapods
要使用 Cocoapods 将 P2P Core 集成到您的 Xcode 项目中,请在您的 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
使用
以自由职业平台为例。
步骤 1(模块配置)
在 AppDelegate 文件中,将配置添加到 application:didFinishLaunchingWithOptions
方法中
P2PCore.setPlatform(id: "PLATFORM_ID", signatureKey: "PLATFORM_SIGNATURE_KEY")
PLATFORM_ID
和 PLATFORM_SIGNATURE_KEY
的值是在注册 P2P Wallet One 服务时获得的 P2P Wallet One。
步骤 2(配置用户)
用户在应用程序中登录后,需要将他的信息记录到配置中。
如果用户是客户
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
- 您系统中用户的电话号码。
步骤 3(选择执行者的卡片)
如果客户在创建订单时选择了“安全交易(P2P Wallet One)”的结算方式,那么当执行者提交执行订单的申请时,他需要添加(选择)一张在执行后会收到支付的卡片。
有2种方式来添加(选择)支付手段
方法 1(使用P2PUI的现成解决方案)
let vc = PaymentToolsViewController(owner: .benificiary)
vc.delegate = self // PaymentToolsViewControllerDelegate
以模态形式显示,在新 UINavigationController
(模态)
let nc = UINavigationController(rootViewController: vc)
self.present(nc, animated: true)
在当前 UINavigationController
(推送)中显示
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
记录在执行者的任务申请中。执行者支付手段的标识符在客户接受申请时将被需要。
步骤 4(交易支付 - HOLD)
当客户选择了最佳的执行者报价后,需要在 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
。
第二种方式(构建自己的 View Controller 并添加卡片列表)
获取客户的付款方式列表
P2PCore.payersPaymentTools.paymentTools { paymentTools, error in
// paymentTools: [PaymentTool]? - Массив объектов [PaymentTool]. Будет nil в случае ошибки запроса
// error: NSError - Будет nil в случае успешного запроса.
}
如果客户之前没有绑定的付款方式,则需要使用 UIWebView 支付。
以下是如何获取付款请求请求的代码
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
。