iOS SDK 接入指南

目前 Ping++ 的 iOS SDK 支持的渠道包含:支付宝 App 支付(alipay)、跨境支付宝 App 支付(cb_alipay)、微信 App 支付(wx)、银联手机控件支付(upacp)、招行一网通(cmb_wallet)、QQ 钱包支付(qpay)、Apple Pay(applepay_upacp)、百度钱包(bfb_wap)、易宝支付(yeepay_wap)、京东支付(jdpay_wap)、建行 App 支付(ccb_pay)。具体可参考API文档

注:

  • 【Ping++ 对象】包含: ChargeOrderRecharge
  • 当仅使用名称包含 _wap 的渠道时,均需要使用 webview 加载,并且不需要导入第三方渠道的 SDK 库包,只需导入 Ping++ SDK 即可。
  • 当前版本不需要额外添加微信的 SDK,可以正常调用微信支付。

版本要求

iOS SDK 要求 iOS 10.0 及以上版本。

接入方法

使用 CocoaPods

  1. Podfile 添加:
pod 'Pingpp', '~> 2.2.25'

默认会包含支付宝、微信、银联,你也可以自己选择渠道。

Alipay(支付宝移动支付)
CBAlipay(支付宝移动支付 - 境外支付)
AlipayNoUTDID(支付宝移动支付,独立 UTDID.framework)
Wx(微信 App 支付)
QQWallet(QQ钱包 App 支付)
UnionPay(银联手机支付)
ApplePay
CmbWallet(招行一网通)
BfbWap(百度钱包 Wap 支付)
Yeepay(易宝支付 Wap 支付)
Jdpay(京东支付 Wap 支付)
CcbPay(建设银行 App 支付)
Agreement(代扣签约)

例如:

pod 'Pingpp/Alipay', '~> 2.2.25'
pod 'Pingpp/UnionPay', '~> 2.2.25'
  1. 运行 pod install
  2. 使用 .xcworkspace 打开项目,而不是 .xcodeproj
  3. 添加 URL Schemes:在 Xcode 中,选择你的工程设置项,选中 TARGETS 一栏,在 Info 标签栏的 URL Types 添加 URL Schemes,如果使用微信(或微信 + 其他渠道),填入微信平台上注册的应用程序 id(为 wx 开头的字符串)。如果不使用微信,则可以自定义,建议起名稍复杂一些,尽量避免与其他程序冲突。允许英文字母和数字,首字母必须是英文字母,不允许特殊字符。

手动导入

  1. 下载 iOS SDK 到本地,里面包含 lib 和 example 两个目录。example 目录下的是示例项目,你需要将 lib 目录下的文件添加到你的项目。

  2. 依赖 Frameworks:

    • 必需:
    CFNetwork.framework
    SystemConfiguration.framework
    Security.framework
    QuartzCore.framework
    CoreTelephony.framework
    libc++.tbd
    libz.tbd
    libsqlite3.0.tbd
    CoreMotion.framework
    CoreLocation.framework
    • Apple Pay 所需:
    PassKit.framework
  3. 如果不需要某些渠道,删除 lib/Channels 下的相应目录即可。

  4. 添加 URL Schemes:在 Xcode 中,选择你的工程设置项,选中 TARGETS 一栏,在 Info 标签栏的 URL Types 添加 URL Schemes,如果使用微信(或微信 + 其他渠道),填入微信平台上注册的应用程序 id(为 wx 开头的字符串)。如果不使用微信,则可以自定义,建议起名稍复杂一些,尽量避免与其他程序冲突。允许英文字母和数字,首字母必须是英文字母,不允许特殊字符。

  5. 添加 Other Linker Flags:在 Build Settings 搜索 Other Linker Flags ,添加 -ObjC

开始接入

你的 APP 内的渠道选择页面和支付完成页面(布局、样式等)由你自行实现,你仅需要将支付凭证传给 Ping++ Client SDK,由 Ping++ Client SDK 完成唤起支付页面的功能。

#import <Pingpp.h>

客户端从服务器端拿到 Ping++ 对象 后,调用下面的方法:

//data 表示 Charge/Order/Recharge 的 JSON 字符串
[Pingpp createPayment:data
viewController:viewController
appURLScheme:kUrlScheme
withCompletion:^(NSString *result, PingppError *error) {
if ([result isEqualToString:@"success"]) {
// 支付成功
} else {
// 支付失败或取消
NSLog(@"Error: code=%lu msg=%@", error.code, [error getMsg]);
}
}];

接收并处理交易结果

渠道为支付宝但未安装支付宝钱包时,交易结果会在调起插件时的 Completion 中返回。渠道为微信、支付宝(安装了支付宝钱包)、银联或者测试模式时,请实现 UIApplicationDelegate- application:openURL:xxxx: 方法:

- (BOOL)application:(UIApplication *)app
openURL:(NSURL *)url
options:(NSDictionary *)options {
BOOL canHandleURL = [Pingpp handleOpenURL:url withCompletion:nil];
return canHandleURL;
}

