ernandesrs / lapi-payment
支付
Requires
- pagarme/pagarme-php: ^4.1
README
LAPI(https://github.com/ernandesrs/pproj_lapi)的支付系统。
已实现的网关
Pagarme: pagarme
安装
composer require ernandesrs/lapi-payment
配置
LAPI PAYMENT包的配置指南。
环境变量
在您的项目 .env 文件中,添加以下变量
PAYMENT_TESTING=true
PAYMENT_POSTBACK_URL_LOCAL_TEST=
PAYMENT_DEFAULT_GATEWAY=GATEWAY NAME
PAYMENT_GATEWAY_PAGARME_API_TEST=YOUR API KEY TEST
PAYMENT_GATEWAY_PAGARME_API_LIVE=YOUR API KEY LIVE
PAYMENT_GATEWAY_PAGARME_API_ANTIFRAUD=false
键 | 描述 |
---|---|
PAYMENT_TESTING | 定义是否收费系统处于测试状态。如果设置为 false,收费系统将执行真实收费。 |
PAYMENT_POSTBACK_URL_LOCAL_TEST | 本地测试的postback URL。 |
PAYMENT_DEFAULT_GATEWAY | 定义将使用的网关。请参阅 文档开头 了解已实现的网关。 |
PAYMENT_GATEWAY_PAGARME_API_TEST | 测试api密钥(用于测试的虚假收费)。 |
PAYMENT_GATEWAY_PAGARME_API_LIVE | 生产api密钥(真实收费)。 |
PAYMENT_GATEWAY_PAGARME_API_ANTIFRAUD | 定义是否在Pagar.me上启用反欺诈功能。启用时,信用卡收费需要一些额外数据。 |
添加ServiceProvider
在 /config/app.php 中,将 ErnandesRS\LapiPayment\LapiPaymentServiceProvider::class 添加到 'providers' 项中。如下所示
<?php return [ // outras configurações... 'providers' => [ // outros providers... App\Providers\RouteServiceProvider::class, Ernandesrs\LapiPayment\LapiPaymentServiceProvider::class ], // outras configurações ];
发布配置文件
在您的Laravel项目根目录中,使用以下命令发布配置文件
php artisan vendor:publish --tag=lapi-payment-config
配置文件包含可在 .env 变量文件中修改的字段,请参阅上面的 '环境变量' 部分。有关更多详细信息,请参阅 配置文件。
(可选)发布语言文件
在您的Laravel项目根目录中,使用以下命令发布语言文件
php artisan vendor:publish --tag=lapi-payment-lang
在User模型中使用AsCustomer trait
在您的用户模型 \App\Models\User 中,使用 AsCustomer trait,您的模型将类似于这样
<?php namespace App\Models; // outras importações... use Ernandesrs\LapiPayment\Models\AsCustomer; class User extends Authenticatable { use AsCustomer;
AsCustomer trait的方法
AsCustomer 包含一些必需的和方法,可能需要在User模型中实现,请参阅以下内容
方法 | 必需 | 描述 |
---|---|---|
customerId() | 必需 | 应返回客户ID。 |
customerFirstName() | 必需 | 应返回客户的首名。 |
customerLastName() | 必需 | 必须返回客户的姓氏。 |
customerEmail() | 必需 | 必须返回客户的电子邮件。 |
customerCountry() | 必需 | 必须返回客户的国籍。 |
customerPhone() | 必需 | 必须返回一个 \Ernandesrs\LapiPayment\Models\Phone 的实例。 |
customerDocument() | 必需 | 必须返回一个 \Ernandesrs\LapiPayment\Models\Document 的实例。 |
customerType() | 可选 | 客户类型,可以是 individual 或 corporation。默认为 individual。 |
customerAddress()() | 必需 | 必须返回一个 \Ernandesrs\LapiPayment\Models\Address 类的实例,该实例将包含客户的地址。 |
复制并粘贴,根据您的 User 模型进行调整
/** * Customer id * * @return string */ public function customerId(): string { return $this->id; } /** * Customer first name * * @return string */ public function customerFirstName(): string { return $this->first_name; } /** * Customer last name * * @return string */ public function customerLastName(): string { return $this->last_name; } /** * Customer email * * @return string */ public function customerEmail(): string { return $this->email; } /** * Customer country * * @return string */ public function customerCountry(): string { return 'br'; } /** * Customer type * Tipo de pessoa, individual ou corporation * * @return string */ public function customerType(): string { return 'individual'; } /** * Customer phone number * * @return \Ernandesrs\LapiPayment\Models\Phone */ public function customerPhone(): \Ernandesrs\LapiPayment\Models\Phone { return new \Ernandesrs\LapiPayment\Models\Phone(55, 67900000000); } /** * Customer document * * @return \Ernandesrs\LapiPayment\Models\Document */ public function customerDocument(): \Ernandesrs\LapiPayment\Models\Document { return \Ernandesrs\LapiPayment\Models\Document::cpf(33983219098); } /** * Customer adress * * @return \Ernandesrs\LapiPayment\Models\Address */ public function customerAddress(): \Ernandesrs\LapiPayment\Models\Address { return new \Ernandesrs\LapiPayment\Models\Address( 'Rua Street', 7822, '29315-000', 'br', 'sp', 'São Paulo', 'Centro', 'Apartamento 489 Andar 12' ); }
使用方法
使用很简单,只需使用 facade \Ernandesrs\LapiPayment\Facades\LapiPay
客户
注册客户
此操作将在网关的数据库中创建一个客户并保存。网关将返回一个 ID,该 ID 将存储在您的数据库中,以便快速将客户与交易(例如支付)关联。
以下示例基于注入的用户创建一个客户(使用 trait AsCustomer 并实现必要的方法,更多信息请见此处)
$user = \Auth::user(); $customer = \Ernandesrs\LapiPayment\Facades\LapiPay::createCustomer($user); print_r($customer);
\Ernandesrs\LapiPayment\Facades\LapiPay::createCustomer 方法还具有其他参数:id、name、email、country 等;这些参数可以手动提供,但如果为空,则将从注入的 $user 中自动获取这些值。
恢复客户
恢复存储在网关数据库中的客户数据
// first way $details = $user->customer()->first()->details(); var_dump($details); // second way $customer = $user->customer()->first(); $details = \Ernandesrs\LapiPayment\Facades\LapiPay::customerDetails($customer); var_dump($details);
卡片
验证和保存一张卡片
\Ernandesrs\LapiPayment\Facades\LapiPay::createCard 方法使用网关验证一张卡片并将其保存到数据库。该卡片将属于注入的用户。
$user = \Auth::user(); $card = \Ernandesrs\LapiPayment\Facades\LapiPay::createCard($user, 'The Holder Name', '4916626701217934', '156', '0424'); print_r($card);
卡片验证错误
在将数据发送到网关之前,将对卡片数据进行预验证。如果在验证过程中发生任何错误,将抛出 \Ernandesrs\LapiPayment\Exceptions\InvalidDataException 异常,并将包含有关错误详细信息的消息数组存储在用户会话中(此数组由 Laravel 验证器返回)。以下是如何检索这些消息的方法:
try { // try validate, create and save card $card = \Ernandesrs\LapiPayment\Facades\LapiPay::createCard($user, 'The Holder Name', '4916626701217934', '156', '0424'); // success print_r($card); } catch(\Ernandesrs\LapiPayment\Exceptions\InvalidDataException $e) { // get error messages $errors = \Ernandesrs\LapiPayment\Facades\LapiPay::errorMessages(); // fail print_r($errors); }
恢复卡片
恢复为用户存储的所有已验证和保存的卡片。
$user = \Auth::user(); $cards = $user->cards()->get(); print_r($cards);
收款
添加客户
将客户数据添加到网关的收款记录中。
// get customer $customer = \Auth::user(); // add customer $lapipay = \Ernandesrs\LapiPayment\Facades\LapiPay::addCustomer($customer)
添加账单(收款数据)
添加收款数据。此操作将设置由customerAddress()方法获取的名称和地址数据在此处实现。
// get customer $customer = \Auth::user(); // add customer $lapipay = \Ernandesrs\LapiPayment\Facades\LapiPay::addBilling($customer)
添加产品
在网关的收款记录中添加产品数据。
// adicionando um produto/item $lapipay = \Ernandesrs\LapiPayment\Facades\LapiPay::addProduct(2109, 'Curso Digital', 99.00, 1, false); // adicionando vários produtos/itens $lapipay = \Ernandesrs\LapiPayment\Facades\LapiPay::addProduct(2109, 'Produto Digital', 99.00, 1, false) ->addProduct(9231, 'Produto Físico', 102.97, 1, true) ->addProduct(9231, 'Outro Produto', 12.97, 1, false) ->addProduct(9231, 'Mais Um Produto', 77.97, 1, false);
执行收款
在信用卡上执行收款。(添加产品/项目时,不会自动计算应收取的金额)
// get customer $customer = \Auth::user(); // get a registered card $card = $customer->cards()->first(); $amount = 99.00 + 102.97 + 12.97; $installments = 1; $lapipay = \Ernandesrs\LapiPayment\Facades\LapiPay::addCustomer($customer) ->addBilling($customer) ->addProduct(2109, 'Produto Digital', 99.00, 1, false) ->addProduct(9231, 'Produto Físico', 102.97, 1, true) ->addProduct(9231, 'Outro Produto', 12.97, 1, false) ->chargeWithCard($customer, $card, $amount, $installments); var_dump($lapipay);
收款数据验证错误
在将数据发送到网关之前,收款数据(值和分期)将进行预验证。如果验证过程中出现任何错误,将抛出\Ernandesrs\LapiPayment\Exceptions\InvalidDataException异常,并将包含有关错误详细信息的消息数组存储在用户会话中(此数组是Laravel验证器返回的数组)。以下是如何检索这些消息的方法
try { // try charge customer $payment = \Ernandesrs\LapiPayment\Facades\LapiPay::addCustomer($customer) ->addBilling($customer) ->addProduct(2109, 'Produto Digital', 99.00, 1, false) ->chargeWithCard($customer, $card, $amount, $installments); // success print_r($payment); } catch(\Ernandesrs\LapiPayment\Exceptions\InvalidDataException $e) { // get error messages $errors = \Ernandesrs\LapiPayment\Facades\LapiPay::errorMessages(); // fail print_r($errors); }
尝试执行收款时,可能会抛出其他异常(所有异常都在\Ernandesrs\LapiPayment\Exceptions命名空间中),并且可以捕获这些异常,如下所示
异常 | 描述 |
---|---|
InvalidCardException | 无效的卡 |
ChargedbackPaymentException | 已退款 |
RefundedPaymentException | 已退款 |
RefusedPaymentException | 已拒绝 |
执行退款
执行部分退款。
$payment = \Auth::user()->payments()->first(); $refund = \Ernandesrs\LapiPayment\Facades\LapiPay::refundPayment($payment, 50.00, ['reason' => 'Lorem ipsum dolor sit']); var_dump($refund);
执行全额退款。
$payment = \Auth::user()->payments()->first(); $refund = \Ernandesrs\LapiPayment\Facades\LapiPay::refundPayment($payment, null, ['reason' => 'Lorem ipsum dolor sit']); var_dump($refund);
退款数据验证错误
退款时,将验证金额,如果验证失败,将抛出\Ernandesrs\LapiPayment\Exceptions\InvalidDataException异常。以下是如何捕获关于发生错误的详细信息的方法
try { // get payment $payment = $user->payments()->first(); // try refund payment $refund = \Ernandesrs\LapiPayment\Facades\LapiPay::refundPayment($payment, null, ['reason' => 'Lorem ipsum dolor sit']); // success var_dump($refund); } catch(\Ernandesrs\LapiPayment\Exceptions\InvalidDataException $e) { // get error messages $errors = \Ernandesrs\LapiPayment\Facades\LapiPay::errorMessages(); // fail print_r($errors); }
尝试执行退款时,可能会抛出其他异常(所有异常都在\Ernandesrs\LapiPayment\Exceptions命名空间中),如下所示
异常 | 描述 |
---|---|
PaymentHasAlreadyBeenRefundedException | 付款已退款 |
获取支付详情
获取由配置的网关记录的支付详情。
// first way $details = $user->payments()->first()->details(); var_dump($details); // second way $payment = $user->payments()->first(); $details = \Ernandesrs\LapiPayment\Facades\LapiPay::paymentDetails($payment); var_dump($details);