Integração Premmia
Sobre o Premmia¶
O Premmia é o programa de fidelidade da rede de postos Petrobras. Ao integrar com este, você pode acumular e resgatar pontos em suas transações de pagamento.
Deeplinks disponíveis¶
| URL | FUNÇÃO |
|---|---|
| premmia://payment | Pagamento em dinheiro |
| premmia://reprint | Reimpressão do último comprovante em dinheiro |
| premmia://rescue | Resgate de produtos |
Dinheiro/Cheque¶
A aplicação de automação deverá chamar o deeplink premmia://payment, que iniciará a aplicação Premmia, analisando os dados enviados.
Os dados já enviados pela aplicação de automação para o deeplink não serão solicitados nas telas do Premmia.
Ao final da transação, ocorrendo aprovação, será mostrada a tela de Sucesso, imprimindo automaticamente a via do Estabelecimento.

Exemplo de implementação
public class MainActivity extends AppCompatActivity {
private final Integer REQUEST_DINHEIRO = 1001;
private final String ARG_RESULT = "RESULT";
private final String ARG_MESSAGE = "MESSAGE";
private final String PARAM_AMOUNT = 'amount';
private final String PARAM_DOCUMENTO = 'documento';
private final String PARAM_CODE = 'code';
private final String PARAM_PRINT = 'print';
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
Bundle bundle = new Bundle();
bundle.putString(PARAM_AMOUNT, "000000001234");
bundle.putString(PARAM_DOCUMENTO, "22222222222");
bundle.putString(PARAM_CODE, "1234");
bundle.putInt(PARAM_PRINT, 0);
Intent intentInfo = new Intent(Intent.ACTION_VIEW, Uri.parse("premmia://payment"));
intentInfo.putExtras(bundle);
startActivityForResult(intentInfo, REQUEST_DINHEIRO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCOde, resultCode, data);
if (RESULT_OK == resultCode && REQUEST_DINHEIRO == requestCode) {
String result = data.getStringExtra(ARG_RESULT);
String message = data.getStringExtra(ARG_MESSAGE);
}
}
}
class MainActivity : AppCompatActivity() {
private val REQUEST_DINHEIRO = 1001
private val ARG_RESULT = "RESULT"
private val ARG_MESSAGE = "MESSAGE"
private val PARAM_AMOUNT = "amount";
private val PARAM_DOCUMENTO = "documento";
private val PARAM_CODE = "code";
private val PARAM_PRINT = "print";
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bundle = Bundle().apply {
putString(PARAM_AMOUNT, "000000001234")
putString(PARAM_DOCUMENTO, "22222222222")
putString(PARAM_CODE, "1234")
putInt(PARAM_PRINT, 0)
}
val intentInfo = Intent(Intent.ACTION_VIEW, Uri.parse("premmia://payment"))
intentInfo.putExtras(bundle)
startActivityForResult(intentInfo, REQUEST_DINHEIRO)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK && requestCode == REQUEST_DINHEIRO) {
val result = data?.getStringExtra(ARG_RESULT)
val message = data?.getStringExtra(ARG_MESSAGE)
}
}
}
import React, { useState, useLayoutEffect } from 'react';
import { View, Text } from 'react-native';
import * as IntentLauncher from 'expo-intent-launcher';
const RESULT_OK = -1;
const RESULT_CANCELED = 0;
const ACTION_VIEW = 'android.intent.action.VIEW';
export default function MainComponent() {
const ARG_RESULT = "RESULT";
const ARG_MESSAGE = "MESSAGE";
const PARAM_AMOUNT = 'amount';
const PARAM_DOCUMENTO = 'documento';
const PARAM_CODE = 'code';
const PARAM_PRINT = 'print';
const [resultCode, setResultCode] = useState<number>();
const [resultData, setResultData] = useState({});
const launchIntent = async(deeplink: string, bundle: {}) => {
const intentParams = { ...bundle, data: deeplink }; //Unindo URI Deeplink com o bundle no intentParams
try {
const activityResult = await IntentLauncher.startActivityAsync(ACTION_VIEW, intentParams);
if (activityResult.data && activityResult.resultCode == RESULT_OK) {
if(activityResult.extra) {
const JSON_obj = JSON.parse(JSON.stringify(activityResult.extra))
const result = JSON_obj[ARG_RESULT];
const message = JSON_obj[ARG_MESSAGE];
setResultData(JSON_obj);
setResultCode(activityResult.resultCode);
}
}
} catch (error) {
console.error(error);
}
};
useLayoutEffect(() => {
const extras: { [key: string]: string|number } = {
[PARAM_AMOUNT]: '000000001234',
[PARAM_DOCUMENTO]: '22222222222',
[PARAM_CODE]: '1234',
[PARAM_PRINT]: 0,
};
const intentParams = {
extra: extras,
};
//Dispara o Deeplink assim que a tela termina de ser carregada
launchIntent('premmia://payment', intentParams);
}, []);
return (
<View>
<Text>Result Code: {resultCode}</Text>
<Text>Result Data: {JSON.stringify(resultData)}</Text>
</View>
);
}
Para utilizar o deeplink, será necessário fazer uso do código nativo:
package com.example.deeplink_test
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
class MainActivity: FlutterActivity(), MethodCallHandler {
private val CHANNEL = "sample.android/deeplink"
private lateinit var channel: MethodChannel
private var callback: Result? = null
private var requestCode: Int = -1
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).apply {
setMethodCallHandler(this@MainActivity)
}
}
override fun onMethodCall(call: MethodCall, result: Result) {
var action = ""
var deeplink = ""
var bundle = Bundle()
when(call.method) {
"startActivityForResult" -> {
callback = result
val params = call.arguments as? Map<String, Any>
params?.run {
for ((key, value) in params) {
when(key.toString()) {
"action" -> action = value.toString()
"data" -> deeplink = value.toString()
"requestCode" -> requestCode = value.toString().toInt()
"arguments" -> {
bundle.apply{
for((argKey, argValue) in (value as Map<String, Any>)) {
when(argValue) {
is String -> putString(argKey, argValue as String)
is Int -> putInt(argKey, argValue as Int)
is Boolean -> putBoolean(argKey, argValue as Boolean)
}
}
}
}
}
}
val intent = Intent(action, Uri.parse(deeplink)).apply {
putExtras(bundle)
}
startActivityForResult(intent, requestCode)
}
}
else -> result.notImplemented()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
this.requestCode -> {
when(resultCode) {
Activity.RESULT_OK -> {
data?.getExtras()?.let { extras ->
val resultMap = hashMapOf<String, Any?>()
for(key in extras.keySet()) {
resultMap[key] = extras.get(key)
}
callback?.success(resultMap)
}
} else -> callback?.error("ERROR", "No valid return from DeepLink", null)
}
} else -> callback?.error("ERROR", "Activity result was not OK", null)
}
}
}
E com o código nativo criado, podemos chamar ele através do startIntent abaixo:
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key,});
@override
State<MyApp> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
static const int REQUEST_DINHEIRO = 1001;
static const String ARG_RESULT = 'RESULT';
static const String ARG_MESSAGE = 'MESSAGE';
static const String PARAM_AMOUNT = 'amount';
static const String PARAM_DOCUMENTO = 'documento';
static const String PARAM_CODE = 'code';
static const String PARAM_PRINT = 'print';
int? resultCode;
var deeplinkResult = '';
static const platform = MethodChannel('sample.android/deeplink');
void startIntent(String deeplink, Map<String, String> bundle) async {
try {
final intent = {
'requestCode': REQUEST_DINHEIRO,
'action': 'android.intent.action.VIEW',
'data': deeplink,
'arguments': bundle,
};
var result = await platform.invokeMethod('startActivityForResult', intent);
if (result != null) {
var resultMap = Map<String, dynamic>.from(result);
String resultValue = resultMap[ARG_RESULT];
String message = resultMap[ARG_MESSAGE];
setState(() {
resultCode = 1;
});
}
} catch (e) {
log('Error launching intent: $e');
}
}
void _sendDeeplink() {
Map<String, String> intentParams = {
PARAM_AMOUNT: '000000001234',
PARAM_DOCUMENTO: '22222222222',
PARAM_CODE: '1234',
};
startIntent('premmia://payment', intentParams);
}
@override
void initState() {
super.initState();
_sendDeeplink();
}
@override
Widget build(BuildContext context) {
return ();
}
}
Requisições
As requisições abaixo devem ser enviadas via deeplink
| Obrigatóriedade | Parâmetro | Descrição |
|---|---|---|
| OBRIGATÓRIO | amount | 12 dígitos representando o valor, considerando os últimos 2 dígitos como casas decimais. Exemplo: "000000001234" é equivalente R$ 12,34 |
| OBRIGATÓRIO | document | 11 dígitos para acúmulo de pontos. O documento utilizado, para o acúmulo é o CPF. Exemplo: “22222222222” é equivalente 222.222.222-22 |
| OPCIONAL | code | 4 dígitos para identificação do funcionário do estabelecimento. Exemplo: “1234” Default: 0000 |
| OPCIONAL | Este parâmetro informa se a tela de SUCESSO na transação deve ser visualizada. Se informado no parâmetro “print”, o valor 0, a tela de SUCESSO não será visualizada, desta forma, o comprovante apenas na tela reimpressão. Se informado no parâmetro “print”, o valor 1, a tela de SUCESSO será visualizada. Default: 1 |
Retornos
Os retornos abaixo são mostrados na tela do POS para o usuário. Em casos de transações que não forem aprovadas, aparecerá, além da mensagem, o código de retorno, facilitando a identificação do atendimento Getnet.
| Result | Message |
|---|---|
| 00 | SUCESSO |
| 03 | FALHA |
| 04 | DESCONHECIDO |
| 15 | ERRO NO PARÂMETRO AMOUNT |
| 16 | ERRO NO PAÂMETRO DOCUMENT |
| 17 | ERRO NO PARÂMETRO CODE |
| 18 | ERRO NO PARÂMETRO PRINT |
| 55 | CODR3 NÃO ENCONTRADO |
| 56 | LIMITE DO PERÍODO JÁ ATINGIDO |
| 57 | CPF NÃO ELEGÍVEL PARA PONTUAÇÃO NO PREMMIA |
| 58 | POSTO NÃO CADASTRADO |
| 59 | POSTO INATIVO NO PREMMIA |
| 74 | COMPROVANTE COM MENSAGEM DE "SEUS PONTOS SERÃO CREDITADOS EM ATÉ 72H" |
| 77 | PARÂMETROS DE ENTRADA INVÁLIDOS PARA O DIA CORRENTE |
| 91 | SISTEMA INDISPONÍVEL – TENTE NOVAMENTE |
| 99 | SISTEMA INDISPONÍVEL |
Reimpressão¶
O deeplink premmia://reprint irá reimprimir o último comprovante.
Exemplo de implementação
public class MainActivity extends AppCompatActivity {
private final Integer REQUEST_REIMPRESSAO = 1002;
private final String ARG_RESULT = "RESULT";
private final String ARG_MESSAGE = "MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
setContentView(R.layout.activity_main);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("premmia://reprint"));
startActivityForResult(intent, REQUEST_REIMPRESSAO);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCOde, resultCode, data);
if (RESULT_OK == resultCode && REQUEST_REIMPRESSAO == requestCode) {
String result = data.getStringExtra(ARG_RESULT);
String message = data.getStringExtra(ARG_MESSAGE);
}
}
}
class MainActivity : AppCompatActivity() {
private val REQUEST_REIMPRESSAO = 1002
private val ARG_RESULT = "RESULT"
private val ARG_MESSAGE = "MESSAGE"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("premmia://reprint"))
startActivityForResult(intent, REQUEST_REIMPRESSAO)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode == RESULT_OK && requestCode == REQUEST_REIMPRESSAO) {
val result = data?.getStringExtra(ARG_RESULT)
val message = data?.getStringExtra(ARG_MESSAGE)
}
}
}
import React, { useState, useLayoutEffect } from 'react';
import { View, Text } from 'react-native';
import * as IntentLauncher from 'expo-intent-launcher';
const RESULT_OK = -1;
const RESULT_CANCELED = 0;
const ACTION_VIEW = 'android.intent.action.VIEW';
export default function MainComponent() {
const ARG_RESULT = "RESULT";
const ARG_MESSAGE = "MESSAGE";
const [resultCode, setResultCode] = useState<number>();
const [resultData, setResultData] = useState({});
const launchIntent = async(deeplink: string, bundle: {}) => {
const intentParams = { ...bundle, data: deeplink }; //Unindo URI Deeplink com o bundle no intentParams
try {
const activityResult = await IntentLauncher.startActivityAsync(ACTION_VIEW, intentParams);
if (activityResult.data && activityResult.resultCode == RESULT_OK) {
if(activityResult.extra) {
const JSON_obj = JSON.parse(JSON.stringify(activityResult.extra))
const result = JSON_obj[ARG_RESULT];
const message = JSON_obj[ARG_MESSAGE];
setResultData(JSON_obj);
setResultCode(activityResult.resultCode);
}
}
} catch (error) {
console.error(error);
}
};
useLayoutEffect(() => {
const intentParams = {};
//Dispara o Deeplink assim que a tela termina de ser carregada
launchIntent('premmia://reprint', intentParams);
}, []);
return (
<View>
<Text>Result Code: {resultCode}</Text>
<Text>Result Data: {JSON.stringify(resultData)}</Text>
</View>
);
}
Para utilizar o deeplink, será necessário fazer uso do código nativo:
package com.example.deeplink_test
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
class MainActivity: FlutterActivity(), MethodCallHandler {
private val CHANNEL = "sample.android/deeplink"
private lateinit var channel: MethodChannel
private var callback: Result? = null
private var requestCode: Int = -1
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).apply {
setMethodCallHandler(this@MainActivity)
}
}
override fun onMethodCall(call: MethodCall, result: Result) {
var action = ""
var deeplink = ""
var bundle = Bundle()
when(call.method) {
"startActivityForResult" -> {
callback = result
val params = call.arguments as? Map<String, Any>
params?.run {
for ((key, value) in params) {
when(key.toString()) {
"action" -> action = value.toString()
"data" -> deeplink = value.toString()
"requestCode" -> requestCode = value.toString().toInt()
"arguments" -> {
bundle.apply{
for((argKey, argValue) in (value as Map<String, Any>)) {
when(argValue) {
is String -> putString(argKey, argValue as String)
is Int -> putInt(argKey, argValue as Int)
is Boolean -> putBoolean(argKey, argValue as Boolean)
}
}
}
}
}
}
val intent = Intent(action, Uri.parse(deeplink)).apply {
putExtras(bundle)
}
startActivityForResult(intent, requestCode)
}
}
else -> result.notImplemented()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
this.requestCode -> {
when(resultCode) {
Activity.RESULT_OK -> {
data?.getExtras()?.let { extras ->
val resultMap = hashMapOf<String, Any?>()
for(key in extras.keySet()) {
resultMap[key] = extras.get(key)
}
callback?.success(resultMap)
}
} else -> callback?.error("ERROR", "No valid return from DeepLink", null)
}
} else -> callback?.error("ERROR", "Activity result was not OK", null)
}
}
}
E com o código nativo criado, podemos chamar ele através do startIntent abaixo:
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key,});
@override
State<MyApp> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
static const int REQUEST_REIMPRESSAO = 1002;
static const String ARG_RESULT = 'RESULT';
static const String ARG_MESSAGE = 'MESSAGE';
static const String PARAM_AMOUNT = 'amount';
static const String PARAM_DOCUMENTO = 'documento';
static const String PARAM_CODE = 'code';
static const String PARAM_PRINT = 'print';
int? resultCode;
var deeplinkResult = '';
static const platform = MethodChannel('sample.android/deeplink');
void startIntent(String deeplink, Map<String, String> bundle) async {
try {
final intent = {
'requestCode': REQUEST_REIMPRESSAO,
'action': 'android.intent.action.VIEW',
'data': deeplink,
'arguments': bundle,
};
var result = await platform.invokeMethod('startActivityForResult', intent);
if (result != null) {
var resultMap = Map<String, dynamic>.from(result);
String resultValue = resultMap[ARG_RESULT];
String message = resultMap[ARG_MESSAGE];
setState(() {
resultCode = 1;
});
}
} catch (e) {
log('Error launching intent: $e');
}
}
void _sendDeeplink() {
Map<String, String> intentParams = {};
startIntent('premmia://reprint', intentParams);
}
@override
void initState() {
super.initState();
_sendDeeplink();
}
@override
Widget build(BuildContext context) {
return ();
}
}
Retornos
| Result | Message |
|---|---|
| 00 | SUCESSO |
| 03 | FALHA |
| 04 | DESCONHECIDO |
Resgate¶
O deeplink premmia://rescue irá executar a funcionalidade de Resgate do aplicativo Premmia.
Desta forma, todo o processo da funcionalidade Resgate é da aplicação Premmia.

