pwCustomizationPlugin 2.2.0

pwCustomizationPlugin 2.2.0

测试已测试
Lang语言 Obj-CObjective C
许可证 Apache 2
发布上次发布2017年9月

Kyle Vu维护。



  • 作者
  • tien.vu

简介

你是否想通过仅编写几行代码就接受来自不同国家和不同支付系统的移动用户的支付?Paymentwall SDK是一个全球移动支付网关,可以接受来自200多个国家以及100多个替代支付方式的支付。我们现在提供了iOS SDK,它将成为你应用的本地部分,它消除了支付时打开网页的需求。步骤更少,效率更高,你的转化率无疑会得到提升!你所要做的就是将库导入你的项目中,并配置它以开始接受应用内支付。这很简单!在此,我们将引导你完成整个流程。

它是如何工作的?

  1. 将框架添加到你的项目中。根据不同的区域,我们提供了相应的外部支付系统框架文件。你可以添加任意多个。你也可以启用/禁用默认支付选项。通过将Paymentwall提供的支付系统框架和框架插件导入你的项目,你可以添加任何想要的支付选项
  2. 用户在你的应用内部请求购买。
  3. Paymentwall SDK使用3种核心支付选项(Brick, MINT, Mobiamo)以及“本地支付”选项初始化支付屏幕。
  4. 用户在应用内使用Brick、Mint、Mobiamo进行支付时,支付过程将完全本地化。在本地支付中,将根据用户的当前位置展示对应的本地支付方式的屏幕。在这里,用户可以选择他们偏爱的一种支付选项。

要求

XCode 8.0+, iOS 8.0+

凭证

SDK集成需要一个项目密钥。在你的商户账户的Paymentwall.com应用设置中获取这些Paymentwall API凭证。

可用的本地支付选项插件

额外的插件

设置(Paymentwall核心SDK)

我们的SDK作为静态库或公开存储库提供。

作为静态库安装

  1. 下载SDK的最新版并将其解压。
  2. 转到Xcode项目的“通用”设置。将libPWCoreSDK.a和其他插件库拖到项目目录中的“链接框架和库”部分。确保选中“如果需要则复制项目”,然后点击完成。
  3. 在单元测试目标的“构建设置”中,将libPWCoreSDK.a的父路径添加到“库搜索路径”部分。
  4. 将捆绑包拖入项目中“复制捆绑资源”的“构建阶段”。
  5. 在项目的构建设置中的“其他链接器标志”中添加-ObjC
  6. 如果你使用Swift,创建一个新的Objective-C文件以创建新的bridging-header.h文件,然后将以下文件导入到头文件中,例如
#import <PWCoreSDK/PWCoreSDK.h> 

更新:如果安装任何插件时CoreSDK发生了更新,你应该还检查更新其余插件。

创建您的第一个支付

  1. 使用以下参数设置SDK,(步骤1-7)只需设置一次
PWCoreSDK.sharedInstance().setupPaymentwall(withProjectKey: "YOUR PUBLIC KEY", secretKey: "YOUR SECRET KEY", requestTimeout: 30)

可选:额外的设置可以在下面的“额外设置”部分找到

项目密钥:如果项目的密钥设置为nil,所有支付选项都会使用此项目密钥,您也可以指定它们自己的项目密钥

密钥:如果您在这里指定了它, PWLocal和本地支付选项插件将使用此密钥作为默认密钥

  1. 实现PWCoreSDKDelegate协议以处理支付响应
func paymentResponse(_ response: PWCoreSDKResponse?) {
    guard let response = response else { return }
    switch response.responseCode {
        case .SUCCESSFUL:
        case .FAILED:
        case .CANCEL:
        case .MERCHANT_PROCESSING:
        //Example when you use Brick and `useNativeFinishDialog == true` can be found below
    }

    switch response.paymentType {
        case .NONE:
        case .MINT:
        case .PWLOCAL:
        case .BRICK:
        case .MOBIAMO:
        case .OTHERS:
    }
}
  1. 添加Brick支付类型,Brick是Paymentwall在全球200多个国家的信用卡解决方案,请参考以下如何处理Brick支付流程,cardScannerPlugin作为插件分发,是可选的
PWCoreSDK.sharedInstance().addBrickPayment(withPublicKey: nil, useNativeFinishDialog: true, cardScannerPlugin: PWCardScannerPlugin.sharedInstance())
  1. 添加Mobiamo支付类型,Mobiamo是一个通过短信实现全球覆盖的移动运营商计费平台,使用noPrice来指定你是否想为每个国家使用默认的Mobiamo价格
PWCoreSDK.sharedInstance().addMobiamoPayment(withAppID: nil, noPrice: true)
  1. 添加Mint支付类型,MINT是Paymentwall的现金支付解决方案,旨在全球范围内通过MINT预付卡帮助变现您的数字商品和服务
PWCoreSDK.sharedInstance().addMintPayment(withAppID: nil)
  1. 添加PWLocal支付类型,type可以是VIRTUAL_CURRENCY / DIGITAL Goods_FLEXIBLE / DIGITAL Goods_DEFAULT / CART
PWCoreSDK.sharedInstance().addPWLocalPayment(with: .DIGITAL_GOODS_FLEXIBLE, secretKey: nil)
  1. 如果您想添加,可以添加其他本地支付选项插件,请参考以下实现本地支付选项部分。
