stone_payment_tech 2.0.0 copy "stone_payment_tech: ^2.0.0" to clipboard
stone_payment_tech: ^2.0.0 copied to clipboard

PlatformAndroid

Plugin Flutter para integrar sua aplicação com o SDK Android da Stone para meios de pagamento.

Stone Payment Tech #

Stone

Plugin Flutter não oficial para integração com o SDK da Stone Smart POS.
Compatível com maquininhas Android inteligentes.

SobreRequisitos e ConfiguraçõesTecnologiasInstalaçãoConfiguração de FlavorsUsoModelo de Resposta


🚨 Aviso #

Este plugin é não oficial e foi desenvolvido de forma independente para facilitar a integração de pagamentos via SDK da Stone em dispositivos Android Smart POS.


🎯 Sobre #

O stone_payment_tech é um plugin Flutter para integração direta com o SDK Stone, permitindo a realização de transações em maquininhas smart Android.

📋 Requisitos e Configurações #

Para utilizar este plugin corretamente, seu projeto precisa atender aos seguintes requisitos:

Versões do Gradle e Dependências #

Componente Versão Mínima Recomendada
Gradle Wrapper 8.12 8.12+
Kotlin 2.1.21 2.1.21+
Android Gradle Plugin 8.12.1 8.12.1+
Stone SDK 4.13.0 4.13.0
Java (compilação) 11 11+

Configuração do Android SDK #

No arquivo android/app/build.gradle do seu projeto:

android {
    compileSdk = 35  // Obrigatório: versão 35 ou superior

    defaultConfig {
        minSdk = 23        // Mínimo exigido pelo SDK Stone
        targetSdk = 35     // Recomendado: 35 ou superior
    }

    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_11
        targetCompatibility = JavaVersion.VERSION_11
    }

    kotlinOptions {
        jvmTarget = "11"
    }
}

Gradle Wrapper Properties #

No arquivo android/gradle/wrapper/gradle-wrapper.properties:

distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip

Build.gradle do Projeto #

No arquivo android/build.gradle (nível de projeto):

buildscript {
    ext.kotlin_version = '2.1.21'

    dependencies {
        classpath 'com.android.tools.build:gradle:8.12.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

Arquivo local.properties #

Na raiz da pasta android/, crie ou edite o arquivo local.properties e adicione:

sdk.dir=/caminho/para/seu/Android/sdk
flutter.sdk=/caminho/para/seu/flutter/sdk
licenceKey=<sua_licenca_jylabtech>
licenceInternalKey=aHR0cHM6Ly9wb3MtcGF5bWVudHMtYXBpLTU3NzQ2NDIzNTQwOC5zb3V0aGFtZXJpY2EtZWFzdDEucnVuLmFwcC9wb3MtcGF5bWVudHMvbGljZW5jZS9jaGVjay9pbnZvaWNl

⚠️ Importante:

  • O compileSdk deve ser 35 ou superior para evitar conflitos com dependências do AndroidX
  • O minSdk deve ser 23 ou superior (requisito do SDK Stone)
  • Certifique-se de que todas as configurações de compileSdkVersion em subprojetos também estejam na versão 35+

Resumo de Versões Utilizadas #

// Gradle
gradle-8.12

// Kotlin
kotlin_version = '2.1.21'

// Stone SDK
stone_sdk_version = '4.13.0'

// Android Gradle Plugin
classpath 'com.android.tools.build:gradle:8.12.1'

// SDK Versions
compileSdk = 35
targetSdk = 35
minSdk = 23

🔐 Licenciamento #

Para adquirir uma licença, cadastre-se no site Licença JY Labtech.
Cada licença é válida por terminal. Após a compra, será gerada uma chave licenceKey vinculada ao terminal.

Inicialização com licença #

Obervação: A partir da versão 1.0.0 não é mais necessário passar o licenceKey como parâmetro.
await StonePaymentTech.initPayment(
  handler: controller,
);

A partir da versão 1.0.0 é necessário adicionar as chaves no seu arquivo local.properties na raiz da pasta android.

licenceKey=<sua_licenca>
licenceInternalKey=aHR0cHM6Ly9wb3MtcGF5bWVudHMtYXBpLTU3NzQ2NDIzNTQwOC5zb3V0aGFtZXJpY2EtZWFzdDEucnVuLmFwcC9wb3MtcGF5bWVudHMvbGljZW5jZS9jaGVjay9pbnZvaWNl

✅ Máquinas compatíveis #

  • Positivo L300
  • Positivo L400
  • Ingenico APOS A8
  • Sunmi P2
  • Sunmi A-11
  • Gertec GPOS700X
  • Tectoy T2
  • Tectoy T8

🚀 Tecnologias #

  • Flutter
  • SDK Stone 4.13.0
  • Comunicação via Platform Channels

⚙️ Instalação #

1. pubspec.yaml #

Adicione a dependência:

dependencies:
  stone_payment_tech: any

2. build.gradle #

No arquivo android/app/build.gradle, defina o minSdkVersion como 23:

defaultConfig {
    ...
    minSdkVersion 23
    ...
}

⚠️ O SDK da Stone requer minSdkVersion >= 23.


🧩 Configuração de Flavors #

Para utilizar o plugin corretamente, você precisa configurar os seguintes productFlavors e signingConfigs no android/app/build.gradle do seu projeto:

👇 Exemplo completo: #

...

android {
    ....
    signingConfigs {
        release {
            storeFile keyProperties.storeFile
            keyAlias keyProperties.keyAlias
            keyPassword keyProperties.keyPassword
            storePassword keyProperties.storePassword
        }
    }

    flavorDimensions "model"
    productFlavors {
        gertecGPOS700X {
            dimension "model"
            signingConfig signingConfigs.release
        }
        positivoSeriesL {
            dimension "model"
            signingConfig signingConfigs.release
        }
        sunmi {
            dimension "model"
            signingConfig signingConfigs.release
        }
        tectoySeriesT {
            dimension "model"
            signingConfig signingConfigs.release
        }
        ingenico {
            dimension "model"
            signingConfig signingConfigs.release
        }
    }
}

Importante: mesmo que o seu projeto não use todos os modelos, você precisa declarar todos os flavors para evitar erro de compilação, pois o plugin depende da estrutura deles.


⚠️ O SDK da Stone requer minSdkVersion >= 23.


📦 Uso #

Criando um StoneHandler #

Crie uma classe que estenda IStoneHandler. Essa será responsável por monitorar os eventos e respostas da Stone:

class StoneHandler extends IStoneHandler {
  final Function(StoneTransaction?)? onTransaction;
  final Function(String)? onMessageMonitor;

  StoneHandler({this.onTransaction, this.onMessageMonitor});

  @override
  Future<void> onError(String message) async {}
  @override
  Future<void> onMessage(String message) async {}
  @override
  Future<void> onFinishedResponse(String message) async {}
  @override
  Future<void> onChanged(String message) async {}
  @override
  Future<void> onAuthProgress(String message) async {}
  @override
  Future<void> onTransactionSuccess() async {}
  @override
  Future<void> onLoading(bool show) async {}
}

Iniciando uma transação #

Ative primeiro o pinpad com seu StoneCode:

StoneTech.I.payment.activePinpad(stoneCode: '12345');

Após ativar, você pode iniciar uma das transações disponíveis:

StoneTech.I.payment.creditPayment(12.50);
StoneTech.I.payment.creditPaymentParc(value: 12.50, installment: 2);
StoneTech.I.payment.debitPayment(12.50);
StoneTech.I.payment.voucherPayment(12.50);
StoneTech.I.payment.pixPayment(
  amount: 1250,
  qrCodeAuthorization: '',
  qrCodeProviderid: '',
);
StoneTech.I.payment.cancelTransaction(
  amount: 12.50,
  transactionType: PaymentTypeTransaction.CREDIT,
);
StoneTech.I.payment.abortTransaction();

🔖 Obs: o SDK imprime automaticamente a via do consumidor.

Implementação de página #

Abaixo segue um exemplo usando uma tela pré montada, onde você deve passar os parâmetros solicitados e a tela faz todo o fluxo de transação, e ao terminar lhe devolve um StoneTransactionModel.

 final result = await Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => StoneStreamPage(
      stonePaymentParams: StonePaymentParams(
        amount: 15,
        type: StonePaymentType.debit,
        credentials: StoneCredentialsModel(
          stoneCode: 'StoneCode',
          appName: 'nome_do_seu_app',
        ),
      ),
    ),
  ),
);

