美文网首页程序员
iOS 集成支付宝支付功能报错:ALI40247

iOS 集成支付宝支付功能报错:ALI40247

作者: 朝雨晚风 | 来源:发表于2017-09-13 14:59 被阅读170次

(一)、前提——已阅读官方开发文档并熟悉了 iOS 集成流程但始终报ALI40247错误,可还没找到问题原因和解决办法的可以参考如下流程

(二)、解决要点

  1. iOS 不支持沙箱环境调试,那是给 Android 同学们使用的,ISO只能先在支付宝开发平台提交上线(很快的,一天就能通过),然后才能使得 APPID 有权限。 1.jpeg
  1. 你的应用必选已经签约生效了,可以像下图一样查看是否生效了。 2.jpeg
  2. 上传应用公钥,检查下应用公钥和私钥是否匹配


    3.jpeg
4.调用支付宝支付的时候,传的参数 orderString 必需是已经进行了 UrlEcode 的字符串。支付宝demo 中是已经 urlEncode 了的,但是如果是从后台返回的签名,你要进行 UrlEnCode编码再拼接之前UrlEncode的商品参数。 4.jpeg

(三)、附上支付的核心代码:

#pragma mark   ==============点击订单模拟支付行为==============
- (void)doAlipayPay
{
    
    NSString *appID = @"123456789";
    
    /*
     *生成订单信息及签名
     */
    //将商品信息赋予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 = @"RSA2";
    
    // 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);
    
    
    
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    params[@"app_id"] =  order.app_id;
    params[@"biz_content"] = order.biz_content;
    params[@"charset"] =  order.charset;
    params[@"method"] =  order.method;
    params[@"sign_type"] =  order.sign_type;
    params[@"timestamp"] =  order.timestamp ;
    params[@"version"] =  order.version;
    
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    [manager POST:@"http://arhere.hotwifibox.com/Alipay/getSign" parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //                 NSLog(@"请求成功:%@", responseObject);
        
        NSDictionary *JSON = [NSJSONSerialization JSONObjectWithData:responseObject options:NSJSONReadingMutableContainers error:nil];
        NSLog(@"JSON = %@",JSON[@"data"]);
        NSString *signedString = JSON[@"data"];
        if (signedString != nil) {
            signedString = [self getUrlStringFromString:signedString];
            NSLog(@"signedString = %@",signedString);
            //应用注册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);
            }];
        }
        
        
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        
        NSLog(@"请求失败:%@", error.description);
    }];
    
}
#pragma mark   ==============对后台返回的 sign 进行 URLEncode==============
- (NSString *)getUrlStringFromString:(NSString *)urlStr{
    NSString *outputStr = (__bridge NSString *)
    CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                            (__bridge CFStringRef)urlStr,
                                            NULL,
                                            (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                            kCFStringEncodingUTF8);
    return outputStr;
}

}

相关文章

  • iOS 集成支付宝支付功能报错:ALI40247

    (一)、前提——已阅读官方开发文档并熟悉了 iOS 集成流程但始终报ALI40247错误,可还没找到问题原因和解决...

  • ios支付宝签名

    支付宝: iOS 支付功能概述 - 简书 1.iOS集成支付宝 - 简书 2.iOS 集成支付宝 - 简书 3.i...

  • iOS支付宝功能集成

    iOS快速集成支付宝详解/支付宝集成获取私钥与公钥 在集成支付宝功能前,我们必须了解下什么支付宝流程,下图是支付宝...

  • iOS Alipay -支付宝

    iOS 集成Alipay -支付宝支付 集成 AliPay - 支付宝

  • 支付宝支付流程(I)

    参考资料:支付宝支付集成支付宝支付集成实现蚂蚁金服iOS支付集成

  • 2019-01-28

    ios 支付宝报错 openssl报错解决方式 集成支付宝的时候,把 有关支付的文件夹放在一起,也就是放在一个大文...

  • iOS 集成支付宝支付SDK遇到的问题

    按照支付宝客户端iOS集成流程集成问题:运行Xcode报错"OBJC_CLASS$_UTDevice", refe...

  • 文章汇总

    ios iOS 网络篇 网络基础总结 支付宝集成 iOS支付宝支付集成 - demo例子集 - 博客园 理解 iO...

  • 支付宝ALI40247

    在新的项目上集成支付宝,包了ALI40247 先说说我这边的解决原因(支付宝PHP文档的示例都是错的): 第一,b...

  • ## [iOS 支付宝支付]

    [iOS开发系列-支付宝支付] 概述 开发中支付通常都会集成支付宝支付,下面讲解支付宝的整体流程。 集成支付宝支付...

网友评论

    本文标题:iOS 集成支付宝支付功能报错:ALI40247

    本文链接:https://www.haomeiwen.com/subject/nktejxtx.html