ios 支付宝支付

https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.GOAs0g&treeId=59&articleId=103676&docType=1

步骤1:启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下,并导入到项目工程中。

1
2
AlipaySDK.bundle
AlipaySDK.framework

在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:

image

其中,需要注意的是:

  • 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
  • 如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib(如下图)。
    image

步骤2:在需要调用AlipaySDK的文件中,增加头文件引用。

1
# import <AlipaySDK/AlipaySDK.h>

步骤3:如果你的app基于9.0编译,那么为了适配iOS9.0中的App Transport Security(ATS)对http的限制,这里需要对支付宝的请求地址alipay.com、alipayobjects.com做例外,在app对应的info.list中添加如下配置(文中以XML格式描述)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<key>NSAppTransportSecurity</key>
     <dict>
         <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>

说明:

如果商户配置了如下的配置:

1
2
3
4
<key>NSAppTransportSecurity</key>
     <dict>   
         <key>NSAllowsArbitraryLoads</key>< true />
     </dict>

则上述的NSAppTransportSecurity可以不配置。

步骤4配置请求信息:

#import <AlipaySDK/AlipaySDK.h>


#import "Order.h"

#import "DataSigner.h"


 /**
     *  URl types 添加一项必须和以下appScheme字段一样
     导入支付宝sdk(AlipaySDK.bundle和AlipaySDK.framework)时一定导入官方demo里的库,下载的sdk包导入会报错。这是个坑
     如果是前台生成签名和预订单,导入oppenssl和Util可能会报错,#include <openssl/asn1.h>
     头文件找不到等-检查路劲Build setting中Header Search Paths 和Library Search Paths --$(PROJECT_DIR)/支付宝   可能然并卵,改为这种格式即可#include <asn1.h>,所以带openssl都要删,改为绝对路劲即可

     */
    
#pragma mark - 服务器生成预订单返回参数
    
    NSString * path = @"http://guofang.tunnel.qydev.com/videoApp/aliPay/aliOrde/";
    NSString * params =[NSString stringWithFormat:@""];
    NSMutableURLRequest *request= [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]];
    
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
    
    
    AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
    
    [operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSDictionary *json = [NSJSONSerialization JSONObjectWithData:responseObject options:0 error:nil];
        NSLog(@"-----%@",json);
        /**
         此为打印的json
         *   -----{
         "PAY_ORDER_ID" = 74116464d54842e893813d9b3a328000;
         "_input_charset" = "utf-8";
         body = 74116464d54842e893813d9b3a328000;
         "it_b_pay" = 30m;
         msg = "\U9884\U652f\U4ed8\U8ba2\U5355\U751f\U6210\U6210\U529f";
         "notify_url" = "http://guofang.tunnel.qydev.com/videoApp/aliPay/aliBack";
         "out_trade_no" = 050910423796064;
         partner = 2088221663575744;
         "payment_type" = 1;
         "seller_id" = "zhangfantuoba@163.com";
         service = "mobile.securitypay.pay";
         sign = "vAQdpw7zVTx8nnItXsBwhUSR8ziDRDcizvup1iG5ANhVhzPG52%2BFf61vcAmcbFSbqu6Agg9pDQ%2F4dUcjYt7X8xVPkGOPhl8nDbL5LJU8nivzqKhsRHdZyMLiKB7n0VqF%2FeET%2BiALV9Vy9xwgJKjQ1xDQr588INhV8LuPzf4w9pc%3D";
         "sign_type" = RSA;
         status = success;
         subject = "\U6d4b\U8bd5\U5546\U54c1";
         "total_fee" = "0.01";
         }
         */
        
        PAY_ORDER_ID = json[@"PAY_ORDER_ID"];
        _input_charset = json[@"_input_charset"];
        body = json[@"body"];
        it_b_pay = json[@"it_b_pay"];
        notify_url = json[@"notify_url"];
        out_trade_no = json[@"out_trade_no"];
        partner = json[@"partner"];
        payment_type = json[@"payment_type"];
        seller_id = json[@"seller_id"];
        service = json[@"service"];
        sign = json[@"sign"];
        sign_type = json[@"sign_type"];
        subject = json[@"subject"];
        total_fee = json[@"total_fee"];
        showURL = @"m.alipay.com";//这个参数一定要拼
        NSString * zhifu = [NSString stringWithFormat:@"partner=\"%@\"&seller_id=\"%@\"&out_trade_no=\"%@\"&subject=\"%@\"&body=\"%@\"&total_fee=\"%@\"¬ify_url=\"%@\"&service=\"%@\"&payment_type=\"%@\"&_input_charset=\"%@\"&it_b_pay=\"%@\"&show_url=\"%@\"",partner,seller_id,out_trade_no,subject,body,total_fee,notify_url,service,payment_type,_input_charset,it_b_pay,showURL];
//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
        NSString *appScheme = @"alisdkdemo";
        
        NSString * orderSpec = zhifu;
//AL164 参数为空或密钥错误,或签名失败
       NSString * orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec,sign,sign_type];