注意事项

  1. 2.1.0 及以上版本,可打开 Debug 模式打印出 log ,方便调试。开启方法:[Pingpp setDebugMode:YES];

  2. 2.2.8 及以上版本,可选择是否在 WAP 渠道中支付完成后,点击「返回商户」按钮,直接关闭支付页面。开启方法:[Pingpp ignoreResultUrl: YES]

  3. 使用微信支付必须要求用户安装微信客户端

  4. CmbWallet(招行一网通)需要把 招行一网通 提供的秘钥 CMBPublicKey 添加到 Info.plist ,如以下代码(如果是混淆加密的则不需要):

    <key>CMBPublicKey</key>
    <string>IwxiAyJIT4tlwJSCbRRE0jZFTvYjt02/CrlutsMzd5O4B9PaVyUmIKSasdasdasdhWTyp3Bb9T7c9ujiUJOJ8y7893grwEae9yiOBoBmByVsCMTaxnc+lMr7A9ifk48Tz61WxsxnQTyYzrIVbuerQIUi3PSORwcPMRqi+XLX8qPXkNpLT9dMvjOasdasdasdUaAdPFc2YFHwl9dHf2ydQsxh1BHvaVO0OO+GtZ04ZKjxRyJW2HfghKLJijl;XTjrWSNizcdoefFKQsTdzvcPNvx7PsxuXKo9SosheeS/SHPk9sGNdwvL55yEBA8gNs0XZbkxJYjuwrwsQInC/N6QSaI0f0kyTA==
    </string>
  5. CmbWallet(招行一网通) 手动导入 : 需要把 lib/Channels/CmbWallet 目录下的 SecreteKeyBoard 文件夹手动添加到工程中的 Assets.xcassets,添加成功后即可删除。如果是混淆加密的方式直接删除即可

  6. CmbWallet(招行一网通) pod 安装 : 需要把 Pods/Pingpp/CmbWallet 目录下的 SecreteKeyBoard 文件夹手动添加到工程中的 Assets.xcassets,添加成功后即可删除。如果是混淆加密的方式直接删除即可

  7. 招商银行 App 支付不需要依赖 CmbWallet 模块,已经包含在 Pingpp/Core 里面。需要用到 URL Schemes,创建 Charge 时,在 extra[result_url] 字段传入 <SCHEME>://pingppcmbwallet,其中 <SCHEME> 是你自定义的 URL Schemes。注:判断设备上是否已经安装招商银行方法:[Pingpp isCmbWalletInstalled]

  8. 如果不使用 Apple Pay,请不要导入 Apple Pay 的静态库。以免提交到 App Store 时审核不通过。如使用 Apple Pay,请在 iOS 工程中的 capabilities 选项里开启 Apple Pay ,且在测试时请注意以下几点:

  • 8.1 测试时必须是真机进行测试
  • 8.2 检查相关的证书是否正确
  • 8.3 手机必须是 iPhone 6 以上 ,并且系统 iOS 9 以上
  • 8.4 支付时必须绑定了真实的银行卡且有充足的余额
  1. 使用阿里百川等阿里系的 SDK 时,可能会出现与支付宝渠道发生冲突的情况,请尝试使用 pod 'Pingpp/AlipayNoUTDID' 代替 pod 'Pingpp/Alipay'。因为 CocoaPods 的限制,只有编译通过的才能上传成功,所以使用时,需要删除项目中已经存在的 UTDID.framework
  2. 请勿直接使用客户端支付结果作为最终判定订单状态的依据。 支付状态以服务端为准! 在收到客户端同步返回结果时,请向自己的服务端发起请求来查询订单状态
  3. 使用 CcbPay 请先确保用户手机安装了建设银行 APP。判断设备上是否已经安装建设银行 APP 的方法:[Pingpp isCcbAppInstalled]。并且,需要在 Info.plistNSAppTransportSecurity 字段添加相应的 NSExceptionDomains
<key>NSExceptionDomains</key>
<dict>
<key>ibsbjstar.ccb.com.cn</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>

额外配置

  1. 如果需要使用支付宝、微信、银联等跳转至渠道 app 的渠道,需要在 Info.plist 里添加如下代码:

    <key>LSApplicationQueriesSchemes</key>
    <array>
    <string>weixin</string>
    <string>wechat</string>
    <string>alipay</string>
    <string>alipays</string>
    <string>mqq</string>
    <string>uppaysdk</string>
    <string>uppaywallet</string>
    <string>uppayx1</string>
    <string>uppayx2</string>
    <string>uppayx3</string>
    <string>cmbmobilebank</string>
    <string>mbspay</string>
    </array>

    请注意: 若安装了银联云闪付 app,那么使用upacp渠道时会直接调起云闪付,反之则默认使用网页版的银联支付。

  2. 如果 App 需要访问 http://, 则需要在 Info.plist 添加如下代码,或者根据需求添加 NSExceptionDomains:

    <key>NSAppTransportSecurity</key>
    <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    </dict>
  3. 如果编译失败,遇到错误信息为:

XXXXXXX does not contain bitcode.
You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE),
obtain an updated library from the vendor,
or disable bitcode for this target.

请到 Xcode 项目的 Build Settings 标签页搜索 bitcode,将 Enable Bitcode 设置为 NO