程序员

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

2017-09-13  本文已影响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;
}

}
上一篇下一篇

猜你喜欢

热点阅读