iOS-支付宝集成流程

支付流程:

iOS-支付宝集成流程_第1张图片
用户支付流程.png

集成流程

1. 创建应用

平台包括:iOS、安卓、双平台。

需要填写信息:应用名称、应用简介、iOS bundle ID、android应用包名、android签名、支付宝网关、应用网关(选填)、授权回调地址、接口内容加密方式(一般使用AES)。

添加功能:App支付、web支付、快捷手机web支付、刷脸支付等功能。

以上信息需要审核通过才能分配AppID

2. 集成方式

集成方式:通过 CocoaPods 导入、手动导入。

CocoaPods:在Podsfile文件中加入pod 'AlipaySDK-iOS',然后pod install

手动导入:需要把资源包和SDKAlipaySDK.bundleAlipaySDK.framework导入工程中。

这里有个问题:不同版本SDK对应不同的场景,目前两种SDK,一种是集成了UTDID库,一种是没有集成UTDID库,有其他三方SDK(友盟安全组件SDK)也包含UTDID库,导致同一个库重复引用

添加依赖库:

在 Build Phases 选项卡的 Link Binary With Libraries 中,增加以下依赖:libc++.tbdlibz.tbdSystemConfiguration.frameworkCoreTelephony.frameworkQuartzCore.frameworkCoreText.frameworkCoreGraphics.frameworkUIKit.frameworkFoundation.frameworkCFNetwork.frameworkCoreMotion.framework,最后还需要把AlipaySDK.framework也加入依赖库。

需要注意:添加依赖库除AlipaySDK.framework都是系统依赖库,可以直接查找到,三方或私有依赖库需要手动拖入

这里,集成就已经完成

3. 开发:
先了解一下支付宝工作流程:

iOS-支付宝集成流程_第2张图片
工作流程.png

在需要的支付的类中添加头文件:

import 

组装支付宝信息:

//将商品信息赋予AlixPayOrder的成员变量
Order* order = [Order 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 = @"RSA";

// NOTE: 商品数据
order.biz_content = [BizContent 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);

// NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
//       需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];

// 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);
    }];
}

其中需要注意的点:

  1. 需要摘取demo中的订单信息 Order(订单)、Authinfo(授权信息)类,其中支付宝写好的属性和写好的商品信息拼接方法可以直接调用。
  2. 私钥一定要放在服务器,从服务器获取私钥签名过的信息。
  3. 调起支付宝时需要传入 Url scheme,要区分其他App,有一定个性化标识度。否则支付宝无法跳回自己的App。

配置返回Url的处理方法:

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary *)options
{
    if ([url.host isEqualToString:@"safepay"]) {
        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}

需要注意:

  1. 位置在Appdelegate中,app 代理回调中,此方法是适用iOS9以后App处理方式,现在一般都适配iOS9以上。
  2. 支付完成后回到自己App中的处理方式。
  3. 所有的从第三方应用回跳后都走这个方法,通过不同三方app的url进行判断,做不同的操作。

完成!

调研支付宝处理商品信息规则:

  1. 把商品信息转jsonString。
  2. 把订单信息和商品信息通过key进行a~z的排序拼接,转为jsonString。
  3. 把jsonString通过签名加密,赋值给sign。
  4. 把赋值好的sign拼接在已经存在的jsonString后,通过支付宝API调起支付宝。

你可能感兴趣的:(iOS-支付宝集成流程)