iOS实用技能扩展-集成支付宝

  前奏

  现在随着移动开发的快速发展,移动支付变得越来越流行与必不可少。最近做了一个关于支付宝支付功能的应用,在使用支付宝的过程中,遇到一些不必要的弯路,因此,写了这篇文章总结一下关于iOS中如何开发使用支付宝。iOS中支付宝的集成相对于微信支付集成和银联的集成会比较复杂,有一些需要注意的地方列举出来,希望对大家有益。

签约(已完成的可略过此步)

  1. 向支付宝申请, 与支付宝签约,获得商户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

集成

  1. 文件目录

  1. 创建项目,把SDK导入项目中,由于支付宝的官方没有明确说可以用cocoaPod来集成,出于安全考虑,还是使用手动集成SDK的方式。
  2. 搭建基本的演示界面
  3. 导入Demo 中的 libcrypto.a,libssl.a 静态库, openssl,Util 文件夹和Order,APAuthV2Info

  1. 下面是集成后出现的一些问题

    1. 如果遇到运行后报错,类似于以下提示信息:

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

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

      #import <Foundation/Foundation.h>
      
    2. 如果商户要在某个文件中使用支付宝的开发包类库,需增加引用头文件。

           #import <AlipaySDK/AlipaySDK.h>
      
    3. 'openssl/asn1.h' file not found 错误

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

    4. 点击项目名称,点击“Build Settings”选项卡,在搜索框中,以关键字bitcode ,设置为NO
    5. AlipaySDK.h 导入 UIKit 框架
    6. 点击项目名称,点击“Build Phases”选项卡,在“Link Binary with Librarles” 选项中,“SystemConfiguration.framework” 系统库文件.
  2.  /*
      *生成订单信息及签名
      */
        //将商品信息赋予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"]);
            }];
        }
  3. 设置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 格式的私钥即可(请 妥善保存该文件)。

 

 

  盗张图来说明一些公钥与私钥的使用

     

可能还会存在一些考虑不到的方面,欢迎阅读到的同行们指正,目前是可以实现应用跳转到支付界面,支付完成后跳转到应用界面的效果。

 

 



 

posted @ 2016-06-19 19:44  码锋窝  阅读(447)  评论(0编辑  收藏  举报