前奏
现在随着移动开发的快速发展,移动支付变得越来越流行与必不可少。最近做了一个关于支付宝支付功能的应用,在使用支付宝的过程中,遇到一些不必要的弯路,因此,写了这篇文章总结一下关于iOS中如何开发使用支付宝。iOS中支付宝的集成相对于微信支付集成和银联的集成会比较复杂,有一些需要注意的地方列举出来,希望对大家有益。
签约(已完成的可略过此步)
- 向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)
参照支付宝开放平台的操作即可:https://doc.open.alipay.com/doc2/detail.htm?treeId=58&articleId=103542&docType=1
下载支付宝SDK
直接连接这个地址即可下载目前最新的SDK:https://t.alipayobjects.com/L1/92/1078/1440576688389.zip
集成
- 文件目录
- 创建项目,把SDK导入项目中,由于支付宝的官方没有明确说可以用cocoaPod来集成,出于安全考虑,还是使用手动集成SDK的方式。
- 搭建基本的演示界面
- 导入
Demo
中的libcrypto.a
,libssl.a
静态库,openssl
,Util
文件夹和Order
,APAuthV2Info
类
- 下面是集成后出现的一些问题
- 如果遇到运行后报错,类似于以下提示信息:
Cannot find interface declaration for ‘NSObject‘, superclass of ‘Base64‘
那么需要打开报错了的文件,增加头文件。
#import <Foundation/Foundation.h>
- 如果商户要在某个文件中使用支付宝的开发包类库,需增加引用头文件。
#import <AlipaySDK/AlipaySDK.h>
‘openssl/asn1.h‘ file not found
错误
点击项目名称,点击
Build Settings
选项卡,在搜索框中,以关键字search
搜索,对Header Search Paths
增加头文件路径:$(SRCROOT)/项目名
称。如果头文件信息已增加,可不必再增加。- 点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字
bitcode
,设置为NO
AlipaySDK.h
导入UIKit
框架- 点击项目名称,点击“Build Phases”选项卡,在“Link Binary with Librarles” 选项中,“SystemConfiguration.framework” 系统库文件.
- 如果遇到运行后报错,类似于以下提示信息:
-
/* *生成订单信息及签名 */ //将商品信息赋予AlixPayOrder的成员变量 Order *order = [[Order alloc] init]; order.partner = partner; order.sellerID = seller; order.outTradeNO = product.orderId; //订单ID(由商家自行制定) order.subject = product.title; //商品标题 order.body = product.desc; //商品描述 order.totalFee = product.price; //商品价格 order.notifyURL = @"http://www.xxx.com"; //回调URL,支付宝服务器主动通知商户网站里指定的页面http路径,服务器异步通知页面路径 order.service = @"mobile.securitypay.pay";//接口名称,固定值 order.paymentType = @"1"; //支付类型,1:商品购买。(不传情况下的默认值) order.inputCharset = @"utf-8";////商户网站(我们APP的服务端)使用的编码格式,固定为utf-8。 order.itBPay = @"30m"; //设置未付款交易的超时时间 order.showURL = @"m.alipay.com";//商品地址 //将商品信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@"orderSpec = %@",orderSpec); // 2. 签名 //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode id<DataSigner> signer = CreateRSADataSigner(privateKey); NSString *signedString = [signer signString:orderSpec]; NSLog(@"签名字符串%@",signedString);// 3. 发送支付请求 //应用注册scheme,在AlixPayDemo-Info.plist定义URL types// 我们在target->info->URL Types 里面设置的URLScheme// 用于支付宝调回到我们的应用,如果这个不唯一,就很可能导致跳转错误. NSString *appScheme = @"Meituan"; //将签名成功字符串格式化为可支付的订单字符串,请严格按照该格式 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); NSLog(@"%@",resultDic[@"memo"]); }]; }
- 设置
Scheme
在target->info->URL Types 里面设置的URLSchemes
4.调用支付接口,监听支付结果回调
(1)block 回调
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
(2)支付宝钱包打开的时候回调 在AppDelegate
中
- (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;
}
下面是关于公钥和私钥的生成与使用:
1.打开终端进入一个合适目录(我这里放到桌面的RSA文件夹下)
2.生成RSA私钥,输入 openssl genrsa -out rsa_private_key.pem 1024
生成rsa_private_key.pem
3.生成RSA公钥,输入openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
命令回车 后,在当前文件夹中生成一个rsa_public_key.pem
文件为原始 的商户公钥(请妥善保存该文件,PHP 开发语言中需要使用该文件),以下为命 令正确执行截图:
4.生成PKCS8 编码的私钥, 输入命令openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
并回车,当前界面中会直接显示出生成结果。
5.复制PKCS8编码的私钥, 把复制的内容粘 贴进一个新的记事本中,可随意命名,只要知道这个是 PKCS8 格式的私钥即可(请 妥善保存该文件)。
盗张图来说明一些公钥与私钥的使用
可能还会存在一些考虑不到的方面,欢迎阅读到的同行们指正,目前是可以实现应用跳转到支付界面,支付完成后跳转到应用界面的效果。