API Hotmart: Como usar o HotConnect

Recentemente migrei o programa de afiliados para o Hotmart. Depois de fazer uma breve pesquisa decidi utilizar a API do Hotmart para autenticar os usuários. Os motivos? Explico eles a seguir.

Quando você lança algum produto no Hotmart do tipo “Assinatura”, em que o usuário vai precisar efetuar login para ter acesso ao conteúdo, você pode continuar utilizando o seu sistema de login normal ou utilizar o Hotconnect para autenticar os usuários.

A grande vantagem em utilizar o HotConnect é que ele permite você verificar o status da compra (assinatura), então, trocando em miúdos, você poderá, antes de autenticar um usuário, verificar o status da transação dele no Hotmart, e caso o status seja “Aprovado”, você libera o acesso, caso contrário, não. Este recurso permite você liberar acesso e bloquear acesso automaticamente no seu sistema de assinatura. Por exemplo, se um cliente fez o pagamento do produto, mas depois de algum tempo resolveu cancelar a compra, após ele efetuar o cancelamento no Hotmart, ele não mais conseguirá acessar à área restrita do seu site. Claro que é você que deve programar a verificação do Status da transação, e conforme o retorno, liberar ou não o acesso. Entretanto sem isso você precisaria ativar e desativar, criar e excluir usuários manualmente, o que é bastante tedioso, principalmente se você tem muitos clientes.

De fato, no site do Hotmart há bastante informações sobre a API, mas eu, como um utilizador dela, encontrei dificuldades para encontrar algumas informações. Neste artigo vou falar sobre as dificuldades que encontrei e também como fiz para superá-las. Lembrando que este artigo possui conteúdo prático, objetivo, se você quer teoria sobre a API do Hotmart, o link já citado acima pode ser-lhe mais útil do que este post. Aqui colocarei exemplos práticos e funcionais de como eu utilizo o HotConnect.

Criando um Aplicativo HotConnect

Para poder interagir com o HotConnect você precisa criar um aplicativo. Cada aplicativo criado no Hotmart possui um ID único e um código secreto de validação dele. Para criar um aplicativo HotConnect, siga o passo-a-passo abaixo:

  1. Efetue Login em sua conta do Hotmart. Atenção, é necessário ter uma conta de afiliado, pois conta de cliente não possui acessos a tais recursos.
  2. No menu “Home”, clique em “Ferramentas e Widgets”
  3. Nas opções existentes na página, clique no link “HotConnect”.
  4. Na Página de gerenciamento de aplicativos HotConnect, para criar um novo aplicativo basta clicar no botão “Criar Novo HotConnect”.
  5. Após criar um Aplicativo, ele será listado na tela automaticamente. Para ver o Código Secreto, clique no link “Exibir Credenciais” que fica do lado do aplicativo criado. Veja:

    hotmart hotconnect

Seguindo os passos acima você obterá um ID de aplicativo e seu Código Secreto. Esses dados são confidenciais e não devem ser revelados a terceiros. Você precisará deles para poder utilizar a API HotConnect.

Criando o Script PHP Que fará a conexão e obtenção dos Dados através da API

No script PHP, o primeiro passo é definir algumas variáveis para guardar os dados do aplicativo e o url (principal) da API. Veja:

Variáveis do Script de Comunicação com a API

1
2
3
4
$hotmart_server = "http://api.hotmart.com.br";
$app_id = "494xxxxxxxxxxx"; //Coloque o ID do aplicativo
$app_secret = "c11xxxxxxxxxxxxxxxxxxxxxxxxx"; //Senha (Código secreto) do aplicativo
$my_url = "http://seusite/loginHotmart.php"; //URL de redirecionamento apos autenticacao no login hotmart e a geracao do code 
$hotmart_server = "http://api.hotmart.com.br";
$app_id = "494xxxxxxxxxxx"; //Coloque o ID do aplicativo
$app_secret = "c11xxxxxxxxxxxxxxxxxxxxxxxxx"; //Senha (Código secreto) do aplicativo
$my_url = "http://seusite/loginHotmart.php"; //URL de redirecionamento apos autenticacao no login hotmart e a geracao do code 

$app_id é a variável que vai guardar o Identificador do aplicativo que você criou
$app_secret é a variável que vai guardar o código secreto (senha) do aplicativo
$my_url é a variável que vai guardar o url de retorno após o usuário efetuar login pelo HotConnect. Neste exemplo, coloque o mesmo url do script, pois ele fará todo o controle.

