iOS 移动支付之种类
iOS 端的移动支付,大概包括:支付宝支付、微信支付、银联卡支付、paypal支付,现在又多出一个Apple pay支付;
如何集成这些种类的支付方式
谈及如何集成这些支付方式,面对各种支付方式的SDK以及Demo写的详细的完美无缺,我还真不如还如何去写,这里我就接地气的写写,写的不好请勿喷哦☺!
支付宝支付
大致有以下步骤:
1.向支付宝申请, 与支付宝签约,获得商户PID(partner)和账号ID(seller)和私钥(privateKey)
注:*这一步,一般公司会搞定的,这里只是让你知道来龙去脉☺
没有支付宝账号的同学,可以点击这里注册账号;
已经有支付宝账号的同学点击这里申请移动支付
申请签约有个门槛比较难,就是不管你是个人还是企业,都需要营业执照,这点有点蛋疼,不过人家也是为了有质量的管理申请者嘛,可以理解,我这里没有营业执照,申请工作就死在了摇篮里,不过大致流程,我基本弄清楚了,不过作为开发者,这申请工作就不用多关心了,一般公司都会有申请过的,我这里写出来也就是让我们开发者也大概知道流程,而不是直接就是用,只知去向,不知来龙。
申请签约成功后,就可以查看 PID(partner)和账号ID(seller)和私钥(privateKey) ,查看地址点击这里 进行登录,点击下图中的查询PID和Key;
但是这里查询到的Key 是公钥,不是私钥,你到底该怎么弄私钥呢?同学们,不用急,支付宝文档写的还是比较清楚的,点击这里可以查看RSA私钥及公钥生成
这里文档给出了两种平台下的生产方式,我们既然是iOS 开发者,那就选择Linux用户生产的方式吧,可以直接在Mac的终端敲这些命令;
敲过这些命令后,会在本地生产两个文件,分别是私钥和公钥文件
在命令行敲入(以行为单位)
$cd ~/
$open . //打开文件的存放位置
想要查看文件内容,还需要使用命令
$cat rsa_private_key.pem //会在终端显示文件中的内容,这就是私钥
到这里,第一步基本上就可以了,具体还需要自己动手试试,不然还是会一头雾水。
2.下载支付宝SDK以及Demo
这一步,没啥好说的,给个地址就行SDK以及Demo下载地址
3.集成SDK到工程中(生成订单信息,签名加密)
支付宝官方集成文档
集成支付宝SDK的步骤,这里是官方给出的集成文档, 按照步骤集成总是会出错,这不是我们脑子不行,而是官方毕竟是官方。
查看支付宝给出的Demo,会发现这些文件必须要加到项目中:
其中小方框中的为必须加入,而除了小方框以外的,那就要看你们后台人员是否将签名成功字符串格式化的订单字符串,给你传到前端来,如果没有,那就必须你自己在前端处理; 按理说,这些应该由后台来处理,为了订单信息的安全,以及前端业务的轻运行,都该有后端来处理(注:这点不懂,不要紧,后面还会根据代码在进行讲解;
集成中可能遇到的错误
1)Cannot find interface declaration for ‘NSObject’
解决方案:a. 可以在报错的文件中加入
#import <Foundation/Foundation.h>
b. 可以建个pch文件加入
` #ifdef __OBJC__ #import UIKit/UIKit.h #import Foundation/Foundation.h #endif `
2)提示找不到 openssl/asn1.h 文件
解决方案:Build Settings –> Search Paths –> Header Search paths:$(PROJECT_DIR)/ASPayDemo/Alipay
3)_CNCopyCurrentNetworkInfo,referenced from:
解决方案:添加SystemConfiguration.framework
部署代码
NSString *partner = @""; //PID NSString *seller = @""; //收款账户,手机号或者邮箱 NSString*privateKey= @"";// 私钥 if ([partner length] == 0 || [seller length] == 0 || [privateKey length] == 0) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"缺少partner或者seller或者私钥。" delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil]; [alert show]; return; } Order *order = [[Order alloc] init]; order.partner = partner; order.seller = seller; order.tradeNO = @"20160324012412412"; //订单ID(由商家自行制定) order.productName = @"iOS 高级教程"; //商品标题 order.productDescription = @"这是一本关于iOS的一本高级教程书"; //商品描述 order.amount = @"0.1"; //商品价格 order.notifyURL = @"http://www.devashen.com/Notify/Alipay/"; //回调URL order.service = @"mobile.securitypay.pay"; order.paymentType = @"1"; order.inputCharset = @"utf-8"; order.itBPay = @"30m"; order.showUrl = @"m.alipay.com"; NSString *appScheme = @"alisdkdemo"; //将商品信息拼接成字符串 该方法支付宝已经封好 NSString *orderSpec = [order description]; //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode id 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) { if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) { //9000为支付成功 } }]; }
看代码,如果后台将签名成功字符串格式化的订单字符串,给你传到前端来,那我们就只需要做很少的工作就可以了,只需要直接处理订单字符串即可:
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) { //9000为支付成功 } }];
最后,千万别忘了,在Appdelegate中,处理支付宝客户端返回url处理方法, 少了这一步,支付宝SDK的回调方法是不会执行的:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { //跳转支付宝钱包进行支付,处理支付结果 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; return YES; }
到这里,支付宝支付基本上完成, 迫不及待的你,赶紧去试验试验吧, 别忘了给你们相关负责人要对应的PID、收款账号、以及私钥,当然如果后台直接传给你订单字符串的话,你可以直接给后台要接口了,置于PID什么的你就不用管了。