Integração do Pesapal API 3.0 no Django

A Pesapal é uma empresa de fintech que fornece serviços de pagamento digital seguros e convenientes para indivíduos e empresas em países africanos, incluindo Quênia, Uganda, Tanzânia, Malawi, Ruanda, Zâmbia e Zimbábue. Recentemente, eu estava trabalhando em um projeto de Django que exigia integrar a API Pesapal para facilitar transações perfeitas dentro do aplicativo. O primeiro passo foi revisar a documentação da API Pesapal; No entanto, após mais pesquisas, não ficou claro como exatamente implementar essa integração no projeto. Este artigo tem como objetivo fornecer uma explicação mais detalhada de como implementar as etapas básicas especificamente em um projeto Django. 1. Configure a conta pesapal Navegue até o portal dos desenvolvedores do Pesapal. Crie uma conta de negócios ao vivo/produção. Você receberá a chave do consumidor e o segredo do consumidor no email registrado. Verifique se o seu projeto Django está configurado. 2. Instale as dependências necessárias criam um arquivo requisitos.txt e instale as seguintes dependências: solicitações == 2.32.4 # HTTP Chamadas para API Pesapal Python-Decouple == 3.8 # Gerenciar teclas de API e segredos Via .Env DjangorestFramework == 3.16.0 # Build Endpoints para PesAbl. .env arquivo na sua raiz do projeto: # pesapal configuração Pesapal_consumer_key = your_consumer_key_here pesapal_consumer_secret = your_consumer_secret_here pesapal_base_url = # sandbox # pesapal_base_url = # Production) 7 Digite o modo de saída do modo de tela cheia e para o seu Settings.py: do decouple importar configuração # configurações pesapal Pesapal_consumer_key = config (‘pesapal_consumer_key’) pesapal_consumer_secret = config (‘pesapal_conser_secret’) Config (‘Pesapal_base_url’) Pesapal_ipn_id = config (‘pesapal_ipn_id’, default = “”) Digite o modo de tela cheia e o modo de tela full 4. API pesapal. Ele contém todas as funções necessárias para: a. Autenticar com Pesapal. Cada solicitação ao Pesapal requer um token de acesso OAuth. Esta função chama o terminal do RequestToken e retorna um token válido por um tempo limitado. def generate_access_token (): url = f “{base_url}/api/auth/requestToken” Payload = {“consumer_key”: Settings.Pesapal_Consumer_Key, “consumer_secret”: “Application.Pesapal_consumer_secret, Headers = {” Application “:” Application.Pesapal_consumer_Secret, ” } resposta = requests.post (url, json = carga útil, cabeçalhos = cabeçalhos) retorna resposta.json (). get (“token”) se resposta.status_code == 200 mais nenhum insira o modo de tela cheia de tela cheia b. Registrando URL de IPN e busca de IPNs registrados. Um IPN é uma notificação de pagamento instantânea que o Pesapal usa para notificar seu sistema sobre o status de pagamento alterações de forma assíncrona. O URL do IPN é onde o Pesapal envia atualizações assíncronas. A busca de IPNs registrados verifica quais IPNs estão ativas. def Register_ipn_url (Access_token, ipn_url): url = f “{base_url}/api/urlsetup/registripn” Payload = {“url”: ipn_url, “ipn_notification_type”: “get”} “} {” autorização “: f” f “ftener {“: ” “Content-Type”: “Application/JSON”} Retornar Requests.post (url, json = carga útil, cabeçalhos = cabeçalhos) def get_registered_ipns (access_token): url = f “{base_url}/api/urlSetup/getipnlist” headers = {“Authoration”: fin: f “flateer”, “Applyer”, “APTILD (APPTILI),” APPTILIMENT {“APPTILIOND {APPTALIOND {APPETIONSTON):” “Content-type”: “Application/JSON”} Return Requests.get (url, cabeçalhos = cabeçalhos) Digite o modo de saída de tela cheia no modo de tela cheia c. Enviando um pedido. Envia detalhes da transação para o Pesapal, por exemplo, a quantidade e a descrição e retorna um URL de redirecionamento, onde os clientes podem concluir o pagamento na página de check -out segura da Pesapal. def submit_order_request (access_token, carga útil): url = f “{base_url}/api/transações/submisserRequest” headers = {“autorização”: f “tarder {Access_token}”, “aceitam”: “aplicativo/json”, “content-tyl (“: “Application/JSOKen”, “Application/” Application/Json “.. Digite o modo de saída de tela cheia de tela cheia d. Verificação do status da transação. Importante para confirmar se um pagamento foi bem -sucedido antes de entregar um produto ou um serviço. def get_transaction_status (access_token, rastrear_id, merchant_reference): url = f “{base_url}/api/transactions/gettransactionStatus” headers = {“autorização”: f “porter {acession_token}” “Acepting”: “Application/json”: “Order_merchant_reference”: comerciante} resposta = requests.get (url, cabeçalhos = cabeçalhos, params = params) se resposta.status_code == 200: return Response.json (). O cache de token para evitar chamar Pesapal para um novo token em todas as solicitações. Enrole com tentativa/exceto para garantir o manuseio de erros. Adicione os documentos às funções para garantir uma descrição clara, args e retornar valores. Depois de receber os detalhes do pagamento, armazene -os no sistema no arquivo model.py, como neste exemplo; de django.db Modelos de importação Pagamento da classe (models.model): order_id = models.charfield (max_length = 100) vale = models.decimalfield (max_digits = 10, decimal_places = 2) status = modelos.charfield (max_length = 50, default = “Pending”) rastreing_id_id = modelos = modelos. = Models.DateTimeField (Auto_now_add = true) Digite o modo de tela cheia de tela cheia 5. Crie visualizações de pagamento aqui, definimos visualizações de Django que conectam o projeto às funções de serviço de Pesapal. Essas visões são os pontos de entrada para os consumidores da API. importar json importar uuid de django.http importar jsonResponse, httpro -resposta de django.shortcuts importa redirecionar, renderizar de django.views.decorators.csrf import_ess_act (generate_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_act_ess_act_ess_act_ess_act_ess_act_ess_act_ess_act_ess_act_acs submit_order_request, get_transaction_status,) def “” “Registre um url de ipn com pesapal.” “” Ipn_url = request.get.get (“url”) se não não ipn_url: retorna jsonResponse ({“error”: “ipn url é necessário”}, status = 400) res = register_ipn_url (ipn_url) return) URLs de IPN de Pesapal para verificação. “” “Res = get_registered_ipns () Return jsonResponse (res, seguro = false) def create_order_view (request):” “” Crie um novo Pesapal Pedido e Retorno e RETORNAR URL para o checkout. request.content_type == “Application/json”: Data = json.loads (request.body) vale = float (data.get (“valor”, 0)) else: vale = float (request.post.get (“quantia”, 0)) Payload = {“id”: str (uuid.uuid4 ()), # # # Aqui “,” callback_url “:” notification_id “:” your_registerred_ipn_id “,” ramil “:” nome do armazenamento – exemplo “,” billing_address “: {” email_address “:” cluster@example.com “,” telefone_number “:” 0723xxxxxxxxx “” country.com “,” Phone_number “:” 0723xxxxxxxxxxxxx.Code “:” country.com “,” Phone_number “:” 0723xxxxxxxxxxxxxx. “country.com”, “country_number”: “0723xxxxxxxxxxxx”, “country.com”, “Phone_number”: “0723xxxxxxxxxxxxxx.” Country.com “,” “last_name”: “mutua”, “line_1”: “endereço do cliente”, “city”: “nairobi”,},} res = submit_order_request (carga paga) se “redirect_url” em res: return jsonResponse ({“redirect_url”: resgin[“redirect_url”]}) else: return jsonResponse ({“error”: “falhou ao criar ordem”}, status = 400) @csrf_exemp def ipn_listener (request): “” “atualize seu banco de dados com status de pagamento assíncrono.[IPN] ID de rastreamento: {rastrear_id}, referência: {Merchant_Reference} “) retorna httpropSons (” ipn recebido “, status = 200) def paging_confirm (request):” “” endpoint de retorno de chamada: Pesapal redireciona o cliente aqui após o pagamento. “” “rastrear_id = request.get.get (” order_tracking_id “) mérchant_reference = request.get.get (” order_merchant_reference “) status_ressonse = get_transaction_status (rastreamento_id, merchant_reference) paged_status = status_ropSonse.get.gen_datsatsatsatus, Merchant_reference) Redirecionar (“Painel”) # Página de sucesso EXEMPLO: Renderização de retorno (solicitação, “Pagamentos/falha de pagamento.html”) Digite o modo de tela cheia de tela cheia, o chamado de chamada é o URL, onde um usuário não pode ser redirecionado após o uso do PesApal. O servidor em execução na sua máquina na Internet. incluído no settings.py sob os allowas_hosts = […]. 6. Configure os URLs nos URLs.py do aplicativo principal (específico para este tutorial de exemplo), configure os URLs para conectar as visualizações de pagamento pesapal definidas. de Django.urls Importar caminho de. importar visualizações urlpatterns = [
# Utility views
path(“pesapal/token/”, views.get_token_view, name=”pesapal-get-token”),
path(“pesapal/ipn/register/”, views.register_ipn_view, name=”pesapal-register-ipn”),
path(“pesapal/ipn/list/”, views.list_ipns_view, name=”pesapal-list-ipns”),

