APIs e Microsserviços

9 jan, 2014

Criando e gerenciando as credenciais da API PayPal

Publicidade

Tabela de conteúdo

  1. Introdução
  2. Tipos de credencial
  3. Criando uma nova credencial
    1. Assinatura da API
    2. Certificado da API
  4. Gerenciando o certificado da API
    1. Renovando o certificado
    2. Criptografando o certificado
    3. Importando o certificado para utilização com .NET e ASP clássico
  5. Utilizando as credenciais da API com PHP
    1. Exemplo de uso da assinatura
    2. Exemplo de uso do certificado

Introdução

Durante a integração PayPal, você fará diversas chamadas para as várias API disponibilizadas. Todas as chamadas para as APIs PayPal requerem uma autenticação, que é feita através das credenciais da API. Este artigo mostrará como gerar e gerenciar essas credenciais e, ao final, códigos de exemplo reutilizáveis serão disponibilizados, para facilitar o processo de integração.

Para gerar as credencias da API para o ambiente Sandbox e testar sua integração, veja os guias Usando o novo Sandbox PayPal e Testando as APIs PayPal no Sandbox.

Tipos de credencial

Existem dois tipos de credencial que poderão ser utilizados durante a integração. Cada um dos dois tipos possui um conjunto de informações, que serão utilizadas para identificar o usuário e autenticá-lo, antes de permitir acesso a qualquer operação da API:

Tipo de credencial Informações requeridas
Assinatura Usuário da API, Senha da API e Assinatura da API
Certificado Usuário da API, Senha da API e Certificado Digital

É claro que você pode utilizar qualquer uma das duas formas de autenticação que preferir, ou que for mais simples implementar na tecnologia utilizada na integração. Contudo, por ser mais simples gerenciar as assinaturas, a PayPal recomenda que você as utilize, em vez do certificado digital.

Criando uma nova credencial

O processo de criação de uma nova credencial é o mesmo, até certo ponto, tanto para a assinatura quanto para o certificado. Ilustraremos o que é comum nessa seção e utilizaremos uma seção separada para as particularidades de cada tipo de credencial.

1 – Acesse sua conta PayPal – No site PayPal, faça login em sua conta PayPal ou, se ainda não tiver uma conta, basta clicar no botão Criar Conta:

2 – Acesse a opção Perfil do menu principal – Assim que fizer login em sua conta PayPal, no menu principal, escolha a opção Perfil e, então, a opção Mais opções no meu que se abre:

3 – Acesse a opção Minhas ferramentas de venda – Após clicar em Mais opções, uma nova tela se abrirá. Nessa tela, haverá um menu no lado esquerdo. Clique na opção Minhas ferramentas de venda e, em seguida, na opção Acesso à API que será listada no lado direito:

4 – Solicite as credenciais da API – Após clicar em Acesso à API na tela anterior, uma nova tela se abrirá e exibirá duas opções. Nós escolheremos a Opção 2, do lado direito, clicando no link Solicitar credenciais de interface de programação de aplicativos (API):

A partir desse momento, os passos são diferentes para cada tipo de credencial. Caso sua opção seja por gerar uma assinatura, veja a seção Assinatura da API ou, se for gerar um certificado, veja a seção Certificado da API.

Assinatura da API

Os passos a seguir ilustrarão como gerar uma assinatura da API. Ao final, você terá três informações altamente sigilosas. Guarde-as com segurança e nunca informe-as para terceiros. Essas credenciais permitirão acesso à sua conta PayPal para, por exemplo, fazer transferências de dinheiro, ver seu histórico de transações, pesquisas e acesso ao seus dados pessoais.

5 – Solicite uma assinatura de API – Após o passo 4, descrito anteriormente, uma nova tela se abrirá. Essa tela terá, novamente, duas opções. Para gerar uma assinatura de API, selecionaremos a opção Solicite uma assinatura de API, localizada no lado esquerdo:

6 – Copie as credenciais da API – Assim que clicamos no link Solicite uma assinatura de API da tela anterior, uma nova tela se abrirá com as suas credencias da API. Essa tela contém as três informações que serão utilizadas na integração: Nome de usuário da API, Senha da API e Assinatura da API:

Certificado da API

Os passos a seguir ilustrarão como gerar um certificado da API. Ao final, você terá um arquivo, que jamais deverá ser armazenado em local público, e duas outras informações altamente sigilosas. Guarde-as com segurança e nunca informe-as para terceiros. Essas credenciais permitirão acesso à sua conta PayPal para, por exemplo, fazer transferências de dinheiro, ver seu histórico de transações, pesquisas e acesso ao seus dados pessoais.

