SopagueDocs
v3

Use a ação com.sopague.START para abrir o Vender, executar uma operação no terminal e devolver o resultado ao aplicativo chamador.

Contrato da Activity

A chamada é assíncrona. Mantenha a tela chamadora ativa e aguarde o resultado antes de iniciar outra operação.

Contrato da chamada

CampoValor
Actioncom.sopague.START
Categoriaandroid.intent.category.DEFAULT
ResultadoActivity Result API ou startActivityForResult

Parâmetros de entrada

Valor em centavos

TRANSACTION_VALUE é obrigatório inclusive para cancelamentos e reimpressão. Envie apenas números: 150 representa R$ 1,50 e 12000 representa R$ 120,00.

Operações suportadas

OperaçãoOPERATION_TYPEParâmetros adicionais
DébitoDEBIT—
Débito digitadoDEBIT_KEYED_IN—
Crédito à vistaCREDIT—
Crédito digitado à vistaCREDIT_KEYED_IN—
Crédito parceladoCREDIT_INSTALLMENTINSTALLMENTS
Crédito digitado parceladoCREDIT_KEYED_IN_PARCELADOINSTALLMENTS
PIXPIX—
Cancelamento de débitoCANCELLATION_DEBITNSU, TRANSACTION_DATE
Cancelamento de créditoCANCELLATION_CREDITNSU, TRANSACTION_DATE
Reimpressão por transaçãoPRINT_TRANSACTION_BYNSU, TRANSACTION_DATE

Código exato

Os valores de OPERATION_TYPE diferenciam maiúsculas e minúsculas. Envie exatamente um dos códigos da tabela.

Exemplo recomendado em Kotlin

Registre o launcher uma vez, antes de iniciar a operação:

private val venderLauncher = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    val data = result.data
 
    when (result.resultCode) {
        Activity.RESULT_OK -> {
            val nsu = data?.getStringExtra("NSU")
            val nsuCancellation = data?.getStringExtra("NSU_CANCELLATION")
            Log.i("VENDER", "Operação concluída. NSU=$nsu")
        }
 
        Activity.RESULT_CANCELED -> {
            val error = data?.getStringExtra("ERROR")
                ?: "Operação cancelada"
            Log.e("VENDER", error)
        }
    }
}

Depois, monte e envie a Intent:

fun iniciarDebito(valorEmCentavos: Long) {
    val intent = Intent("com.sopague.START").apply {
        addCategory(Intent.CATEGORY_DEFAULT)
        putExtra("TRANSACTION_VALUE", valorEmCentavos)
        putExtra("OPERATION_TYPE", "DEBIT")
    }
 
    if (intent.resolveActivity(packageManager) == null) {
        Log.e("VENDER", "Aplicativo Vender não encontrado")
        return
    }
 
    venderLauncher.launch(intent)
}

Exemplos de operações

Crédito parcelado

val intent = Intent("com.sopague.START").apply {
    putExtra("TRANSACTION_VALUE", "48000") // R$ 480,00
    putExtra("OPERATION_TYPE", "CREDIT_INSTALLMENT")
    putExtra("INSTALLMENTS", "4")
}
venderLauncher.launch(intent)

PIX

val intent = Intent("com.sopague.START").apply {
    putExtra("TRANSACTION_VALUE", 5000L) // R$ 50,00
    putExtra("OPERATION_TYPE", "PIX")
}
venderLauncher.launch(intent)

Cancelamento de crédito

val intent = Intent("com.sopague.START").apply {
    putExtra("TRANSACTION_VALUE", "8990")
    putExtra("OPERATION_TYPE", "CANCELLATION_CREDIT")
    putExtra("NSU", "000789012")
    putExtra("TRANSACTION_DATE", "15062026")
}
venderLauncher.launch(intent)

Exemplo em Java

Para projetos que ainda usam startActivityForResult:

private static final int REQUEST_VENDER = 1113;
 
Intent intent = new Intent("com.sopague.START");
intent.addCategory(Intent.CATEGORY_DEFAULT);
intent.putExtra("TRANSACTION_VALUE", "15000"); // R$ 150,00
intent.putExtra("OPERATION_TYPE", "DEBIT");
startActivityForResult(intent, REQUEST_VENDER);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode != REQUEST_VENDER) return;
 
    if (resultCode == RESULT_OK) {
        String nsu = data != null ? data.getStringExtra("NSU") : null;
        Log.i("VENDER", "Operação concluída. NSU=" + nsu);
    } else {
        String error = data != null
            ? data.getStringExtra("ERROR")
            : "Operação cancelada";
        Log.e("VENDER", error);
    }
}

Resposta

Sucesso — RESULT_OK

Falha — RESULT_CANCELED

Sobre CODRESP

O Vender interpreta internamente o CODRESP recebido do m-SiTef. O aplicativo integrador deve decidir pelo resultCode: RESULT_OK indica conclusão bem-sucedida e RESULT_CANCELED indica falha ou cancelamento.

Visibilidade de pacote no Android 11+

Se o aplicativo chamador usa resolveActivity e tem targetSdkVersion 30 ou superior, declare a consulta no AndroidManifest.xml:

<queries>
    <intent>
        <action android:name="com.sopague.START" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent>
</queries>

Checklist de homologação

  • Na homologação (HMG), as transações são simuladas e a leitura do cartão físico não fica habilitada.
  • Teste débito, crédito, parcelado e PIX com valores válidos.
  • Teste o tratamento de erro enviando TRANSACTION_VALUE com o valor "3333".
  • Teste recusa e cancelamento pelo operador.
  • Valide RESULT_OK, RESULT_CANCELED, NSU e ERROR.
  • Teste uma operação de cancelamento com NSU e data reais.
  • Bloqueie cliques repetidos enquanto uma operação estiver em andamento.
  • Confirme o comportamento quando o Vender não estiver instalado.