学无止境

最新版支付宝集成(支付宝SDK更新时间:2016/08/19 )

2016-11-04  本文已影响0人  y夜无眠

支付宝开放平台里App支付iOS集成流程文档:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.nWMATK&treeId=193&articleId=105295&docType=1 注意看文档,看文档,看文档! 重要的事情说三遍...

把SDK里需要的文件全放入新建的文件夹里,一起拖进来!


Paste_Image.png Paste_Image.png

在下图中要添加 RSA 签名

Paste_Image.png

我把支付宝的订单信息单独封装在一个类的方法里面

- (void)alipayWithDictionary:(NSMutableDictionary *)payDict
{
    NSString *partner = @"";
    NSString *seller = @"";

    NSString * privateKey = @"";
    
    //将商品信息赋予AlixPayOrder的成员变量
    Order* order = [Order new];
    
    // NOTE: app_id设置
    order.app_id = partner;
    
    // 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";
    order.notify_url = [NSString stringWithFormat:@"%@apl.php",LinkName];
    // NOTE: sign_type设置
    order.sign_type = @"RSA";
    
    // NOTE: 商品数据
    order.biz_content = [BizContent new];
    order.biz_content.body = [NSString stringWithFormat:@"%@",payDict[@"body"]];
    order.biz_content.subject = [NSString stringWithFormat:@"%@",payDict[@"productName"]];
    order.biz_content.out_trade_no = [NSString stringWithFormat:@"%@",payDict[@"tradeNO"]]; //订单ID(由商家自行制定)
    order.biz_content.timeout_express = @"30m"; //超时时间设置
    order.biz_content.total_amount = [NSString stringWithFormat:@"%@",payDict[@"rmb_fee"]]; //商品价格
//    order.biz_content.total_amount = @"0.01";
    order.biz_content.seller_id = seller;
    
    //将商品信息拼接成字符串
    NSString *orderInfo = [order orderInfoEncoded:NO];
    NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
    NSLog(@"orderSpec = %@",orderInfo);
    
    // NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
    //       需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    
    NSString *signedString = [signer signString:orderInfo];
    
    // NOTE: 如果加签成功,则继续执行支付
    if (signedString != nil) {
//           应用注册scheme,在AliSDKDemo-Info.plist定义URL types
        NSString *appScheme = @"";
//             NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
        NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",orderInfoEncoded, signedString];
        
//                支付宝网页版调用的问题
        NSArray * array = [UIApplication sharedApplication].windows;
        UIWindow * window = [array firstObject];
        [window setHidden:NO];
        
//             NOTE: 调用支付结果开始支付
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"页面返回的结果 = %@",resultDic);
                        //判断
            NSString * resultStatus = resultDic[@"resultStatus"];
            NSLog(@"状态码:%@",resultStatus);
            
//          支付宝网页版调用的问题
            NSArray * array = [UIApplication sharedApplication].windows;
            UIWindow * window = [array firstObject];
            [window setHidden:YES];
            
            [[NSNotificationCenter defaultCenter] postNotificationName:@"alipayStatue" object:nil userInfo:@{@"resultStatus":resultStatus}];

    }];
    }
}

在AppDelegate里处理回调

#pragma mark --9.0以下版本支付宝的回调方法
- (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) {
            
//                      支付宝网页版调用时,window没有隐藏,要在这里隐藏才行
            NSArray * array = [UIApplication sharedApplication].windows;
            UIWindow * window = [array firstObject];
            [window setHidden:YES];
            
            [[NSNotificationCenter defaultCenter] postNotificationName:@"alipayStatue" object:nil userInfo:@{@"resultStatus":resultDic[@"resultStatus"]}];
        }];
    }
    return YES;
}

#pragma mark --9.0以上版本支付宝的回调方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
    NSLog(@"url:%@",url);

    if ([url.host isEqualToString:@"safepay"]){
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            
//                      支付宝网页版调用时,window没有隐藏,要在这里隐藏才行
            NSArray * array = [UIApplication sharedApplication].windows;
            UIWindow * window = [array firstObject];
            [window setHidden:YES];
            
            [[NSNotificationCenter defaultCenter] postNotificationName:@"alipayStatue" object:nil userInfo:@{@"resultStatus":resultDic[@"resultStatus"]}];
        }];
    }
    return YES;
}

还有一些小问题就懒的截图贴上去了,基本上感觉文档看懂了,支付宝集成就那么回事...

上一篇下一篇

猜你喜欢

热点阅读