5 – Solicite um certificado de API – Após o passo 4, descrito anteriormente, uma nova tela se abrirá. Essa tela terá, novamente, duas opções. Para gerar um certificado de API, selecionaremos a opção Solicite um certificado de API, localizada no lado direito:

6 – Copie as credenciais da API e faça download do certificado – Um certificado digital é um arquivo que deverá ser enviado para a PayPal sempre que uma requisição para qualquer operação for feita. Esse certificado é como um documento de identidade. É único e intransferível. Para utilizar o certificado digital, você ainda precisará do nome de usuário e da senha, disponibilizados nessa última tela que se abre:

Gerenciando o certificado de API

O certificado de API é um arquivo que contém informações para identificar uma conta PayPal. Por ser um arquivo, esse certificado deve ser armazenado com muito cuidado, em um local no servidor em que não haja acesso público.

Ao fazer o download do certificado, você terá um arquivo no formato PEM contendo sua chave pública e sua chave privada. Apesar de conter as duas chaves, esse certificado não é legível por pessoas, apenas por máquinas. Caso tenha a curiosidade de ver como é um certificado de API, o conteúdo abaixo é de um certificado real:

-----BEGIN RSA PRIVATE KEY-----
MIICXgIBAAKBgQDLs5fL+VW0CZrd7CwJ0Kz+Tm1wplw7oG0bxFaX77q+x8QOcKpu
s5N+DBUpQRFQJPepuFwdwHKOblZ+hD1mgsWUkgrzTdgAcH+Yy7xxTWIcP7yplEF9
pGlHVeSnUYJnsEgsKjkIIn/BXEj1MAiatxdzyc4eZ9Is4T4RNc6+KyUJdwIDAQAB
AoGAc5TJsuEc8fTpPLa/HiqbngheLKcYenTCtBipkbhi29F5uz/OVNXsAH9Wmnvj
GPiA1npXOkJyPcL5rPvX4wyckncuDoC73rp4cce/4PhGrsIi0bUbMmAECRXXEBON
T8Hl4qIX03o6invjHjhO22DR1hFB0eK9eTs7b8idq+v03iECQQDrhPn3wV4ReJTD
aybLuSQMMTXjcfSv6DU1e+7+kIK2OaaikTwuCi5Hiy29LDogUPI1SCdBSZgIAb+1
gMVxTPC5AkEA3WpNHOeePP8/nys+TnFyhCKo9kRkke6JnI9JWDx729nPyMOcve92
lz450JcYgzAljpN27ummgkS10arIPETTrwJBAIQ/Zx13txqYWvBgeqhqjZNLDrdo
hb1A5p/ht5G6E6u/M5KVevVfQh1qSYSwEPOUgGzq1yAR8wyL7to8NKIqUgECQQCA
nzrymp5ywrh7x0wnl4G1vsi2Xt6pY4+vUhGCX4h4G5y3/OJ198DFdVFymgOUWgjH
PWTuvu6KaE3S4cn2MOljAkEA0115zZ+YawzXTHnnaHcxsdvEno7YiUzGn7wOkfup
N3b5RYp/cud7dKiSd5N6c+AgYkJTdYQVlSeV0HvU+rmhyw==
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIICoTCCAgqgAwIBAgIDEBInMA0GCSqGSIb3DQEBBQUAMIGfMQswCQYDVQQGEwJV
UzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2UxFTATBgNV
BAoTDFBheVBhbCwgSW5jLjEWMBQGA1UECxQNc2FuZGJveF9jZXJ0czEbMBkGA1UE
AxQSc2FuZGJveF9jYW1lcmNoYXBpMRwwGgYJKoZIhvcNAQkBFg1yZUBwYXlwYWwu
Y29tMB4XDTEzMTIxMzEyMzE0MVoXDTIzMTIxMTEyMzE0MVowfDEiMCAGA1UEAxQZ
ZW1wcmVzYV9hcGkxLnRlc3RlLmNvbS5icjEjMCEGA1UEChMaRW1wcmVzYSBUZXN0
ZSdzIFRlc3QgU3RvcmUxFzAVBgNVBAcTDlJpbyBEZSBKYW5laXJvMQswCQYDVQQI
EwJSSjELMAkGA1UEBhMCQlIwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAMuz
l8v5VbQJmt3sLAnQrP5ObXCmXDugbRvEVpfvur7HxA5wqm6zk34MFSlBEVAk96m4
XB3Aco5uVn6EPWaCxZSSCvNN2ABwf5jLvHFNYhw/vKmUQX2kaUdV5KdRgmewSCwq
OQgif8FcSPUwCJq3F3PJzh5n0izhPhE1zr4rJQl3AgMBAAGjDTALMAkGA1UdEwQC
MAAwDQYJKoZIhvcNAQEFBQADgYEAtyt4D+Bx+Ruhyu+Vny2eyNWrK1kA7Tv4Ywvn
sAsLhDDZnLaTg48zJ3F+YGTgcjsxeFustpz61WIesupUNBg0HyVEyuV28mLXLRZ4
/sVIhocunaTZwljyQUCNV2tH/Cratg89Zvy5VzcGYGH/2zdYmgaYQQfXlnlNJH5A
tGxevtQ=
-----END CERTIFICATE-----

