cokecancino / laravel-flow
Laravel包,用于集成Flow支付(https://www.flow.cl)
Requires
- php: >=5.4.0
- illuminate/support: ~5.0
README
Laravel Flow
Laravel包,用于集成Flow支付。
警告
此包已过时,不再维护
最初,它被创建用于实现现在已过时的Flow集成套件,因为当时没有其他集成方式。目前,Flow提供了更新的REST API,因此此包变得不再必要,并且可能与Flow API的新版本不兼容。因此,强烈建议使用Flow的新REST API进行未来的集成。
感谢所有信任此包用于其项目和商业项目的用户。希望Flow的新REST API能为支付集成提供更好的体验和更大的灵活性。
兼容性
此包已与以下版本的Laravel进行了测试
- Laravel 5.1
- Laravel 5.5
它可能也与其他版本兼容,但尚未在它们上进行具体测试。
安装
-
通过Composer安装
composer require cokecancino/laravel-flow
-
添加服务提供者
在文件
config/app.php
中,将以下行添加到数组providers
'providers' => [ // ... CokeCancino\LaravelFlow\FlowServiceProvider::class, // ... ],
-
添加别名
在同一个文件中,将以下行添加到数组
aliases
'aliases' => [ // ... 'Flow' => CokeCancino\LaravelFlow\Facades\Flow::class, // ... ],
-
发布配置文件
php artisan vendor:publish --provider="CokeCancino\LaravelFlow\FlowServiceProvider" --force
-
配置你的
.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许可证许可。