QuickPay SDK
QuickPay SDK 封装了 QuickPay API 并提供了添加原生支付功能的必要功能和便利性。
安装
您可以通过直接从我们的 GitHub 代码库下载或使用 CocoaPods 来安装 QuickPay SDK。如果您想使用 CocoaPods,您可以复制以下示例 Podfile。
platform :ios, '11.0'
target '<YOUR_PROJECT_NAME>' do
use_frameworks!
pod 'QuickPaySDK'
end
Swift 版本
QuickPaySDK 版本 1.1.2 Swift 5.2
QuickPaySDK 版本 1.1.0 和 1.1.1 使用 Swift 5.1 构建
QuickPaySDK 版本 < 1.1.0 使用 Swift 5.0 构建
Fat 库
SDK 以一个胖库的形式构建,这意味着它包含模拟器和设备架构的符号。这样做是为了您可以在相同二进制模式下同时在两个平台上进行开发,而无需动用构建路径或交换二进制文件。不幸的是,苹果要求您在提交应用之前删除所有模拟器相关符号。最简单的方法是添加一个额外的构建步骤,删除未使用的架构。如果您还没有执行此操作的脚本,您可以复制下面提供的脚本。选择您的构建目标,进入构建阶段
并添加一个新的运行脚本阶段。将下面的代码复制并粘贴到您的脚本中即可。
echo "Target architectures: $ARCHS"
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
FRAMEWORK_TMP_PATH="$FRAMEWORK_EXECUTABLE_PATH-tmp"
# remove simulator's archs if location is not simulator's directory
case "${TARGET_BUILD_DIR}" in
*"iphonesimulator")
echo "No need to remove archs"
;;
*)
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "i386") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "i386" "$FRAMEWORK_EXECUTABLE_PATH"
echo "i386 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
if $(lipo "$FRAMEWORK_EXECUTABLE_PATH" -verify_arch "x86_64") ; then
lipo -output "$FRAMEWORK_TMP_PATH" -remove "x86_64" "$FRAMEWORK_EXECUTABLE_PATH"
echo "x86_64 architecture removed"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_TMP_PATH" "$FRAMEWORK_EXECUTABLE_PATH"
fi
;;
esac
echo "Completed for executable $FRAMEWORK_EXECUTABLE_PATH"
echo $(lipo -info "$FRAMEWORK_EXECUTABLE_PATH")
done
API密钥和权限
为了使SDK能够与QuickPay通信,您需要一个API密钥。您可以通过登录QuickPay帐户并导航到设置 -> 用户来创建一个。您与SDK一起使用的API密钥需要额外的权限才能与Apple Pay一起工作。选择API密钥所属的用户,并添加以下权限。
GET /acquirers/clearhaus
用法
本指南将引导您完成将QuickPay SDK集成到您的代码中的步骤,并展示如何使用SDK支持的不同的支付方式来进行基本支付。
初始化
在您的AppDelegate中,您需要使用API密钥初始化SDK。
QuickPay.initWith(apiKey: String)
当您将API密钥传递给SDK后,它会开始与QuickPay API通信,以确定针对给定API密钥可用的支付方式。您可以查看isInitializing
属性来询问SDK是否初始化完成。如果属性值为true,则意味着SDK目前正在与QuickPay API通信。如果您不想观察此属性,您可以在QuickPay类中附加一个InitializeDelegate
。这将通知您SDK开始初始化何时完成。
支付流程
要完成支付并授权,您需要遵循以下四个步骤
- 创建支付
- 创建支付会话
- 授权支付
- 检查支付状态以查看授权是否成功
所有支付都需要经过这四个步骤,但某些服务,如支付窗口,将在一个请求中处理多个这些步骤。
支付窗口
支付窗口是让支付变得最容易和最快的方式,目前这还是唯一一个您可以通过QuickPay SDK接受信用卡支付的方式。支付窗口会为您处理支付流程中的第二步和第三步,所以操作顺序如下。
- 创建支付
- 生成支付URL并显示支付窗口
- 检查支付状态
要创建支付,您首先需要指定一些参数,这些参数被封装在QPCreatePaymentParameters
类中。之后,您将这些参数传递给QPCreatePaymentRequest
构造函数。最后,您需要将该请求发送给QuickPay,这是通过请求本身的sendRequest
函数完成的,该函数需要一个成功和失败的处理器。
let params = QPCreatePaymentParameters(currency: "DKK", order_id: "SomeOrderId")
let request = QPCreatePaymentRequest(parameters: params)
request.sendRequest(success: { (payment) in
// Handle the payment
}, failure: { (data, response, error) in
// Handle the failure
})
如果成功,则在成功处理器中将获得一个QPPayment
。下一步是生成一个支付URL,这是您将用于显示基于Web的支付窗口所必需的。此请求所需参数被封装在QPCreatePaymentLinkParameters
中,需要传递给QPCreatePaymentLinkRequest
构造函数。这些参数需要一个支付ID和需要授权的金额。发送请求并等待响应。
let linkParams = QPCreatePaymentLinkParameters(id: payment.id, amount: 100)
let linkRequest = QPCreatePaymentLinkRequest(parameters: linkParams)
linkRequest.sendRequest(success: { (paymentLink) in
// Handle the paymentLink
}, failure: { (data, response, error) in
// Handle the failure
})
最后一步是使用QPPaymentLink
打开支付窗口,这里有两种选择。您可以使用内置的便利机制来显示支付窗口并处理交互和响应,或者您可以自己处理并完全控制支付窗口的呈现方式。
如果您想使用便利机制,您必须将支付URL传递给QuickPay类。使用Presentation枚举,您可以指定是要推送还是展示支付窗口。
QuickPay.openPaymentLink(paymentUrl: paymentLink.url, onCancel: {
// Handle if the user cancels
}, onResponse: { (success) in
// Handle success/failure
}, presentation: .present(controller: self, animated: true, completion: nil))
如果成功为true,则支付已被处理,但我们尚不知道支付是否已授权。为了做到这一点,我们需要检查支付的状态,这可以通过QPGetPaymentRequest
来完成。
QPGetPaymentRequest(id: payment.id).sendRequest(success: { (payment) in
if payment.accepted {
// The payment has been authorized 👍
}
}, failure: { (data, response, error) in
// Handle the failure
})
如果您想要对支付窗口有更多控制并想自己处理导航,您可以创建一个QPPaymentWindowController
并将支付URL传递给初始化器。接下来,您设置一个QPPaymentWindowControllerDelegate
到支付窗口控制器上,现在您就能完全控制如何呈现支付视图。通过委托,您还可以创建一个自定义的加载视图,在支付窗口被加载和渲染时会显示该视图。
Apple Pay
为了利用Apple Pay,首先需要在项目中进行一些初始设置并生成签名证书。完成这些操作后,您还需要实现一些代码来处理原生的Apple Pay流程。
注意:为了使用Apple Pay,您需要与Clearhaus签订协议。
证书
为了使Apple加密支付,您需要一个由Apple创建的证书并将其上传到您的QuickPay账户。
获取证书签名请求(CSR)
登录您的QuickPay账户,转到设置 -> 收单机构 -> Clearhaus。在这里,您需要启用Apple Pay并点击“创建证书”。选择ApplePay作为类型并输入简短的描述。选择您新生成的密钥,点击“创建CSR”,填写表格并点击“创建”。您将下载CSR (.pem文件),需要将其带到您的Apple开发者账户。不要关闭此窗口,因为您稍后还需要用它。
商户ID和证书
登录您的Apple开发者账户,转到“证书、标识符和配置文件”。选择“商户ID”,生成新的商户ID。现在编辑您的商户ID并选择“创建证书”。按照指南上传QuickPay的CSR。这将为您生成证书。下载证书并回到QuickPay窗口上传证书。
将商家ID添加到您的应用
现在打开XCode并转到您的目标功能。启用Apple Pay并选择您刚刚创建的商家ID。在此指南的后期,您将需要您的商家ID标识符,因此请记住它或将其写下。
Apple Pay的支付流程
您已经创建了一个商家ID和证书,现在可以添加必要的代码了。由于大多数所需的代码都由苹果和PassKit支配,因此这里将仅涵盖QuickPay特定的代码。您可以在互联网上找到大量有关如何在代码中实现Apple Pay的资源和指南。我们推荐这篇指南,但几乎任何指南都适用。您也可以查看QuickPay示例应用以了解其实施方式。
当您的ViewController符合PKPaymentAuthorizationViewControllerDelegate
协议时,我们需要查看两个函数来编写QuickPay特定的代码。
第一个函数是苹果需要QuickPay授权支付的地方。
func paymentAuthorizationViewController(_ controller: PKPaymentAuthorizationViewController, didAuthorizePayment payment: PKPayment, handler completion: @escaping (PKPaymentAuthorizationResult) -> Void)
我们要通过在QuickPay创建一个支付订单就像使用其他支付方式一样来实现这一点。然后我们需要用包含存储在由苹果提供的PKPayment中的支付令牌的卡片来授权它。当我们从QuickPay收到响应时,我们需要告诉PassKit授权已完成并是否成功。
let authParams = QPAuthorizePaymentParams(id: qpPayment.id, amount: 100)
authParams.card = QPCard(applePayToken: pkPayment.token)
let authRequest = QPAuthorizePaymentRequest(parameters: authParams)
authRequest.sendRequest(success: { (qpPayment) in
completion(PKPaymentAuthorizationResult.init(status: .success, errors: nil))
}, failure: { (data, response, error) in
completion(PKPaymentAuthorizationResult.init(status: .failure, errors: nil))
})
最后要处理的函数是告诉我们支付流程已完成的一个函数。这将无论支付是成功还是失败都会被调用。这是我们验证支付是否成功授权的地方。
func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController)
支付UI
如果您不想花太多时间制作自己的支付选择UI,SDK附带了一个您可以使用的UI组件。支付视图将自动确定通过QuickPay API可用的支付选项,并将检查用户的手机上哪些支付应用可用。此支付视图在示例应用中使用。
支付组件名为PaymentView
,可在QuickPaySDK
模块中找到。
与Storyboard一起使用
要将PaymentView附加到Storyboard,请拖入一个UIView并转到身份检查器。将类更改为PaymentView并将模块更改为QuickPaySDK。将PaymentView作为出口添加到您的UIViewController中,以便我们在代码中进行一些额外的设置。
如果您正在使用布局约束,请注意PaymentView覆盖了intrinsicContentSize函数,从而计算它自己的高度。这意味着不需要将高度约束添加到PaymentView中,但如果XCode会显示警告。因此,请添加任何高度约束并设置优先级为低(<250)。
到目前为止,PaymentComponent已准备好使用,但您不知道用户何时或是否选择了支付方式。在这里,PaymentViewDelegate发挥作用。PaymentViewDelegate有两个函数。首先,当用户选择支付方式时会进行通知,其次,它用于确定支付方式单元格中显示的文本。在代码中,您可以通过遵守PaymentViewDelegate并将其附加到PaymentView来实现此操作。
extension ShopViewController: PaymentViewDelegate {
func titleForPaymentMethod(_ paymentView: PaymentView, paymentMethod: PaymentView.PaymentMethod) -> String {
// If you want to use the default English titles, the PaymentMethod enum as a default title.
return paymentMethod.defaultTitle()
}
func didSelectPaymentMethod(_ paymentView: PaymentView, paymentMethod: PaymentView.PaymentMethod) {
// The user has selected a payment method.
// This is useful if you want to change a payment button from disabled to enabled or show some additional information
// about the selected payment method.
}
}
初始化
在显示PaymentView之前,QuickPay SDK需要完成其初始化阶段。
样式
支付组件使用的单元格具有一些基本的颜色样式属性,以便您可以根据自己的主题进行定制。可选的选项标记为IBInspectable并且在Storyboard中可直接访问。您也可以通过您的代码来更改它们。
以下是可用的属性
- cellBackgroundColorSelected
- cellBackgroundColorUnselected
- cellBorderColorSelected
- cellBorderColorUnselected