Renovando o certificado

Ao gerar o certificado, você deve ter percebido uma caixa verde dizendo que o certificado vence em 3650 dias. Todo certificado digital tem uma data de expiração e, no caso do certificado da API, a expiração é em 10 anos.

Antes de o certificado expirar, porém, será necessário gerar um novo certificado, ou sua aplicação não conseguirá mais se autenticar para executar as operações da API. Para renovar o certificado, siga os mesmos passos para a geração do certificado, fazendo login em sua conta PayPal, acessando a opção Profile no menu principal, Minhas ferramentas de vendas e, então, Acesso à API. Você verá uma tela como a seguinte:

Ao clicar em Exibir Certificado de API, do lado direito, se o seu certificado estiver expirando, você verá uma tela semelhante à seguinte:

Se seu certificado estiver expirando, você verá um botão Renovar ao lado do aviso vermelho com a validade do certificado. Clique nesse botão para renovar o certificado. Ao fazer isso, um novo certificado será exibido:

Agora tudo o que você precisa fazer é seguir a seguinte sequência:

  1. Faça download do novo certificado.
  2. Substitua o certificado antigo no seu servidor.
  3. Faça um teste de integração para verificar se tudo continua funcionando.
  4. Volte à sua conta PayPal e remova o certificado antigo.

Atenção: Não remova o certificado antigo enquanto não fizer a substituição do certificado em seu servidor. Ao remover o certificado de sua conta PayPal, ele deixará imediatamente de autenticar suas chamadas à API.

Criptografando o certificado

Algumas plataformas, como .NET, Java e ASP clássico, mesmo os SDKs da PayPal para essas tecnologias, requerem que o certificado esteja criptografado para utilizá-lo. Se você estiver utilizando uma das tecnologias citadas, siga os passos a seguir para criptografar o certificado.

Dica: Se estiver utilizando uma das tecnologias citadas, lembre-se de criptografar os certificados tanto para o ambiente de produção, quanto para o Sandbox.

Dica: O PHP não requer que o certificado esteja criptografado. Você pode utilizar o certificado da forma como feito o download. Para exemplos de uso em PHP, veja a seção Utilizando as credenciais da API com PHP.

Para criptografar seu certificado, siga os passos abaixo:

  1. Abra seu terminal ou prompt de comando. Se estiver utilizando Windows, acesse o menu iniciar, Programas, Acessórios e, então, Prompt de Comando.
  2. Tenha a certeza de que o binário do OpenSSL está em seu PATH. Se não estiver, adicione-o.
  3. Execute o seguinte comando em seu terminal (lembrando de trocar os diretórios pela localização do seu certificado):
    openssl pkcs12 -export -in cert_key_pem.txt -inkey cert_key_pem.txt -out paypal_cert.p12

Atenção: Ao criptografar seu certificado, você será questionado por uma senha que será utilizada para descriptografá-lo. Informe a senha quando questionado pelo OpenSSL e tenha a certeza de armazená-la em um lugar seguro.

Ao finalizar esse processo de criptografia do certificado, você terá um arquivo chamado paypal_cert.p12, que deverá ser instalado em seu servidor.

Importando o certificado para utilização com .NET e ASP clássico

Se você estiver utilizando o SDK da PayPal para .NET ou para ASP clássico, você precisará instalar o certificado criptografado em seu servidor.

