Pular para conteúdo

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.

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.

Premmia-1 Premmia-2 Premmia-3

Ao final da transação, ocorrendo aprovação, será mostrada a tela de Sucesso, imprimindo automaticamente a via do Estabelecimento.

Premmia-Sucesso-1

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 print 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.

Resgate-1 Resgate-2 Resgate-3 Resgate-4 Resgate-5 Resgate-6 Resgate-7 Resgate-8

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.