iOS集成说明
1.下载SDK包, 并解压,文件目录如下:
.
|____S4P_SDK // SDK目录
| |____ScanForPaySDK.framework // ScanForPay Framework
| |____Channels // 依赖的支付宝SDK
|____ScanForPay_Demo // Demo工程
2.将SDK目录拖入工程里
3.添加依赖,Target --> Build Phases --> Link Binary With Libraries
4.如果App需要访问http地址,需要在Info.plist
添加如下代码,或者根据需求添加 NSExceptionDomains:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
5.添加URL Scheme,在Target --> Info --> URL Types里面添加自己的URL Scheme
6.调用接口,发起支付
1)先在要调用的文件里引用头文件:
#import <ScanForPaySDK/ScanForPayTask.h>
2)发起支付,需要调用ScanForPayTask里的pay
方法,该方法接受支付请求串,需要服务端进行签名或者组装。其格式可见iOS接口说明
在没有安装支付宝或者调起支付宝失败时,将进入wap支付,支付完成或取消后,结果会在pay
方法的回调里返回。
正常拉起支付宝App支付时,回调会进入App的OpenUrl
回调。
// 先获取ScanForPayTask的实例,ScanForPayTask为单例模式
ScanForPayTask* task = [ScanForPayTask shareInstance];
// 组建订单信息,签名等信息一定要放到服务端做,这里只是做为示例,不可以在客户端生成签名。
// 请求的格式可以见API说明文档,或者参考Demo里的代码
NSString *request = [self buildRequest:@"Alipay"
orderTitle:@"test"
price:0.01f];
// 调用支付接口,拉起支付
[task pay:request // 请求串
appScheme:@"scanforpaySdkDemo" // app注册的URL Scheme, 从钱包返回app时使用
callback:^(NSDictionary *dictResult){
// NOTE: 该回调只有当支付宝未安装或无法调起时,调用了wap方式时才会进入。
// 拿到结果后需要判断是否正确, 1成功,其他为失败
NSLog(@"reslut test= %@",dictResult);
if([dictResult[@"code"] intValue] == 1 && [dictResult[@"data"] [@"status"] intValue] == 1){
// NOTE: 请求成功,且支付状态为成功时, 应该将params里的参数给app服务端校验签名,然后才认为成功,并进行成功的处理
NSLog(@"pay success, params =%@", dictResult[@"data"][@"params"]);
// 去服务端校验签名
// 校验成功,进行成功展示
} else{
if([dictResult[@"code"] intValue] < 0){
// 支付渠道返回的错误都转为了负数,通常为用户取消支付等,可以不进行处理
}else{
// 失败的展示,可以根据情况进行展示。
}
}
}];
3)在AppDelegate.h
中注册openURL
回调, 并调用ScanForPayTask里的handleOpenURL
来取得订单信息,用于给服务端进行交易的交易和订单的更新。
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
// 将支付宝返回的结果url发送给ScanForPay,ScanForPay处理后会将相关的订单信息及结果返回给商户
return [[ScanForPayTask shareInstance] handleOpenURL:url callback:^(NSDictionary *dictResult){
// NOTE: 拿到结果后,需要把订单内容发给APP的服务端,校验签名或者查询结果以确认支付结果
NSLog(@"reslut test= %@",dictResult);
if([dictResult[@"code"] intValue] == 1 && [dictResult[@"data"] [@"status"] intValue] == 1){
// NOTE: 请求成功,且支付状态为成功时, 应该将params里的参数给app服务端校验签名,然后才认为成功,并进行成功的处理
NSLog(@"pay success, params =%@", dictResult[@"data"][@"params"]);
// 去服务端校验签名
// 校验成功,进行成功展示
} else{
if([dictResult[@"code"] intValue] < 0){
// 支付渠道返回的错误都转为了负数,通常为用户取消支付等,可以不进行处理
}else{
// 失败的展示,可以根据情况进行展示。
}
NSLog(@"pay failed, code =%@, msg=%@", dictResult[@"code"], dictResult[@"msg"]);
}
}];
}