iOS实用技能扩展-集成支付宝
前奏
现在随着移动开发的快速发展,移动支付变得越来越流行与必不可少。最近做了一个关于支付宝支付功能的应用,在使用支付宝的过程中,遇到一些不必要的弯路,因此,写了这篇文章总结一下关于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 格式的私钥即可(请 妥善保存该文件)。
盗张图来说明一些公钥与私钥的使用
可能还会存在一些考虑不到的方面,欢迎阅读到的同行们指正,目前是可以实现应用跳转到支付界面,支付完成后跳转到应用界面的效果。