cokecancino/laravel-flow

此包已被废弃,不再维护。没有建议的替代包。

Laravel包,用于集成Flow支付(https://www.flow.cl)

1.2.2 2017-12-22 02:06 UTC

This package is auto-updated.

Last update: 2024-06-24 23:39:38 UTC


README

Laravel Flow

Total Downloads Latest Stable Version License

Laravel包,用于集成Flow支付。

警告

此包已过时,不再维护

最初,它被创建用于实现现在已过时的Flow集成套件,因为当时没有其他集成方式。目前,Flow提供了更新的REST API,因此此包变得不再必要,并且可能与Flow API的新版本不兼容。因此,强烈建议使用Flow的新REST API进行未来的集成。

感谢所有信任此包用于其项目和商业项目的用户。希望Flow的新REST API能为支付集成提供更好的体验和更大的灵活性。

兼容性

此包已与以下版本的Laravel进行了测试

  • Laravel 5.1
  • Laravel 5.5

它可能也与其他版本兼容,但尚未在它们上进行具体测试。

安装

  1. 通过Composer安装

    composer require cokecancino/laravel-flow
  2. 添加服务提供者

    在文件config/app.php中,将以下行添加到数组providers

    'providers' => [
        // ...
        CokeCancino\LaravelFlow\FlowServiceProvider::class,
        // ...
    ],
  3. 添加别名

    在同一个文件中,将以下行添加到数组aliases

    'aliases' => [
        // ...
        'Flow' => CokeCancino\LaravelFlow\Facades\Flow::class,
        // ...
    ],
  4. 发布配置文件

    php artisan vendor:publish --provider="CokeCancino\LaravelFlow\FlowServiceProvider" --force
  5. 配置你的.env或修改你的config/flow.php

    FLOW_URL_PAGO=http://flow.tuxpan.com/app/kpf/pago.php
    FLOW_COMERCIO=emailFlow@comercio.com

使用指南

以下是在Laravel中使用它的示例。

重要

排除成功、失败和确认页面的CSRF保护,因为Flow不知道应该向你的路由发送什么CSRF令牌。

购买表单

视图:resources/views/index.blade.php

@extends('layouts._master')

@section('content')
    <form method="POST" action="{{ route('orden') }}">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        Orden n°: <input type="text" name="orden" id="orden" placeholder="1000" required><br>
        Monto: <input type="text" name="monto" id="monto" placeholder="20000" required><br>
        Descripción: <input type="text" name="concepto" id="concepto" placeholder="Pago de orden n° 1000" required><br>
        Email pagador (opcional): <input type="email" name="pagador" id="pagador" placeholder="usuario@email.com"><br>
        <br>
        <button type="submit">Aceptar</button>
    </form>
@endsection

创建新订单

控制器:Http/Controllers/FlowController.php

<?php

namespace App\Http\Controllers;

use Flow;

use Illuminate\Http\Request;

class FlowController extends Controller
{
    /**
     * Creando una nueva orden
     *
     * @param Request $request
     * @return \Illuminate\View\View
     */
    public function orden(Request $request)
    {
        $orden = [
            'orden_compra'  => $request->input('orden'),
            'monto'         => $request->input('monto'),
            'concepto'      => $request->input('concepto'),
            'email_pagador' => $request->input('pagador'),

            // Opcional: Medio de Pago (Webpay = 1, Servipag = 2, Multicaja = 3, Todos = 9)
            //'medio_pago'    => $request->input('medio_pago'),
        ];

        // Genera una nueva orden de pago, Flow la firma y retorna un paquete de datos firmados
        $orden['flow_pack'] = Flow::new_order($orden['orden_compra'], $orden['monto'], $orden['concepto'], $orden['email_pagador']);

        // Si desea enviar el medio de pago usar la siguiente línea
        //$orden['flow_pack'] = Flow::new_order($orden['orden_compra'], $orden['monto'], $orden['concepto'], $orden['email_pagador'], $orden['medio_pago']);

        return view('orden', $orden);
    }
// ...

视图:resources/views/orden.blade.php

@extends('layouts._master')

@section('content')
    <!-- Formulario HTML que envía la nueva orden -->
    Confirme su orden antes de proceder al pago vía Flow<br>
    <br>
    Orden n°: {{ $orden_compra }}<br>
    Monto: {{ $monto }}<br>
    Descripción: {{ $concepto }}<br>
    Email pagador (opcional): {{ $email_pagador }}<br>
    <br>
    <form method="POST" action="{{ config('flow.url_pago') }}">
        <input type="hidden" name="_token" value="{{ csrf_token() }}">
        <input type="hidden" name="parameters" value="{{ $flow_pack }}">
        <button type="submit">Pagar en Flow</button>
    </form>
@endsection

成功页面

控制器:Http/Controllers/FlowController.php

// ...
    /**
     * Página de éxito del comercio
     *
     * Esta página será invocada por Flow cuando la transacción resulte exitosa
     * y el usuario presione el botón para retornar al comercio desde Flow.
     *
     * @return \Illuminate\View\View
     */
    public function exito()
    {
        // Lee los datos enviados por Flow
        Flow::read_result();

        // Recupera los datos enviados por Flow
        $orden = [
            'orden_compra'  => Flow::getOrderNumber(),
            'monto'         => Flow::getAmount(),
            'concepto'      => Flow::getConcept(),
            'email_pagador' => Flow::getPayer(),
            'flow_orden'    => Flow::getFlowNumber(),
        ];

        return view('flow.exito', $orden);
    }
// ...

视图:resources/views/flow/exito.blade.php

@extends('layouts._master')

@section('content')
    <h1>Página de éxito de comercio</h1>
    Su pago se ha realizado con éxito<br>
    <br>
    Orden de compra: {{ $orden_compra }}<br>
    Monto: {{ $monto }}<br>
    Descripción: {{ $concepto }}<br>
    Pagador: {{ $email_pagador }}<br>
    Flow orden n°: {{ $flow_orden }}<br>
    <br>
    Gracias por su compra
@endsection

失败页面

控制器:Http/Controllers/FlowController.php

// ...
    /**
     * Página de fracaso del comercio
     *
     * Esta página será invocada por Flow cuando la transacción no se logre pagar
     * y el usuario presione el botón para retornar al comercio desde Flow.
     *
     * @return \Illuminate\View\View
     */
    public function fracaso()
    {
        // Lee los datos enviados por Flow
        Flow::read_result();

        // Recupera los datos enviados por Flow
        $orden = [
            'orden_compra'  => Flow::getOrderNumber(),
            'monto'         => Flow::getAmount(),
            'concepto'      => Flow::getConcept(),
            'email_pagador' => Flow::getPayer(),
            'flow_orden'    => Flow::getFlowNumber(),
        ];

        return view('flow.fracaso', $orden);
    }
// ...

视图:resources/views/flow/fracaso.blade.php

@extends('layouts._master')

@section('content')
    <h1>Página de fracaso de comercio</h1>
    Su pago ha sido rechazado<br>
    <br>
    Orden de compra: {{ $orden_compra }}<br>
    Monto: {{ $monto }}<br>
    Descripción: {{ $concepto }}<br>
    Pagador: {{ $email_pagador }}<br>
    Flow orden n°: {{ $flow_orden }}<br>
    <br>
    <a href="{{ url('/') }}">Intente nuevamente</a>
@endsection

确认页面

控制器:Http/Controllers/FlowController.php

// ...
    /**
     * Página de confirmación del comercio
     *
     * @return void
     */
    public function confirmacion()
    {
        try {
            // Lee los datos enviados por Flow
            Flow::read_confirm();
        } catch (Exception $e) {
            // Si hay un error responde false
            echo Flow::build_response(false);
            return;
        }

        // Recupera los valores de la orden
        $flow_status  = Flow::getStatus();      // El resultado de la transacción (EXITO o FRACASO)
        $orden_numero = Flow::getOrderNumber(); // N° de orden del comercio
        $monto        = Flow::getAmount();      // Monto de la transacción
        $orden_flow   = Flow::getFlowNumber();  // Si $flow_status = 'EXITO' el n° de orden de Flow
        $pagador      = Flow::getPayer();       // El email del pagador

        /**
         * Aquí puede validar la orden
         *
         * Si acepta la orden responder Flow::build_response(true)
         * Si rechaza la orden responder Flow::build_response(false)
         */
        if ($flow_status == 'EXITO') {
            // La transacción fue aceptada por Flow
            // Aquí puede actualizar su información con los datos recibidos por Flow
            echo Flow::build_response(true); // Comercio acepta la transacción
        } else {
            // La transacción fue rechazada por Flow
            // Aquí puede actualizar su información con los datos recibidos por Flow
            echo Flow::build_response(false); // Comercio rechaza la transacción
        }
    }
// ...

路由

// ...
Route::get('/', function () {
    return view('index');
});
Route::post('orden', 'FlowController@orden')->name('orden');

Route::post('flow/exito', 'FlowController@exito')->name('flow.exito');
Route::post('flow/fracaso', 'FlowController@fracaso')->name('flow.fracaso');
Route::post('flow/confirmacion', 'FlowController@confirmacion')->name('flow.confirmacion');
// ...

许可证

此包根据MIT许可证许可。