Infos | Deeplink

O deeplink getnet://pagamento/v1/getinfos irá retornar os dados do terminal via activityResult.

Abaixo segue a tabela de resposta e seus respectivos parâmetros:

Quando retorna? Parâmetro Formato Descrição
SEMPRE result String Resultado da transação, conforme a Tabela de Resultados das Funcionalidades.
SEMPRE ec String Número do estabelecimento comercial vinculado.
SEMPRE numserie String Número de série do equipamento
SEMPRE numlogic String Número lógico do equipamento vinculado
SEMPRE version String Versão da API
SEMPRE cnpjEC String CNPJ do estabelecimento vinculado à Getnet
SEMPRE razaoSocialEC String Razão social do estabelecimento vinculado
SEMPRE cidadeEC String Cidade do estabelecimento, onde foi credenciado

Exemplo de implementação

public class MainActivity extends AppCompatActivity {
  private final int REQUEST_CODE = 1001;
  private final String ARG_RESULT = "result";
  private final String ARG_EC = "ec";
  private final String ARG_NUM_SERIE = "numserie";
  private final String ARG_NUM_LOGIC = "numlogic";
  private final String ARG_VERSION = "version";
  private final String ARG_CNPJ = "cnpjEC";
  private final String ARG_NAME = "nomeEC";
  private final String ARG_RAZAO_SOCIAL = "razaoSocialEC";
  private final String ARG_CIDADE = "cidadeEC";

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("getnet://pagamento/v1/getinfos"));
    startActivityForResult(intent, REQUEST_CODE);
  }

  @Override
  protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);
    if(REQUEST_CODE == requestCode && RESULT_OK == resultCode){
      String result = data.getString(ARG_RESULT);
      String ec = data.getString(ARG_EC);
      String numSerie = data.getString(ARG_NUM_SERIE);
      String numLogic = data.getString(ARG_NUM_LOGIC);
      String apiVersion = data.getString(ARG_VERSION);
      String cnpj = data.getString(ARG_CNPJ);
      String name = data.getString(ARG_NAME);
      String razaoSocial = data.getString(ARG_RAZAO_SOCIAL);
      String cidade = data.getString(ARG_CIDADE);
    }
  }
}
class MainActivity : AppCompatActivity() {
    private val REQUEST_CODE = 1001
    private val ARG_RESULT = "result"
    private val ARG_EC = "ec"
    private val ARG_NUM_SERIE = "numserie"
    private val ARG_NUM_LOGIC = "numlogic"
    private val ARG_VERSION = "version"
    private val ARG_CNPJ = "cnpjEC"
    private val ARG_NAME = "nomeEC"
    private val ARG_RAZAO_SOCIAL = "razaoSocialEC"
    private val ARG_CIDADE = "cidadeEC"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val intent = Intent(Intent.ACTION_VIEW, Uri.parse("getnet://pagamento/v1/getinfos"))
        startActivityForResult(intent, REQUEST_CODE)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if (REQUEST_CODE == requestCode && resultCode == RESULT_OK) {
            val result = data?.getStringExtra(ARG_RESULT)
            val ec = data?.getStringExtra(ARG_EC)
            val numSerie = data?.getStringExtra(ARG_NUM_SERIE)
            val numLogic = data?.getStringExtra(ARG_NUM_LOGIC)
            val apiVersion = data?.getStringExtra(ARG_VERSION)
            val cnpj = data?.getStringExtra(ARG_CNPJ)
            val name = data?.getStringExtra(ARG_NAME)
            val razaoSocial = data?.getStringExtra(ARG_RAZAO_SOCIAL)
            val cidade = data?.getStringExtra(ARG_CIDADE)
        }
    }
}
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_EC = "ec";
  const ARG_NUM_SERIE = "numserie";
  const ARG_NUM_LOGIC = "numlogic";
  const ARG_VERSION = "version";
  const ARG_CNPJ = "cnpjEC";
  const ARG_NAME = "nomeEC";
  const ARG_RAZAO_SOCIAL = "razaoSocialEC";
  const ARG_CIDADE = "cidadeEC";

  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 ec = JSON_obj[ARG_EC];
          const numSerie = JSON_obj[ARG_NUM_SERIE];
          const numLogic = JSON_obj[ARG_NUM_LOGIC];
          const apiVersion = JSON_obj[ARG_VERSION];
          const cnpj = JSON_obj[ARG_CNPJ];
          const name = JSON_obj[ARG_NAME];
          const razaoSocial = JSON_obj[ARG_RAZAO_SOCIAL];
          const cidade = JSON_obj[ARG_CIDADE];

          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('getnet://pagamento/v1/getinfos', 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_CODE = 10001;
  static const String ARG_RESULT = "result";
  static const String ARG_EC = "ec";
  static const String ARG_NUM_SERIE = "numserie";
  static const String ARG_NUM_LOGIC = "numlogic";
  static const String ARG_VERSION = "version";
  static const String ARG_CNPJ = "cnpjEC";
  static const String ARG_NAME = "nomeEC";
  static const String ARG_RAZAO_SOCIAL = "razaoSocialEC";
  static const String ARG_CIDADE = "cidadeEC";

  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_CODE,
          '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 ec = resultMap[ARG_EC];
          String numSerie = resultMap[ARG_NUM_SERIE];
          String numLogic = resultMap[ARG_NUM_LOGIC];
          String apiVersion = resultMap[ARG_VERSION];
          String cnpj = resultMap[ARG_CNPJ];
          String name = resultMap[ARG_NAME];
          String name = resultMap[ARG_RAZAO_SOCIAL];
          String name = resultMap[ARG_CIDADE];

          setState(() {
            resultCode = 1;
          });
        }
      } catch (e) {
        log('Error launching intent: $e');
      }
    }

  void _sendDeeplink() {
    Map<String, String> intentParams = {};
    startIntent('', intentParams);
  }

  @override
  void initState() {
    super.initState();
    _sendDeeplink();
  }
  @override
  Widget build(BuildContext context) {

    return ();
  }
}