首先看支付宝的官方文档:https://docs.open.alipay.com/204/105295/,了解大概,接下来开始我们的集成工作。楼主简单总结一下,完成集成我们需要了解以下四步:
1.支付宝开放平台创建应用,签约移动支付功能
2.接入支付前的准备工作(附准备工作中遇到难题的解决方法
3.配置官方Demo 附BUG解决方法
4.集成项目,具体代码编写
废话不多说,直接开始讲解!
一、支付宝开放平台创建应用,在这之前先做好准备工作:申请公司的支付宝帐号。等公司的支付宝帐号申请完成,就可以登录支付宝去创建应用啦~,下面截图为各位简单描述:
打开蚂蚁金服开放平台,找到支付接入,创建自己app的应用,注意app命名规范
1. 应用创建过程中,主要是创建应用公钥配置那块可能有人搞不清楚,其实很简单,(生成密钥文档:https://docs.open.alipay.com/291/105971/),通过RSA工具生成一对应用公私钥,然后将应用公钥上传到接口加签方式那儿,它会给我们返回一个支付宝的公钥,这个公钥就是日后我们测试支付代码中所需的,将应用公私钥和支付宝公钥保存好。
这样设置完成后直接提交审核,等半天左右,支付宝会告知审核通过。
通过后进行支付功能的签约,具体步骤 https://b.alipay.com/newIndex.htm;
2.当第一步准备工作全部完成后,开始集成支付宝的SDK,具体步骤可参考:https://docs.open.alipay.com/204/105295/
(1)在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
(2)在需要调用AlipaySDK的文件中,增加头文件引用。
import AlipaySDK/AlipaySDK.h
3.你可以将支付宝SDK中的这些文件拖入到一个文件夹,然后一起拖入项目,避免出现错误!
注意:在拖入这两个静态库时,有时会出现UTDID冲突,解决办法:https://docs.open.alipay.com/54/104509,进入此页面重新下载解决过冲突的SDK。
拖入后会出现一些问题,
1)"Unknown type name ‘NSString‘ "或"Unknown type name ‘NSData‘ "
这是因为缺少Foundation类库和UIKit类库,支付宝Demo中之所以没有出现此错误,是因为在.pch文件中导入过这些类库
解决办法:只需要在出现错误的文件中导入这些类库即可
2)‘openssl/asn1.h‘ file not found
这是openssl文件夹头文件链接问题,如果openssl文件夹随意拉进项目中,即使添加头文件链接,也可能解决不了此问题,这也是一开始就将所需要的文件放到一个新建文件夹中再添加到项目中的原因。
解决办法:
Targets->Build Settings->Header Search Path中添加AliPaySDK文件夹的路径
编译成功后,别忘记:在Info里面设置Url Scheme,记住这个scheme,测试要用。
4.最后可以集成代码啦~~
在AppDelegate.m中,写入
- (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);
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
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);
}];
// 授权跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = nil;
if (result.length>0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
break;
}
}
}
NSLog(@"授权结果 authCode = %@", authCode?:@"");
}];
}
return YES;
}
如果你的项目后台配置未完成,你可以自己拿着申请的APPID,支付宝返回的私钥,还有在info里配置的URL_Scheme来干活了。Demo如下:
如果你们的后台动作敏捷,已经将接口写好,你就很轻松得直接拉起支付宝啦,点支付时,写上
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
NSString *resultNum = resultDic[@"resultStatus"];
}];
最后结果中按支付宝给的结果代码区分!
如果你想查看测试获得的结果对不对,可以用以下简单方法对其拆分:
// NOTE: 调用支付结果开始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:@"YiNuanTong" callback:^(NSDictionary *resultDic) {
NSLog(@"支付页面reslut = %@",resultDic);
// 提取支付结果字符串
NSDictionary *returnDic = [self stringToJson:resultDic[@"result"]];
NSDictionary *dataDic = returnDic[@"alipay_trade_app_pay_response"];
NSLog(@"支付码:%@",dataDic[@"code"]);
NSLog(@"支付结果:%@",dataDic[@"msg"]);
NSLog(@"支付appid:%@",dataDic[@"app_id"]);
NSLog(@"支付授权auth_app_id:%@",dataDic[@"auth_app_id"]);
NSLog(@"支付时间:%@",dataDic[@"timestamp"]);
NSLog(@"支付费用:%@",dataDic[@"total_amount"]);
NSLog(@"支付交易码trade_no:%@",dataDic[@"trade_no"]);
NSLog(@"支付编号:%@",dataDic[@"out_trade_no"]);
NSLog(@"支付seller_id:%@",dataDic[@"seller_id"]);
}];
- (NSDictionary *)stringToJson:(NSString *)str
{
NSString *requestTmp = [NSString stringWithString: str];
NSData *resData = [[NSData alloc] initWithData:[requestTmp dataUsingEncoding:NSUTF8StringEncoding]];
NSDictionary *resultDic = [NSJSONSerialization JSONObjectWithData:resData options:NSJSONReadingMutableLeaves error:nil];
return resultDic;
}
自己总结的一点小知识点,希望各位看官能点个赞哦,小女子感激不尽~~~