ernandesrs/lapi-payment

此包已被弃用,不再维护。作者建议使用 ernandesrs/lapipay 包。

支付

v0.0.6 2023-08-01 16:35 UTC

This package is auto-updated.

Last update: 2023-08-16 14:37:31 UTC


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() 可选 客户类型,可以是 individualcorporation。默认为 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);