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什么的你就不用管了。