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
| Campo | Valor |
|---|---|
| Action | com.sopague.START |
| Categoria | android.intent.category.DEFAULT |
| Resultado | Activity 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ção | OPERATION_TYPE | Parâmetros adicionais |
|---|---|---|
| Débito | DEBIT | — |
| Débito digitado | DEBIT_KEYED_IN | — |
| Crédito à vista | CREDIT | — |
| Crédito digitado à vista | CREDIT_KEYED_IN | — |
| Crédito parcelado | CREDIT_INSTALLMENT | INSTALLMENTS |
| Crédito digitado parcelado | CREDIT_KEYED_IN_PARCELADO | INSTALLMENTS |
| PIX | PIX | — |
| Cancelamento de débito | CANCELLATION_DEBIT | NSU, TRANSACTION_DATE |
| Cancelamento de crédito | CANCELLATION_CREDIT | NSU, TRANSACTION_DATE |
| Reimpressão por transação | PRINT_TRANSACTION_BY | NSU, 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_VALUEcom o valor"3333". - Teste recusa e cancelamento pelo operador.
- Valide
RESULT_OK,RESULT_CANCELED,NSUeERROR. - 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.