Exemplo de implementação
public class MainActivity extends AppCompatActivity {
private final Integer REQUEST_RESGATE = 1003;
private final String ARG_RESULT = "RESULT";
private final String ARG_MESSAGE = "MESSAGE";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate (savedInstanceState);
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("premmia://rescue"));
startActivityForResult(intentInfo, REQUEST_RESGATE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCOde, resultCode, data);
if (REQUEST_RESGATE == requestCode) {
String result = data.getStringExtra(ARG_RESULT);
String message = data.getStringExtra(ARG_MESSAGE);
}
}
}
class MainActivity : AppCompatActivity() {
private val REQUEST_RESGATE = 1003
private val ARG_RESULT = "RESULT"
private val ARG_MESSAGE = "MESSAGE"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val intent = Intent(Intent.ACTION_VIEW, Uri.parse("premmia://rescue"))
startActivityForResult(intent, REQUEST_RESGATE)
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == REQUEST_RESGATE) {
val result = data?.getStringExtra(ARG_RESULT)
val message = data?.getStringExtra(ARG_MESSAGE)
}
}
}
import React, { useState, useLayoutEffect } from 'react';
import { View, Text } from 'react-native';
import * as IntentLauncher from 'expo-intent-launcher';
const ACTION_VIEW = 'android.intent.action.VIEW';
export default function MainComponent() {
const ARG_RESULT = "RESULT";
const ARG_MESSAGE = "MESSAGE";
const [resultCode, setResultCode] = useState<number>();
const [resultData, setResultData] = useState({});
const launchIntent = async(deeplink: string, bundle: {}) => {
const intentParams = { ...bundle, data: deeplink }; //Unindo URI Deeplink com o bundle no intentParams
try {
const activityResult = await IntentLauncher.startActivityAsync(ACTION_VIEW, intentParams);
if (activityResult.data) {
if(activityResult.extra) {
const JSON_obj = JSON.parse(JSON.stringify(activityResult.extra))
const result = JSON_obj[ARG_RESULT];
const message = JSON_obj[ARG_MESSAGE];
setResultData(JSON_obj);
setResultCode(activityResult.resultCode);
}
}
} catch (error) {
console.error(error);
}
};
useLayoutEffect(() => {
const intentParams = {};
//Dispara o Deeplink assim que a tela termina de ser carregada
launchIntent('premmia://rescue', intentParams);
}, []);
return (
<View>
<Text>Result Code: {resultCode}</Text>
<Text>Result Data: {JSON.stringify(resultData)}</Text>
</View>
);
}
Para utilizar o deeplink, será necessário fazer uso do código nativo:
package com.example.deeplink_test
import androidx.annotation.NonNull
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import io.flutter.plugin.common.MethodChannel.Result
import android.app.Activity
import android.content.Intent
import android.net.Uri
import android.os.Bundle
import android.util.Log
class MainActivity: FlutterActivity(), MethodCallHandler {
private val CHANNEL = "sample.android/deeplink"
private lateinit var channel: MethodChannel
private var callback: Result? = null
private var requestCode: Int = -1
override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine)
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).apply {
setMethodCallHandler(this@MainActivity)
}
}
override fun onMethodCall(call: MethodCall, result: Result) {
var action = ""
var deeplink = ""
var bundle = Bundle()
when(call.method) {
"startActivityForResult" -> {
callback = result
val params = call.arguments as? Map<String, Any>
params?.run {
for ((key, value) in params) {
when(key.toString()) {
"action" -> action = value.toString()
"data" -> deeplink = value.toString()
"requestCode" -> requestCode = value.toString().toInt()
"arguments" -> {
bundle.apply{
for((argKey, argValue) in (value as Map<String, Any>)) {
when(argValue) {
is String -> putString(argKey, argValue as String)
is Int -> putInt(argKey, argValue as Int)
is Boolean -> putBoolean(argKey, argValue as Boolean)
}
}
}
}
}
}
val intent = Intent(action, Uri.parse(deeplink)).apply {
putExtras(bundle)
}
startActivityForResult(intent, requestCode)
}
}
else -> result.notImplemented()
}
}
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
when(requestCode) {
this.requestCode -> {
when(resultCode) {
Activity.RESULT_OK -> {
data?.getExtras()?.let { extras ->
val resultMap = hashMapOf<String, Any?>()
for(key in extras.keySet()) {
resultMap[key] = extras.get(key)
}
callback?.success(resultMap)
}
} else -> callback?.error("ERROR", "No valid return from DeepLink", null)
}
} else -> callback?.error("ERROR", "Activity result was not OK", null)
}
}
}
E com o código nativo criado, podemos chamar ele através do startIntent abaixo:
import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({super.key,});
@override
State<MyApp> createState() {
return _MyAppState();
}
}
class _MyAppState extends State<MyApp> {
static const int REQUEST_RESGATE = 1003;
static const String ARG_RESULT = 'RESULT';
static const String ARG_MESSAGE = 'MESSAGE';
static const String PARAM_AMOUNT = 'amount';
static const String PARAM_DOCUMENTO = 'documento';
static const String PARAM_CODE = 'code';
static const String PARAM_PRINT = 'print';
int? resultCode;
var deeplinkResult = '';
static const platform = MethodChannel('sample.android/deeplink');
void startIntent(String deeplink, Map<String, String> bundle) async {
try {
final intent = {
'requestCode': REQUEST_RESGATE,
'action': 'android.intent.action.VIEW',
'data': deeplink,
'arguments': bundle,
};
var result = await platform.invokeMethod('startActivityForResult', intent);
if (result != null) {
var resultMap = Map<String, dynamic>.from(result);
String resultValue = resultMap[ARG_RESULT];
String message = resultMap[ARG_MESSAGE];
setState(() {
resultCode = 1;
});
}
} catch (e) {
log('Error launching intent: $e');
}
}
void _sendDeeplink() {
Map<String, String> intentParams = {};
startIntent('premmia://rescue', intentParams);
}
@override
void initState() {
super.initState();
_sendDeeplink();
}
@override
Widget build(BuildContext context) {
return ();
}
}
Retornos
Os retornos abaixo são mostrados na tela do POS para o usuário. Em casos de transações que não forem aprovadas, aparecerá, além da mensagem, o código de retorno, facilitando a identificação do atendimento Getnet.
| Result | Message |
|---|---|
| 20 | TOKEN EXPIRADO |
| 21 | CADASTRO SEM CLASSIFICAÇÃO |
| 22 | TOKEN INVALIDO |
| 23 | CADASTRO INCOMPLETO |
| 25 | SALDO INSUFICIENTE |
| 26 | CAMPO OBRIGATÓRIO NÃO ESTÁ PREENCHIDO |
| 27 | PARCEIRO NÃO ENCONTRADO |
| 28 | PRODUTO NÃO ENCONTRADO |
| 29 | NÃO HÁ CONTRATO ATIVO |
| 30 | RESGATE NÃO EFETUADO |
| 31 | CONTRATO INVÁLIDO OU INATIVO |
| 32 | LIMITE DE RESGATES DO PRODUTO ATINGIDO |
| 33 | POSTO NÃO HABILITADO PARA ESTE CPF |
| 34 | ENDEREÇO INCOMPLETO |
| 35 | SALDO NÃO LIBERADO |
| 36 | PRAZO DE CARÊNCIA NÃO ATINGIDO |
| 37 | TIPO DE OPERAÇÃO DESCONHECIDO |
| 40 | ATIVIDADE PROCESSADA C/ ERRO |
| 41 | LIMITE DE ESTOQUE DO PRODUTO ATINGIDO |
| 42 | PRODUTO INDISPONÍVEL |
| 43 | ERRO NA GERAÇÃO DE TOKEN - USUÁRIO E/OU SENHA INVALIDO |
| 55 | RCODR3 NÃO ENCONTRADO |
| 58 | POSTO NÃO CADASTRADO |
| 59 | POSTO INATIVO NO PREMMIA |
| 60 | RESGATE NÃO APROVADO |
| 91 | ERRO DE BANCO DE DADOS |
Observação importante:¶
Se for necessitar de outras funcionalidades, como pagamento com cartão de crédito, débito ou voucher, acesse o link abaixo:
https://getstore.getnet.com.br/developer/#/developer/home
Após efetuar a autenticação você poderá efetuar o download dos arquivos e do SDK, para desenvolvimento.