iOS集成支付宝

本文档详述了在iOS项目中集成支付宝的过程,包括下载SDK,导入所需文件,配置依赖库,设置Header Search Paths,引入必要的头文件,以及实现支付按钮事件处理和用户未安装支付宝时的处理。通过后台提供的参数生成订单字符串,结合APPScheme完成支付流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中用到了支付,之前也做过,不过时候到在做的时候又要查文档,感觉很麻烦,所以在这整理下具体的流程以及在集成过程中遇到的一些问题。

1.下载支付宝SDK,附上链接:
https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1

2.将下载后的Demo中的这些文件导入到你的工程里面

这里写图片描述

在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
这里写图片描述

注意:”AlipaySDK.framework”、”libcrypto.a”、”libssl.a”这三个依赖库最好也导入进去,中间需要配置
这里写图片描述
不过一般做项目的时候这个已经配置过,就不再累赘。

然后在Build Setting->Search Paths->Header Search Paths添加”$(SRCROOT)/aliPaySDK”
这里写图片描述

编译,没问题准备工作就OK了。出了问题仔细检查下是否哪里错误。

3.在你要进行支付的页面导入以下三个头文件
这里写图片描述
在你要进行支付的按钮事件中编写如下代码

#pragma mark - 支付宝支付
- (void)aliPay
{
    //应用注册scheme,在Info.plist定义URL types
    NSString *appScheme = @"aliPay12chu";

    //订单字符串
    NSString *orderString = [self getOrderInfoString];

    //创建支付单例
    [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {

         if ([resultDic[@"resultStatus"] intValue] == 9000) {
             [Utility popWithString:@"充值成功" onView:appDelegate.window];
         } else {
             [Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
         }
     }];

}

/**
 *  获取订单字符串
 */
- (NSString *)getOrderInfoString
{
    //将商品信息赋予AlixPayOrder的成员变量,生成订单信息及签名
    Order *order = [[Order alloc] init];

    /*********************************支付四要素*********************************/
    //商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)。
    order.partner = self.alipayDictionary[@"partner"];
    //卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
    order.sellerID = self.alipayDictionary[@"seller_id"];
    //商户网站商品对应的唯一订单号,订单ID(由商家自行制定)
    order.outTradeNO = self.alipayDictionary[@"out_trade_no"];
    //该笔订单的资金总额,单位为RMB(Yuan)。取值范围为[0.01,100000000.00],精确到小数点后两位。
    order.totalFee = self.alipayDictionary[@"total_fee"];

    /*********************************商品相关*********************************/
    //商品的标题/交易标题/订单标题/订单关键字等。
    order.subject = self.alipayDictionary[@"subject"];
    //对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
    order.body = self.alipayDictionary[@"body"];

    /*********************************其他必传参数*********************************/
    //接口名称,固定为mobile.securitypay.pay。
    order.service = self.alipayDictionary[@"service"];
    //商户网站使用的编码格式,固定为utf-8。
    order.inputCharset = self.alipayDictionary[@"_input_charset"];
    //支付宝服务器主动通知商户网站里指定的页面http路径。
    order.notifyURL = self.alipayDictionary[@"notify_url"];

    /*********************************可选参数*********************************/
    //商品购买
    order.paymentType = self.alipayDictionary[@"payment_type"];
    //设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭
    order.itBPay = @"30m";
    //商品地址
    order.showURL = @"m.alipay.com";

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

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

    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;

    if (signedString != nil) {
        //订单字符串
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderInfo, signedString, self.alipayDictionary[@"sign_type"]];
        return orderString;
    } else { //签名为空
        return nil;
    }
}

支付宝支付的具体流程就是根据商户在支付宝注册的商户ID以及私钥等一系列参数按照一定规则生成订单字符串。再通过订单字符串与APPScheme通过支付对象完成整个支付的流程。以上的所有参数均由后台给出,APPScheme可自己定义,定义如下图
这里写图片描述
到这,网页支付就能完成。
以上情况是针对用户没安装支付宝直接在网页上进行付款的情况。

如果用户在支付宝钱包进行付款的话,还需要做以下操作:
在AppDelegate导入”AlipaySDK/AlipaySDK.h”头文件,并且添加下面两个方法

//9.0以上调用这个方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{   
    //支付宝回调
    if ([url.host isEqualToString:@"safepay"]) {
        //这个是进程KILL掉之后也会调用,这个只是第一次授权回调,同时也会返回支付信息
        [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            if ([resultDic[@"resultStatus"] intValue] == 9000) {
                //支付宝支付成功返回付款成功页面
                [Utility popWithString:@"支付成功" onView:appDelegate.window];
                //支付宝钱包无法返回APP,发送一个通知,到之前支付界面添加观察者,通知支付完成接下来该做的事情
                [[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];

            } else {
                [Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
            }
        }];

        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            if ([resultDic[@"resultStatus"] intValue] == 9000) {
                //支付宝支付成功返回付款成功页面
                [Utility popWithString:@"支付成功" onView:appDelegate.window];
                [[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];

            } else {
                [Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
            }
        }];
    }
    return YES;
}

//iOS9.0以下调用这个方法
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{   
    //支付宝回调
    if ([url.host isEqualToString:@"safepay"]) {

        [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
            if ([resultDic[@"resultStatus"] intValue] == 9000) {
                //支付宝支付成功返回付款成功页面
                [Utility popWithString:@"支付成功" onView:appDelegate.window];
                [[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];

            } else {
                [Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
            }
        }];

        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            if ([resultDic[@"resultStatus"] intValue] == 9000) {
                //支付宝支付成功返回付款成功页面
                [Utility popWithString:@"支付成功" onView:appDelegate.window];
                [[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];

            } else {
                [Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
            }
        }];
    }
    return  YES ;
}

大功告成!!!!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值