支付宝集成
导入
导入没什么好说的,按照官方的步骤一步步来就行了。
私钥和公钥
RSA的具体内容就不讲了,自己搜搜就有。
但是要知道的是RSA加密有一个公钥一个私钥,用公钥可以验证是否是私钥加密过的内容,防止数据传输过程中劫持修改内容。
支付宝这边需要的是你给他一个公钥,和私钥一样是在你的本机生成。然后把公钥填到支付宝,支付宝也会给你一个公钥,用于验证支付完成后支付宝回调的数据是否正确。
私钥和公钥生成
生成比较简单就把官方文档的搬过来了,下面的选一个就行了。要注意的是填到支付宝里面的时候不要有空格换行。PHP需要的是.pem的文件,但是IOS这边模拟生成订单只需要把里面的字符串取出来用就行了。
Linux用户(以Ubuntu为例)
$ openssl 进入OpenSSL程序
OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥
OpenSSL> exit ## 退出OpenSSL程序
Windows用户在cmd窗口中进行以下操作:
C:\Users\Hammer>cd C:\OpenSSL-Win32\bin 进入OpenSSL安装目录
C:\OpenSSL-Win32\bin>openssl.exe 进入OpenSSL程序
OpenSSL> genrsa -out rsa_private_key.pem 1024 生成私钥
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt Java开发者需要将私钥转换成PKCS8格式
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 生成公钥
OpenSSL> exit ## 退出OpenSSL程序
需要准备的
首先要到支付宝查到下面的值
NSString *partner = @"2088开头的16为数字";
NSString *seller = @"账号ID,应该是邮箱";
NSString *privateKey = @"本机生成的私钥";
NSString *publicKey = @"支付宝给的公钥";
开始支付
-(void)createOrder{
Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = [self generateTradeNO];
order.productName = product.subject;
order.productDescription = product.body;
order.amount = @"0.01";
order.notifyURL = @"http://www.xxx.com";
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
NSString *appScheme = @"dsc";
NSString *orderSpec = [order description];
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) {
NSLog(@"reslut = %@",resultDic);
NSString *str = resultDic[@"result"];
NSArray *arr = [str componentsSeparatedByString:@"&sign_type=\"RSA\"&sign=\""];
NSString *information = [arr firstObject];
NSString *temp = [arr lastObject];
temp = [temp componentsSeparatedByString:@"\""].firstObject;
id<DataVerifier> publicSinger = CreateRSADataVerifier(publicKey);
BOOL ret = [publicSinger verifyString:information withSign:temp];
if(ret){
NSLog(@"验证成功");
if([resultDic[@"resultStatus"] isEqualToString:@"9000"]){
NSLog(@"支付成功");
}
}
}];
}
}
一些优化
和后台对接完成后,我创建了一个支付管理单例。得到后台返回签名后的字符串,调用这个方法就行了
-(void)aliPayWithDataPay:(NSString *)dataPay andScheme:(NSString *)scheme andSuc:(aliSuc)aliSuc andErr:(aliErr)aliErr{
if([dataPay isKindOfClass:[NSDictionary class]]){
[SVProgressHUD showErrorWithStatus:@"订单创建失败!"];
return;
}
[[AlipaySDK defaultService] payOrder:dataPay fromScheme:scheme callback:^(NSDictionary *resultDic) {
if([resultDic[@"resultStatus"] isEqualToString:@"9000"]){
if(aliSuc){
aliSuc();
}
}else{
[SVProgressHUD showErrorWithStatus:@"支付失败!"];
if(aliErr){
aliErr();
}
}
}];
}