PWCoreSDK.sharedInstance().addCustomPaymentOptions([alipay, unionpay, ...])

注意:这些支付选项将连同PWLocal一起放置在本地支付中。

  1. 使用PaymentObject类创建新的支付,并将其分配给CoreSDK
let payment = PaymentObject()
payment.name = choosenItem.name
payment.price = Double(choosenItem.price)!
payment.currency = "USD"
payment.image = choosenItem.image
payment.userID = "test_user"
payment.itemID = choosenItem.name+"id"
payment.signVersion = 3

let customSetting = ["widget":"pw",
                    "ag_type":"fixed"]
payment.pwLocalParams = customSetting

PWCoreSDK.sharedInstance().setPaymentObject(payment)

注意:pwLocalParams可以是字典或以下定义的任何类:CartDefaultWidgetDigitalGoodsDefaultWidgetDigitalGoodsFlexibleWidgetVirtualCurrency,参考它们的头文件以获取所需的属性或PWLocal文档。键和值如价格、金额、货币代码、货币、ag_name、ag_external_id、uid将被忽略,并使用你在PaymentObject中描述的值。

  1. 显示支付选项视图控制器
PWCoreSDK.showPaymentOptionsViewController(withParentViewcontroller: self, delegate: self, showCompletion: nil)

额外设置

  • SDK的默认UI是平面风格,如果想要使用游戏UI,请添加以下代码到你的代码:PWCoreSDK.sharedInstance().setUseGameUI(true)
  • 如果您想自定义平面UI以适应您的应用程序,您可以使用PWCustomizationPlugin并设置它,当设置SDK时。
  • 默认情况下(Brick除外),所有支付方式在支付完成后都会显示成功,如果您不想使用SDK的成功对话框,而是返回委托供您处理,请向您的代码中添加此代码:PWCoreSDK.sharedInstance().setUseNativeFinishDialogForAllMethods(false)

Brick支付流程

  1. 成功获取令牌后,response: PWCoreSDKResponse将包含与它一起的token: BrickToken
  2. 向您的服务器发送请求以处理令牌
  • 如果将 useNativeFinishDialog 设置为 false,则在获取令牌成功后,SDK 将会关闭,response.responseCode 也会是 .MERCHANT_PROCESSING,您需要自己处理成功/失败/3D安全,且存储卡片功能将不可用。

  • 如果将 useNativeFinishDialog 设置为 true,载入弹出窗口将持续显示,您在服务器上处理令牌后,发布一个 Notification 来使用 SDK 成功或失败对话框,SDK 也会再次调用代理以返回 .SUCCESS.FAILED

if response.paymentType == .BRICK {
    if let returnedToken = response.token {
        //Process the token with your server here asynchronous
        //When done:
        NotificationCenter.default.post(name: Notification.Name(BRICK_TOKEN_PROCESSED_FINISH), object: nil, userInfo: nil)
    }
}
  • 将通过 Dictionary 传递错误信息作为 ["error": errorMessage] 通过 userInfo,SDK 将自动显示失败对话框而不是成功对话框。

  • 如果发生3D安全,我们同样支持3D安全,通过 Dictionary 中的 ["secure": urlString] 通过 userInfo 传递URL,用户完成安全信息的输入后,SDK 将处理显示3D安全并将 SUCCESS/FAILED 返回给应用。

  • 如果您想为用户启用存储卡片功能,请通过 userInfo 将 Charge 对象传递给我们 SDK,Charge 对象的格式可在我们的 Brick 文档 中找到。

自定义 PWLocal 签名

如果您希望手动提供您的 PWLocal 签名

//Define all params in step 8., and extra custom settings, then get `stringToSign`:

let payment = PaymentObject()
payment.name = choosenItem.name
payment.price = Double(choosenItem.price)!
payment.currency = "USD"
payment.image = choosenItem.image
payment.userID = "test_user"
payment.itemID = choosenItem.name+"id"
payment.signVersion = 3
let customSetting = ["widget":"pw",
                    "ag_type":"fixed"]

let strToSign = PWCoreSDK.sharedInstance().getStringToSign(customSetting, paymentObject: payment)

//Calculate your sign and set it
customSetting["sign"] = sha256(text: "\(strToSign!)YOUR SECRET KEY")
payment.pwLocalParams = customSetting

实现本地支付选项

Paymentwall SDK 支持外部支付系统注入(这些都在我们定义的支付系统(PS)列表中)。每次您想添加一个新支付系统时,您必须将其本地 SDK 和我们的插件框架一起包含到项目中,我们的框架将处理创建所有必要的参数,然后您可以使用它们来显示本地支付 SDK。

  1. 使用 pod 'PW[Local payment method]Plugin' 通过 Cocoapods 添加插件,或手动将 PW[Local payment method]Plugin.a 及其头文件拖到您的项目中。
  2. 将库头文件导入到您的项目中,如果使用 Swift,则通过 bridging-headers.h
  3. 设置插件,每个插件的详细要求不同,可以在它们的头文件或下面的详细文档中找到。

注意:所有插件都支持您自己的签名字符串,如果您在 CoreSDK 和 PluginSDK 中均不指定密钥,请使用 plugin.getStringToSign() 获取签名字符串,然后将您的签名字符串添加到 plugin.signString