array(2) { ["docs"]=> array(10) { [0]=> array(10) { ["id"]=> string(3) "428" ["text"]=> string(77) "Visual Studio 2017 单独启动MSDN帮助(Microsoft Help Viewer)的方法" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(8) "DonetRen" ["tagsname"]=> string(55) "Visual Studio 2017|MSDN帮助|C#程序|.NET|Help Viewer" ["tagsid"]=> string(23) "[401,402,403,"300",404]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400964" ["_id"]=> string(3) "428" } [1]=> array(10) { ["id"]=> string(3) "427" ["text"]=> string(42) "npm -v;报错 cannot find module "wrapp"" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "zzty" ["tagsname"]=> string(50) "node.js|npm|cannot find module "wrapp“|node" ["tagsid"]=> string(19) "[398,"239",399,400]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400760" ["_id"]=> string(3) "427" } [2]=> array(10) { ["id"]=> string(3) "426" ["text"]=> string(54) "说说css中pt、px、em、rem都扮演了什么角色" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(12) "zhengqiaoyin" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511400640" ["_id"]=> string(3) "426" } [3]=> array(10) { ["id"]=> string(3) "425" ["text"]=> string(83) "深入学习JS执行--创建执行上下文(变量对象,作用域链,this)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "Ry-yuan" ["tagsname"]=> string(33) "Javascript|Javascript执行过程" ["tagsid"]=> string(13) "["169","191"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511399901" ["_id"]=> string(3) "425" } [4]=> array(10) { ["id"]=> string(3) "424" ["text"]=> string(30) "C# 排序技术研究与对比" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "vveiliang" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(8) ".Net Dev" ["catesid"]=> string(5) "[199]" ["createtime"]=> string(10) "1511399150" ["_id"]=> string(3) "424" } [5]=> array(10) { ["id"]=> string(3) "423" ["text"]=> string(72) "【算法】小白的算法笔记:快速排序算法的编码和优化" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(9) "penghuwan" ["tagsname"]=> string(6) "算法" ["tagsid"]=> string(7) "["344"]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511398109" ["_id"]=> string(3) "423" } [6]=> array(10) { ["id"]=> string(3) "422" ["text"]=> string(64) "JavaScript数据可视化编程学习(二)Flotr2,雷达图" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "chengxs" ["tagsname"]=> string(28) "数据可视化|前端学习" ["tagsid"]=> string(9) "[396,397]" ["catesname"]=> string(18) "前端基本知识" ["catesid"]=> string(5) "[198]" ["createtime"]=> string(10) "1511397800" ["_id"]=> string(3) "422" } [7]=> array(10) { ["id"]=> string(3) "421" ["text"]=> string(36) "C#表达式目录树(Expression)" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(4) "wwym" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(4) ".NET" ["catesid"]=> string(7) "["119"]" ["createtime"]=> string(10) "1511397474" ["_id"]=> string(3) "421" } [8]=> array(10) { ["id"]=> string(3) "420" ["text"]=> string(47) "数据结构 队列_队列实例:事件处理" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(7) "idreamo" ["tagsname"]=> string(40) "C语言|数据结构|队列|事件处理" ["tagsid"]=> string(23) "["246","247","248",395]" ["catesname"]=> string(12) "数据结构" ["catesid"]=> string(7) "["133"]" ["createtime"]=> string(10) "1511397279" ["_id"]=> string(3) "420" } [9]=> array(10) { ["id"]=> string(3) "419" ["text"]=> string(47) "久等了,博客园官方Android客户端发布" ["intro"]=> string(288) "目录 ECharts 异步加载 ECharts 数据可视化在过去几年中取得了巨大进展。开发人员对可视化产品的期望不再是简单的图表创建工具,而是在交互、性能、数据处理等方面有更高的要求。 chart.setOption({ color: [ " ["username"]=> string(3) "cmt" ["tagsname"]=> string(0) "" ["tagsid"]=> string(2) "[]" ["catesname"]=> string(0) "" ["catesid"]=> string(2) "[]" ["createtime"]=> string(10) "1511396549" ["_id"]=> string(3) "419" } } ["count"]=> int(200) } 222 iOS集成支付宝 - 爱码网

使用支付宝进行一个完整的支付功能,大致有以下步骤:

1>先与支付宝签约,获得商户ID(partner)和账号ID(seller)(这个主要是公司的负责)
2>下载相应的公钥私钥文件(加密签名用)
3>下载支付宝SDK(登录网站:http://club.alipay.com/)里面提供了非常详细的文档、如何签约、如何获得公钥私钥、如何调用支付接口
4>生成订单信息
5>调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
6>支付完毕后返回支付结果给商户客户端和服务器。
SDK里有集成支付宝功能的一个Demo>集成支付功能的具体操作方式,可以参考Demo
如何创建订单 ( 订单根据自己公司看是什么样的)

iOS集成支付宝

iOS集成支付宝

要想集成支付功能,依赖以下文件夹的库文件(把这3个添加到你的客户端中)

iOS集成支付宝

调用支付接口可以参考AlixPayDemoViewController的下面方法

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

如何签名

如何调用支付接口

都在这个方法里面了

  1. //  
  2. //选中商品调用支付宝快捷支付  
  3. //  
  4. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  
  5. {  
  6.     /* 
  7.      *点击获取prodcut实例并初始化订单信息 
  8.      */  
  9.     Product *product = [_products objectAtIndex:indexPath.row];  
  10.       
  11.     /* 
  12.      *商户的唯一的parnter和seller。 
  13.      *本demo将parnter和seller信息存于(AlixPayDemo-Info.plist)中,外部商户可以考虑存于服务端或本地其他地方。 
  14.      *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。 
  15.      */  
  16.     //如果partner和seller数据存于其他位置,请改写下面两行代码  
  17.     NSString *partner = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Partner"];  
  18.     NSString *seller = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Seller"];  
  19.       
  20.     //partner和seller获取失败,提示  
  21.     if ([partner length] == 0 || [seller length] == 0)  
  22.     {  
  23.         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"  
  24.                                                         message:@"缺少partner或者seller。"  
  25.                                                        delegate:self  
  26.                                               cancelButtonTitle:@"确定"  
  27.                                               otherButtonTitles:nil];  
  28.         [alert show];  
  29.         return;  
  30.     }  
  31.       
  32.     /* 
  33.      *生成订单信息及签名 
  34.      *由于demo的局限性,本demo中的公私钥存放在AlixPayDemo-Info.plist中,外部商户可以存放在服务端或本地其他地方。 
  35.      */  
  36.     //将商品信息赋予AlixPayOrder的成员变量  
  37.     AlixPayOrder *order = [[AlixPayOrder alloc] init];  
  38.     order.partner = partner;  
  39.     order.seller = seller;  
  40.     order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)  
  41.     order.productName = product.subject//商品标题  
  42.     order.productDescription = product.body//商品描述  
  43.     order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格  
  44.     order.notifyURL =  @"http://www.xxx.com"; //回调URL  
  45.       
  46.     //应用注册scheme,在AlixPayDemo-Info.plist定义URL types,用于快捷支付成功后重新唤起商户应用  
  47.     NSString *appScheme = @"AlixPayDemo";  
  48.       
  49.     //将商品信息拼接成字符串  
  50.     NSString *orderSpec = [order description];  
  51.     NSLog(@"orderSpec = %@",orderSpec);  
  52.       
  53.     //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode  
  54.     id<DataSigner> signer = CreateRSADataSigner([[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA private key"]);  
  55.     NSString *signedString = [signer signString:orderSpec];  
  56.       
  57.     //将签名成功字符串格式化为订单字符串,请严格按照该格式  
  58.     NSString *orderString = nil;  
  59.     if (signedString != nil) {  
  60.         orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",  
  61.                        orderSpec, signedString, @"RSA"];  
  62.           
  63.         //获取快捷支付单例并调用快捷支付接口  
  64.         AlixPay * alixpay = [AlixPay shared];  
  65.         int ret = [alixpay pay:orderString applicationScheme:appScheme];  
  66.           
  67.         if (ret == kSPErrorAlipayClientNotInstalled) {  
  68.             UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"提示"  
  69.                                                                  message:@"您还没有安装支付宝快捷支付,请先安装。"  
  70.                                                                 delegate:self  
  71.                                                        cancelButtonTitle:@"确定"  
  72.                                                        otherButtonTitles:nil];  
  73.             [alertView setTag:123];  
  74.             [alertView show];  
  75.         }  
  76.         else if (ret == kSPErrorSignError) {  
  77.             NSLog(@"签名错误!");  
  78.         }  
  79.           
  80.     }  
  81.       
  82.     [tableView deselectRowAtIndexPath:indexPath animated:YES];  
  83. }  
  84. //主要集成的关键就是下面几步:  
  85. //1.封装订单模型  
  86. AlixPayOrder *order = [[AlixPayOrder alloc] init];  
  87. // 生成订单描述  
  88. NSString *orderSpec = [order description];  
  89.   
  90. //2.签名  
  91. id<DataSigner> signer = CreateRSADataSigner(@“私钥key”);  
  92. // 传入订单描述 进行 签名  
  93. NSString *signedString = [signer signString:orderSpec];  
  94.   
  95.   
  96. //3.生成订单字符串  
  97. NSString *orderString = [NSString stringWithFormat:@'%@&sign='%@'&sign_type='%@'',  
  98.                          orderSpec, signedString, @'RSA'];  
  99.   
  100. //4.调用支付接口  
  101. AlixPay * alixpay = [AlixPay shared];  
  102. // appScheme:商户自己的协议头  
  103. int ret = [alixpay pay:orderString applicationScheme:appScheme];  

相关文章: