1.0.0 • Published 4 years ago

payment-bot v1.0.0

Weekly downloads
-
License
ISC
Repository
-
Last release
4 years ago

#PAYMENTBOT:

Novo deploy

Basta utilizar a opção

Instruções de deploy (deprecated)

sls deploy -v
  • Antes de fazer deploy da maquina local rodar o npm install abaixo devido a dependencia do dialogflow tem com o google para dialogflow grpc

  • RODAR NA AWS SOMENTE NO MOMENTO DO DEPLOY DA MAQUIDA DE DEV

npm install grpc --target=8.10.0 --target_arch=x64 --target_platform=linux --target_libc=glibc
  • RODAR NO MAC PARA IMPLEMENTACAO OU DEBUG
npm install grpc --target=8.10.0 --target_arch=x64 --target_platform=darwin --target_libc=unknown

Funcões de customização do texto de retorno

É possível utilizar funcões javascript no meio dos textos de resposta. Para isso, basta utilizar esse padrão para colocar o código fonte: . Você pode colocar mais de um código no meio da resposta.

Variáveis do DF também podem ser utilizadas no meio do código, conforme exemplo abaixo.

Exemplo:

Seu nome é <?"#save_session.name".toUpperCase()?> e seu valor é *<?money($numero/10)?>* e você está falando do <?data.context.agent?> em <?date("$data","DD/MM/YYYY")?>

Utilizamos com base a biblioteca safe-eval para executar as chamadas. Logo, você terá acesso a toda a biblioteca padrão do JS.

https://www.npmjs.com/package/safe-eval

Também criamos as funções abaixo para simplificar a programação dentro das respostas. Novas podem ser criadas sob demanda.

money

Recebe um número de entrada e formata como REAL.

money($numero/10)

date

Formata data hora usando padrão da biblioteca moment.

https://momentjs.com

date("$data","DD/MM/YYYY")

Plugin de decisão simples

Para utilizar o plugin de decisão, você deve configurar o retorno com um "custom payload" (clicar em ADD RESPONSES e CUSTOM PAYLOAD) e adicionar o JSON conforme abaixo:

{
  "action": {
    "type": "decision",
    "decisionScript": "evaluate($parametro > 0,'evento_se_true', 'evento_se_false')"
  }
}
  • O primeiro parâmetro da funcão evaluate é a expressão que deve ser avaliada. em caso de TRUE, será criado um evento com o nome do 2o parâmetro. Em caso de FALSe, do 3o parâmetro.

  • O dialogflow será executado novamente, para que o evento que tenha um dos eventos como condição de entrada seja executado. Recomendo que os eventos que serão executados na sequencia sejam configurados no DF como "follow up event". Apenas para melhor organização do código.

  • Como exemplo utilize a inteção "905-test decision plugin".

Plugin de decisão complexa

Para utilizar o plugin de decisão complexa, você deve configurar o retorno com um "custom payload" (clicar em ADD RESPONSES e CUSTOM PAYLOAD) e adicionar o JSON conforme abaixo:

{
  "action": {
    "type": "complex_decision",
    "decisions": [
      {
        "condition": "$parametro1 > 5",
        "event": "evento_1"
      },
      {
        "condition": "2 > #contexto.parametro2",
        "event": "evento_2"
      },
      {
        "condition": "#contexto.parametro2 + 5 < $parametro 3",
        "event": "evento_3"
      }
    ]
  }
}
  • A plugin segue a ordem estabelecida no JSON e para no primeiro item em que a condição for TRUE.

  • É recomendado que sempre haja uma condição verdadeira.

  • Se nenhuma das condicões for encontrada, o plugin retorna o evento "sys_complex_decision_no_condition_found" que executa a inteção "999-no condition found". Isso não deve ser alterado.

  • Recomendo que os eventos que serão executados na sequencia sejam configurados no DF como "follow up event". Apenas para melhor organização do código.

  • Como exemplo utilize a inteção "906-teste complex decision plugin".

Funcões auxiliares para tomar decisão:

exists

