P2PUI 0.3.5

P2PUI 0.3.5

Vitaliy Kuzmenko 维护。



P2PUI 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 服务时获得的 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/CVVRETURN_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

依赖关系