Ejemplo n.º 1
0
        // ---

        public async Task <string> GetRedirect(UserData user, string ticketId, string userRedirectUrl, string callbackUrl)
        {
            var ret = (string)null;

            var fields = new Parameters()
                         .Set("method", "")
                         .Set("client_id", _opts.ClientId)
                         .Set("reference", ticketId)
                         .Set("first_name", user.FirstName)
                         .Set("last_name", user.LastName)
                         .Set("country", user.CountryCode)
                         .Set("dob", user.DoB.ToString("yyyy-MM-dd"))
                         .Set("phone_number", "+" + user.PhoneNumber.Trim('+'))
                         .Set("callback_url", callbackUrl)
                         .Set("redirect_url", userRedirectUrl)
                         .Set("background_checks", "0")
            ;

            fields.Set("signature", CalcSignature(fields.GetDictionary()));

            using (var req = new Request(_logger)) {
                await req
                .AcceptJson()
                .BodyForm(fields)
                .OnResult(async(res) => {
                    var raw = await res.ToRawString();

                    var result = new ServiceJsonResponse();
                    if (Json.ParseInto(raw, result) && CheckCallbackSignature(raw))
                    {
                        if (result.status_code == "SP2")
                        {
                            ret = result.message;
                        }
                        else
                        {
                            _logger?.Error("Failed to get redirect: {0} with message: {1}", result.status_code, result.message);
                        }
                    }
                    else
                    {
                        _logger?.Error("Failed to parse response or invalid signature");
                    }
                })
                .SendPost("https://api.shuftipro.com/")
                ;
            }

            return(ret);
        }
Ejemplo n.º 2
0
        public async Task <CallbackResult> OnServiceCallback(HttpRequest request)
        {
            var ret = new CallbackResult()
            {
                OverallStatus = VerificationStatus.Pending,
            };

            try {
                var result     = new ServiceJsonResponse();
                var resultDict = new Dictionary <string, string>();

                var raw = "";
                using (var reader = new StreamReader(request.Body)) {
                    raw = await reader.ReadToEndAsync();
                }

                if (!Json.ParseInto(raw, result) || result.signature == null)
                {
                    throw new Exception("Failed to parse response");
                }

                if (!CheckCallbackSignature(Json.Stringify(result)))
                {
                    throw new Exception("Invalid signature");
                }

                var finalStatus =
                    result.status_code == "SP0" ||                  // verified
                    result.status_code == "SP1"                     // not verified
                ;

                if (finalStatus)
                {
                    ret.OverallStatus  = result.status_code == "SP1"? VerificationStatus.Verified: VerificationStatus.NotVerified;
                    ret.TicketId       = result.reference;
                    ret.ServiceStatus  = result.status_code;
                    ret.ServiceMessage = result.message;
                }

                _logger?.Info("Callback code {0} for ref {1}: {2}", result.status_code, result.reference, result.message);
            } catch (Exception e) {
                ret.OverallStatus = VerificationStatus.Fail;
                _logger?.Info(e, "Callback failure");
            }

            return(ret);
        }
Ejemplo n.º 3
0
        public async Task <CallbackResult> OnServiceCallback(HttpRequest request)
        {
            var ret = new CallbackResult()
            {
                OverallStatus = VerificationStatus.Pending,
            };

            try {
                var result = new ServiceJsonResponse();

                var raw = "";
                using (var reader = new StreamReader(request.Body)) {
                    raw = await reader.ReadToEndAsync();
                }

                if (!request.Headers.TryGetValue("SIGNATURE", out var sigs) || sigs.Count != 1)
                {
                    throw new Exception("Missing signature");
                }
                if (!CheckCallbackSignature(raw, sigs[0]))
                {
                    throw new Exception("Invalid signature");
                }

                if (!Json.ParseInto(raw, result))
                {
                    throw new Exception("Failed to parse response");
                }

                if (result.@event != "request.pending")
                {
                    ret.OverallStatus  = result.@event == "verification.accepted"? VerificationStatus.Verified: VerificationStatus.NotVerified;
                    ret.TicketId       = result.reference;
                    ret.ServiceStatus  = result.@event;
                    ret.ServiceMessage = result.@event;
                }

                _logger?.Information("Callback event is {0} for ref {1}", result.@event, result.reference);
            } catch (Exception e) {
                ret.OverallStatus = VerificationStatus.Fail;
                _logger?.Error(e, "Callback failure");
            }

            return(ret);
        }
Ejemplo n.º 4
0
        // ---

        public async Task <string> GetRedirect(UserData user, string ticketId, string userRedirectUrl, string callbackUrl)
        {
            var ret = (string)null;

            var bodyJson = Json.Stringify(
                new {
                reference         = ticketId,
                redirect_url      = userRedirectUrl,
                callback_url      = callbackUrl,
                email             = user.Email,
                country           = user.CountryCode,
                language          = user.LanguageCode,
                verification_mode = "video_only",
                face     = "",
                document = new {
                    supported_types = new[] { "id_card", "driving_license", "passport" },
                    name            = new {
                        first_name = user.FirstName,
                        last_name  = user.LastName,
                    },
                    dob = user.DoB.ToString("yyyy-MM-dd"),
                },
                // "+" + user.PhoneNumber.Trim('+')
            }
                );

            using (var req = new Request(_logger)) {
                await req
                .AcceptJson()
                .AuthBasic($"{_opts.ClientId}:{_opts.ClientSecret}", true)
                .BodyJson(bodyJson)
                .OnResult(async(res) => {
                    var raw = await res.ToRawString();

                    var sig = res.GetHeader("SIGNATURE");
                    if (sig.Length != 1)
                    {
                        _logger?.Error("Missing signature");
                        return;
                    }

                    var result = new ServiceJsonResponse();
                    if (Json.ParseInto(raw, result) && CheckCallbackSignature(raw, sig[0]))
                    {
                        if (result.@event == "request.pending" && result.verification_url != "")
                        {
                            ret = result.verification_url;
                        }
                        else
                        {
                            _logger?.Error("Failed to get redirect: {0} with url: {1}", result.@event, result.verification_url);
                        }
                    }
                    else
                    {
                        _logger?.Error("Failed to parse response or invalid signature");
                    }
                })
                .SendPost("https://shuftipro.com/api/")
                ;
            }

            return(ret);
        }