Se você estiver desenvolvendo com o SDK da PayPal para .NET, o Windows requer que você importe o certificado no Armazenamento de Certificados do Windows e garanta acesso à sua chave privada para o usuário que estiver executando sua aplicação web. A Microsoft fornece um utilitário que facilita essa tarefa através de uma única linha de comando. O utilitário, chamado Windows HTTP Services Certificate Configuration Tool, ou WinHttpCertCfg.exe, é disponibilizado gratuitamente pela Microsoft.

Para utilizar esse utilitário, você precisará de privilégios administrativos. Digite o seguinte comando em seu prompt de comando, fazendo as substituições como descrito abaixo:

WinHttpCertCfg -i \<paypal_cert.p12> -p \<privateKeyPassword> -c LOCAL_MACHINE\my -a \<userName>
  1. Substitua pelo nome do arquivo PKCS12 criptografado na seção anterior.
  2. Substitua pela senha que você utilizou para criptografar o certificado.
  3. Substitua pelo nome de usuário que estiver executando sua aplicação. Por exemplo:
    • Se for uma aplicação ASP.NET, então o usuário é
      ASPNET

      .

    • Se estiver usando o IIS 5 com a configuração padrão, então o usuário é
      IWAM_

      .

    • Se estiver usando o IIS 6 com a configuração padrão, então o usuário é
      “NETWORK SERVICE”

      .

Utilizando as credenciais da API com PHP

Se estiver fazendo a integração utilizando PHP, você poderá utilizar os exemplos descritos nessa seção para facilitar a integração. As duas funções ilustradas abaixo são reutilizáveis, ou seja, poderão ser utilizadas para enviar qualquer requisição de qualquer API PayPal, bastando apenas informar os campos requeridos pela operação da API e suas credenciais.

Exemplo de uso da assinatura

A função abaixo pode ser utilizada nas requisições em integrações PHP. Ela recebe dois parâmetros – o primeiro com os campos que serão enviados na requisição, e o segundo com a identificação do ambiente. Essa função pode ser utilizada para qualquer operação do Express Checkout, bastando apenas especificar o campo METHOD e os campos específicos da operação.

<?php
/**
 * Envia uma requisição NVP para uma API PayPal.
 *
 * @param array $requestNvp Define os campos da requisição.
 * @param boolean $sandbox Define se a requisição será feita no sandbox ou no
 *                         ambiente de produção.
 *
 * @return array Campos retornados pela operação da API. O array de retorno poderá
 *               pode ser vazio, caso a operação não seja bem sucedida. Nesse caso,
 *               os logs de erro deverão ser verificados.
 */
function sendNvpRequest(array $requestNvp, $sandbox = false)
{
    //Endpoint da API
    $apiEndpoint  = 'https://api-3t.' . ($sandbox? 'sandbox.': null);
    $apiEndpoint .= 'paypal.com/nvp';

    //Executando a operação
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $apiEndpoint);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($requestNvp));

    $response = urldecode(curl_exec($curl));

    curl_close($curl);

    //Tratando a resposta
    $responseNvp = array();

    if (preg_match_all('/(?<name>[^\=]+)\=(?<value>[^&]+)&?/', $response, $matches)) {
        foreach ($matches['name'] as $offset => $name) {
            $responseNvp[$name] = $matches['value'][$offset];
        }
    }

    //Verificando se deu tudo certo e, caso algum erro tenha ocorrido,
    //gravamos um log para depuração.
    if (isset($responseNvp['ACK']) && $responseNvp['ACK'] != 'Success') {
        for ($i = 0; isset($responseNvp['L_ERRORCODE' . $i]); ++$i) {
            $message = sprintf("PayPal NVP %s[%d]: %s\n",
                               $responseNvp['L_SEVERITYCODE' . $i],
                               $responseNvp['L_ERRORCODE' . $i],
                               $responseNvp['L_LONGMESSAGE' . $i]);

            error_log($message);
        }
    }

    return $responseNvp;
}

Abaixo um exemplo de uso da função sendNvpRequest para fazer uma requisição para a operação SetExpressCheckout da API Express Checkout:

<?php
//Incluindo o arquivo que contém a função sendNvpRequest
require 'sendNvpRequest.php';

//Vai usar o Sandbox, ou produção?
$sandbox = true;