Retorna TRUE se a variável de sessão indicada existe. Funciona apenas para as variáveis que começão com #.

{
  "action": {
    "type": "complex_decision",
    "decisions": [
      {
        "condition": "exists(\"#save_session.name\") == false",
        "event": "sys_new_user"
      },
      {
        "condition": "1 == 1",
        "event": "hello_return_user"
      }
    ]
  }
}

Exemplo 5 (request GET)

{
  "action": {
    "type": "javascript",
    "command": "msg(\"iniciando teste HTTP\",\"text\", 1); ret = request(\"GET\", \"https://api.darksky.net/forecast/apikey/-23.5505,-46.6333?units=si&lang=pt\"); dump(ret,\"retorno do darksky\"); if (ret.statusCode == 200) {{ msg(\"Timezone: \" + ret.body.timezone + \"\\nTemperatura: \" + ret.body.currently.temperature,\"text\", 2); }} else {{ msg(\"Erro no retorno. Código: \" + ret.statusCode + \"\\n Mensagem de erro: \" + ret.message,\"text\", 1) }}"
  }
}

Exemplo 7 (request GETDATA)

{
  "action": {
    "type": "javascript",
    "command": "params = {{}}; params.customerId = data.customer.id; params.actionType = 0; params.callbackUrl = \"https://api.fintalk.io/dev/getdatanoticewebhook\"; params.botURL = \"https://t.me/PagAIBot\"; params.channel = 20; customPayload = {{}}; customPayload.eventSuccess = \"javascript_getdata_success\"; customPayload.eventError = \"javascript_getdata_error\"; customPayload.msg = data.msg; params.customPayload = JSON.stringify(customPayload); ret = request(\"POST\", \"https://obter-dados.fintalk.io/dev/v1/transaction/beginTransaction\", {{json: params,}}); if (ret.statusCode == 200) {{ msg(\"Clique no link para continuar: \" + ret.body.actionUrl,\"text\", 2); }} else if (ret.statusCode == 502 && ret.body) {{ msg(\"Já havia uma transação aberta.\\nClique no link para continuar: \" + ret.body.actionUrl,\"text\", 2); }} else {{ msg(\"Erro no retorno. Código: \" + ret.statusCode + \"\\n Mensagem de erro: \" + ret.message, \"text\", 1); }}"
  }
}

Plugin de execução de serviço

Gateway de pagamento

save_card

Utilizada para salvar um cartão no gateway de pagamento

Entrada:

{
  "action": {
    "type": "plugin",
    "actionValue": "save_card",
    "actionType": 10 //define a mundipagg com gateway
  }
}

list_cards

Lista seus cartões salvos no gateway de pagamento

Entrada:

{
  "action": {
    "type": "plugin",
    "actionValue": "list_cards",
    "partner": 10 //define a mundipagg com gateway
  }
}

Serviços Bancarios

get_balance

Exibe o saldo da conta do usuário

Entrada:

{
  "action": {
    "type": "plugin",
    "actionValue": "check_balance",
    "partner": 20  //stone
  }
}

pay_bill

Pagamento de uma conta, utilizando o código de barras

Entrada:

{
  "action": {
    "type": "plugin",
    "actionValue": "pay_bill",
    "barCode": "$barCode"
  }
}

get_payments

Lista os últimos pagamentos na conta

Entrada:

{
  "action": {
    "type": "plugin",
    "actionValue": "get_payments",
    "partner": 20 //stone
  }
}

get_transfers

Lista os últimas transferências da conta

Entrada:

{
  "action": {
    "type": "plugin",
    "actionValue": "get_transfers",
    "partner": 20
  }
}

Outros Serviços

Envio de Email

Obs: Como está em modo de testes (grátis) os e-mails de destino devem ser pre autorizados na AWS antes.

{
  "action": {
    "type": "send_email",
    "destiny": "gustavocmorais@gmail.com",
    "template": {
      "subject": "Mensagem de teste do paybot",
      "body": "Corpo do email"
    },
    "events": {
      "success": "teste_envio_email_sucesso",
      "error": "teste_envio_email_error"
    }
  }
}