Na sequência, criamos uma função PHP para efetuar as conexões e retornar as respostas da API HotConnect. No site da Hotmart há uma função de exemplo utilizando fopen, mas aqui no meu servidor web ela não funcionou, então eu criei uma nova função que utiliza CURL. Veja-a:

Função CURL para Conexão com a API HotConnect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function do_post_request($url, $data, $header = null){
    
    $ch = curl_init();
    $timeout = 10;
    
    $data_array = explode("&", $data);
    $total_fields = count($data_array);
    $data_array = null;
    
    if($header != null) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);  
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_FILETIME, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    curl_setopt($ch,CURLOPT_POST, $total_fields);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
 
    $output = curl_exec($ch);
 
    curl_close($ch);
    return $output;
    
}
function do_post_request($url, $data, $header = null){
	
	$ch = curl_init();
	$timeout = 10;
	
	$data_array = explode("&", $data);
	$total_fields = count($data_array);
	$data_array = null;
	
	if($header != null) curl_setopt($ch, CURLOPT_HTTPHEADER, $header);	
	curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch,CURLOPT_FOLLOWLOCATION, true);
	curl_setopt($ch, CURLOPT_FILETIME, true);
	curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
	curl_setopt($ch,CURLOPT_POST, $total_fields);
	curl_setopt($ch,CURLOPT_POSTFIELDS, $data);

	$output = curl_exec($ch);

	curl_close($ch);
	return $output;
	
}

Esta função simplesmente recebe alguns parâmetros como url, dados e cabeçalho, envia uma requisição POST e retorna o resultado. Isto é suficiente para comunicação com a API do Hotmart.

Agora é Hora de verificar se o usuário já está autenticado ou não.

Redirecionando para a página de Login

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
session_start("hotmart_Session");
 