//Baseado no ambiente, sandbox ou produção, definimos as credenciais
//e URLs da API.
if ($sandbox) {
    //credenciais da API para o Sandbox
    $user = 'conta-business_api1.test.com';
    $pswd = '1365001380';
    $signature = 'AiPC9BjkCyDFQXbSkoZcgqH3hpacA-p.YLGfQjc0EobtODs.fMJNajCx';

    //URL da PayPal para redirecionamento, não deve ser modificada
    $paypalURL = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
} else {
    //credenciais da API para produção
    $user = 'usuario';
    $pswd = 'senha';
    $signature = 'assinatura';

    //URL da PayPal para redirecionamento, não deve ser modificada
    $paypalURL = 'https://www.paypal.com/cgi-bin/webscr';
}

//Campos da requisição da operação SetExpressCheckout, como ilustrado acima.
$requestNvp = array(
    'USER' => $user,
    'PWD' => $pswd,
    'SIGNATURE' => $signature,

    'VERSION' => '108.0',
    'METHOD'=> 'SetExpressCheckout',

    'PAYMENTREQUEST_0_PAYMENTACTION' => 'SALE',
    'PAYMENTREQUEST_0_AMT' => '22.00',
    'PAYMENTREQUEST_0_CURRENCYCODE' => 'BRL',
    'PAYMENTREQUEST_0_ITEMAMT' => '22.00',
    'PAYMENTREQUEST_0_INVNUM' => '1234',

    'L_PAYMENTREQUEST_0_NAME0' => 'Item A',
    'L_PAYMENTREQUEST_0_DESC0' => 'Produto A – 110V',
    'L_PAYMENTREQUEST_0_AMT0' => '11.00',
    'L_PAYMENTREQUEST_0_QTY0' => '1',
    'L_PAYMENTREQUEST_0_ITEMAMT' => '11.00',
    'L_PAYMENTREQUEST_0_NAME1' => 'Item B',
    'L_PAYMENTREQUEST_0_DESC1' => 'Produto B – 220V',
    'L_PAYMENTREQUEST_0_AMT1' => '11.00',
    'L_PAYMENTREQUEST_0_QTY1' => '1',

    'RETURNURL' => 'http://PayPalPartner.com.br/VendeFrete?return=1',
    'CANCELURL' => 'http://PayPalPartner.com.br/CancelaFrete',
    'BUTTONSOURCE' => 'BR_EC_EMPRESA'
);

//Envia a requisição e obtém a resposta da PayPal
$responseNvp = sendNvpRequest($requestNvp, $sandbox);

//Se a operação tiver sido bem sucedida, redirecionamos o cliente para o
//ambiente de pagamento.
if (isset($responseNvp['ACK']) && $responseNvp['ACK'] == 'Success') {
    $query = array(
        'cmd'    => '_express-checkout',
        'token'  => $responseNvp['TOKEN']
    );

    $redirectURL = sprintf('%s?%s', $paypalURL, http_build_query($query));

    header('Location: ' . $redirectURL);
} else {
    //Opz, alguma coisa deu errada.
    //Verifique os logs de erro para depuração.
}

Exemplo de uso do certificado

A função abaixo pode ser utilizada nas requisições em integrações PHP. Ela recebe três parâmetros – o primeiro com os campos que serão enviados na requisição, o segundo com a localização do certificado digital, e o terceiro com a identificação do ambiente. Essa função pode ser utilizada para qualquer operação do Express Checkout, bastando apenas especificar o campo METHOD e os campos específicos da operação.

<?php
/**
 * Envia uma requisição NVP assinada digitalmente com um certificado de API PayPal.
 *
 * @param array $requestNvp Define os campos da requisição.
 * @param string $certpath Localização do certificado digital.
 * @param boolean $sandbox Define se a requisição será feita no sandbox ou no
 *                         ambiente de produção.
 *
 * @return array Campos retornados pela operação da API. O array de retorno poderá
 *               pode ser vazio, caso a operação não seja bem sucedida. Nesse caso,
 *               os logs de erro deverão ser verificados.
 */
