iOS支付那些事(二)支付宝

支付宝业务逻辑

1、先与支付宝签约,获得商户ID(partner)和账号ID(seller)
(这个主要是公司的负责)
2、下载相应的公钥私钥文件(加密签名用)
3、生成订单信息
4、调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
5、支付完毕后返回支付结果给商户客户端和服务器

APP接入支付宝流程

  1. 在支付宝开放平台下载支付宝SDK
    点击这里下载支付宝SDK
  2. 添加sdk文件到xcode

1,新建一个aliPaySDK文件夹,提取SDK包中以下文件到此文件夹里,在xcode中添加此文件夹。

这里写图片描述

 2.在xcode中,点击项目名,选择”target”->”Link Binary With Libraries”添加依赖库。
这里写图片描述

集成的关键

//.封装订单模型
AlixPayOrder *order = [[AlixPayOrder alloc] init];
// 生成订单描述
NSString *orderSpec = [order description];

//2.签名
id signer = CreateRSADataSigner(@“私钥key”);
// 传入订单描述 进行 签名
NSString *signedString = [signer signString:orderSpec];


//3.生成订单字符串
NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                         orderSpec, signedString, @"RSA"];

//4.调用支付接口
AlixPay * alixpay = [AlixPay shared];
// appScheme:商户自己的协议头
int ret = [alixpay pay:orderString applicationScheme:appScheme];
  • 三、添加支付逻辑代码,完成支付过程。
  • ViewController.m

      /*=======================需要填写商户app申请的===================================*/

      //这里的三个参数是公司和支付宝签约之后得到的,没有这三个参数无法完成支付
      NSString *partner = @"";
      NSString *seller = @"";
      NSString *privateKey = @"";    

     //partner和seller获取失败,提示
     if ([partner length] == 0 ||
         [seller length] == 0 ||
         [privateKey length] == 0)
     {
         UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"                                                         message:@"缺少partner或者seller或者私钥。"                                                        delegate:self                                          cancelButtonTitle:@"确定"                                             otherButtonTitles:nil];
         [alert show];
        return;
     }     
    //生成订单信息及签名
     //将商品信息赋予AlixPayOrder的成员变量
     Order *order = [[Order alloc] init];
     order.partner = partner;
     order.seller = seller;
 #warning 这里需要填商品信息
     order.tradeNO = @""; //订单ID(由商家自行制定)
    order.productName = @"测试商品"; //商品标题
     order.productDescription = @"这是一个测试商品"; //商品描述
     order.amount = @"0.01"; //商品价格
     order.notifyURL = @""; //回调URL   这个URL是在支付之后,支付宝通知后台服务器,使数据同步更新,必须填,不然支付无法成功

     //下面的参数是固定的,不需要改变
     order.service = @"mobile.securitypay.pay";
     order.paymentType = @"1";
     order.inputCharset = @"utf-8";
     order.itBPay = @"30m";
     order.showUrl = @"m.alipay.com";

     //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
     //如果不知道scheme是神马东西,请自行百度
     NSString *appScheme = @"";

     //将商品信息拼接成字符串
     NSString *orderSpec = [order description];

     //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
     id signer = CreateRSADataSigner(privateKey);
     NSString *signedString = [signer signString:orderSpec];

     //将签名成功字符串格式化为订单字符串,请严格按照该格式
     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(@"使用支付宝的支付结果 %@",resultDic);
                    }];         
                        }

AppDelegate.m

  - (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
这里写图片描述

“Unknown type name ‘NSString‘ “或者”Unknown type name ‘NSData‘
“等不识别常见类的问题
这是因为缺少Foundation类库和UIKit类库,支付宝Demo中之所以没有出现此错误,是因为在.pch文件中导入过这些类库

解决办法:只需要在出现错误的文件中导入这些类库即可
这里写图片描述
问题2
这里写图片描述

‘openssl/asn1.h‘ file not found
  这是openssl文件夹头文件链接问题,如果openssl文件夹随意拉进项目中,即使添加头文件链接,也可能解决不了此问题,
 这也是问什么一开始就将所需要的文件放到一个新建文件夹中再添加到项目中的原因。

解决办法:Targets->Build Settings->Header Search Path中添加1中建立的aliPaySDK文件夹的路径(拖拽此文件夹至输入框即可)
这里写图片描述
问题3 根据项目需求添加demo中ViewController中的代码 编译后可能会出下面错误

  “OBJC_CLASS$_Product”, referenced from: objc-class-ref in ViewController.o

这里写图片描述
AlipaySDK的demo中将Product的定义写在了ViewControler.h中所致
这里写图片描述
  解决办法:新建Product类,将ViewController中的代码拷贝过去即可。
这里写图片描述

你可能感兴趣的:(iOS开发基础技能,iOS进阶教程)