在开发过程中,经常需要接入第三方支付。下面对支付进行一个概括。

支付宝支付

支付宝SDK下载地址:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

支付宝集成

在支付宝集成的过程中,会遇到一些报错,下面就碰到的报错,和大家一起解决。

集成参考官方文档:

导入代码文档:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.RiFaVa&treeId=59&articleId=103676&docType=1

Demo运行注意:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.Ravnv1&treeId=59&articleId=103677&docType=1

1.新建一个aliPaySDK文件夹,提取SDK包中以下文件到此文件夹里,把文件拉到xcode里

2.在xcode中,点击项目名,选择Build Phases -->Link Binary With Libraries 添加依赖库。

注意:如果漏了部分没有添加的,有时会报其它各种错。

3.编译项目,会出现以下错误。

1)Cannot find interface declaration for 'NSObject', superclass of 'Base64'

那么需要打开报错了的文件,增加头文件。

  1. #import <Foundation/Foundation.h

2)"Unknown type name ‘NSString‘ "或者"Unknown type name ‘NSData‘ "等不识别常见类的问题。

这是因为缺少Foundation类库和UIKit类库,支付宝Demo中之所以没有出现此错误,是因为在.pch文件中导入过这些类库

解决办法:只需要在出现错误的文件中导入这些类库即可,可以在.pch中添加,也可以直接在openssl_wrapper.h中添加

  1. #import <UIKit/UIKit.h>
  2. #import <Foundation/Foundation.h>

3)‘openssl/asn1.h‘ file not found

这个处理方式,参考上面链接“Demo的运行注意”第4点。

点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字“search”搜索,对“Header Search Paths”增加头文件路径:$(SRCROOT)/项目名称。如果头文件信息已增加,可不必再增加。

$(SRCROOT)/项目名称 一定要注意这个路径。

4)如果你的app基于9.0编译,那么为了适配iOS9.0中的App Transport Security(ATS)对http的限制,这里需要对支付宝的请求地址alipay.com、alipayobjects.com做例外,在app对应的info.list中添加如下配置(文中以XML格式描述)。

  1. <key>NSAppTransportSecurity</key>
  2. <dict>
  3. <key>NSExceptionDomains</key>
  4. <dict>
  5. <key>alipay.com</key>
  6. <dict>
  7. <key>NSIncludesSubdomains</key>
  8. <true/>
  9. <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
  10. <true/>
  11. <key>NSTemporaryExceptionMinimumTLSVersion</key>
  12. <string>TLSv1.0</string>
  13. <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
  14. <false/>
  15. </dict>
  16. <key>alipayobjects.com</key>
  17. <dict>
  18. <key>NSIncludesSubdomains</key>
  19. <true/>
  20. <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
  21. <true/>
  22. <key>NSTemporaryExceptionMinimumTLSVersion</key>
  23. <string>TLSv1.0</string>
  24. <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
  25. <false/>
  26. </dict>
  27. </dict>
  28. </dict>

5)配置支付宝返回

注意:定义的返回types,不能带下画线,建议字母或者字母+数字

  1. //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
  2. NSString *appScheme = @"alisdkPaydemo";

