这次是一个新项目,集成支付宝和微信支付,客户端集成其实非常简单,主要参数和配置都是可以在后台完成。不过还是碰到了一些问题,所以在这里做一次记录吧。支付宝的官方文档在 开放平台文档中心 这里。
1、首先使用cocopods导入支付宝的sdk库。如下:
pod 'AlipaySDK-iOS'
2、在需要调用 AlipaySDK 的文件中,增加头文件引用。
import <AlipaySDK/AlipaySDK.h>
3、组装请求信息
这一步应在商户服务端完成,商户服务端直接将组装和签名后的请求串 orderString 传给客户端,客户端直接传给 SDK 发起请求。支付宝官方文档和 Demo 是为了示例效果在客户端实现。
4、配置返回 url 处理方法-支付结果回调
在AppDelegate.m中,引入头文件
import <AlipaySDK/AlipaySDK.h>
在 @implementation AppDelegate 中将以下代码中的 NSLog 改为实际业务处理代码:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付时,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
注意:以上方法在AppDelegate中,只能实现一次,不可以在AppDelegate分类中重复实现以上回调方法,笔者就曾在一个AppDelegate(um)分类中已经实现过这个方法,导致这里不走这个回调,而走了分类里面的回调。
5、唤起支付宝支付
在唤起支付宝之前,还要在“URL Types”选项中,点击“+”,在“URL Schemes”中输入“你的app标识”。在后面payOrder:orderString fromScheme:@"tcyclingapp" callback:^(NSDictionary *resultDic) {}]方法中,fromscheme里面输入“你的app标识”字符串。
配置好以后,就可以去请求服务端接口,服务端会返回一个拼接好的字符串,然后实现以下方法
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
说明:orderString 为服务端返回的一串字符串,appScheme为你在URL Schemes中输入的标识字符串。
注意:(重点)经官方确认,实现这个方法唤起支付宝钱包app支付的时候,是不会走callback这个回调的,会走AppDelegate里面实现的回调方法。只有在调起h5网页支付的时候,才会走callback这个回调方法。这也是我踩的坑之一。
6、回调结果处理举例
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication*)app openURL:(NSURL*)url options:(NSDictionary *)options
{
if ([url.host isEqualToString:@"safepay"]) { //支付宝支付的回调
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
QDLog(@"支付结果 = %@",resultDic);
NSIntegerresCode = [resultDic[@"resultStatus"]integerValue];
if(resCode ==9000) {//支付成功
//发送支付成功的通知
[[NSNotificationCenter defaultCenter] postNotificationName:NoticePaySuccess object:nil];
}elseif(resCode ==6001){//用户中途取消
//发送支付取消的通知
[[NSNotificationCenter defaultCenter] postNotificationName:NoticePayCancel object:nil];
}else{
[[NSNotificationCenter defaultCenter] postNotificationName:NoticePayFailure object:nil];
}
}];
}
return YES;
}
TIPS:因为之前已经集成了友盟分享,在集成支付宝支付时,提示了utdid冲突的错误,原因可能是友盟和支付宝两个库里面有重复的文件,查找了一下资料,把友盟的pod ‘UMCSecurityPlugins’ 安全组件这个库移除掉,就可以解决这个冲突了。
至此,支付宝支付的集成就完成了。
网友评论