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接入支付的大量工作都在创建应用时配置环境以及后台了,移动端做的工作并不多。
- App接入支付宝
- 支付宝-APP支付接入
- app 支付宝支付接入
- android app 接入支付宝
- app接入支付宝流程
- app接入支付宝接口
- 支付宝的app支付接入
- iOS App接入支付宝SDK
- App接入支付宝开发流程
- Android app 第三方支付宝支付接入
- app接入支付宝后,支付成功后,回调不响应
- APP怎样接入支付宝或微信支付?
- APP 接入 微信支付和支付宝
- Android:微信和支付宝的APP支付接入
- App Store支持微信支付,去年接入支付宝
- APP怎样接入支付宝或微信支付
- APP接入微信支付
- 微信支付商户-APP支付接入
- apk分析工具(aapt.exe)
- Flume使用大全之kafka source-kafka channel-hdfs(SSL加密)
- 弹窗的移动
- 微信小程序的学习过程-1
- C#基础知识点记录
- App接入支付宝
- 遗传算法解决背包问题
- HMTL中用图片当按钮
- js String对象
- 关于单点登录【SSO】的初步理解
- 应用升级:应用未安装
- 利用do{}while();循环语句实现人机猜数字游戏
- 细说cinder.conf那些事儿
- 【阿里、腾讯、头条】等12家企业【C++方向】30场面试经验