iOS支付三部曲之集成支付宝支付

支付宝支付

一. 开发前的准备

  • 创建应用>申请开通APP支付>签约>审核,等待时间大概一天左右。
  • 秘钥:不过一般用不到(支付时后台会返回),如果要试支付宝的demo可以找后台或者产品要。

二. 支付宝支付流程

  • 安装支付宝支付流程

    1. 用户在商家App中选择商品下单、确认购买,进入支付环节,选择支付宝,用户点击确认支付;
    2. 进入到支付宝页面,调起支付宝支付,出现确认支付界面;
    3. 用户确认收款方和金额,点击立即支付后出现输入密码界面;
    4. 输入正确密码后,支付宝端显示支付结果;
    5. 自动回跳到商家App中,商家根据付款结果个性化展示订单处理结果。
  • 用户未安装支付宝支付流程

    1. 用户在商家App中选择商品下单、确认购买,进入支付环节,选择支付宝,用户点击确认支付;
    2. 用户未安装支付宝客户端,则调起支付宝网页支付收银台,用户登录支付宝账户;
    3. 登录成功后,进入确认付款页面;
    4. 用户点击确认付款,进入支付密码页面;
    5. 用户输入密码,完成支付,展示支付结果。
  • 系统交互流程:

系统交互流程

三. App支付iOS集成流程

1. 导入支付宝SDK:
  • 通过CocoaPods导入,在工程的Podfile里面添加以下代码:
1
pod 'AlipaySDK-iOS'

保存并执行 pod install

  • 手动导入SDK

支付宝SDK下载地址 新版本
下载完成后,把下面的文件拷贝到项目文件夹下,导入到项目中,并添加依赖库。

1
2
AlipaySDK.bundle
AlipaySDK.framework

选择你的工程设置项,选中“TARGETS”一栏,在“Build Phases”标签栏的“Link Binary With Libraries“添加以下依赖库:
依赖库

关于设置URL Types在上篇文章微信支付有写传送门
到此,项目集成SDK完成下面进入代码环节。

2. 代码

代码仅供参考 有所删减

  • 在调用支付宝之前需要创建订单创建订单成功后后台会把调用支付宝的参数返回,如密码APPID等,目前新版是,拿到后台的返回数据后只需全部给支付宝就OK,同时还需要把Scheme传给支付宝。
  • 注意点:支付宝的调用接口有一个支付回调,只有网页支付才会触发,APP走appdelegate。
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
//点击支付调的方法其中有微信支付
- (void)cd_paymentMeetingTicketsWithPaymentType:(CDPayFeePayStyle)paymentType
paymentState:(CDPaymentState)paymentState
buyType:(CDPaymentType)buyType
view:(UIView *)view
parameters:(NSDictionary *)parameters
successBlock:(void(^)(NSDictionary * resultStatusDic,BOOL flage))successBlock{
WS(weakSelf);//这个方法是创建订单 返回调用SDK所需参数
[CdPaymentHttpRequest cd_payInfoWithPayState:paymentState paymentType:paymentType buyType:buyType view:nil parameter:parameters success:^(NSString *payOrderStr) {
if (paymentType == CDPayFeePayStyleAlibaba) {//支付宝支付 拿到参数调用支付API
[[AlipaySDK defaultService]payOrder:payOrderStr fromScheme:ZWYJY_SCHEME callback:^(NSDictionary *resultDic) {
//注意这个回调是在没有装支付宝APP使用的网页支付才会走的回调,通过APP支付会走appdelegate
successBlock(resultDic,YES);
}];
}else{//微信支付
if ([payOrderStr isKindOfClass:[NSString class]]) {
NSData *data = [payOrderStr mj_JSONData];
NSDictionary *weChatDic = [data mj_JSONObject];
if (weChatDic != nil) {
////调起微信支付
PayReq *weChatReq = [[PayReq alloc]init];
weChatReq.openID = weChatDic[@"appid"];
weChatReq.partnerId = weChatDic[@"partnerid"];
weChatReq.prepayId = weChatDic[@"prepayid"];
weChatReq.nonceStr = weChatDic[@"noncestr"];
weChatReq.timeStamp = [weChatDic[@"timestamp"] integerValue];
weChatReq.package = weChatDic[@"package"];
weChatReq.sign = weChatDic[@"sign"];
[WXApi sendReq:weChatReq];
successBlock(@{},YES);
}else{
[[CdPaymentCenter sharedCdPaymentCenter].hud hide:YES];
[MBProgressHUD showMessage:@"服务器返回错误"];
}

}
}else{
successBlock(@{},NO);
}

} errBlock:^(NSString *errMsg) {

}];


}
  • 支付回调 使用支付宝APP才会走的回调
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
return [WXApi handleOpenURL:url delegate:[CdWeChatAPIManager sharedCdWeChatAPIManager]];
}

// 配置系统回调接口
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
BOOL result = [UMSocialSnsService handleOpenURL:url];

if (result == FALSE) {
//调用其他SDK,例如支付宝SDK等
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {//这个方法是支付宝支付结果回调
[kNotificationCenter postNotificationName:kAlibabaPaymentStatus object:resultDic];//发起通知处理支付结果
}];
return YES;
}

return [WXApi handleOpenURL:url delegate:[CdWeChatAPIManager sharedCdWeChatAPIManager]];

}

return result;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
BOOL result = [UMSocialSnsService handleOpenURL:url];
if (result == false) {
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
[kNotificationCenter postNotificationName:kAlibabaPaymentStatus object:resultDic];//发起通知处理支付结果
}];
return YES;
}
return [WXApi handleOpenURL:url delegate:[CdWeChatAPIManager sharedCdWeChatAPIManager]];
}
return result;
}
  • 支付宝resultStatus结果码含义
返回码 含义
9000 订单支付成功
8000 正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
4000 订单支付失败
5000 重复请求
6001 用户中途取消
6002 网络连接出错
6004 支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态
其它 其它支付错误

关于处理支付结果根据需求来写,这里就不写了。

-------------本文结束感谢您的阅读-------------

本文标题:iOS支付三部曲之集成支付宝支付

文章作者:leon

发布时间:2018年11月14日 - 15:11

最后更新:2019年04月25日 - 16:04

原始链接:https://huanghaipo.github.io/2018/11/14/iOS支付三部曲之集成支付宝支付/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!