正在寻找直击内心的话……
背景介绍
正在开发一个类大众点评的应用,涉及到支付宝支付。虽说不是第一次做支付,但之前遇到的问题现在还是遇到了。所以想记录一下,不对或不合理的地方大家多多指正,共同进步。
资源
请点击一下连接获取资源:
1.蚂蚁金服开放平台App开发文档【包括支付宝Logo和相关素材】
3.【App支付架构】
4.【支付场景描述】
5.【退款流程】
创建应用
假设你已经登录支付宝开放平台,并与支付宝签约
1.创建应用的入口:
(1)【登陆后的网站首页】-【右上角的管理中心】-【开发者中心】
入口展示:
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接入支付的大量工作都在创建应用时配置环境以及后台了,移动端做的工作并不多。