blenderdeluxe / flow-laravel-system
Laravel支付集成包,用于与Flow(https://www.flow.cl)集成
2.0.2
2020-12-16 22:49 UTC
Requires
- php: >=5.4.0
- illuminate/support: ~5.0|^6.0|^7.0
README
Laravel支付集成包,用于与Flow集成
已测试与Laravel 5.1, 5.5, 6.0兼容
此包是基于Jorge Cancino Flores创建的原版修改,我只为其添加了Laravel 6的支持
安装
步骤1:通过Composer安装
$ composer require blenderdeluxe/laravel-flow
步骤2:添加服务提供者
在文件config/app.php中,将以下行添加到providers数组中
'providers' => [ … BlenderDeluxe\FlowLaravelSystem\FlowServiceProvider::class, … ],
步骤3:添加别名
在同一文件中,将以下行添加到aliases数组中
'aliases' => [ … 'Flow' => BlenderDeluxe\FlowLaravelSystem\Facades\Flow::class, … ],
步骤4:发布配置文件
$ php artisan vendor:publish --provider="BlenderDeluxe\FlowLaravelSystem\FlowServiceProvider" --force
步骤5:配置你的.env文件或修改config/flow.php
…
FLOW_URL_PAGO=http://flow.tuxpan.com/app/kpf/pago.php
FLOW_COMERCIO=emailFlow@comercio.com
使用方法
此包几乎充当一个简单的服务提供者,用于Flow集成套件,因此我将仅举例说明在Laravel中使用的差异。
注意:由于Flow不知道应该发送哪个CSRF token到你的路由,因此需要排除成功、失败和确认页面的CSRF保护(https://laravel.net.cn/docs/master/csrf#csrf-excluding-uris)
购买表单
视图: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 via 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 exitosamente<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'); …