iOS 支付宝集成
来源:互联网 发布:sqlite 创建数据库 编辑:程序博客网 时间:2024/06/07 01:56
使用支付宝进行一个完整的支付功能大概需要以下几个步骤:
1.向支付宝申请,与支付宝签约,获得商户ID (partner) 和账号ID (seller)
2.下载相应的公钥私钥文件(加密签名使用)
3.下载支付宝的SDK
4.生成订单信息,签名加密
5.调用支付宝客户端,由支付宝客户端跟支付宝完全服务器打交道
6.支付完毕后,支付宝客户端会跳回到原来的应用程序
7.在原来的应用程序中显示支付结果给用户看
首先是下载SDK (https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash)
图中的商户客户端就是我们iOS 客户端需要做的事情:
*调用支付宝支付接口
*处理支付宝返回的支付结果
在调用支付宝支付接口前,我们还需要先生成一个订单,文档中描述时,是将这步放在客户端做了,但也可以在服务器端生成这个订单(图中支付宝会在支付成功后通知服务器端,所以在服务器端生成订单的话,可以掌握所有的订单,而且也会更加的安全):
*生成订单(可以在iOS 客户端内生成,也可以在服务器端生成)
*调用支付宝支付接口,发送订单
*处理支付宝返回的支付结果
业务大致就是这样的,但是还有一个安全性的问题,你肯定不希望接收到的支付结果被截取修改,所以需要生成订单和处理支付结果的时候做一个安全性的校验:
生成订单时对数据签名,收到支付结果时对数据进行签名验证,以校验数据是否被篡改过。支付宝目前只支持采用RSA 加密方式做签名验证。
注:RSA 加密算法除了可加解密外,还可以用来作为签名校验,简单的说就是RSA 会生成一个私钥和一个公钥,私钥应该改由我们独立保管,公钥分发出去,做签名验证时,可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据没有篡改。具体到支付宝使用RSA 做签名验证,就是在生成订单的时候,需要使用私钥生成签名值,在处理返回的支付结果时,需要使用公钥验证返回的结果是否被篡改。具体对哪些值,怎样生成签名,对哪些值做签名验证文档中都有。
//0:导入框架及资源包//1:生成订单信息 -> Order//2:配置URLScheme//3:签名 --> 两个文件夹 / 两个.a文件 / 增加Foundation头文件 / 配置搜索头文件的路径$(PROJECT_DIR)/Alipay / 增加框架//4:使用支付宝支付//5:处理回调信息 >1.在当前的页面中处理一次 2. 在AppDeleagte中配置一次- (void)btnClick:(UIButton *)button { //1.生成订单信息 Order *order = [[Order alloc] init]; /* *商户的唯一的parnter和seller。 *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。 */ //合伙人 order.partner = PartnerID; //卖家 order.seller = SellerID; //商品号 order.tradeNO = @"123456"; //商品名 order.productName = @"商品名称"; //商品描述 order.productDescription = @"上平描述"; //商品价格 order.amount = @"0.01"; order.notifyURL = @"http://www.baidu.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 = @"zhifuTest"; //将商品信息拼接成字符串 NSString *ordeSpec = [order description]; //2. 签名 //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncode //使用私钥签名 id<DataSigner> signer = CreateRSADataSigner(PartnerPrivKey); //签名订单描述 NSString *signedString = [signer signString:ordeSpec]; //将签名成功字符串格式化为订单字符串,请严格按照该格式 NSString *orderString = nil; if (signedString != nil) { orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",ordeSpec,signedString,@"RSA"]; } //3. 支付成功的回调 --> 在当前程序中完成付款的回调 [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"支付宝测试"); NSLog(@"restlut = %@",resultDic); }];}//appDelegate中的回调
// 跳转支付宝客户端的时候 --> 有客户端的- (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) { NSLog(@"result = %@",resultDic); }]; } return YES;}resultStatus,状态码,SDK里没对应信息,第一个文档里有提到:
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消
6002 网络连接出错
上面说了,订单签名应该用私钥,但是把私钥放到app里其实本身就不安全,因为你的app是分发到用户手里的,私钥应该放在自己的手里,分发出去的应该是公钥。
所以私钥最好是放在自己的服务器上,订单加密这个工作放在服务器端来做,服务器将包含签名的订单信息返回给app,app再通过SDK发送给支付宝,这样会更安全些;而且服务器也能掌握所有的订单状况。
如果你非要将私钥集成到app里,那可以参考SDK的DEMO,因为这个DEMO就是在app本地通过私钥做的订单签名。
- iOS 集成支付宝支付
- iOS集成支付宝支付
- iOS 集成支付宝支付
- iOS集成支付宝支付
- 集成iOS支付宝支付
- iOS支付宝支付集成
- iOS集成支付宝
- iOS集成支付宝
- iOS集成支付宝
- iOS集成支付宝
- iOS集成支付宝
- iOS支付宝集成
- iOS集成支付宝
- iOS集成支付宝
- IOS集成支付宝
- iOS 支付宝 集成
- iOS集成支付宝
- iOS 支付宝 集成
- iPhone/iOS开发推送C++服务端APNS源代码
- leetcode -- Kth Smallest Element in a BST -- 简单重点
- mysql修改字符集位utf-8使其和操作数据库连接字符程序统一
- excel
- 程序开发的验证工作
- iOS 支付宝集成
- Centos修炼----->centos7办公环境打造(No1--桌面快捷方式创建)
- WebService
- ubuntu系统下Elasticsearch 安装
- 无重复数字的三位数(第0届第3题)
- 随记
- [转] 定位Oops的具体代码行
- 推送证书p12文件转换成pem的命令
- jQuery学习笔记(三)