//sign 为:商品信息和密钥 签名而得,服务器生成返回的。前台生成如下发示例
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"reslut = %@",resultDic);
        }];

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
        NSLog(@"请求失败");
    }];
    [operation start];


#pragma mark -  以下为本地生成预订单信息 - 本地生成时官方demo里文件都需导入。libcryto.a libssl.a Order.h 和.m openssl文件和util文件,demo运行是可能报错,私钥找不到什么的, 修改 在RSADataSigner.m文件中 搜索代码 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"]; 将其改成 [result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];

在RSADataSigner.m文件中 搜索代码 [result appendString:@"\n-----END PRIVATE KEY-----"]; 将其改成 [result appendString:@"\n-----END RSA PRIVATE KEY-----"];
#warning 这三个参数打死也不能告诉别人哦。
//    NSString *partners = @"商户号";//必填
//    NSString *seller = @"付款账号";//必填
//    NSString *privateKey = @"私钥";//必填
//
//    /*
//     *生成订单信息及签名
//     */
//    //将商品信息赋予AlixPayOrder的成员变量
//    Order *order = [[Order alloc] init];
//    order.partner = partners;
//    order.sellerID = seller;
//    order.outTradeNO = @"S3M7GI9K2EGYCV7"; //订单ID(由商家自行制定)
//    order.subject = @"测试"; //商品标题
//    order.body = @"不要钱"; //商品描述
//    order.totalFee = [NSString stringWithFormat:@"0.01"]; //商品价格
//    order.notifyURL =  @"http://www.xxx.com"; //回调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
//    NSString *appScheme = @"alisdkdemo";
//    
//    //将商品信息拼接成字符串
//    NSString *orderSpec = [order description];
//    NSLog(@"orderSpec = %@",orderSpec);
//    
//    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
//    id<DataSigner> signer = CreateRSADataSigner(privateKey);
//    NSString *signedString = [signer signString:orderSpec];
    NSString * signedString = privateKey;
//    //将签名成功字符串格式化为订单字符串,请严格按照该格式
//    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);
//        }];
//    }

步骤5,设置支付成功回调:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    // 可通过url.host 来判断支付宝返回的回调 或微信等
    if ([url.host isEqualToString:@"safepay"]) {
        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSString * strTitle = @"支付结果";
            //  NSLog(@"result = %@----%@",resultDic,[resultDic objectForKey:@"resultStatus"]);
            if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) {
                alipay = @"成功";
                aliMsg = @"您已支付成功,若还提示您付费,请使用自助激活功能。";
            }else{
                alipay = @"失败";
                aliMsg = @"支付结果:失败!";
                
            }
            
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:aliMsg delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
            alert.delegate = self;
            alert.tag = 1;
            [alert show];
            
        }];
    }
    return YES;
}



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值