支付协议
1.1 协议名
BBASMPaymentAdapterProtocol
1.2 功能说明
小程序开源的支付实现是必选,开源 Demo 实现方案是使用百度糯米 SDK 。百度糯米 SDK 包含聚合收银台支付、百度钱包(度小满)直连、支付宝直连。
- 小程序为开发者提供了支付宝、微信(H5 页面)、百度钱包三个平台的直连支付 API ;同时,还提供了一个聚合收银台的 API 供开发者使用。
- 宿主 App 需要自行接入各支付平台的 SDK ,并实现相关的支付能力。
- 微信直连支付目前使用的是 H5 支付流程,整个流程完全在 SDK 内部已实现,不需要宿主 App 做额外的工作。
- 微信聚合支付需要 Info.plist 的 CFBundleURLSchemes 中增加 xxx.baidu.com(宿主可自定义,必须以 “.baidu.com” 结尾)。
1.3 接口列表
1.3.1 支付宝(度小满)直连
直连协议
支持支付宝、度小满直连支付。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| /** * @brief 直连支付 * * @param type 支付方式 * @param orderInfo 订单信息 * @param completion 完成回调 */ + (void)requestPaymentWithType:(BBASMPaymentType)type orderInfo:(NSString *)orderInfo completion:(void (^)(BBASMPaymentStatus status, NSDictionary *result))completion; ``` **payID 协议** 直连支付完成后,宿主 server 生成一个唯一的 payID ,用来配合 push ,进行支付结果的推送,如果宿主不需要 push 支付结果,可以不实现。
``` /** * @brief 生成一个唯一的payID * * @param appID 小程序 or 小游戏 ID * @param completionBlock 完成回调 * @return 宿主app是否实现此接口,默认没有实现返回NO;实现此接口请宿主方手动返回YES */ + (BOOL)requestPayIDWithAppID:(NSString *)appID completion:(void (^)(NSString *payID))completionBlock;
|
1.3.2 聚合收银台支付
聚合支付接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| /** * @brief 糯米聚合收银台 * * @discussion 调起聚合收银台,小程序可以配置收银台的支付渠道。 * @param params 调起参数,包含订单信息、宿主信息以及场景值等。宿主app不需要做额外处理,直接透传给收银台API即可 * @param bannedChannels 收银台需要屏蔽的渠道列表,宿主app不需要做额外处理,直接透传给收银台API即可 * @param completionBlock 支付回调,其中payResult需要宿主app通过kBDNCashierWalletPayResultPayDescsKey取出后直接透传给小程序框架 */ + (void)requestBainuoPolymerPaymentWithParams:(NSDictionary *)params bannedChannels:(NSArray *)bannedChannels completion:(void (^)(BBASMPaymentStatus status, NSString *payResult))completionBlock; /// 是否聚合收银台禁止微信支付,默认NO,显示微信支付 + (BOOL)isPolymerBannedWeChatPaymemt;
|
聚合收银台是聚合了度小满支付、支付宝支付、微信支付的能力,需要分别引入 SDK ,实现聚合支付能力。聚合支付涉及到的库:
- 聚合收银台 SDK:从开源工程 SwanLibs/Pay/BainuoCashierSDK.framework 拷贝;
- 度小满支付 SDK(BaiduWallet_Portal.framework:v8.2.105.1):度小满官网下载地址;
- 支付宝支付 SDK(AlipaySDK.framework:v15.4.1):支付宝官网下载地址;
- 微信支付 SDK(libWeChatSDK.a:v1.8.6.1):微信官网下载地址。
增加支付 SDK 依赖的系统库
增加支付宝 SDK 需要引入系统库:libc++.tbd、libz.tbd、SystemConfiguration.framework、CoreTelephony.framework、CoreMotion.framework、CoreText.framework、CFNetwork.framework、CoreGraphics.framework ;
增加度小满 SDK 需要引入系统库:AudioToolbox.framework、AVFoundation.framework、AddressBookUI.framework、AddressBook.framework、MobileCoreServices.framework 。
增加支付 SDK 依赖的资源
BainuoCashierSDK.bundle、BaiduWallet_Portal.bundle、AlipaySDK.bundle 。
需要实现聚合收银台协议:BDNCashierSDKBaifubaoDelegate ,参考 demo 中的 BBASMBainuoPayManagerDelegate 实现。
需要实现度小满协议:BDWalletSDKMainManagerDelegate ,参考 demo 中的 BBASMWalletPaymentDelegate 实现。
在宿主的 appDelegate 中增加对支付宝回调处理:
(1) 支付宝回调处理:
1 2 3 4 5 6 7 8 9 10 11 12
| - (BOOL)application:(UIApplication *)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { ... if ([url.host isEqualToString:@"safepay"]) { // 支付跳转支付宝钱包进行支付,处理支付结果 BOOL result = [BDNCashierSDK handleOpenURL:url]; return result; } return YES; }
|
(2)微信回调处理:
- 在 info.plist 中的 URL Types ,添加回流的 URL Schemes:xxx.baidu.com(必须以 “.baidu.com” 结尾);
- 在聚合收银台支付请求时传入参数(参考 BBASMPaymentHelper):
dealReq.schemeForWechatH5Pay = @"xxx.baidu.com";。
1.4 示例
参考:BBASMPaymentImplement 。
1.5 备注
- 目前聚合收银台支付中只对开源宿主提供度小满和支付宝支付的能力,但是微信支付 SDK 也需要集成到工程中;
- 度小满支付依赖百度账号,所以在进行度小满支付的时候,可能会产生两次登录行为;一次是在调起聚合收银台支付进行的联盟账号登录,一次是进行度小满支付的时候进行的百度账号登录。