Envio de SMS

Obs: Adicionar +55 no número!

{
  "action": {
    "type": "send_sms",
    "destiny": "$phone-number",
    "template": {
      "text": "Mensagem de teste do paybot"
    },
    "events": {
      "success": "teste_envio_sms_sucesso",
      "error": "teste_envio_sms_error"
    }
  }
}

Menu do FB

Opções de template:

  • buttons
  • carousel
  • quickreply
  • list
{
  "action": {
    "type": "menu",
    "template": {
      "title": "Escolha uma das opcoes",
      "type": "$fb-template",
      "data": [
        {
          "id": "A3",
          "title": "Audi A3!",
          "subtitle": "Sedan Ambition",
          "image_url": "https://images.noticiasautomotivas.com.br/img/f/Audi-A3-Sedan-Ambition-2017-4.jpg",
          "link": "https://www.noticiasautomotivas.com.br",
          "defaultactionlink": "https://www.noticiasautomotivas.com.br/audi-a3-sedan/",
          "buttons": [
            {
              "type": "web_url",
              "url": "https://www.noticiasautomotivas.com.br",
              "title": "View Website"
            },
            {
              "type": "postback",
              "title": "Comprar",
              "payload": {
                "action": {
                  "type": "messenger_postback",
                  "text": "messenger_PAYLOAD_A3"
                },
                "msg": {
                  "text": "messenger_PAYLOAD_A3"
                }
              }
            }
          ]
        },
        {
          "id": "RS3",
          "title": "Audi RS3",
          "subtitle": "400 e la vai fumaça HP",
          "defaultactionlink": "https://www.noticiasautomotivas.com.br/audi-a3-sedan/",
          "image_url": "http://2019carscomingout.com/wp-content/uploads/2018/01/2019-Audi-RS3-Predictions.jpg",
          "buttons": [
            {
              "type": "web_url",
              "url": "https://www.noticiasautomotivas.com.br",
              "title": "Visitar o site"
            },
            {
              "type": "postback",
              "title": "saiba mais",
              "payload": {
                "action": {
                  "type": "messenger_postback",
                  "text": "messenger_PAYLOAD_RS3"
                },
                "msg": {
                  "text": "messenger_PAYLOAD_RS3"
                }
              }
            }
          ]
        }
      ]
    },
    "events": {
      "success": "teste_postback_sucesso",
      "error": "teste_postback_error"
    }
  }
}

Exemplo da estrutura do objeto "data", que fica disponível dentro do JS

Telegram:

{
  "context": {
    "sessionId": "b9f663e7437e47c297561b91019bcd02e2fa6da1",
    "agent": "Telegram",
    "outputContexts": [
      {
        "name": "projects/paybot-ab6ff/agent/sessions/b9f663e7437e47c297561b91019bcd02e2fa6da1/contexts/vars",
        "lifespanCount": 1,
        "parameters": {
          "fields": {
            "name": {
              "stringValue": "gustavo",
              "kind": "stringValue"
            },
            "name.original": {
              "stringValue": "gustavo",
              "kind": "stringValue"
            }
          }
        }
      }
    ]
  },
  "reply": "",
  "payload": {
    "structValue": {
      "fields": {
        "command": {
          "stringValue": "msg(\"iniciando teste HTTP. Usando API api.darksky.net com GET e retorno UTF-8\",\"text\", 1); ret = request(\"GET\", \"https://api.darksky.net/forecast/9484b9214f77f7c54342aff9f26515d1/-23.5505,-46.6333?units=si&lang=pt\"); dump(ret,\"retorno do darksky\"); if (ret.statusCode == 200) { msg(\"Timezone: \" + ret.body.timezone + \"\\nTemperatura: \" + ret.body.currently.temperature,\"text\", 2); } else { msg(\"Erro no retorno. Código: \" + ret.statusCode + \"\\n Mensagem de erro: \" + ret.message,\"text\", 1) }",
          "kind": "stringValue"
        },
        "type": {
          "stringValue": "javascript",
          "kind": "stringValue"
        }
      }
    },
    "kind": "structValue"
  },
  "customer": {
    "id": "5c48799bbcf80b4d3f406e3f"
  },
  "msg": {
    "message_id": 24,
    "from": {
      "id": 630686206,
      "is_bot": false,
      "first_name": "Gustavo",
      "last_name": "Morais",
      "language_code": "pt-br"
    },
    "chat": {
      "id": 630686206,
      "first_name": "Gustavo",
      "last_name": "Morais",
      "type": "private"
    },
    "date": 1545387807,
    "text": "javascript http request",
    "context": {
      "sessionId": "b9f663e7437e47c297561b91019bcd02e2fa6da1",
      "agent": "Telegram"
    },
    "telegram_chatId": 630686206,
    "input": {
      "text": "javascript http request"
    }
  }
}