基本上已经完成了,下面只需要拷贝demo里的测试代码,即可以进行支付宝支付了。

  1. #pragma mark ==============产生随机订单号==============
  2.  
  3. - (NSString *)generateTradeNO
  4. {
  5. static int kNumber = ;
  6.  
  7. NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  8. NSMutableString *resultStr = [[NSMutableString alloc] init];
  9. srand((unsigned)time());
  10. for (int i = ; i < kNumber; i++)
  11. {
  12. unsigned index = rand() % [sourceStr length];
  13. NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, )];
  14. [resultStr appendString:oneStr];
  15. }
  16. return resultStr;
  17. }
  18.  
  19. - (void)payForAlipay
  20. {
  21. /*
  22. *点击获取prodcut实例并初始化订单信息
  23. */
  24. //Product *product = [self.productList objectAtIndex:indexPath.row];
  25. NSString *productName = @"支付宝测试商品"; //商品标题
  26. NSString *productDescription = @"支付宝测试商品描述"; //商品描述
  27. NSString *amount = @"0.01"; //商品价格
  28. NSString *notifyURL = @"http://www.xxx.com"; //回调URL
  29. /*
  30. *商户的唯一的parnter和seller。
  31. *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
  32. */
  33.  
  34. /*============================================================================*/
  35. /*=======================需要填写商户app申请的===================================*/
  36. /*============================================================================*/
  37. NSString *partner = @""; // 这是支付宝文档里的测试账号
  38. NSString *seller = @"xinyuxingbangxinxi@163.com"; // 这是支付宝文档里的测试账号
  39. NSString *privateKey = @"MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAJ3U/F+CuYUTwIlefRyWcwNvecIx756fbYFKp3Ymfy3MNdzccPc7Kk62RKCpVTgshHGVx0UUpRGzSV1y6M17teOTY/1KVSxhB6wvlOkTxF9SYiXWyr6ioHyl1etxjnQOtL0zqA3ID1vjOzMZZXM0+QE8dnc3rXoOSE7xOvkIb+RJAgMBAAECgYAdE0Rer+1PN6FLbQ2tO4X6hwmuHZbf6My6ea8508OwAyOVCUMCOHMFxwwDcM5TJ9hKOGZaMoBqL1X/khCS8gxCkwVEsIqr0/A4b2wBcJqtYXYx9onhUDjpfc/DjJ/DJx0VDDuEpeM5++djBTDxEjzDmEgK27trfPwm7cNbJjxPJQJBANb6bBpmUnml22bUu4jMeVAQZekg+ho3tMr8aa/np0CK8Jdq9je/HBhPXkVMGDhXlX4hAOYGI6wF2vrmz7ExRdMCQQC78v+lCXRtmsMzJQzE6tZAVG8ErFYpfm+23Ebn+36w8E+VNT+8wquoCD8tXsBssvBwdT6ZRqmEeEV77mdZ18/zAkBvcl1OhlMlW1VVht09uvr9BbM/W2gs5UolnRtRJN+w9xZo+PtxxPJUq/isJhm8Q7NtMsDbfr1JdbOjNLrhGjEfAkEArFeroeskjuit+7UKm3r3ka+ayX851vywdc5RWqGbz6XcY+abFnyvqPo+7FyJOGNw5L4t86D/CpC6rmSy8ohZjwJBALiHGihuWHU8Xw9Qz5l6nWzN2w/vQa9Brm3XOkVLfoirPdOx0oo6OU7wwdgBMz+86+QLMAwx+ZooIHpGiZ0mWR8=";
  40. /*============================================================================*/
  41. /*============================================================================*/
  42. /*============================================================================*/
  43.  
  44. //partner和seller获取失败,提示
  45. if ([partner length] == ||
  46. [seller length] == ||
  47. [privateKey length] == )
  48. {
  49. UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
  50. message:@"缺少partner或者seller或者私钥。"
  51. delegate:self
  52. cancelButtonTitle:@"确定"
  53. otherButtonTitles:nil];
  54. [alert show];
  55. return;
  56. }
  57.  
  58. /*
  59. *生成订单信息及签名
  60. */
  61. //将商品信息赋予AlixPayOrder的成员变量
  62. Order *order = [[Order alloc] init];
  63. order.partner = partner;
  64. order.seller = seller;
  65. order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
  66. order.productName = productName; //商品标题
  67. order.productDescription = productDescription; //商品描述
  68. order.amount = [NSString stringWithFormat:@"%.2f",[amount doubleValue]]; //商品价格
  69. order.notifyURL = notifyURL; //回调URL
  70.  
  71. order.service = @"mobile.securitypay.pay";
  72. order.paymentType = @"";
  73. order.inputCharset = @"utf-8";
  74. order.itBPay = @"30m";
  75. order.showUrl = @"m.alipay.com";
  76.  
  77. //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
  78. NSString *appScheme = @"alisdkPaydemo";
  79.  
  80. //将商品信息拼接成字符串
  81. NSString *orderSpec = [order description];
  82. NSLog(@"orderSpec = %@",orderSpec);
  83.  
  84. //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
  85. id<DataSigner> signer = CreateRSADataSigner(privateKey);
  86. NSString *signedString = [signer signString:orderSpec];
  87.  
  88. //将签名成功字符串格式化为订单字符串,请严格按照该格式
  89. NSString *orderString = nil;
  90. if (signedString != nil) {
  91. orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
  92. orderSpec, signedString, @"RSA"];
  93.  
  94. NSLog(@"%@",orderString);
  95. [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
  96. NSLog(@"reslut = %@",resultDic);
  97. // 这里填写需要回调的页面,比如,跳转到支付成功页面。
  98. // BSPayResultViewController *payState = [[BSPayResultViewController alloc] init];
  99. // payState.title =[resultDic[@"resultStatus"] isEqualToString:@"9000"]?@"支付成功": @"支付失败";
  100. // payState.orderId = self.paymentModel.order_id;
  101. // payState.amount = self.paymentModel.order_amount;
  102. // payState.payType = @"支付宝支付";
  103. // payState.failure = resultDic[@"memo"];
  104. // [self.navigationController pushViewController:payState animated:NO];
  105. }];
  106. }
  107.  
  108. }

当然,这个是在客户端进行签名的,实际上,客户端不需要知道RAS的私密,签名通过请求服务端获取。官方是推荐服务端签名的,为了安全考虑。

