美文网首页程序员
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

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