function sendSignedNvpRequest(array $requestNvp, $certpath, $sandbox = false)
{
    $certpath = realpath($certpath);

    if ($certpath === false || !is_readable($certpath)) {
        error_log(sprintf('O certificado PayPal não foi encontrado em "%s"',
                          $certpath));

        return array();
    }

    //Endpoint da API
    $apiEndpoint  = 'https://api.' . ($sandbox? 'sandbox.': null);
    $apiEndpoint .= 'paypal.com/nvp';

    //Executando a operação
    $curl = curl_init();

    curl_setopt($curl, CURLOPT_URL, $apiEndpoint);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true);
    curl_setopt($curl, CURLOPT_SSLCERT, $certpath);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($requestNvp));

    $response = urldecode(curl_exec($curl));

    curl_close($curl);

    //Tratando a resposta
    $responseNvp = array();

    if (preg_match_all('/(?<name>[^\=]+)\=(?<value>[^&]+)&?/', $response, $matches)) {
        foreach ($matches['name'] as $offset => $name) {
            $responseNvp[$name] = $matches['value'][$offset];
        }
    }

    //Verificando se deu tudo certo e, caso algum erro tenha ocorrido,
    //gravamos um log para depuração.
    if (isset($responseNvp['ACK']) && $responseNvp['ACK'] != 'Success') {
        for ($i = 0; isset($responseNvp['L_ERRORCODE' . $i]); ++$i) {
            $message = sprintf("PayPal NVP %s[%d]: %s\n",
                               $responseNvp['L_SEVERITYCODE' . $i],
                               $responseNvp['L_ERRORCODE' . $i],
                               $responseNvp['L_LONGMESSAGE' . $i]);

            error_log($message);
        }
    }

    return $responseNvp;
}

Abaixo um exemplo de uso da função sendSignedNvpRequest para fazer uma requisição para a operação SetExpressCheckout da API Express Checkout:

<?php
//Incluindo o arquivo que contém a função sendSignedNvpRequest
require 'sendSignedNvpRequest.php';

//Vai usar o Sandbox, ou produção?
$sandbox = true;

//Baseado no ambiente, sandbox ou produção, definimos as credenciais
//e URLs da API.
if ($sandbox) {
    //credenciais da API para o Sandbox
    $user = 'usuário da API';
    $pswd = 'senha da API';
    $certpath = 'paypal_cert.txt';

    //URL da PayPal para redirecionamento, não deve ser modificada
    $paypalURL = 'https://www.sandbox.paypal.com/cgi-bin/webscr';
} else {
    //credenciais da API para produção
    $user = 'usuario';
    $pswd = 'senha';
    $certpath = 'paypal_cert.txt';

    //URL da PayPal para redirecionamento, não deve ser modificada
    $paypalURL = 'https://www.paypal.com/cgi-bin/webscr';
}

//Campos da requisição da operação SetExpressCheckout, como ilustrado acima.
$requestNvp = array(
    'VERSION' => '108.0',
    'METHOD'=> 'SetExpressCheckout',
    'USER' => $user,
    'PWD' => $pswd,

    'PAYMENTREQUEST_0_PAYMENTACTION' => 'SALE',
    'PAYMENTREQUEST_0_AMT' => '22.00',
    'PAYMENTREQUEST_0_CURRENCYCODE' => 'BRL',
    'PAYMENTREQUEST_0_ITEMAMT' => '22.00',
    'PAYMENTREQUEST_0_INVNUM' => '1234',

    'L_PAYMENTREQUEST_0_NAME0' => 'Item A',
    'L_PAYMENTREQUEST_0_DESC0' => 'Produto A – 110V',
    'L_PAYMENTREQUEST_0_AMT0' => '11.00',
    'L_PAYMENTREQUEST_0_QTY0' => '1',
    'L_PAYMENTREQUEST_0_ITEMAMT' => '11.00',
    'L_PAYMENTREQUEST_0_NAME1' => 'Item B',
    'L_PAYMENTREQUEST_0_DESC1' => 'Produto B – 220V',
    'L_PAYMENTREQUEST_0_AMT1' => '11.00',
    'L_PAYMENTREQUEST_0_QTY1' => '1',

    'RETURNURL' => 'http://PayPalPartner.com.br/VendeFrete?return=1',
    'CANCELURL' => 'http://PayPalPartner.com.br/CancelaFrete',
    'BUTTONSOURCE' => 'BR_EC_EMPRESA'
);

//Envia a requisição e obtém a resposta da PayPal
$responseNvp = sendSignedNvpRequest($requestNvp, $certpath, $sandbox);

//Se a operação tiver sido bem sucedida, redirecionamos o cliente para o
//ambiente de pagamento.
if (isset($responseNvp['ACK']) && $responseNvp['ACK'] == 'Success') {
    $query = array(
        'cmd'    => '_express-checkout',
        'token'  => $responseNvp['TOKEN']
    );

    $redirectURL = sprintf('%s?%s', $paypalURL, http_build_query($query));

    header('Location: ' . $redirectURL);
} else {
    //Opz, alguma coisa deu errada.
    //Verifique os logs de erro para depuração.
}