App接入支付宝

来源:互联网 发布:linux查看运行的服务 编辑:程序博客网 时间:2024/05/17 04:47

正在寻找直击内心的话……

背景介绍

正在开发一个类大众点评的应用,涉及到支付宝支付。虽说不是第一次做支付,但之前遇到的问题现在还是遇到了。所以想记录一下,不对或不合理的地方大家多多指正,共同进步。

资源

请点击一下连接获取资源:
1.蚂蚁金服开放平台App开发文档【包括支付宝Logo和相关素材】
2.App支付客户端SDK和Demo下载
3.【App支付架构】
这里写图片描述
4.【支付场景描述】
这里写图片描述
5.【退款流程】
这里写图片描述

创建应用

假设你已经登录支付宝开放平台,并与支付宝签约

1.创建应用的入口:
(1)【登陆后的网站首页】-【右上角的管理中心】-【开发者中心】
(2)开发文档-接入指引中有创建应用的链接
入口展示:
这里写图片描述
2.创建步骤:
(1)一般选择自用型,具体区别请看这里

(2)记得将APPID保存在你知道的一个地方,Demo测试要用。另外这里需填写的基础信息之后都是可以修改的。

这里的功能,根据需要跟支付宝签约使用。具体看这里
这里写图片描述
请一定要仔细阅读,点击【查看如何使用】后的内容。
这里写图片描述
【设置应用网关】
这里写图片描述
这里写图片描述
【授权回调地址由后台设置】
【设置应用公钥】
步骤和设置应用网关差不多,都是需要校验身份,然后继续操作。验证身份后,根据该文档操作即可
在此需要说明的是:(1)只需要设置一个应用公钥就可以了,当你将自己的公钥设置完后,支付宝会自动生成一个支付宝公钥与其对应。(2)设置公钥时,根据实际条件选择是否为JAVA,以及1024或2048(当然选择2048加密了)。

Demo运行

(1)我是使用真机测试,当你配置好下图的内容时就可以真机运行了。
这里写图片描述
(2)运行后,你会发现不管你点击首页的哪个按钮都会给你提示:缺少appId或者私钥或缺少pid或者appID或者私钥,你需要这样做:在工程内搜索缺少两个字,找到相应的位置,添加AppID,私钥,pid就好了。
AppID:在开发者中心找到你的应用即可看到AppID;
私钥:在你【设置应用公钥】的时候就会得到一个应用私钥,直接用就好,在Demo中你只用设置rsa2PrivateKey(支付宝建议)。
pid:【账户的管理中心】-【服务市场】
这里写图片描述
(3)我在配置完Pid,AppID,私钥后,依然报错:
* rsa_private read error : private key is NULL*
,后来经网上查找使用这个方式解决了错误:
1)在RSADataSigner.m文件中 搜索代码 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"];将其改成[result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];
2)在RSADataSigner.m文件中 搜索代码 [result appendString:@"\n-----END PRIVATE KEY-----"];将其改成[result appendString:@"\n-----END RSA PRIVATE KEY-----"];

实际开发

【集成SDK】:只可以手动集成。
请按照点击这里,认真按步骤操作
【业务逻辑】
用户提交订单后,待商家端确认即可进行支付。待支付的订单都展示在一个列表中。
【实现逻辑】
在待支付列表中点击“去支付按钮”,跳转选择支付方式的页面;
选择好支付方式后,将支付方式传递给后台,后台会返回订单字符串,我们根据订单字符串发起支付请求,唤起支付宝支付。
【代码实现】
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) {        }];        // 授权跳转支付宝钱包进行支付,处理支付结果        [[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) {        }];        // 授权跳转支付宝钱包进行支付,处理支付结果        [[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;}

ViewController.m中
网络请求成功后,获取到订单字符串后,唤起支付宝支付

 self.hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];    self.hud.mode = MBProgressHUDAnimationFade;    NSString *url = [NSString stringWithFormat:@"%@%@",Main_URL,Build_Url];    NSDictionary *par = @{@"apitoken":[UserDefaut objectForKey:BYD_APIToken],                          @"ord_type":self.ord_type,                          @"ord_id":self.orderID,                          @"pay_type":self.payStr};    [PPNetworkHelper POST:url parameters:par success:^(id responseObject) {        [self.hud removeFromSuperview];        if ([responseObject[@"code"] isEqual:@0]) {            [MBProgressHUD showMessage:responseObject[@"message"] ToView:self.view.window];        }else if([responseObject[@"code"] isEqual:@1]){            // NOTE: 调用支付结果开始支付            [[AlipaySDK defaultService] payOrder:responseObject[@"data"][@"order_string"] fromScheme:BYD_ScemeStr callback:^(NSDictionary *resultDic) {                if ([resultDic[@"resultStatus"] isEqualToString:@"9000"]) {                    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付结果" message:@"您已支付成功,再去逛逛吧!" preferredStyle:(UIAlertControllerStyleAlert)];                    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {                        [MBProgressHUD showMessage:@"跳转详情页" ToView:self.view];                    }];                    [alert addAction:action1];                    [self presentViewController:alert animated:YES completion:^{                    }];                }else if ([resultDic[@"resultStatus"] isEqualToString:@"8000"]){                    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付结果" message:@"您还未完成支付,请继续支付!" preferredStyle:(UIAlertControllerStyleAlert)];                    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {                        self.AlipayBtn.selected = NO;                    }];                    [alert addAction:action1];                    [self presentViewController:alert animated:YES completion:^{                    }];                }else{                    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"支付结果" message:@"很抱歉,您支付失败了!" preferredStyle:(UIAlertControllerStyleAlert)];                    UIAlertAction *action1 = [UIAlertAction actionWithTitle:@"确定" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction * _Nonnull action) {                        self.AlipayBtn.selected = NO;                    }];                    [alert addAction:action1];                    [self presentViewController:alert animated:YES completion:^{                    }];                }            }];        }else if([responseObject[@"code"] isEqual:@(-2)]){            [MBProgressHUD showMessage:responseObject[@"message"] ToView:self.view.window];        }    } failure:^(NSError *error) {        [self.hud removeFromSuperview];        [MBProgressHUD showMessage:Tip_URL ToView:self.view.window];    }];

【说明】
1.支付回调结果参数如下,请比对这些参数,来进行个性化提示:
点我带你去看参数
2.这是iOS调用说明,你可能会用到

总结

(1)其实用到第三方的东西,特别是有官方说明文档和Demo的这种,都不是难的,关键在于你需要认真阅读官方文档,按照步骤进行操作。
(2)App接入支付的大量工作都在创建应用时配置环境以及后台了,移动端做的工作并不多。