今天看到好朋友的支付功能梳理,自己也想写一个学习学习。好了,我们话不多说,赶紧来一起学习吧。
支付宝开发平台文档给你们,你们可以按照支付宝的文档来开发。
首先看一下流程图
我们需要做的事情就是图中“商户客户端”要做的事情:
- 生成订单(可以在客户端生成、也可以在服务器端生成)
- 调用支付宝支付接口
- 处理支付宝返回的支付结果
在调用支付宝支付接口之前,我们需要去生成一个订单。在图中,生成订单放在客户端来做了,但是也可以放在服务器端生成这个订单。放在服务器生成会比较好一些,比较安全也比较方便你掌握所有订单。
这些步骤对于业务来说,已经可以了,但是还存在一个安全性的问题,就是支付结果被截获修改,所以,就需要在生成订单和处理支付结果的时候做一个安全性校验:
生成订单时对数据签名,收到支付结果时对数据进行签名验证,以检验数据是否被篡改过。
支付宝目前只支持采用RSA加密方式做签名验证。就是生成一个公钥和一个私钥。私钥用来对传输数据加密,公钥用来对接收的数据校验。如果一致,数据就没有篡改。
私钥公钥一定是要对应的生成私钥的方法
生成公钥私钥方法
RSA密钥生成命令
1. 进入终端,输入“openssl”
2. 生成RSA私钥openssl>genrsa -out rsa_private_key.pem 1024
3. 生成RSA公钥openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
4. 将RSA私钥转换成PKCS8格式openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
注意:“>”符号后面的才是需要输入的命令。
得到公钥私钥之后,在你的支付宝账户合作伙伴密钥里填写公钥(私钥放在项目中或者是服务器端)
开始集成支付宝
1、 下载支付宝的SDK包,导入SDK包并且在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖。
2、下载官方demo,将下图文件导入项目中
2、 在需要调用AlipaySDK的文件中,增加头文件引用。
#import <AlipaySDK/AlipaySDK.h>
#import "Order.h"
#import "DataSigner.h"
#import "APAuthV2Info.h"
3、 配置请求信息
//需要填写商户app申请
NSString *partner = @"";//签约的支付宝账号唯一ID
NSString *seller = @"";//卖家支付宝账号
NSString *privateKey =@"";//私钥
//配置请求信息
Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = [self generateTradeNO]; //订单ID(由商家?自?行制定)
order.productName = product.subject; //商品标题
order.productDescription = product.body; //商品描述
order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商
品价格
order.notifyURL = @"http://www.test.com"; //回调URL
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @"alisdkdemo";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
//【callback处理支付结果】
NSLog(@"reslut = %@",resultDic);
}];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
5、处理返回结果
- (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) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
NSLog(@"result = %@",resultDic);
}];
}
if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
好了,接下来小伙伴去试试吧。如果有不足之处还请多多指教。