之前使用人脸身份证校验时,一直返回code=-1提示“照片质量太低”。当时以为是图片太小不清晰,传大一些的图片时又提示“图片过大”,那时弄得很懵因为安卓端能正常调用接口。
经过了一段痛苦的摸索过程,发现图片转成BASE64字符串后还需要对字符串进行URL编码。
 认证比对-人脸身份证认证-人脸识别-人脸身份证校验

/*
 阿里云人脸识别接口
 输入人脸图片(BASE64格式,图片大小小于100k,base64转换时参数需要去掉data:image/jpeg;base64,)、姓名、身份证号,验证身份证号与姓名是否匹配,若匹配,则将匹配的身份证头像与人脸图片进行比对,返回比对分数,由此判断是否为同一人。
 */
- (void)newtAliyunAuthInfo {
    NSString *rz_name = _nameText.text;
    NSString *rz_card = _cardText.text;
    NSString *appcode = @“自己的appcode”;
    NSString *host = @"https://rlsfzdb.market.alicloudapi.com";
    NSString *path = @"/face_id/check";
    NSString *method = @"POST";
    NSString *querys = @"";
    NSString *url = [NSString stringWithFormat:@"%@%@%@",  host,  path , querys];
    
    NSString *baseImgstr = [self encodeToBase64String:_photoIV.image];
    // 必须对base64图片进行URL编码
    baseImgstr = [self URLEncodedString:baseImgstr];
    
    NSString *bodys = [NSString stringWithFormat:@"idcard=%@&image=%@&name=%@",_cardText.text, baseImgstr, _nameText.text];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: url]  cachePolicy:1  timeoutInterval:  90];
    request.HTTPMethod =  method;
    [request addValue: [NSString stringWithFormat:@"APPCODE %@", appcode] forHTTPHeaderField: @"Authorization"];
    [request addValue: @"application/x-www-form-urlencoded; charset=UTF-8" forHTTPHeaderField: @"Content-Type"];
    NSData *data = [bodys dataUsingEncoding: NSUTF8StringEncoding];
    [request setHTTPBody: data];
    NSURLSession *requestSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
    
    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD showHUDAddedTo:KWindow withTitle:@"身份校验中.." animated:YES];
    });
    NSURLSessionDataTask *task = [requestSession dataTaskWithRequest:request
        completionHandler:^(NSData * _Nullable body , NSURLResponse * _Nullable response, NSError * _Nullable error) {
        dispatch_async(dispatch_get_main_queue(), ^{
            [MBProgressHUD hideHUDForView:KWindow animated:YES];
        });
        NSDictionary *responseJSON = [NSJSONSerialization JSONObjectWithData:body options:NSJSONReadingMutableLeaves error:nil];
        if (responseJSON) {
            NSString *code = responseJSON[@"code"];
            if ([code isEqualToString:@"0"]) {
                [self netSaveRealNameObject:responseJSON Name:rz_name Card:rz_card];
            } else {
                NSString *message = responseJSON[@"message"];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [KWindow makeToast:message];
                });
            }
        }
    }];
    [task resume];
}

// UIImage转Base64
- (NSString *)encodeToBase64String:(UIImage *)image {
    UIImage *newImag = [self yasuoImage:image];
    // return [UIImagePNGRepresentation(newImag) base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    NSData *data = UIImageJPEGRepresentation(newImag, 1.0f);
    NSString *encodedImageStr = [data base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return encodedImageStr;
}

// Base64转UIImage
- (UIImage *)decodeBase64ToImage:(NSString *)strEncodeData {
    NSData *data = [[NSData alloc]initWithBase64EncodedString:strEncodeData options:NSDataBase64DecodingIgnoreUnknownCharacters];
    return[UIImage imageWithData:data];
}

// 压缩图片
- (UIImage *)yasuoImage:(UIImage *)image {
    // 图片限制大小100KB
    NSData *tpData = UIImagePNGRepresentation(image);
    NSInteger dxLengh = [tpData length]/1024;
    NSInteger num = 0;
    while (dxLengh >= 100) {
        if (num > 100) {
            break;
        }
        UIImage *tpImg = [UIImage imageWithData:tpData];
        CGSize tpSize = tpImg.size;
        UIImage *newImg = [self scaleToSize:tpImg size:CGSizeMake(tpSize.width*0.8, tpSize.height*0.8)];
        tpData = UIImageJPEGRepresentation(newImg, 1);
        // tpData = UIImageJPEGRepresentation(tpImg,0.5);
        dxLengh = [tpData length]/1024;
        num = num + 1;
    }
    UIImage *rImage = [UIImage imageWithData:tpData];
    return rImage;
}

/// 压缩图片大小 并不是截取图片而是按照size绘制图片
- (UIImage*)scaleToSize:(UIImage*)img size:(CGSize)size {
    // 创建一个基于位图的上下文(context),并将其设置为当前上下文(context)
    UIGraphicsBeginImageContext(size);
    // 绘制改变大小的图片
    [img drawInRect:CGRectMake(0, 0, size.width, size.height)];
    // 从当前context中创建一个改变大小后的图片
    UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    // 使当前的context出堆栈
    UIGraphicsEndImageContext();
    // 保存图片
    // UIImageWriteToSavedPhotosAlbum(scaledImage, nil, nil, nil);
    return scaledImage;
}

/// URLEncode 
- (NSString *)URLEncodedString:(NSString *)tempStr {
    // CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
    // CharactersToLeaveUnescaped = @"[].";
    NSString *unencodedString = tempStr;
    NSString *encodedString = (NSString *) CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)unencodedString, NULL, (CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8));
    return encodedString;
}


 

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