Facebook:

{
  "context": {
    "sessionId": "6708cab371c4ebe369dcfb4ac89230c309f33b5f",
    "agent": "Facebook",
    "outputContexts": [
      {
        "name": "projects/paybot-ab6ff/agent/sessions/6708cab371c4ebe369dcfb4ac89230c309f33b5f/contexts/vars",
        "lifespanCount": 1,
        "parameters": {
          "fields": {
            "param1": {
              "stringValue": "null",
              "kind": "stringValue"
            },
            "numero": {
              "stringValue": "1",
              "kind": "stringValue"
            },
            "param1.original": {
              "stringValue": "71378312066",
              "kind": "stringValue"
            },
            "name.original": {
              "stringValue": "Cleiton",
              "kind": "stringValue"
            },
            "name": {
              "stringValue": "Cleiton",
              "kind": "stringValue"
            },
            "eventoVolta": {
              "stringValue": "null",
              "kind": "stringValue"
            },
            "numero.original": {
              "stringValue": "null",
              "kind": "stringValue"
            }
          }
        }
      }
    ]
  },
  "reply": "",
  "payload": {
    "structValue": {
      "fields": {
        "command": {
          "stringValue": "msg(\"iniciando teste HTTP. Usando API api.darksky.net com GET e retorno UTF-8\",\"text\", 1); ret = request(\"GET\", \"https://api.darksky.net/forecast/9484b9214f77f7c54342aff9f26515d1/-23.5505,-46.6333?units=si&lang=pt\"); dump(ret,\"retorno do darksky\"); if (ret.statusCode == 200) { msg(\"Timezone: \" + ret.body.timezone + \"\\nTemperatura: \" + ret.body.currently.temperature,\"text\", 2); } else { msg(\"Erro no retorno. Código: \" + ret.statusCode + \"\\n Mensagem de erro: \" + ret.message,\"text\", 1) }",
          "kind": "stringValue"
        },
        "type": {
          "stringValue": "javascript",
          "kind": "stringValue"
        }
      }
    },
    "kind": "structValue"
  },
  "customer": {
    "id": "5c976cb355aec484bdf56a7d"
  },
  "msg": {
    "event": "INBOX",
    "from": "2213380222015818",
    "to": "340374529910536",
    "text": "javascript http request",
    "first_name": "Cleiton",
    "last_name": "Amaral",
    "custom_data": "6708cab371c4ebe369dcfb4ac89230c309f33b5f",
    "context": {
      "sessionId": "6708cab371c4ebe369dcfb4ac89230c309f33b5f",
      "agent": "Facebook"
    },
    "whatsapp_phone": "2213380222015818",
    "input": {
      "text": "javascript http request"
    }
  }
}

Debug utilizando Ngrok

O Ngrok expõe um host (HTTP e HTTPS) de forma pública, apontando para um servidor local. Sendo possível subir um server ngrok apontando para a aplicação de debug local.

Após isso, basta apontar o webhook do Telegram, por exemplo, para a host do Ngrok, e realizar o debug normalmente.

Download: https://ngrok.com/

No comando abaixo, o ngrok está apontando para a porta 3000, e retornará um endereço HTTP e outro HTTPS.

./ngrok http 3000