NodeJS
Aprenda a integrar a API CPF do SintegraWS com NodeJS utilizando exemplos de código práticos.
Valide CPFs em tempo real em seu sistema de forma rápida e eficiente. Siga o exemplo abaixo para implementar a API CPF com NodeJS no seu ambiente de desenvolvimento e aprimorar a confiabilidade do seu sistema.
(async () => {
// Aqui você define os valores do token, CPF e data de nascimento:
// Este código assume Node.js 18+ com fetch e AbortController nativos
const token = 'SEU_TOKEN_AQUI';
const cpf = '12345678901';
const dataNascimento = '03061988';
// Validando o CPF antes de proceder
if (!isValidCPF(cpf)) {
console.error("CPF inválido!");
return;
}
// Montando a URL com parâmetros codificados
const url = `https://www.sintegraws.com.br/api/v1/execute-api.php?token=${encodeURIComponent(token)}&cpf=${encodeURIComponent(cpf)}&data-nascimento=${encodeURIComponent(dataNascimento)}&plugin=CPF`;
// Criar AbortController para implementar o timeout manualmente
const controller = new AbortController();
const signal = controller.signal;
// Timeout de 120 segundos
const timeout = setTimeout(() => {
controller.abort();
}, 120000);
try {
const response = await fetch(url, { signal });
if (!response.ok) {
throw new Error(`Erro na requisição: ${response.status} ${response.statusText}`);
}
const data = await response.json();
if (data.status === "OK") {
console.log("Status está OK!");
} else {
console.log("Status não está OK ou não encontrado.");
}
} catch (error) {
console.error('Erro ao chamar a API:', error);
} finally {
clearTimeout(timeout);
}
})();
// Essa função é utilizada para validar o CPF antes de realizar a chamada na API
function isValidCPF(cpf) {
cpf = cpf.replace(/[^\d]+/g, '');
if (cpf.length !== 11) return false;
if (/^(.)\1+$/.test(cpf)) return false;
let add = 0;
for (let i = 0; i < 9; i++) {
add += parseInt(cpf.charAt(i)) * (10 - i);
}
let rev = 11 - (add % 11);
rev = (rev > 9) ? 0 : rev;
if (rev !== parseInt(cpf.charAt(9))) return false;
add = 0;
for (let i = 0; i < 10; i++) {
add += parseInt(cpf.charAt(i)) * (11 - i);
}
rev = 11 - (add % 11);
rev = (rev > 9) ? 0 : rev;
return (rev === parseInt(cpf.charAt(10)));
}
(async () => {
// Aqui você define os valores do token, CPF e data de nascimento:
const token = 'SEU_TOKEN_AQUI';
const cpf = '12345678901'; // Exemplo de CPF sem pontuação
const dataNascimento = '03061988'; // Ajuste o formato conforme a API exige
// Antes de tudo, validar o CPF
if (!isValidCPF(cpf)) {
console.error("CPF inválido!");
return;
}
// Montando a URL com os parâmetros codificados para evitar problemas com caracteres especiais
const url = `https://www.sintegraws.com.br/api/v1/execute-api.php?token=${encodeURIComponent(token)}&cpf=${encodeURIComponent(cpf)}&data-nascimento=${encodeURIComponent(dataNascimento)}&plugin=CPF`;
// Criamos um AbortController para permitir cancelar a requisição, caso atinja o timeout
const controller = new AbortController();
const signal = controller.signal;
// Definimos um timeout de 120 segundos (120.000 milissegundos).
// Se a requisição não responder nesse tempo, abortamos.
const timeout = setTimeout(() => {
controller.abort();
}, 120000);
try {
// Fazendo a requisição GET usando fetch e aguardando a resposta.
// Passamos o 'signal' do AbortController para poder abortar se necessário.
const response = await fetch(url, { signal });
// Verificando se o status da resposta é OK (200)
if (!response.ok) {
// Se não for, lançamos um erro para cair no bloco catch
throw new Error(`Erro na requisição: ${response.status} ${response.statusText}`);
}
// Convertendo a resposta para JSON
const data = await response.json();
// Aqui você pode manipular os dados retornados da API.
// Vamos apenas verificar se o campo "status" é "OK"
if (data.status === "OK") {
console.log("Status está OK!");
} else {
console.log("Status não está OK ou não encontrado.");
}
} catch (error) {
// Tratando qualquer erro que possa ocorrer durante a requisição ou o processamento,
// incluindo o erro de timeout (AbortError) ou problemas de rede.
console.error('Erro ao chamar a API:', error);
} finally {
// Limpamos o timeout, garantindo que não fique pendente após o término da operação.
clearTimeout(timeout);
}
})();
// Essa função é utilizada para validar o CPF antes de realizar a chamada na API
function isValidCPF(cpf) {
// Remove todos os caracteres não-numéricos
cpf = cpf.replace(/[^\d]+/g, '');
// Verifica se tem 11 dígitos
if (cpf.length !== 11) return false;
// Verifica se todos os dígitos são iguais
if (/^(.)\1+$/.test(cpf)) return false;
let add = 0;
for (let i = 0; i < 9; i++) {
add += parseInt(cpf.charAt(i)) * (10 - i);
}
let rev = 11 - (add % 11);
rev = (rev === 10 || rev === 11) ? 0 : rev;
if (rev !== parseInt(cpf.charAt(9))) return false;
add = 0;
for (let i = 0; i < 10; i++) {
add += parseInt(cpf.charAt(i)) * (11 - i);
}
rev = 11 - (add % 11);
rev = (rev === 10 || rev === 11) ? 0 : rev;
return (rev === parseInt(cpf.charAt(10)));
}
package main
import (
"context"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"time"
)
func main() {
// Definir valores de token, CPF e data de nascimento
token := "SEU_TOKEN_AQUI"
cpf := "12345678901"
dataNascimento := "03061988"
// Validar CPF
if !isValidCPF(cpf) {
fmt.Println("CPF inválido!")
return
}
// Construir a URL com parâmetros
baseURL := "https://www.sintegraws.com.br/api/v1/execute-api.php"
params := url.Values{}
params.Set("token", token)
params.Set("cpf", cpf)
params.Set("data-nascimento", dataNascimento)
params.Set("plugin", "CPF")
finalURL := fmt.Sprintf("%s?%s", baseURL, params.Encode())
// Contexto com timeout de 120s
ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(ctx, "GET", finalURL, nil)
if err != nil {
fmt.Println("Erro ao criar a requisição:", err)
return
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Erro ao chamar a API:", err)
return
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
fmt.Printf("Erro na requisição: %d\n", resp.StatusCode)
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println("Erro ao ler a resposta:", err)
return
}
var result map[string]interface{}
if err := json.Unmarshal(body, &result); err != nil {
fmt.Println("Erro ao decodificar JSON:", err)
return
}
if status, ok := result["status"].(string); ok && status == "OK" {
fmt.Println("Status está OK!")
} else {
fmt.Println("Status não está OK ou não encontrado.")
}
}
// Essa função é utilizada para validar o CPF antes de realizar a chamada na API
func isValidCPF(cpf string) bool {
var digits []rune
for _, c := range cpf {
if c >= '0' && c <= '9' {
digits = append(digits, c)
}
}
if len(digits) != 11 {
return false
}
allSame := true
for i := 1; i < 11; i++ {
if digits[i] != digits[0] {
allSame = false
break
}
}
if allSame {
return false
}
sum := 0
for i := 0; i < 9; i++ {
sum += int(digits[i]-'0') * (10 - i)
}
rest := 11 - (sum % 11)
if rest == 10 || rest == 11 {
rest = 0
}
if rest != int(digits[9]-'0') {
return false
}
sum = 0
for i := 0; i < 10; i++ {
sum += int(digits[i]-'0') * (11 - i)
}
rest = 11 - (sum % 11)
if rest == 10 || rest == 11 {
rest = 0
}
return rest == int(digits[10]-'0')
}
// Aqui você define os valores do token, CPF e data de nascimento:
$token = "SEU_TOKEN_AQUI";
$cpf = "12345678901";
$dataNascimento = "03061988";
// Validar CPF antes de prosseguir
if (!isValidCPF($cpf)) {
echo "CPF inválido!";
exit;
}
// Montar a URL com parâmetros codificados
$baseURL = "https://www.sintegraws.com.br/api/v1/execute-api.php";
$params = [
"token" => $token,
"cpf" => $cpf,
"data-nascimento" => $dataNascimento,
"plugin" => "CPF",
];
// URL final
$url = $baseURL . "?" . http_build_query($params);
// Iniciar cURL e definir timeout de 120 segundos
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
// Executar a requisição
$response = curl_exec($ch);
// Verificar se ocorreu algum erro no cURL
if (curl_errno($ch)) {
$error = curl_error($ch);
curl_close($ch);
echo "Erro ao chamar a API: " . $error;
exit;
}
// Verificar o código de status HTTP
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode !== 200) {
echo "Erro na requisição: $httpCode\n";
exit;
}
// Converter resposta para JSON
$data = json_decode($response, true);
if (json_last_error() !== JSON_ERROR_NONE) {
echo "Erro ao decodificar JSON: " . json_last_error_msg();
exit;
}
// Verificar se o campo "status" é "OK"
if (isset($data["status"]) && $data["status"] === "OK") {
echo "Status está OK!\n";
} else {
echo "Status não está OK ou não encontrado.\n";
}
// Função para validar CPF em PHP
// Remove não dígitos, verifica se não é uma sequência repetida
// e calcula os dígitos verificadores conforme a regra do CPF.
function isValidCPF($cpf) {
$cpf = preg_replace('/\D/', '', $cpf);
if (strlen($cpf) != 11) return false;
if (preg_match('/(\d)\1{10}/', $cpf)) return false;
for ($t = 9; $t < 11; $t++) {
$d = 0;
for ($c = 0; $c < $t; $c++) {
$d += $cpf[$c] * (($t + 1) - $c);
}
$d = 11 - ($d % 11);
$d = ($d > 9) ? 0 : $d;
if ($cpf[$t] != $d) return false;
}
return true;
}
import requests
# Definir valores de token, CPF e data de nascimento
token = "SEU_TOKEN_AQUI"
cpf = "12345678901"
data_nascimento = "03061988"
# Validar CPF antes de prosseguir
if not isValidCPF(cpf):
print("CPF inválido!")
exit()
# Montar a URL e os parâmetros
url = "https://www.sintegraws.com.br/api/v1/execute-api.php"
params = {
"token": token,
"cpf": cpf,
"data-nascimento": data_nascimento,
"plugin": "CPF"
}
try:
# Fazer a requisição GET com timeout de 120 segundos
response = requests.get(url, params=params, timeout=120)
# Verificar se o status code é 200 (OK)
response.raise_for_status()
# Converter resposta para JSON
data = response.json()
# Verificar se o campo "status" é "OK"
if data.get("status") == "OK":
print("Status está OK!")
else:
print("Status não está OK ou não encontrado.")
except requests.exceptions.RequestException as e:
# Tratar erros de conexão, timeout e HTTP
print(f"Erro ao chamar a API: {e}")
except ValueError as e:
# Tratar erros ao decodificar JSON
print(f"Erro ao decodificar JSON: {e}")
def isValidCPF(cpf: str) -> bool:
# Remove caracteres não numéricos
# Verifica se possui 11 dígitos
# Verifica se não é uma sequência de dígitos iguais
# Calcula os dígitos verificadores conforme a regra do CPF
cpf = ''.join([c for c in cpf if c.isdigit()])
if len(cpf) != 11:
return False
if cpf == cpf[0]*11:
return False
def calc_digit(digs, pos):
s = sum(int(d) * (pos - i) for i, d in enumerate(digs))
r = 11 - (s % 11)
return '0' if r > 9 else str(r)
d1 = calc_digit(cpf[:9], 10)
d2 = calc_digit(cpf[:10], 11)
return cpf[-2:] == d1 + d2
using System;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Text.Json;
using System.Linq;
using System.Collections.Generic;
class Program
{
static async Task Main(string[] args)
{
// Valores de exemplo para token, CPF e data de nascimento
string token = "SEU_TOKEN_AQUI";
string cpf = "12345678901";
string dataNascimento = "03061988";
// Validar CPF antes de prosseguir
if (!IsValidCPF(cpf))
{
Console.WriteLine("CPF inválido!");
return;
}
// Construir a URL com parâmetros codificados
var baseUrl = "https://www.sintegraws.com.br/api/v1/execute-api.php";
var builder = new UriBuilder(baseUrl);
var query = HttpUtility.ParseQueryString(string.Empty);
query["token"] = token;
query["cpf"] = cpf;
query["data-nascimento"] = dataNascimento;
query["plugin"] = "CPF";
builder.Query = query.ToString();
// Criar um HttpClient com timeout de 120 segundos
using var httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(120) };
try
{
// Fazer a requisição GET
var response = await httpClient.GetAsync(builder.Uri);
// Verificar se o status code é 200 (OK)
if (!response.IsSuccessStatusCode)
{
Console.WriteLine($"Erro na requisição: {(int)response.StatusCode} {response.ReasonPhrase}");
return;
}
// Ler o corpo da resposta como string
var responseBody = await response.Content.ReadAsStringAsync();
// Decodificar JSON
var options = new JsonSerializerOptions { PropertyNameCaseInsensitive = true };
var data = JsonSerializer.Deserialize>(responseBody, options);
// Verificar o campo "status" no JSON
if (data != null && data.TryGetValue("status", out var statusValue) && statusValue is string status && status == "OK")
{
Console.WriteLine("Status está OK!");
}
else
{
Console.WriteLine("Status não está OK ou não encontrado.");
}
}
catch (TaskCanceledException)
{
// Caso o timeout seja excedido
Console.WriteLine("A requisição excedeu o tempo limite (120 segundos).");
}
catch (Exception e)
{
Console.WriteLine($"Erro ao chamar a API: {e.Message}");
}
}
// Função para validar CPF em C#
// Remove caracteres não numéricos, verifica se não é uma sequência de dígitos iguais
// e calcula os dígitos verificadores conforme a regra do CPF.
static bool IsValidCPF(string cpf)
{
cpf = new string(cpf.Where(char.IsDigit).ToArray());
if (cpf.Length != 11) return false;
if (cpf.All(c => c == cpf[0])) return false;
int[] mult1 = {10,9,8,7,6,5,4,3,2};
int[] mult2 = {11,10,9,8,7,6,5,4,3,2};
string tempCpf = cpf.Substring(0,9);
int sum = 0;
for (int i = 0; i < 9; i++)
sum += (tempCpf[i] - '0') * mult1[i];
int rest = 11 - (sum % 11);
rest = (rest == 10 || rest == 11) ? 0 : rest;
if (rest != (cpf[9]-'0')) return false;
tempCpf = cpf.Substring(0,10);
sum = 0;
for (int i = 0; i < 10; i++)
sum += (tempCpf[i] - '0') * mult2[i];
rest = 11 - (sum % 11);
rest = (rest == 10 || rest == 11) ? 0 : rest;
return rest == (cpf[10]-'0');
}
}
import java.io.IOException;
import java.net.URI;
import java.net.URLEncoder;
import java.net.http.*;
import java.net.http.HttpResponse.BodyHandlers;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Map;
import com.fasterxml.jackson.databind.ObjectMapper;
public class ApiExample
{
public static void main(String[] args)
{
// Valores de exemplo para token, CPF e data de nascimento
// Ajuste conforme a API exige
String token = "SEU_TOKEN_AQUI";
String cpf = "12345678901";
String dataNascimento = "03061988";
// Validar CPF antes de prosseguir
if (!isValidCPF(cpf)) {
System.out.println("CPF inválido!");
return;
}
// Montar a URL com parâmetros codificados
String baseUrl = "https://www.sintegraws.com.br/api/v1/execute-api.php";
String url = baseUrl
+ "?token=" + URLEncoder.encode(token, StandardCharsets.UTF_8)
+ "&cpf=" + URLEncoder.encode(cpf, StandardCharsets.UTF_8)
+ "&data-nascimento=" + URLEncoder.encode(dataNascimento, StandardCharsets.UTF_8)
+ "&plugin=CPF";
// Criar o HttpClient com timeout de 120 segundos
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(120))
.build();
// Criar a requisição GET com timeout de 120 segundos
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.timeout(Duration.ofSeconds(120))
.GET()
.build();
try {
// Executar a requisição
HttpResponse response = client.send(request, BodyHandlers.ofString());
// Verificar se o status HTTP é 200 (OK)
if (response.statusCode() != 200) {
System.err.println("Erro na requisição: " + response.statusCode() + " " + response.body());
return;
}
// Decodificar a resposta JSON
ObjectMapper objectMapper = new ObjectMapper();
Map data = objectMapper.readValue(response.body(), Map.class);
// Verificar o campo "status"
Object statusValue = data.get("status");
if (statusValue instanceof String && "OK".equals(statusValue)) {
System.out.println("Status está OK!");
} else {
System.out.println("Status não está OK ou não encontrado.");
}
} catch (HttpTimeoutException e) {
// Caso a requisição ultrapasse o tempo limite
System.err.println("A requisição excedeu o tempo limite de 120 segundos.");
} catch (IOException | InterruptedException e) {
// Tratar outros erros (rede, parsing, etc.)
System.err.println("Erro ao chamar a API: " + e.getMessage());
}
}
// Função para validar CPF em Java
// Remove não dígitos, verifica se não é uma sequência repetida,
// e calcula dígitos verificadores conforme a regra do CPF.
public static boolean isValidCPF(String cpf)
{
cpf = cpf.replaceAll("\\D", "");
if (cpf.length() != 11) return false;
if (cpf.chars().allMatch(ch -> ch == cpf.charAt(0))) return false;
try {
int sum = 0;
for (int i = 0; i < 9; i++) {
sum += (cpf.charAt(i) - '0') * (10 - i);
}
int rest = 11 - (sum % 11);
rest = (rest == 10 || rest == 11) ? 0 : rest;
if (rest != (cpf.charAt(9)-'0')) return false;
sum = 0;
for (int i = 0; i < 10; i++) {
sum += (cpf.charAt(i) - '0') * (11 - i);
}
rest = 11 - (sum % 11);
rest = (rest == 10 || rest == 11) ? 0 : rest;
return rest == (cpf.charAt(10)-'0');
} catch (Exception e) {
return false;
}
}
}
import Foundation
// Aqui você define os valores do token, CPF e data de nascimento:
let token = "SEU_TOKEN_AQUI"
let cpf = "12345678901"
let dataNascimento = "03061988"
guard isValidCPF(cpf) else {
print("CPF inválido!")
exit(1)
}
var components = URLComponents(string: "https://www.sintegraws.com.br/api/v1/execute-api.php")!
components.queryItems = [
URLQueryItem(name: "token", value: token),
URLQueryItem(name: "cpf", value: cpf),
URLQueryItem(name: "data-nascimento", value: dataNascimento),
URLQueryItem(name: "plugin", value: "CPF")
]
guard let finalURL = components.url else {
print("Não foi possível construir a URL final.")
exit(1)
}
let config = URLSessionConfiguration.default
config.timeoutIntervalForRequest = 120
let session = URLSession(configuration: config)
let task = session.dataTask(with: finalURL) { data, response, error in
if let error = error {
print("Erro ao chamar a API:", error.localizedDescription)
return
}
guard let httpResponse = response as? HTTPURLResponse else {
print("Resposta inválida.")
return
}
guard httpResponse.statusCode == 200 else {
print("Erro na requisição: \(httpResponse.statusCode)")
return
}
guard let data = data else {
print("Resposta sem dados.")
return
}
do {
if let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] {
if let status = json["status"] as? String, status == "OK" {
print("Status está OK!")
} else {
print("Status não está OK ou não encontrado.")
}
} else {
print("Formato de JSON inválido.")
}
} catch {
print("Erro ao decodificar JSON:", error.localizedDescription)
}
}
task.resume()
// Essa função é utilizada para validar o CPF antes de realizar a chamada na API
func isValidCPF(_ cpf: String) -> Bool {
let digits = cpf.filter { $0.isNumber }
if digits.count != 11 { return false }
if Set(digits).count == 1 { return false }
func calcDigit(_ str: String, _ factor: Int) -> Int {
var sum = 0
for (i, char) in str.enumerated() {
let val = Int(String(char))!
sum += val * (factor - i)
}
let rest = 11 - (sum % 11)
return (rest > 9) ? 0 : rest
}
let d1 = calcDigit(String(digits.prefix(9)), 10)
if d1 != Int(String(digits[9]))! { return false }
let d2 = calcDigit(String(digits.prefix(10)), 11)
if d2 != Int(String(digits[10]))! { return false }
return true
}
#Include "protheus.ch"
User Function ChamarAPI()
// Aqui você define os valores do token, CPF e data de nascimento
Local cToken := "SEU_TOKEN_AQUI"
Local cCPF := "12345678901"
Local cDataNascimento:= "03061988"
Local cBaseURL := "https://www.sintegraws.com.br/api/v1/execute-api.php"
Local cURL, cResp := ""
Local nStatus := 0
Local oJson
If !IsValidCPF(cCPF)
Conout("CPF inválido!")
Return
EndIf
cURL := cBaseURL + ;
"?token=" + URLEncode(cToken) + ;
"&cpf=" + URLEncode(cCPF) + ;
"&data-nascimento=" + URLEncode(cDataNascimento) + ;
"&plugin=CPF"
HttpSetTimeOut(120000)
cResp := HttpGet(cURL)
nStatus := HttpResult()
If nStatus <> 200
Conout("Erro na requisição: " + Ltrim(Str(nStatus)))
Return
EndIf
If Empty(cResp)
Conout("Resposta vazia.")
Return
EndIf
oJson := JsonDecode(cResp)
If oJson == Nil
Conout("Erro ao decodificar JSON.")
Return
EndIf
If oJson["status"] == "OK"
Conout("Status está OK!")
Else
Conout("Status não está OK ou não encontrado.")
EndIf
Return
Static Function IsValidCPF(cCpf)
Local cClean := ""
Local i, nSum, nRest
For i := 1 To Len(cCpf)
If IsDigit(SubStr(cCpf,i,1))
cClean += SubStr(cCpf,i,1)
EndIf
Next i
If Len(cClean) <> 11
Return .F.
EndIf
If (cClean == Replicate(SubStr(cClean,1,1),11))
Return .F.
EndIf
nSum := 0
For i := 1 To 9
nSum += Val(SubStr(cClean,i,1)) * (11 - i)
Next i
nRest := 11 - (nSum % 11)
If (nRest == 10 .Or. nRest == 11)
nRest := 0
EndIf
If nRest <> Val(SubStr(cClean,10,1))
Return .F.
EndIf
nSum := 0
For i := 1 To 10
nSum += Val(SubStr(cClean,i,1)) * (12 - i)
Next i
nRest := 11 - (nSum % 11)
If (nRest == 10 .Or. nRest == 11)
nRest := 0
EndIf
Return (nRest == Val(SubStr(cClean,11,1)))
EndFunc
REPORT z_chamar_api.
DATA: lv_token TYPE string VALUE 'SEU_TOKEN_AQUI',
lv_cpf TYPE string VALUE '12345678901',
lv_data_nasc TYPE string VALUE '03061988',
lv_url TYPE string,
lv_response TYPE string,
lv_status_code TYPE i,
lv_encoded_token TYPE string,
lv_encoded_cpf TYPE string,
lv_encoded_dn TYPE string,
lv_valid_cpf TYPE abap_bool.
CALL FUNCTION 'ESCAPE_URL'
EXPORTING unescaped = lv_token
IMPORTING escaped = lv_encoded_token.
CALL FUNCTION 'ESCAPE_URL'
EXPORTING unescaped = lv_cpf
IMPORTING escaped = lv_encoded_cpf.
CALL FUNCTION 'ESCAPE_URL'
EXPORTING unescaped = lv_data_nasc
IMPORTING escaped = lv_encoded_dn.
PERFORM is_valid_cpf USING lv_cpf CHANGING lv_valid_cpf.
IF lv_valid_cpf <> abap_true.
WRITE: / 'CPF inválido!'.
EXIT.
ENDIF.
lv_url = |https://www.sintegraws.com.br/api/v1/execute-api.php?token={ lv_encoded_token }&cpf={ lv_encoded_cpf }&data-nascimento={ lv_encoded_dn }&plugin=CPF|.
DATA(lo_http_client) = NEW cl_http_client( ).
CALL METHOD cl_http_client=>create_by_url
EXPORTING url = lv_url
IMPORTING client = lo_http_client
EXCEPTIONS OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Erro ao criar o HTTP Client'.
EXIT.
ENDIF.
lo_http_client->timeout = 120.
lo_http_client->request->set_header_field( name = '~request_method' value = 'GET' ).
CALL METHOD lo_http_client->send
EXCEPTIONS OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Erro ao enviar requisição HTTP.'.
EXIT.
ENDIF.
CALL METHOD lo_http_client->receive
EXCEPTIONS OTHERS = 4.
IF sy-subrc <> 0.
WRITE: / 'Erro ao receber resposta HTTP.'.
EXIT.
ENDIF.
lv_status_code = lo_http_client->response->get_status( ).
IF lv_status_code <> 200.
WRITE: / |Erro na requisição: { lv_status_code }|.
lo_http_client->close( ).
EXIT.
ENDIF.
lv_response = lo_http_client->response->get_data( ).
lo_http_client->close( ).
DATA(lo_json) = NEW /ui2/cl_json( ).
DATA(ls_result) = lo_json->deserialize( EXPORTING json = lv_response ).
DATA(lv_status) = VALUE string( ls_result[ 'status' ] ).
IF lv_status = 'OK'.
WRITE: / 'Status está OK!'.
ELSE.
WRITE: / 'Status não está OK ou não encontrado.'.
ENDIF.
FORM is_valid_cpf USING p_cpf TYPE string CHANGING p_valid TYPE abap_bool.
DATA: lv_cpf TYPE string.
lv_cpf = p_cpf.
TRANSLATE lv_cpf TO UPPER CASE.
REPLACE ALL NON DIGITS IN lv_cpf WITH ''.
IF strlen( lv_cpf ) <> 11.
p_valid = abap_false.
RETURN.
ENDIF.
DATA lv_first TYPE c LENGTH 1.
lv_first = lv_cpf(1).
IF lv_cpf = lv_first && lv_cpf = lv_first(11).
p_valid = abap_false.
RETURN.
ENDIF.
DATA: i TYPE i, sum TYPE i, rest TYPE i, val TYPE i.
sum = 0.
DO 9 TIMES.
i = sy-index.
val = lv_cpf+i(1).
sum = sum + val * (10 - i).
ENDDO.
rest = 11 - ( sum MOD 11 ).
IF rest = 10 OR rest = 11.
rest = 0.
ENDIF.
IF rest <> lv_cpf+9(1).
p_valid = abap_false.
RETURN.
ENDIF.
sum = 0.
DO 10 TIMES.
i = sy-index.
val = lv_cpf+i(1).
sum = sum + val * (11 - i).
ENDDO.
rest = 11 - ( sum MOD 11 ).
IF rest = 10 OR rest = 11.
rest = 0.
ENDIF.
IF rest <> lv_cpf+10(1).
p_valid = abap_false.
RETURN.
ENDIF.
p_valid = abap_true.
ENDFORM.