iOS开发系列-支付宝支付
概述
开发中支付通常都会集成支付宝支付,下面讲解支付宝的整体流程。
集成支付宝支付的流程
签约
与支付签约,得到获取商户的ID(partner)、账户ID(seller)、私钥privateKey。
下载SDK
编写支付代码
- 创建APOrderInfo模型,赋值所有的订单信息
- 调用APOrderInfo的orderInfoEncoded转成字符串,使用APRSASigner对订单参数进数字签名(其中私钥是客户端使用支付宝提供的工具生成的密钥对。公钥需要上传支付宝对应的应用后台返回支付宝公钥用于校验支付完成的回调数据进行校验)。
- 调用AlipaySDK的payOrder进行支付。
- (void)pay
{
NSString *pid = @"";
NSString *appID = @"";
// 如下私钥,rsa2PrivateKey 或者 rsaPrivateKey 只需要填入一个
// 如果商户两个都设置了,优先使用 rsa2PrivateKey
// rsa2PrivateKey 可以保证商户交易在更加安全的环境下进行,建议使用 rsa2PrivateKey
// 获取 rsa2PrivateKey,建议使用支付宝提供的公私钥生成工具生成,
// 工具地址:https://doc.open.alipay.com/docs/doc.htm?treeId=291&articleId=106097&docType=1
NSString *rsa2PrivateKey = @"MIIEpAIBAAKCAQEAngES3OTqQR/dH5/D64inGWfxrYUZX75JJ1RxIEkjJW+ISTA7SK75CVNaoMTfEQ1twmluIQr0uEAVCWdjY2UuSsl+MoRlufTjDgVY0W94zcG7CcWy6vshWde1xAkyJq23fWyokFvgBERY7G00pkULSnwpofcWgk1xITkNo4ocW0kTgAKlGYyLkKjJ7Sy4MgWpS+4GQm0ABJ/ahzlJ+u4NP4F765Ntk2AUi3mDXs0DgzB6rjonEAyOWbUKpHESqsuzZ/VbIJ+KEhbJzRrUnd3xSO7a4Up0TzALusfH1IPxVdn0E7KTpfYPCmzKyJ8NzY7CCxqMftEcMML/bpxwuymt+wIDAQABAoIBAHpWTHuaBsKr4DMXKcQZh4AFWjvG/XGDTPLVz812s27N35EDdjN9vrb4wggOxsRWSHCp3ypYaEis3VztnyebdO9U+ZA1sOn9cTwu6aknjTqK0L3tQ+3qydTdTxBdKmaGRLcpRY6YhGfpX4yXtZcziF2Aq1+Lh/MV8Q0PNr80NWZ7g9pOnj4xuLaHZyPy60XZu3pjqG18hx07ny0CMn/kjt/a1EDPSGj2Nqrn9ERP8kD0jWQmdXRK2wDBESqyjD65jy4wrX2pqbiphqKBP3NcBdI+sxkAxezKTiwsqcMU/o2tXDEYyBuTPCUQm6/CJgbi6q1Ll0d5KTTfIt4V+YzvYOECgYEAyekr+g/1P0+1oyobBSlr0dLlmXu7QcJsazS23YkTgjNZldyEqRhg8q3oPl4e6HMlxuP71YJySbVaw3o3g5pMg8myLCa0THndpVruwxjtbG4GxCwLgWBJHjJGuLVoCn+ngNPRhjN1n7K1K+R/mWQGAZc7PdQm8B7bs35JtCDTbAsCgYEAyFTVAB9ziLt2dxO9J1Kd1zrh6se1ZdcxLXtBnNIyxuEktvcce9xtmu41N4+0pXF80Gl3IfWmVuMFjA5XpxpGa3f7QMiSm4lYG3Xr00KzcBfsciVIE2ZyrOdpfnoKtxJvZ6imPyJMkswwJxrnE92FDQj98V+l4BoIzAVYvLL+C9ECgYEAvX6zwj2l2uRxQQ/sSfzk7wiyaUjBpubUoAzaLrJOd9y/kDFk49o4aqoilB37fgdLhg1Dtc92eYzWAS272iw+8VSjfmJYxol9JopgGQRVF3Vvrj70EVkPZmKjEwlV+rxxtSuWsg+rrdSnyejqhEhmhqmrdMyeOq+LXDsC6yX/pp8CgYEAikg0d08+euWb0npnmRsoJQdaJqwQBOpT4ecw1UUrE6kZpMpSeRUg+07uoRmrQoBh/aKvP1vHpDY1AAZubsRuU4SQhJluybo2fU4aqMtj/T4mUmx1oh6Xjc53PXyUpOYuzEjX6MCORs53dqbVVxsT2nmYgOLbJyQRanNOW4LaZeECgYADEXDfjOIqmSdeZvWasFhQmUFMcj+9bYu9E80ps+Px5Ko5gr5fmB0fV4itR6REbk5WS57jb2ilFi4mCHkgOeuj5LtVQQ+TofIfl9vWqx5dj/wq8eG1KynijUZhcG5ONgJ+3gB6KM5KsOMf3IVi3WiFOzVha+T8cE530EG8VrYVZw==";
NSString *rsaPrivateKey = @"";
/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量
APOrderInfo* order = [APOrderInfo new];
// NOTE: app_id设置
order.app_id = appID;
// NOTE: 支付接口名称
order.method = @"alipay.trade.app.pay";
// NOTE: 参数编码格式
order.charset = @"utf-8";
// NOTE: 当前时间点
NSDateFormatter* formatter = [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
order.timestamp = [formatter stringFromDate:[NSDate date]];
// NOTE: 支付版本
order.version = @"1.0";
// NOTE: sign_type 根据商户设置的私钥来决定
order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";// NOTE: 商品数据
order.biz_content = [APBizContent new];
order.biz_content.body = @"我是测试数据";
order.biz_content.subject = @"1";
order.biz_content.out_trade_no = [self generateTradeNO]; //订单ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超时时间设置
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品价格
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
NSString *signedString = nil;
APRSASigner* signer = [[APRSASigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)];
if ((rsa2PrivateKey.length > 1)) {
signedString = [signer signString:orderInfo withRSA2:YES];
} else {
signedString = [signer signString:orderInfo withRSA2:NO];
}
// NOTE: 如果加签成功,则继续执行支付
if (signedString != nil) {
//应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString *appScheme = @"alisdkdemo";
// NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
// NOTE: 调用支付结果开始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
}
#pragma mark -
#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;
}
补充:
APRSASigner利用私钥对参数签名,其中支付签名分为两种RSA2、RSA区别主要是签名过程使用的单向散列函数不同分别是SHA256、SHA1。建议使用前者。具体信息参考。
APRSASigner做签名内部依赖openssl,不过支付宝对签名细节封装成了libcrypto.a libssl.a。集成支付的工程目录

iOS开发系列-支付宝支付的更多相关文章
- iOS开发集成支付宝支付、支付宝&微信支付
支付宝支付: 参考链接:https://www.jianshu.com/p/60175e525c0e https://blog.csdn.net/zhonggaorong/article/detail ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--通知与消息机制--转
来自:http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
随机推荐
- 使用VS2015制作安装包( 含相关的下载链接)
补充: 在看下面的教程过程中,如果在下面的步聚1中没有 " Visual Studio Installer", 则需要通过下面的链接进行安装 Visual Studio Insta ...
- svn 类似.gitignore功能实现
svn propset -R svn:ignore -F .cvsignore .
- 面向对象(三)——组合、多态、封装、property装饰器
组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...
- TortoiseGit密钥设置
需要用到TortoiseGit的puttykey generator工具来生成既适用于github的rsa密钥也适用于TortoiseGit的ppk密钥. 1. 安装完成TortoiseGit后 ...
- swiper在微信端滑动效果不友好(滑动不了)的解决方案
如需转载请注明出处.好用就点赞吧 前提:我做的事竖直方向的一份报告,上下翻页滑动. 猜测原因: 1.检查自己的slide里面内容的样式的的高度,就是两个页面的高度不一致,测试的时候wrapper会取连 ...
- 高程(三)----数组Array
一.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上 ...
- C-Ubuntu中MySQL出现ERROR1698(28000):Access denied for user root@localhost错误解决方法
卸载原先的MySQL,重新安装过程中没有提示设置密码, 当键入命令:mysql -uroot -p; 不知密码是什么,输入主机的密码以及不输入密码,回车后都出现标题错误. 寻找多篇相关博文,验证如下博 ...
- 「CSP-S 2019」树的重心
题目 考场上送\(75pts\)真实良心,正解不难:考虑直接对于每一个点算割掉多少条边能使得这个点成为重心,不难发现对于一个不是重心的点,我们要割掉的那条边一定在那个大于\(\lfloor \frac ...
- 2018湘潭大学程序设计竞赛【E】
题目链接:https://www.nowcoder.com/acm/contest/105/E 题意:给你美食种类和查询次数,告诉你美味度和价格,给你固定钱数,问你最多能吃到多少美味度的食物.(X真是 ...
- Windows性能监控perfmon工具的使用和性能指标的分析
Windows性能监控工具perfmon的使用和性能指标分析 一.perfmon提供图表化的实时的性能监视器.性能日志.警报管理,能监控CPU的使用率.内存使用率.磁盘I/O(磁盘的读写速度).网络I ...