$code = isset($_REQUEST["code"])?$_REQUEST["code"]:'';
 
 
if(empty($code)) {
 
 $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection (http://pt.wikipedia.org/wiki/Cross-site_request_forgery)
 
 $dialog_url = $hotmart_server . "/oauth/authorize?client_id=" 
   . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
   . $_SESSION['state'] . "&response_type=code";
  
 echo("<script> top.location.href='" . $dialog_url . "'</script>");
 
}
session_start("hotmart_Session");

$code = isset($_REQUEST["code"])?$_REQUEST["code"]:'';


if(empty($code)) {

 $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection (http://pt.wikipedia.org/wiki/Cross-site_request_forgery)

 $dialog_url = $hotmart_server . "/oauth/authorize?client_id=" 
   . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
   . $_SESSION['state'] . "&response_type=code";
  
 echo("<script> top.location.href='" . $dialog_url . "'</script>");
 
}

Aqui nesta parte do código é iniciada a Sessão do PHP, é pego o valor de um campo submetido via GET (chamado code) e na sequência é feita uma verificação: code está vazio ou não. Quando o usuário faz login e retorna para o seu script, o hotmart envia um code, então, se este code não existe ou está vazio, é sinal de que o usuário ainda não fez login. Assim sendo, estando o code vazio, o script gera um código de segurança aleatório e guarda-o na variável de sessão “state”, na sequência o visitante é redirecionado para a página de login do HotConnect, através da impressão de um script de redirecionamento (Browser side).

Adicionando usuário ao seu Banco de Dados

Após o usuário efetuar login, você deverá efetuar uma nova requisição para a API, para obter alguns dados do Usuário. Veja abaixo o código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
if($_REQUEST['state'] == $_SESSION['state']) {
 
    $token_url = $hotmart_server . "/oauth/access_token";
    $post_params =   "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
    . "&client_secret=" . $app_secret . "&code=" . $code;
    
    $response_token = json_decode(do_post_request($token_url,$post_params));
     
    $token = $response_token->{'TokenResponse'}->{'access_token'};
     
     
     $post_params =   "access_token=" . $token;
     $url = 'http://api.hotmart.com.br/user_info';
     $response_user_info = json_decode(do_post_request($url,$post_params));
     
     $id = $response_user_info->UserInfoResponse->id;
     $nome = $response_user_info->UserInfoResponse->name;
 
     if($id==1) exit;
    
    if(!existe_id($id)){
        
        //Se não existir, cadastra-o
        save($id,$nome);
        
    }
    
}else {
    
 echo("Os Status não batem, você pode ter sido vítima de CSRF");
 
}
if($_REQUEST['state'] == $_SESSION['state']) {

	$token_url = $hotmart_server . "/oauth/access_token";
	$post_params =   "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
	. "&client_secret=" . $app_secret . "&code=" . $code;
	
	$response_token = json_decode(do_post_request($token_url,$post_params));
	 
	$token = $response_token->{'TokenResponse'}->{'access_token'};
	 
	 
	 $post_params =   "access_token=" . $token;
	 $url = 'http://api.hotmart.com.br/user_info';
	 $response_user_info = json_decode(do_post_request($url,$post_params));
	 
	 $id = $response_user_info->UserInfoResponse->id;
	 $nome = $response_user_info->UserInfoResponse->name;

	 if($id==1) exit;
	
	if(!existe_id($id)){
		
		//Se não existir, cadastra-o
		save($id,$nome);
		
	}
	
}else {
	
 echo("Os Status não batem, você pode ter sido vítima de CSRF");
 
}

Esta parte do script faz verificar o código gerado e salvo na variável de sessão “state”. Uma vez que você enviou o código para a API e ela retornou o mesmo código, subentende-se que é uma “conversa” genuína. Na sequência, você precisa obter um “token”, que é um código de comunicação com tempo de validade restrito. Você precisa enviar uma requisição para obter este código “token” para então poder utilizar outras funções da API.

Após obter o “token”, você faz uma nova requisição à API (http://api.hotmart.com.br/user_info) para obter os dados do usuário. Um detalhe é que nesta “conversa” você já precisa enviar o código “token” através do parâmetro “access_token”.

Por fim, no exemplo eu peguei dois dados do usuário, o ID dele e o Nome Dele. Esse ID é o identificador único do usuário no Hotmart. Para quem vai guardar o usuário no seu próprio banco de dados, este ID é a melhor opção para ser utilizada para diferenciar os usuários. Pois dois usuários podem ter o mesmo nome, e o email pode ser modificado no Hotmart. Já o ID é único, intransferível e não pode ser modificado.

A parte do código onde eu pego o ID e nome do usuário do Hotmart é esta:

1
2
$id = $response_user_info->UserInfoResponse->id;
$nome = $response_user_info->UserInfoResponse->name;
$id = $response_user_info->UserInfoResponse->id;
$nome = $response_user_info->UserInfoResponse->name;

Aí, de posse deste ID e nome você já pode salvar o usuário no banco de dados. Para saber todos os dados do usuário que são retornados pela API, basta “dar” um print_r($response_user_info) no seu script.

Esta parte do código “if($id==1) exit;” é muito importante (ou talvez não), pois eu estou subentendendo que o primeiro usuário do seu banco de dados (aquele com Identificador 1) é o administrador. Então, é bom evitar que o usuário que tenha ID igual a 1 faça login no sistema como se fosse você. A verdade é que é muito difícil existir um usuário cliente que tenha ID = 1, geralmente o primeiro usuário é o administrador do sistema, e no caso do Hotmart não creio que seja diferente. Todavia, é melhor prevenir do que remediar, né!?

Seguindo com o script acima temos o código:

1
2
3
4
5
6
    if(!existe_id($id)){
        
        //Se não existir, cadastra-o
        save($id,$nome);
        
    }
	if(!existe_id($id)){
		
		//Se não existir, cadastra-o
		save($id,$nome);
		
	}

Esta parte do código faz uma verificação no banco de dados através da função existe_id. O objetivo da função é saber se o ID já consta no banco de dados, em caso positivo, é um erro adicionar o usuário novamente, pois ele já foi adicionado anteriormente. Se o ID do usuário não existir, então você insere ele ao seu banco de dados usando a função save.

Note o seguinte, as funções existe_id e save devem ser criadas por você. Aí não tem segredo algum, na função existe_id você pode fazer uma consulta do tipo “select count(*) as total from tabela where id = O ID AQUI”, e caso total contenha valor maior que 0, você já saberá que o usuário existe no seu banco de dados. Do mesmo modo, na função save você pode utilizar algum comando sql do tipo: “insert into tabela (id, nome) values (“O ID”, “O Nome”);

Verificando status da transação via API Hotmart

Você apenas obter os dados do usuário não vai ajudar muito. Para poder ativar ou desativar (adicionar ou excluir) automaticamente, você precisará saber como anda o status da compra ou assinatura de seu serviço no Hotmart. Veja o código a seguir:

1
2
3
4
5
6
7
         $post_params =   "access_token=" . $token;
         $url = 'http://api.hotmart.com.br/purchases';
         $response_compra_info = json_decode(do_post_request($url,$post_params));
             
         $status = $response_compra_info->Purchases[0]->PurchaseResponse->status;
          
         if($status == "approved"){ autentica o usuário no seu site }
		 $post_params =   "access_token=" . $token;
		 $url = 'http://api.hotmart.com.br/purchases';
		 $response_compra_info = json_decode(do_post_request($url,$post_params));
		 	 
		 $status = $response_compra_info->Purchases[0]->PurchaseResponse->status;
		  
		 if($status == "approved"){ autentica o usuário no seu site }

Aqui, nesta altura do campeonato (risos), saliento duas coisas. Primeiro de tudo, na documentação do Hotmart eles dizem em seu exemplo que o status pode ser “Aprovado”, mas na prática, o retorno é “approved” para transações aprovadas. Então a ideia é verificar se o status da compra é “Aprovado”, em caso positivo, você autentica o usuário em seu website, e em caso negativo, não.

Outra sinistro que me ocorreu foi com um usuário que havia feito duas compras (assinaturas), sendo que uma delas falhou e a outra foi aprovada. Neste caso o script acima falhará, pois PurchaseResponse passará a ser um array contendo todas as transações. Para superar este problema, você deve ao invés do código de exemplo sugerido acima, utilizar o seguinte:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
         $post_params =   "access_token=" . $token;
         $url = 'http://api.hotmart.com.br/purchases';
         $response_compra_info = json_decode(do_post_request($url,$post_params));
         
         if(is_array($response_compra_info->Purchases[0]->PurchaseResponse)){
             
             $status = "started";
             
             foreach($response_compra_info->Purchases[0]->PurchaseResponse as $response){
                 
                 if($response->status == 'approved'){
                     
                    $status = 'approved';
                    break;
                     
                 }
                 
             }
             
         }else{
             
            $status = $response_compra_info->Purchases[0]->PurchaseResponse->status;
         
         }
         
         if($status == "approved"){
            
            Aqui você deve autenticar o usuário no seu site, seja através de cookies ou sessões. 
                        Após criar o cookie ou a sessão, redirecione-o para a primeira página autenticada do seu site.
            
         }else{
                       Aqui você pode imprimir alguma mensagem para o usuário, avisando que a compra não está aprovada ainda.
                 }
		 $post_params =   "access_token=" . $token;
		 $url = 'http://api.hotmart.com.br/purchases';
		 $response_compra_info = json_decode(do_post_request($url,$post_params));
		 
		 if(is_array($response_compra_info->Purchases[0]->PurchaseResponse)){
			 
			 $status = "started";
			 
			 foreach($response_compra_info->Purchases[0]->PurchaseResponse as $response){
				 
				 if($response->status == 'approved'){
					 
					$status = 'approved';
					break;
					 
				 }
				 
			 }
			 
		 }else{
			 
		 	$status = $response_compra_info->Purchases[0]->PurchaseResponse->status;
		 
		 }
		 
		 if($status == "approved"){
			
			Aqui você deve autenticar o usuário no seu site, seja através de cookies ou sessões. 
                        Após criar o cookie ou a sessão, redirecione-o para a primeira página autenticada do seu site.
			
		 }else{
                       Aqui você pode imprimir alguma mensagem para o usuário, avisando que a compra não está aprovada ainda.
                 }

No código acima, o segredo é verificar se PurchaseResponse é um array. Em caso positivo, significa que há mais de uma transação — então você deve verificar todas elas em busca de alguma que tenha sido aprovada — e caso negativo, significa que há somente uma transação — então basta acessar a propriedade status de PurchaseResponse.

Ah! para quem não sabe, no PHP você pode iniciar uma variável de sessão facilmente da seguinte forma:

$_SESSION[“nome-aqui”] = $id;

Isto iniciará uma variável de sessão chamada “nome-aqui”, e seu valor seria o ID do usuário que fez login no Hotconnect. E para redirecionar o usuário para um outro url basta fazer assim:

header(“Location: area-restrita-home.php”);

Neste exemplo, o usuário seria redirecionado para a página “area-restrita-home.php”

Conclusão

Utilizando a API do Hotmart você consegue automatizar o acesso e o bloqueio dele para os seus assinantes. Uma vez que um assinante efetuou uma assinatura e o status está aprovado, ele conseguirá acessar a área restrita de seu website automaticamente, do mesmo modo, quando ele cancelar a assinatura (caso a cancele), ele perderá o acesso a área restrita em seu site.

Ah!, no seu site você deve criar uma página de “obrigado” informando sobre a forma de login e com um link para o script de controle (que no nosso exemplo foi “http://seusite/loginHotmart.php”). E então, durante a criação do produto no Hotmart, informe a sua página de obrigado. Assim sendo, após o usuário concluir o pgto ou após o pgto ser aprovado, o Hotmart enviará um email para ele informando o url da sua página de obrigado. Na página de obrigado você informará ao usuário que ele deve fazer login no site usando suas próprias credenciais do Hotmart através do link do script que você criou.

Isto é tudo, o resto é automático. Talvez tudo seja um pouco complicado de entender, mas depois do trabalho concluído, o resto é automático, poupando horas e horas de seu tempo durante o dia. Sem falar que os compradores terão acesso liberado mesmo que você esteja dormindo, viajando, ou almoçando. Nada como a liberação e a “suspensão” ser automática, é muita praticidade e comodidade a nosso serviço.

About This Author

Webmaster com interesse principalmente nas áreas: Web Marketing, Wordpress, Otimização de Sites (SEO), PHP. Criador do <strong>Hot Links Plus</strong> e do <strong>Face Conversion</strong> <a href="http://ganhardinheiroblog.net/sobre">Veja mais sobre mim Aqui</a>

10 Comments

You can post comments in this post.


  • Bastante útil o artigo. Vou guardar o url aqui para quando eu precisar. Atualmente eu não possuo um produto no Hotmart, mas pretendo, quem sabe, num futuro próximo lançar o meu produto digital nesta plataforma. E quando eu fizer o lançamento, vou tentar integrar com o Hotconnect para facilitar minha vida.

    Obrigada.

    Michele 3 anos ago Reply


    • Michele, boa sorte!

      Anderson Makiyama 3 anos ago Reply


  • amigo, uma grande dúvida… onde coloco esse script? eu tenho um site com script de login e senha em php. Como faço essa integração?

    Pedro 2 anos ago Reply


    • Pedro, nesse script eu dou apenas uma ideia de uma forma de utilização do Hotconnect. Nesse exemplo você não utilizaria mais a página de login do seu site, mas apenas um scritp de controle que efetuaria o login ou não, sempre baseado no status da compra. Todavia, para o correto funcionamento você deverá ainda criar algumas funções de adição de usuário ao banco de dados e também mudança de status, conforme sugeri no artigo. Releia o artigo com calma, e por inteiro, vai entender melhor a ideia.

      Anderson Makiyama 2 anos ago Reply


  • Boa tarde, muito legal, parabéns!!!

    Mas como eu sei qual o produto eu estou verificando o status de aprovado?

    Vilson 2 anos ago Reply


    • Vilson, pelo Id do produto: [idProduct]

      Anderson Makiyama 2 anos ago Reply


  • Olá parabéns mas fiquei com uma dúvida se eu tiver mais de produto como vejo qual está como aprovado

    diego 1 ano ago Reply


  • Olá parabéns mas fiquei com uma dúvida se eu tiver mais de produto como vejo qual está como aprovado?

    diego 1 ano ago Reply


  • Olá amigo Anderson, parabéns pelo post! Muito bom!
    Gostaria de te perguntar se vc tem um exemplo desta página loginHotmart.php para donwload.
    Caso positivo, poderia enviar para o meu email, ou disponibilizar algum link?

    Agradeço antecipadamente.
    Forte abraço, Guilherme.

    Guilherme 11 meses ago Reply


  • olá amigo, você tem esse script pronto? quanto você cobra para disponibilizalo? estou montando um curso online e vai ser ultil pra mim. esse post ajudou bastante, pra montar esse script é só seguir a sequência um ebaixo do outro no editor ?

    Râmed 2 meses ago Reply


Post A Reply