# Payment flow
path(“pesapal/order/create/”, views.create_order_view, name=”pesapal-create-order”),
path(“pesapal/ipn/”, views.ipn_listener, name=”pesapal-ipn-listener”),
path(“pesapal/payment-confirm/”, views.payment_confirm, name=”pesapal-payment-confirm”),
]

Digite o modo de saída do modo de tela cheia 7. Registre o URL do IPN Obtenha o ID do IPN executando e substituindo o espaço reservado no arquivo .env. 8. Teste de teste O fluxo de pagamento verificando se o redirecionamento funciona, o retorno de chamada atualiza o status e se o IPN atinge o terminal. Ao mudar para a produção, mude o URL da base da API para produção e atualize as chaves. Antes da produção, você também pode garantir a segurança, como o uso de HTTPs, a implementação do manuseio de erros adequado para o log de erros e a configuração de um domínio adequado para URLs de retorno de chamada. Acima estão as etapas fundamentais para integrar a API Pesapal em um projeto Django. Obviamente, a Pesapal possui muitos outros serviços, como lidar com pagamentos recorrentes, solicitação de reembolso e cancelamento de pedidos que não estão incluídos no artigo, mas são igualmente úteis (documentação). Espero que você tenha achado isso útil! Eu ficaria feliz em receber seus comentários sobre isso. Vejo você no próximo. 🫡

Fonte

Você pode ter perdido