Implementação usando Dialog #

Abaixo segue um exemplo usando um dialog pré montado, onde você deve passar os parâmetros solicitados e o dialog faz todo o fluxo de transação, e ao terminar lhe devolve um StoneTransactionModel.

await showDialog(
  context: context,
  builder: (context) {
    return StoneStreamDialog(
      stonePaymentParams: StonePaymentParams(
        amount: 15,
        type: StonePaymentType.debit,
        credentials: StoneCredentialsModel(
          stoneCode: 'StoneCode',
          appName: 'nome_do_seu_app',
        ),
      ),
      onConfirmPayment: (transaction) {
        print('***Response dialog: $transaction');
      },
    );
  });

Implementação usando Tela para IMPRESSÃO #

 final result = await Navigator.push(
  context,
  MaterialPageRoute(
    builder: (context) => StonePrinterPage(
      credentials: StoneCredentialsModel(
          stoneCode: 'StoneCode',
          appName: 'nome_do_seu_app',
        ),
        child: <Seu widget montando seu layout para impressão>
    ),
  ),
);

Ele vai devolver um boolean, informando se deu certo a impressão ou não.

Style

Caso queira passar um estilo diferente para o StoneStreamDialog ou para StoneStreamPage, é só passar o parâmetro style, sendo este a classe StoneStreamStyle.


📥 Callbacks implementáveis (StoneHandler) #

Método Descrição
onAbortedSuccessfully Transação abortada com sucesso
onAuthProgress Status de autenticação (inclui PIN pad)
onError Erro em uma operação
onMessage Mensagem bruta vinda da Stone
onFinishedResponse Resultado final da transação
onTransactionSuccess Sucesso da transação

📄 Modelo de Resposta #

Exemplo: onAuthProgress, onChanged, onError #

{
  "method": "transaction",
  "message": "Transação aprovada",
  "errorMessage": "",
  "result": 0
}

Exemplo: onFinishedResponse #

{
  "method": "transaction",
  "idFromBase": 0,
  "amount": 1250,
  "cardHolderNumber": "",
  "cardBrand": "",
  "date": "",
  "time": "",
  "aid": "",
  "arcq": "",
  "transactionReference": "",
  "saleAffiliationKey": "",
  "entryMode": "",
  "typeOfTransactionEnum": "",
  "serialNumber": "",
  "manufacture": "",
  "actionCode": "",
  "transactionStatus": "",
  "messageFromAuthorize": "",
  "errorMessage": "",
  "result": 0
}

❗ Observações importantes #

  • Para transações PIX, forneça qrCodeAuthorization e qrCodeProviderid.
  • Para exibir QRCode (campo method: QRCode), o retorno virá em message como uma imagem em Bitmap convertida para String.
  • O método getAllTransactions() pode ser usado para buscar transações anteriores para fins de estorno.

💡 Dica #

A resposta mais completa da SDK Stone virá sempre no método onFinishedResponse. Use o campo method da resposta para identificar o tipo de evento:

void onFinishedResponseMonitor(StoneTransaction? stoneTransaction) {
  switch (stoneTransaction?.method) {
    case 'licence':
    //se result vier == 0, licença ativada, do contrário o objeto "errorMessage" irá trazer a descrição do erro.
    case 'active':
      // Terminal ativado
      break;
    case 'transaction':
      // Transação finalizada
      break;
    case 'abort':
    case 'abortPix':
    case 'cancel':
    case 'printer':
    case 'QRCode':
      // Exibir QR Code
      break;
    case 'PaymentOptions':
      // Use _stoneTech.payment.setPaymentOption(option: ...)
      break;
    case 'reversal':
      break;
    default:
  }
}


🔝 Voltar ao topo

3
likes
140
points
474
downloads

Publisher

verified publisherjylabtech.com.br

Weekly Downloads

Plugin Flutter para integrar sua aplicação com o SDK Android da Stone para meios de pagamento.

Repository (GitHub)

Documentation

API reference

License

BSD-3-Clause (license)

Dependencies

flutter

More

Packages that depend on stone_payment_tech

Packages that implement stone_payment_tech