支付在很多主流的APP中都会用到,最常见的支付是支付宝、微信、银联等。
刚好公司项目都需要用到,目前只调试好了支付宝,之前想抽时间写,总是拖拖拉拉的,索性在后台写微信支付的时候狠下心来把支付宝SDK集成以及支付实现记录下来,后续会陆续放上微信,银联等支付文章,不足之处希望各位看官谅解,小子会加以改正。
注意:支付宝开发文档多看几遍!!!
一起看一下支付宝支付流程图,这样方便大家理解每一步后台做了什么,移动端需要怎么进行配合:
1.首先在支付宝平台创建应用,获取appid,appid是16位数字,在项目中需要用到(之后开通支付功能)。open.alipay.com
2.获取appid之后,下载官方调试Demo,https://docs.open.alipay.com/54/104509
之后会看到分别有iOS和Android代码,打开如下:
a.分别将下图中的1,2放到自己的工程当中
b.添加一下需要的依赖库,支付宝文档中可查到https://docs.open.alipay.com/204/105295/
c.工程中在Info下找到Url Types,添加支付宝的Url Schemes,支付的时候需要使用
然后运行demo,基本不会报错,报错的话,查一下文档,会有解决办法
支付宝SDK集成完成了,那么下面就是支付流程,也就是demo了:
这里的图片是以上下载的支付宝支付调试Demo,支付方法里面的demo可以根据自己需要进行更改,
这里贴上我在项目中使用的demo:
这里需要后台给一个接口,获取订单的总额,外部订单号,通知url,body,subject以便支付的时候进行更换
自己项目中还需要更换的就是之前获取的APPID,私钥AliPrivate,AliScheme,
1 NSURL * myURL_APP_A = [NSURL URLWithString:@"alipay:"]; 2 if (![[UIApplication sharedApplication] canOpenURL:myURL_APP_A]) { 3 //如果没有安装支付宝客户端那么需要安装 4 [MBProgressHUD showMBPAlertView:@"您还没有安装支付宝" withSecond:2.0]; 5 return; 6 } 7 NSDictionary *dic = @{ 8 @"orderNo":orderModel.orderNo 9 }; 10 [[SG_HttpsTool sharedSG_HttpsTool] postWithURL:SHAlipayRequestUrl params:dic success:^(id JSON, int code, NSString *msg) { 11 12 if (code == 0) { 13 14 SH_PayAlipayModel *aliModel = [SH_PayAlipayModel mj_objectWithKeyValues:JSON[@"alipaymentOrder"]]; 15 //私钥是后台分发的 16 NSString *rsa2PrivateKey = AliPrivateKey; 17 NSString *rsaPrivateKey = @""; 18 //AppIDhe PrivateKey没有配置的提示 19 if ([AlipayAppId length] == 0 || [AliPrivateKey length] == 0) { 20 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"缺少appid或者私钥" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; 21 [alert show]; 22 return; 23 } 24 25 26 /** 27 * 生成订单信息 28 * 将商品信息赋予AliPayOrder的成员变量 29 */ 30 Order *order = [[Order alloc] init]; 31 //appid---》之前获得的APPID 32 order.app_id = AlipayAppId; 33 //支付接口名称 34 order.method = @"alipay.trade.app.pay"; 35 //参数编码格式 36 order.charset = @"utf-8"; 37 //当前时间点 38 NSDateFormatter *formatter = [NSDateFormatter new]; 39 [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 40 order.timestamp = [formatter stringFromDate:[NSDate date]]; 41 42 //支付版本 43 order.version = @"1.0"; 44 order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA"; 45 order.notify_url = aliModel.notifyUrl; 46 47 order.biz_content = [BizContent new]; 48 order.biz_content.body = aliModel.Description; 49 //支付宝支付页面的订单信息 50 order.biz_content.subject = aliModel.title; 51 //订单id----》后台返回的 52 order.biz_content.out_trade_no = aliModel.outTradeNo; 53 //超时时间 54 order.biz_content.timeout_express = @"30s"; 55 //价格---》后台返回 56 order.biz_content.total_amount = aliModel.totalAmount; 57 58 order.biz_content.product_code = @"QUICK_MSECURITY_PAY"; 59 60 /** 61 * 将商品信息拼接成字符串 62 */ 63 NSString *orderInfo = [order orderInfoEncoded:NO]; 64 NSString *orderInfoEncoded = [order orderInfoEncoded:YES]; 65 //SHLog(@"orderSpec = %@", orderInfo) 66 67 //获取私钥并将商户信息签名,外部商户的加签过程务必放在服务端,防止公钥数据泄露 68 //需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode 69 NSString *signedString = nil; 70 APRSASigner* signer = [[APRSASigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)]; 71 if ((rsa2PrivateKey.length > 1)) { 72 signedString = [signer signString:orderInfo withRSA2:YES]; 73 } else { 74 signedString = [signer signString:orderInfo withRSA2:NO]; 75 } 76 SHLog(@"%@", signedString) 77 //如果加签成功,则继续执行支付 78 if (signedString != nil) { 79 //应用注册scheme,在info.plist定义URL types 80 //将签名成功字符串格式化为订单字符串,请严格按照该格式 81 NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderInfoEncoded, signedString]; 82 //调用支付结果开始支付, AliAppScheme-->之前设置的Url Schemes 83 84 [[AlipaySDK defaultService] payOrder:orderString fromScheme:AliAppScheme callback:^(NSDictionary *resultDic) { 85 int resultStatus = [resultDic[@"resultStatus"] intValue]; 86 SHLog(@"%d", resultStatus) 87 if (resultStatus == 9000) { 88 89 } 90 }]; 91 92 } 93 94 } 95 } failure:^(NSError *error) { 96 97 }];
以上步骤完成之后,那么就可以调起支付宝进行支付了
下面开始支付宝支付结果之后的操作:
根据支付结果,进行通知处理,然后进行自己业务上的实现
原文地址:https://www.cnblogs.com/zhoutf/p/9272913.html