照着官方文档进行集成即可,因为我这边项目是后期集成的,同时服务器可能会关闭极验验证,走正常的获取验证码流程,所以没有集成到button中。
demo中的方法都不能满足我的需求,进行了部分调整。
在api_1中进行了参数的修改发起请求,在api_2中没有执行提供的默认的二次验证接口,而是调用自己的方法直接实现的。
首先需要接口提供两个链接,用于替换demo中的两个方法,然后创建方法进行注册manager
//网站主部署的用于验证登录的接口 (api_1)
NSString *api1 = @"替换为自己的API1";
//网站主部署的二次验证的接口 (api_2)
NSString *api2 = @"替换为自己的API2";
self.captchaManager = [[GT3CaptchaManager alloc] initWithAPI1:api1 API2:api2 timeout:5.0];
self.captchaManager.delegate = self;
self.captchaManager.maskColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.6];
@weakify(self)
[self.captchaManager registerCaptcha:^{
@strongify(self)
[self.captchaManager startGTCaptchaWithAnimated:YES];
}];
修改api_1中的请求
/** 修改API1的请求 */
- (void)gtCaptcha:(GT3CaptchaManager *)manager willSendRequestAPI1:(NSURLRequest *)originalRequest withReplacedHandler:(void (^)(NSURLRequest *))replacedHandler {
NSMutableURLRequest *mRequest = [originalRequest mutableCopy];
NSString *timestamp = [NSString stringWithFormat:@"%.f", [[NSDate date] timeIntervalSince1970]];
mRequest.URL = originalRequest.URL;
[mRequest setHTTPMethod:@"POST"];
[mRequest setValue:@"ios" forHTTPHeaderField:@"platform"];
[mRequest setValue:appVersion forHTTPHeaderField:@"app-ver"];
[mRequest setValue:deviceId forHTTPHeaderField:@"device-guid"];
[mRequest setValue:osName forHTTPHeaderField:@"os"];
[mRequest setValue:osVersion forHTTPHeaderField:@"os-ver"];
[mRequest setValue:timestamp forHTTPHeaderField:@"unix"];
NSString *mString = [NSString stringWithFormat:@"%@",timestamp];
mString = [NSString stringWithFormat:@"token=%@",[mString md5String]];
[mRequest setHTTPBody:[mString dataUsingEncoding:NSUTF8StringEncoding]];
replacedHandler(mRequest);
}
滑块出现,而后拖动滑块,补全图片之后,会执行下面这个方法获取到api_1返回的参数,将服务器中需要的参数返回给极验。
极验服务器可能会宕机,所以需要服务器处理这种情况,fallback就是处理这种情况的。
//处理API1返回的数据并将初始化数据传给管理器
- (NSDictionary *)gtCaptcha:(GT3CaptchaManager *)manager didReceiveDataFromAPI1:(NSDictionary *)dictionary withError:(GT3Error *)error {
if ([dictionary objectForKey:@"challenge"] && [dictionary objectForKey:@"gt"] && [dictionary objectForKey:@"success"]) {
self.fallback = [NSString stringWithFormat:@"%@", [dictionary objectForKey:@"fallback"]];
return @{
@"challenge" : dictionary[@"challenge"],
@"gt" : dictionary[@"gt"],
@"success" : dictionary[@"success"]
};
};
return @{};
}
因为我这边没有调用默认的二次验证,所以需要执行
- (BOOL)shouldUseDefaultSecondaryValidate:(GT3CaptchaManager *)manager {
return NO;
}
这个时候就会执行下面这个方法,将取到的值通过执行api_2方法返回给服务器,让服务器判断是否正确,根据服务器返回的结果执行接下来的业务逻辑。
- (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveCaptchaCode:(NSString *)code result:(NSDictionary *)result message:(NSString *)message {
if ([result objectForKey:@"geetest_challenge"] && [result objectForKey:@"geetest_seccode"] && [result objectForKey:@"geetest_validate"]) {
self.challenge = [QBUtils clearNullString:result[@"geetest_challenge"]];
self.validate = [QBUtils clearNullString:result[@"geetest_validate"]];
self.seccode = [QBUtils clearNullString:result[@"geetest_seccode"]];
[XMCenter sendRequest:^(XMRequest * _Nonnull request) {
request.api = @"api_2";
request.parameters = @{@"geetest_challenge":self.challenge,
@"geetest_seccode":self.seccode,
@"geetest_validate":self.validate,
@"type":self.type,
@"fallback":self.fallback,
@"mobile":self.mobile};
} onSuccess:^(id _Nullable responseObject) {
[QBUtils toastMessage:responseObject[@"message"]];
self.block(YES);
} onFailure:^(NSError * _Nullable error) {
[self.captchaManager closeGTViewIfIsOpen];
self.block(NO);
}];
}
}
这个时候极验的流程已经走完了,可以正常使用了。
这个时候会出现一个感叹号,这是因为下面这个方法没有实现导致的
- (void)gtCaptcha:(GT3CaptchaManager *)manager didReceiveSecondaryCaptchaData:(NSData *)data response:(NSURLResponse *)response error:(GT3Error *)error decisionHandler:(void (^)(GT3SecondaryCaptchaPolicy))decisionHandler {
DLog(@"该方法不会调用,实现这个方法只是因为这个代理方法是@required");
}
网友评论