SDKs & Bibliotecas
Mobile

API de Nota Fiscal para Android e Smart POS (Kotlin)

Emissão de NFC-e mobile, maquininhas Smart POS (Cielo, Stone, PagBank) e contingência offline.

Guia de integração da API fiscal do NFER para Android (Kotlin). Ideal para desenvolvedores de aplicativos mobile, PDVs móveis, tablets de frente de caixa e maquininhas Smart POS (Cielo LIO, Stone, PagBank, Rede).

Kotlin 1.9+Smart POS & Mobile POSOkHttpClient & Coroutines

1. Permissões no AndroidManifest.xml

Certifique-se de que a permissão de internet esteja configurada no manifesto do aplicativo:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
</manifest>

2. Dependências no build.gradle (Module :app)

Adicione a biblioteca de rede OkHttp e o conversor JSON:

dependencies {
implementation("com.squareup.okhttp3:okhttp:4.12.0")
implementation("com.google.code.gson:gson:2.10.1")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3")
}

3. Gerenciador Fiscal em Kotlin (NferFiscalService)

Classe para emissão direta de NFC-e (Nota de Consumidor Modelo 65) a partir do PDV Android:

package com.exemplo.pdv
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import java.io.IOException
class NferFiscalService(
private val apiKey: String,
private val baseUrl: String = "https://api.nfer.me"
) {
private val client = OkHttpClient()
private val jsonMediaType = "application/json; charset=utf-8".toMediaType()
suspend fun emitirNfce(payloadJson: String): String = withContext(Dispatchers.IO) {

4. Exemplo de Emissão de NFC-e no PDV Móvel

Chamada de emissão dentro de uma Coroutine na Activity ou ViewModel do Android:

fun finalizarVenda(valorTotal: Double, formaPagamento: String) {
viewModelScope.launch {
try {
val payload = """
{
"naturezaOperacao": "VENDA AO CONSUMIDOR",
"pagamentos": [
{ "forma": "$formaPagamento", "valor": $valorTotal }
],
"itens": [
{
"descricao": "Cafe Expresso 50ml",
"ncm": "21011110",
"unidade": "UN",
"quantidade": 1,
"valorUnitario": $valorTotal
}
]

Contingência Offline para Maquininhas

Se a maquininha perder sinal de 4G/Wi-Fi na rua, o NFER aceita emissão em contingência offline (tpEmis=9) para sincronização automática assim que a conectividade retornar.