美文网首页
极验(geetest)集成到iOS项目中

极验(geetest)集成到iOS项目中

作者: 远方有田 | 来源:发表于2018-03-16 15:10 被阅读0次

    首先上官网找到技术文档,然后下载sdk

    照着官方文档进行集成即可,因为我这边项目是后期集成的,同时服务器可能会关闭极验验证,走正常的获取验证码流程,所以没有集成到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");

    }

    相关文章

      网友评论

          本文标题:极验(geetest)集成到iOS项目中

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