iOS集成支付宝支付

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cloud_jianxi/article/details/52302506

1,SDK导入

  1. 下载支付宝demo:支付宝Demo
  2. 解压Demo,进入到路径:Demo/客户端demo/支付宝钱包支付接口开发包标准版(iOS 15.1.6)
  3. 将AlipaySDK.bundle,AlipaySDK.framework导入到项目
  4. 添加依赖,官方文档给的好多依赖,试了下,这几个是必须要加的。TARGETS-General-Linked Frameworks and Libraries添加:
    • libz.tbd
    • libc++.tbd
    • SystemConfiguration.framework
    • CoreTelephony.framework
    • CoreMotion.framework

5,配置URL Schemes
TARGETS-Info-URL Types添加一项,在URL Schemes里边随便一个,注意要有一定唯一性,否则如果和手机中其它app的重复,就会出现调起支付宝支付后不能跳转回app的情况。这里最好是用纯字符,用下划线什么的也会出现支付后无法跳转回app。
6,打开项目info.plist,右键选择Open as - Source code,把这段复制到plist中,保存重新选择Open as - Property List,能正常打开就证明格式对了,除弹窗提示打不开就是标签或者层级不对,修改一下。

<key>NSAppTransportSecurity</key>
 <dict>
  <key>NSAllowsArbitraryLoads</key>
  <true>
  <key>NSExceptionDomains</key>
  <dict>
   <key>alipay.com</key>
   <dict>
    <key>NSIncludesSubdomains</key>
    <true>
    <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
    <true>
    <key>NSTemporaryExceptionMinimumTLSVersion</key>
    <string>TLSv1.0</string>
    <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
    <false>
   </dict>
   <key>alipayobjects.com</key>
   <dict>
    <key>NSIncludesSubdomains</key>
    <true>
    <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
    <true>
    <key>NSTemporaryExceptionMinimumTLSVersion</key>
    <string>TLSv1.0</string>
    <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
    <false>
   </dict>
  </dict>
 </dict>

2,从服务器获取订单信息后调起支付

- (void)touchesBegan:(NSSet<UITouch> *)touches withEvent:(UIEvent *)event {
    // 向服务器请求订单数据,支付宝需要的订单数据是一个字符串
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; //服务器获取订单需要传递的参数
    //假设这里需要传需要支付的订单ID,服务器接到后会根据这个ID向支付宝获取订单数据
    parameters[@"order_id"] = @"";
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:@"服务器获取订单数据的URL" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //用服务器返回的订单信息发起支付
        [self jumpToAlipayWithOrder:responseObject[@"order"]]; 
    } failure:nil];
}

#pragma mark - 根据订单参数调起支付宝客户端支付
- (void)jumpToAlipayWithOrder:(NSString *)order {
    [[AlipaySDK defaultService] payOrder:order fromScheme:appScheme callback:nil]; ///这个block完成了并没有回调
}

3,本地生成订单支付

  • 如果没有服务器来提供生成订单或者需要本地测试,可以在客户端生成订单信息。
  • 将官方Demo中的 Util 和 openssl 两个文件夹导入项目中,注意勾选Copy items if needed。
  • 将官方Demo中的 libcrypto.a 和 libssl.a 导入项目中。
  • TARGETS-BuildSettings-Search Paths-Header Search Paths中添加:$(PROJECT_DIR)/JKRAlipayDemo/AlipayFramewrok
    上面添加的是openssl文件夹的路径,所以根据项目不同而修改吧。
  • 为项目建立pch文件,添加
#import <UIKit>
  • 将官方Demo中的Order.h, Order.m文件导入项目中
    以上配置完毕后,运行项目就应该没有错误了,下面本地生成订单数据:
- (void)touchesBegan:(NSSet<UITouch> *)touches withEvent:(UIEvent *)event {
    /**
    // 向服务器请求订单数据,支付宝需要的订单数据是一个字符串
    NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; //服务器获取订单需要传递的参数
    //假设这里需要传需要支付的订单ID,服务器接到后会根据这个ID向支付宝获取订单数据
    parameters[@"order_id"] = @"";
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager POST:@"服务器获取订单数据的URL" parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //用服务器返回的订单信息发起支付
        [self jumpToAlipayWithOrder:responseObject[@"order"]]; 
    } failure:nil];
     */

    NSString *partner = @"2088xxxxxxxxxxxx";                   // 合作者身份(PID)
    NSString *seller = @"xxxxxx@foxmail.com";                  // 支付宝收款账号
    NSString *privateKey = @"xxxxxxxxxxxxxx";                 // 商户方的私钥

    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.sellerID = seller;
    order.outTradeNO = [self generateTradeNO];                  // 订单ID
    order.subject = @"1";                                       // 商品标题
    order.body = @"没有钱怎么办";                                 // 商品描述
    order.totalFee = @"0.01";                                   // 商品价格
    order.notifyURL = @"http://www.baidu.com";                  // 回调URL
    order.service = @"mobile.securitypay.pay";                  // 固定为mobile.securitypay.pay
    order.paymentType = @"1";                                   // 支付类型,1:商品购买
    order.inputCharset = @"utf-8";                              // 商户网站使用的编码格式,固定为utf-8
    order.itBPay = @"30m";                                      // 设置未付款交易的超时时间
    order.showURL = @"m.alipay.com";                            // 商品地址

    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);

    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];

    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        [self jumpToAlipayWithOrder:orderString];
    }
}

#pragma mark - 根据订单参数调起支付宝客户端支付
- (void)jumpToAlipayWithOrder:(NSString *)order {
    [[AlipaySDK defaultService] payOrder:order fromScheme:appScheme callback:nil]; ///这个block完成了并没有回调
}

#pragma mark 生成随机订单号
- (NSString *)generateTradeNO {
    static int kNumber = 15;
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++) {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}

4,处理支付结果

AppDelegate.m中

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

    if ([url.host isEqualToString:@"safepay"]) {
        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            if ([resultDic[@"resultStatus"] isEqualToString:@"9000"]) {
                NSLog(@"支付成功");
            } else {
                NSLog(@"支付失败");
            }
        }];
    }
    return YES;
}

// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    if ([url.host isEqualToString:@"safepay"]) {
        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
            if ([resultDic[@"resultStatus"] isEqualToString:@"9000"]) {
                NSLog(@"支付成功");
            } else {
                NSLog(@"支付失败");
            }
        }];
    }
    return YES;
}

5,Demo下载

Github: https://github.com/Joker-388/AlipayDemo.git

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页