P2PCore 0.3.5

P2PCore 0.3.5

Vitaliy Kuzmenko 维护。



P2PCore 0.3.5

  • 作者:
  • Vitaliy

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_IDPLATFORM_SIGNATURE_KEY 的值将在您注册 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)”结算方式,则执行者提交执行订单申请时,必须添加(选择)一个付款账户,用于执行完成后接收款项。

添加(选择)付款方式有两种方法

方法 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(推送)和模式(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。在这种情况下,客户在支付页面上不会被要求输入 CVC/CVVRETURN_URL - 结束支付后将被重定向的 URL。

步骤 5(检查支付)

在交易支付后,您可以使用以下代码了解支付状态

P2PCore.deals.status(dealId: self.deal.id) { deal, error 
	switch deal.dealStateId {
	case DealStateIdPaymentProcessing:
	    // В процессе оплаты. Тут необходимо проверить статус еще раз через некоторое время
	case DealStateIdPaymentProcessError:
	    // Возникает в случае ошики оплаты. Например недостаточно средств на карте заказчика
	case DealStateIdPaid:
	    // Средства успешно зарезевированы
	default:
		break
	}
}

状态定义在 enum: String 中,以支持 Objective-C。

步骤 6(完成交易)

执行者完成后,他需要转账并完成交易。

可以使用以下代码完成交易

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

依赖项