iOS 支付宝支付的更多相关文章

  1. iOS支付宝支付集成

    概述 iOS支付宝支付集成 详细 代码下载:http://www.demodashi.com/demo/10729.html 支付宝和微信都是业界的老大哥,相信大家都有所觉得文档.SDK都是各种坑吧( ...

  2. iOS 支付宝支付集成获取私钥

    http://doc.open.alipay.com/doc2/apiList?docType=4 登录到支付宝开放平台,下载相关支付宝支付的demo.解压出来有3个文件夹.(服务端demo,客户端 ...

  3. iOS支付宝支付总结

    1.按照http://doc.open.alipay.com/doc2/detail?spm=0.0.0.0.SWdJgo&treeId=59&articleId=103676& ...

  4. iOS支付宝支付相关问题

    支付宝实现以及相关问题:http://www.jianshu.com/p/f81578954974 1.支付宝支付流程 1.用户点击支付2.客户端请求服务器用户支付3.服务器接收请求生成金额订单等要给 ...

  5. ios 支付宝支付集成

    支付宝支付: 下载官方demo,把需要的framwork下载下来,在自己的工程中,新建文件夹,然后全部塞进去,到build phases中把需要的全部导入,其中xcode7以上需要多导入两个.a文件, ...

  6. IOS支付宝支付出现6002问题的解决办法

    运行支付宝官方demo进行支付测试,会出现6002-网络连接错误,是因为以iOS9 SDK编译的工程会默认以SSL安全协议进行网络传输,即HTTPS,如果依然使用HTTP协议请求网络会报系统异常并中断 ...

  7. iOS开发支付宝支付

    iOS支付宝支付(Alipay)详细接入流程以及项目中遇到的问题分析    浏览: 149 发布日期: 2016-10-19  分类: ios 最近在项目中接入了微信支付和支付宝支付,总的来说没有那么 ...

  8. iOS app集成支付宝支付流程及后台php订单签名处理

    iOS app集成支付宝支付流程 1: 开通支付宝商户 由公司去支付宝 https://b.alipay.com/order/serviceIndex.htm 签约支付宝开通支付宝商家: 2:商户支付 ...

  9. iOS - AliPay 支付宝支付

    1.支付宝支付申请 支付宝支付官方签约集成指引 支付宝APP支付官方集成指引 蚂蚁金服开放平台 1.1 支付宝 APP 支付申请步骤 APP 支付:APP 支付是商户通过在移动端应用 APP 中集成开 ...

随机推荐

  1. angular.js input

    <!DOCTYPE html> <html ng-app="app"> <head> <meta charset="UTF-8& ...

  2. gcc-常见命令和错误

      一:编译过程的4个阶段:预处理,编译,汇编,链接; 1:最常用的方式 gcc hello.c -o hello 2:预处理后停止编译 gcc -E hello.c -o hello.i(.i通常为 ...

  3. java io 输入输出流

    数据流分类: 流序列中的数据既可以是未经加工的原始二进制数据, 也可以是经一定编码处理后符合某种格式规定的特定数据. 因此Java中的流分为两种: 1) 字节流:数据流中最小的数据单元是字节 2) 字 ...

  4. windows 上执行python pywin32.exe

    大家熟知的python脚本可以在linux系统上直接运行,因为linux上会安装python编译器 然而windows不会安装,如果想要别人直接运行你发布的python脚本,一种方法是在他的windo ...

  5. 自定义属性,资源文件attrs.xml

    1.attrs.xml中写:在values文件夹下. <?xml version="1.0" encoding="utf-8"?> <reso ...

  6. Ubuntu上安装MongoDB(译)

    add by zhj:直接从第四步开始就可以了,而且安装好MongoDB后会自动启动的,不必自己去执行启动命令 原文:https://docs.mongodb.com/manual/tutorial/ ...

  7. MFC CFileDialog用法例子。

     Set it to TRUE to construct a File Open dialog box. Set it to FALSE to construct a File Save As dia ...

  8. docker-compose安装使用

    Docker Compose的工作原理 Docker Compose将所管理的容器分为三层,工程(project),服务(service)以及容器(contaienr).Docker Compose运 ...

  9. ecshop 商品页面添加商品标签:

    /* @脚垫客户 需要给商品加属性.最简单粗暴的办法.后台调用加入.界面没有美化. */ goods.dwt <ul class="quantity"> <h2& ...

  10. Python学习笔记(二)基本语法

    Class 2 一.交互式编程 交互式编程不需要创建脚本文件,是通过 Python 解释器的交互模式进来编写代码. linux上你只需要在命令行中输入 Python 命令即可启动交互式编程,如下图: ...