iOS快速集成支付宝(完善版)
2016-06-22 10:46
567 查看
前言:
随着互联网的迅猛发展,支付功能受到越来越多APP的青睐,其中支付宝支付在app开发中占据着举足轻重的位置,但按照官网的集成方式,会遇到很多坑,小编集成支付宝SDK后,决定整理一下集成思路,分享给大家,希望对大家有所帮助.在此也感谢提供集成参考资料的各路大神.
这里首先要提醒大家,集成支付宝支付最好还是别用cocoapods了,会出各种各样的坑,比较蛋疼,有兴趣的小伙伴可以去踩一踩.希望官方能完善一下这个问题吧.用手动方法集成更方便一些.
集成准备:
1.商户签约和秘钥配置.
2.去支付宝开放平台下载支付宝最新版SDK
3.打开支付宝的SDK,你会看到如下图所示的文件
重点来了,注意了!!!
SDK集成步骤:
1.将支付宝SDK中以下文件及文件夹拷贝到项目文件夹下,并导入开发环境中。
AlipaySDK.bundle
AlipaySDK.framework
libcrypto.a
libssl.a
Order.h
Order.m
Util 文件夹及子文件
openssl 文件夹及子文件
2.导入系统依赖库,在Build
Phases -> link Binary With Libraries 里面添加如下依赖库
3.在需要使用SDK的文件中,导入以下头文件
#import "Order.h"
#import "DataSigner.h"<pre name="code" class="objc" style="color: rgb(47, 47, 47); font-size: 16px; text-align: justify;">#import <AlipaySDK/AlipaySDK.h>
注意:这时有人会遇到报错(我的倒是没有遇到,可能是将SDK中文件导入自己项目中的方法不同导致的)如下图:
这个原因是项目没有找到之前导入的
,在Header Search Paths中添加路径,如下图:
到这里,SDK集成完毕,然后配置代码.
配置代码:
1.需要支付的类中添加这个代码,根据业务逻辑调用payAction方法即可.
#pragma mark ==============配置alipay支付==============
- (void)payAction
{
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = @"";//商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)。
order.sellerID = @"";////卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
order.outTradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
order.subject = @"测试商品"; //商品的标题/交易标题/订单标题/订单关键字等。
order.body = @"runbey商品描述"; //对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
order.totalFee = @"0.01"; //该笔订单的资金总额,单位为RMB(Yuan)。取值范围为[0.01,100000000.00],精确到小数点后两位。
order.notifyURL = @"http://*****"; //支付宝服务器主动通知商户网站里指定的页面http路径。
//实际项目开发中 订单信息应该由服务器返回
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//应用注册scheme 便于支付结束后重新打开客户端
NSString *appScheme = @"";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString * privateKey = @"";//商户私钥
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
// orderString = [NSString stringWithFormat:@"%@&sign=\\"%@\\"&sign_type=\\"%@\\"",
// orderSpec, signedString, @"RSA"];
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
NSLog(@"签名字符串:%@",orderString);
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"支付结果reslut = %@",resultDic);
}];
}
}
#pragma mark ==============产生随机订单号==============
- (NSString *)generateTradeNO
{
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
2.配置返回处理代码,在AppDelegate.m 文件中,增加引用代码:
#pragma mark- 支付宝支付
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
if ([url.host isEqualToString:@"safepay"])
{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
3.添加URL Schemes
点击项目名称,点击“Info”选项卡,在“URL
Types”选项中,点击“+”, 在“URL Schemes”中输入项目的bundleid。“bundleid”来自于 NSString *appScheme = @"****"(一般为项目的bundleid),如下图
这时运行程序还会报错:
1.base64.h和 openssl_wrapper.h这两个文件报错,会出现:
Cannot
find interface declaration for 'NSObject', superclass of 'Base64'
解决方法:打开base64.h
和 openssl_wrapper.h,分别在他们顶部导入头文件:
#import <Foundation/Foundation.h>2.
rsa.h 中,会出现报错:
解决方法:
我看资料,有人是把项目文件夹中的和项目同名的文件夹,在Header
Search Paths中添加路径
一样把文件夹拖进去!如下图:
但经过测试发现,这样不一定对,原因是,他把支付宝SDK的文件都放在和项目同名的文件夹下了,如果项目较大时,一般不会直接把文件散乱的放在这个文件夹下的,这时拖入项目同名的文件夹是解决不了问题的.小编建议,新建一个支付宝支付的文件夹,这个文件夹中只存放支付宝支付的SDK,然后给存放SDK文件的这个文件夹添加路径,我把支付宝SDK的文件全都放在AliSDK文件中了,所以把这个文件夹拖入路径,如下图:
,
然后再运行程序,就不会有报错了,这说明集成成功了,接下来把参数添加到配置代码中就行了.
随着互联网的迅猛发展,支付功能受到越来越多APP的青睐,其中支付宝支付在app开发中占据着举足轻重的位置,但按照官网的集成方式,会遇到很多坑,小编集成支付宝SDK后,决定整理一下集成思路,分享给大家,希望对大家有所帮助.在此也感谢提供集成参考资料的各路大神.
这里首先要提醒大家,集成支付宝支付最好还是别用cocoapods了,会出各种各样的坑,比较蛋疼,有兴趣的小伙伴可以去踩一踩.希望官方能完善一下这个问题吧.用手动方法集成更方便一些.
集成准备:
1.商户签约和秘钥配置.
2.去支付宝开放平台下载支付宝最新版SDK
3.打开支付宝的SDK,你会看到如下图所示的文件
重点来了,注意了!!!
SDK集成步骤:
1.将支付宝SDK中以下文件及文件夹拷贝到项目文件夹下,并导入开发环境中。
AlipaySDK.bundle
AlipaySDK.framework
libcrypto.a
libssl.a
Order.h
Order.m
Util 文件夹及子文件
openssl 文件夹及子文件
2.导入系统依赖库,在Build
Phases -> link Binary With Libraries 里面添加如下依赖库
CoreMotion.framework
CFNetwork.framework
SystemConfiguration.framework
QuartzCore.framework
CoreText.framework
CoreTelephony.framework
CoreGraphics.framework
libc++.tbd
libz.tbd
3.在需要使用SDK的文件中,导入以下头文件
#import "Order.h"
#import "DataSigner.h"<pre name="code" class="objc" style="color: rgb(47, 47, 47); font-size: 16px; text-align: justify;">#import <AlipaySDK/AlipaySDK.h>
注意:这时有人会遇到报错(我的倒是没有遇到,可能是将SDK中文件导入自己项目中的方法不同导致的)如下图:
这个原因是项目没有找到之前导入的
AliSDKDemo\Util 及下面所有文件,
AliSDKDemo\openssl 及下面所有文件头文件,解决方法:在项目文件夹中找到
Util和
openssl文件夹
,在Header Search Paths中添加路径,如下图:
到这里,SDK集成完毕,然后配置代码.
配置代码:
1.需要支付的类中添加这个代码,根据业务逻辑调用payAction方法即可.
#pragma mark ==============配置alipay支付==============
- (void)payAction
{
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
Order *order = [[Order alloc] init];
order.partner = @"";//商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)。
order.sellerID = @"";////卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
order.outTradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
order.subject = @"测试商品"; //商品的标题/交易标题/订单标题/订单关键字等。
order.body = @"runbey商品描述"; //对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
order.totalFee = @"0.01"; //该笔订单的资金总额,单位为RMB(Yuan)。取值范围为[0.01,100000000.00],精确到小数点后两位。
order.notifyURL = @"http://*****"; //支付宝服务器主动通知商户网站里指定的页面http路径。
//实际项目开发中 订单信息应该由服务器返回
order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showURL = @"m.alipay.com";
//应用注册scheme 便于支付结束后重新打开客户端
NSString *appScheme = @"";
//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString * privateKey = @"";//商户私钥
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
// orderString = [NSString stringWithFormat:@"%@&sign=\\"%@\\"&sign_type=\\"%@\\"",
// orderSpec, signedString, @"RSA"];
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];
NSLog(@"签名字符串:%@",orderString);
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"支付结果reslut = %@",resultDic);
}];
}
}
#pragma mark ==============产生随机订单号==============
- (NSString *)generateTradeNO
{
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
2.配置返回处理代码,在AppDelegate.m 文件中,增加引用代码:
#pragma mark- 支付宝支付
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
if ([url.host isEqualToString:@"safepay"])
{
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
3.添加URL Schemes
点击项目名称,点击“Info”选项卡,在“URL
Types”选项中,点击“+”, 在“URL Schemes”中输入项目的bundleid。“bundleid”来自于 NSString *appScheme = @"****"(一般为项目的bundleid),如下图
这时运行程序还会报错:
1.base64.h和 openssl_wrapper.h这两个文件报错,会出现:
Cannot
find interface declaration for 'NSObject', superclass of 'Base64'
解决方法:打开base64.h
和 openssl_wrapper.h,分别在他们顶部导入头文件:
#import <Foundation/Foundation.h>2.
rsa.h 中,会出现报错:
解决方法:
我看资料,有人是把项目文件夹中的和项目同名的文件夹,在Header
Search Paths中添加路径
一样把文件夹拖进去!如下图:
但经过测试发现,这样不一定对,原因是,他把支付宝SDK的文件都放在和项目同名的文件夹下了,如果项目较大时,一般不会直接把文件散乱的放在这个文件夹下的,这时拖入项目同名的文件夹是解决不了问题的.小编建议,新建一个支付宝支付的文件夹,这个文件夹中只存放支付宝支付的SDK,然后给存放SDK文件的这个文件夹添加路径,我把支付宝SDK的文件全都放在AliSDK文件中了,所以把这个文件夹拖入路径,如下图:
,
然后再运行程序,就不会有报错了,这说明集成成功了,接下来把参数添加到配置代码中就行了.
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法
- iOS应用开发中AFNetworking库的常用HTTP操作方法小结
- iOS应用中UISearchDisplayController搜索效果的用法
- iOS App开发中的UISegmentedControl分段组件用法总结
- IOS开发环境windows化攻略
- iOS应用中UITableView左滑自定义选项及批量删除的实现
- iOS中UIAlertView警告框组件的使用教程
- 浅析iOS应用开发中线程间的通信与线程安全问题
- iOS中的UIKeyboard键盘视图使用方法小结
- 检测iOS设备是否越狱的方法
- C#支付宝扫码支付代码完整版