payzeio / laravel-payze
Payze.io Payment Integration for Laravel
Requires
- php: >=7.4|^8.0|^8.1|^8.2
- ext-json: *
- guzzlehttp/guzzle: ^6|^7
- illuminate/support: >=5.3
README
此包允许您从Laravel应用程序中处理Payze.io的支付。
变更日志
有关最近更改的更多信息,请参阅变更日志。
升级
升级到新版本后,请确保运行发布命令以发布最新的迁移。此外,请将新的配置文件内容复制到现有的配置文件中。
目录
安装
composer require payzeio/laravel-payze
适用于Laravel <= 5.4
如果您使用的是Laravel 5.4或更低版本,您必须手动在您的config/app.php
文件中添加服务提供者。打开config/app.php
并将PayzeServiceProvider
添加到providers
数组中。
'providers' => [ # Other providers PayzeIO\LaravelPayze\PayzeServiceProvider::class, ],
通过运行发布迁移和配置
php artisan vendor:publish --provider="PayzeIO\LaravelPayze\PayzeServiceProvider"
运行迁移
php artisan migrate
API密钥
访问Payze.io网站并生成API密钥。将密钥和密钥保存到.env文件中
PAYZE_API_KEY=PayzeApiKey
PAYZE_API_SECRET=PayzeApiSecret
定义路由
您必须定义应用程序中的成功和失败路由以完成交易。转到您的web.php
(或存储路由的地方)并添加以下内容
routes()
函数接受3个可选
参数
控制器:控制器名称,默认:App\Http\Controller\PayzeController
成功方法:成功方法名称,默认:success
失败方法:失败方法名称,默认:fail
use PayzeIO\LaravelPayze\Facades\Payze; // Other routes... Payze::routes();
这些路由将具有payze.success
和payze.fail
的名称。如果您在某个命名空间下定义了它们,则可以更新配置中的名称。例如,如果您在api.php
中定义了payze路由,并且该文件名为api.
,则您的路由将是api.payze.success
和api.payze.fail
。在config/payze.php
文件中更新它们,该文件存储在routes
数组中。
配置
通用变量存储在config/payze.php
文件中。更多详情
日志
在每个请求/交易中启用/禁用数据库详细日志记录。默认情况下,仅在本地环境中启用日志记录。您可以从.env
或直接从配置文件中覆盖此值。
SSL验证
在Guzzle客户端中启用/禁用SSL验证以避免某些服务器上的SSL问题。默认启用。
路由
成功和失败路由名称,用于识别完成的交易并在数据库中更新交易状态。
只有当您在另一个命名空间(如api
)中定义了路由时,才更新路由名称。例如,您将拥有api.payze.success
和api.payze.fail
URL。
视图
交易完成后显示的成功和失败视图名称。您可以覆盖它们并使用带有自己布局的自己的页面。
默认情况下,它使用一个空页面,仅包含状态文本(绿色/红色颜色)和“返回首页”按钮。
交易表
数据库中存储所有交易的表的名称。
日志表
数据库中存储关于交易和API请求详细日志的表的名称。
卡令牌表
数据库中存储所有已保存的卡令牌的表的名称。
API密钥
Payze.io账户的API密钥。
API密钥
Payze.io账户的API密钥。
支付与请求
所有请求都由相应的类发送,这些类扩展了相同的类(PayzeIO\LaravelPayze\Concerns\ApiRequest)。
所有请求都通过request()
函数(传递构造函数数据)静态调用,然后链式调用所有需要的数据,然后调用process()
。
有关所需数据和选项的详细说明请参阅下一节。
直接支付
如果您需要一次性支付,则应使用Just Pay功能。
参数
Amount
-float
,必需
返回: Illuminate\Http\RedirectResponse
use PayzeIO\LaravelPayze\Requests\JustPay; return JustPay::request(1) ->for($order) // optional ->preauthorize() // optional ->process();
添加(保存)卡
保存一张卡会为您提供一张卡令牌,您可以使用它进行进一步的手动收费而无需与客户互动。您可以收费任何金额,也可以在单个操作中保存一张卡,或者您可以将金额设置为0以仅保存一张卡(某些银行可能收取0.1GEL并退款以保存卡)。
卡令牌保存在数据库中,可以通过PayzeCardToken模型或cards relationship访问。
请求支付后,数据库中会创建一个处于非活动状态的卡令牌。在成功收费后,卡令牌会自动变为活动状态。
重要!如果您想将卡令牌与用户关联,以及将交易与订单关联,则应使用接收卡令牌所有者模型实例的assignTo
方法。
参数
Amount
-float
,可选,默认:0
方法
assignTo
-Illuminate\Database\Eloquent\Model
,可选,默认:null
返回: Illuminate\Http\RedirectResponse
use PayzeIO\LaravelPayze\Requests\AddCard; return AddCard::request(1) ->for($order) // transaction will be assigned to order ->assignTo($user) // optional: card token will be assigned to user. if not present, then will be assigned to order ->process();
使用已保存的卡支付
您可以在不与客户互动的情况下随时使用已保存的卡令牌进行支付。
可以通过PayzeCardToken模型或cards relationship访问卡令牌。有关卡令牌模型的更多信息,请参阅此处。
参数
CardToken
-PayzeIO\LaravelPayze\Models\PayzeCardToken
,必需Amount
-float
,可选,默认:0
返回: PayzeIO\LaravelPayze\Models\PayzeTransaction
use PayzeIO\LaravelPayze\Requests\PayWithCard; // Get user's non-expired, default card $card = $user->cards()->active()->default()->firstOrFail(); return PayWithCard::request($card, 15) ->for($order) // optional ->process();
提交
提交(收费)已冻结(预先授权)的交易。
参数
TransactionId
-string|PayzeIO\LaravelPayze\Models\PayzeTransaction
,必需Amount
-float
,可选,默认:0
,(可以部分收费)。0将收费全部金额
返回: PayzeIO\LaravelPayze\Models\PayzeTransaction
use PayzeIO\LaravelPayze\Requests\Commit; return Commit::request($transaction)->process();
退款
退还可退还的交易。
参数
TransactionId
-string|PayzeIO\LaravelPayze\Models\PayzeTransaction
,必需Amount
-float
,可选,默认:0
,(可以部分退还)。0将退还全部金额
返回: PayzeIO\LaravelPayze\Models\PayzeTransaction
use PayzeIO\LaravelPayze\Models\PayzeTransaction; use PayzeIO\LaravelPayze\Requests\Refund; $transaction = PayzeTransaction::refundable()->latest()->firstOrFail(); return Refund::request($transaction)->process();
交易信息
获取交易信息并更新数据库。
参数
TransactionId
-string|PayzeIO\LaravelPayze\Models\PayzeTransaction
,必需
返回: PayzeIO\LaravelPayze\Models\PayzeTransaction
use PayzeIO\LaravelPayze\Models\PayzeTransaction; use PayzeIO\LaravelPayze\Requests\GetTransactionInfo; $transaction = PayzeTransaction::latest()->firstOrFail(); return GetTransactionInfo::request($transaction)->process();
商户余额
从商户账户获取余额信息。
返回: array
use PayzeIO\LaravelPayze\Requests\GetBalance; return GetBalance::request()->process();
支付请求选项
您可以将这些参数传递给Payze包中的所有支付请求。
金额
所有支付请求在构造函数中都有一个金额,但也有一個单独的方法可以更改金额。
use PayzeIO\LaravelPayze\Requests\JustPay; // Request 1 GEL originally $request = JustPay::request(1); // Some things happened, updating amount return $request->amount(10)->process();
货币
您可以通过在请求上调用 currency()
函数来更改您的支付货币。默认:GEL
查看支持货币请参阅 货币枚举文件。
建议:使用枚举传递货币而不是直接传递字符串。
use PayzeIO\LaravelPayze\Enums\Currency; use PayzeIO\LaravelPayze\Requests\JustPay; return JustPay::request(1)->currency(Currency::USD)->process();
语言
您可以通过在请求上调用 language()
函数来更改您的支付页面语言。默认:ge
查看支持的语言请参阅 语言枚举文件。
建议:使用枚举传递语言而不是直接传递字符串。
use PayzeIO\LaravelPayze\Enums\Language; use PayzeIO\LaravelPayze\Requests\JustPay; return JustPay::request(1)->language(Language::ENG)->process();
预授权
预授权方法用于暂时锁定金额,然后手动(提交)交易。例如,如果您销售需要订单后生产的商品,则在订单时锁定(预授权)交易,然后在您的产品准备好后手动(提交)。
关联模型
您可以通过在请求上调用 for()
函数将任何 Eloquent 模型关联到交易。例如,将订单实例传递到支付请求以检查支付后的订单状态。
use App\Models\Order; use PayzeIO\LaravelPayze\Requests\JustPay; $order = Order::findOrFail($orderId); return JustPay::request(1)->for($order)->process();
分割资金
您可以将在不同银行账户之间分割资金。例如,您有一个市场,用户在那里销售他们的产品,您为此收取佣金。您可以直接轻松分割转账资金,而不是在每次订单中手动从银行账户转账到卖家。
您必须在请求上调用 split()
函数,该函数接受 PayzeIO\LaravelPayze\Objects\Split
对象的列表/数组。
分割对象有三个参数:Amount
(金额)、Receiver's IBAN
(收款人的 IBAN)和Pay In(可选)
(转账前延迟的天数)。
例如,一个产品的成本是 20GEL。您需要获得您的佣金(10%)并将剩余部分转账给卖家。
use PayzeIO\LaravelPayze\Objects\Split; use PayzeIO\LaravelPayze\Requests\JustPay; return JustPay::request(20) ->split( new Split(2, "Your IBAN"), // Transfer 2GEL immediately new Split(18, "Seller's IBAN", 3) // Transfer 18GEL after 3 days (for example, as an insurance before processing the order) )->process();
原始数据
默认情况下,当您请求支付时,它将返回一个 RedirectResponse。您可以通过调用 raw()
函数,支付请求将返回原始数据而不是 RedirectResponse。
use PayzeIO\LaravelPayze\Requests\JustPay; $request = JustPay::request(20)->raw()->process(); log($request['transactionId']); return $request['transactionUrl'];
控制器
默认控制器应在运行安装部分中的发布命令后发布。您可以在控制器中的 successResponse
和 failResponse
方法中添加您的自定义逻辑。例如,您可以从这些方法中设置闪存消息,发送通知,标记订单为完成或您需要做任何事情。
重要:如果您从 successResponse
和 failResponse
方法返回任何非 NULL 值,则该响应将用于成功/失败路由。否则将使用 默认逻辑。
事件
在成功或失败的交易之后会触发事件。您可以在您的应用程序中 定义监听器 以标记订单为已支付,通知客户或您需要的任何操作。
这两个事件都有 $transaction
属性。
已支付事件:PayzeIO\LaravelPayze\Events\PayzeTransactionPaid
失败事件:PayzeIO\LaravelPayze\Events\PayzeTransactionFailed
关系
您可以使用特质将 transactions
和 cards
关系添加到您的模型中,以便轻松访问关联条目。
交易关系
将 HasTransactions
特质添加到您的模型。
use PayzeIO\LaravelPayze\Traits\HasTransactions; class Order extends Model { use HasTransactions; }
现在您可以通过调用 $order->transactions
访问交易。
卡关系
将 HasCards
特质添加到您的模型。
use PayzeIO\LaravelPayze\Traits\HasCards; class User extends Model { use HasCards; }
现在您可以通过调用 $user->cards
访问已保存的卡片。
模型
交易模型
您可以通过 PayzeIO\LaravelPayze\Models\PayzeTransaction
模型访问数据库中记录的所有交易。
获取所有交易
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::all();
已支付范围
使用 paid()
范围过滤已支付交易。
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::paid()->get();
未支付范围
使用 unpaid()
范围过滤未支付交易。
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::unpaid()->get();
已完成范围
使用 completed()
范围过滤已完成交易。
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::completed()->get();
不完整范围
使用 incomplete()
范围过滤不完整的交易。
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::incomplete()->get();
可退款范围
使用 refundable()
范围过滤可退款交易。
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::refundable()->get();
不可退款范围
使用 nonrefundable()
范围过滤不可退款交易。
use PayzeIO\LaravelPayze\Models\PayzeTransaction; PayzeTransaction::nonrefundable()->get();
卡令牌模型
您可以通过 PayzeIO\LaravelPayze\Models\PayzeCardToken
模型访问数据库中记录的所有已保存的卡令牌。
注意:开始 AddCard 支付后,会创建一个新的非活动令牌数据库条目,该令牌在支付成功后激活。因此,“活动”卡指的是有效的令牌,可用于未来的支付。
获取所有活动令牌
令牌会自动按全局范围过滤,并只返回活动令牌。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; PayzeCardToken::all();
活动卡令牌具有 card_mask
、cardholder
、brand
、expiration_date
属性,这些属性有助于用户选择正确的卡。
活动(未过期)范围
由于令牌会自动按全局范围过滤,因此 active()
范围现在根据到期日期返回非过期卡令牌。
使用 active()
范围过滤活动(未过期)卡令牌。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; PayzeCardToken::active()->get();
带有非活动范围
令牌会自动按全局范围过滤,并只返回活动令牌。如果您想将非活动卡令牌包含在列表中,应在查询中添加 withInactive()
范围。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; PayzeCardToken::withInactive()->get();
非活动范围
使用 inactive()
范围过滤非活动卡令牌。此方法已包含 withInactive()
范围,因此您无需手动指定。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; PayzeCardToken::inactive()->get();
是否过期
您可以检查已检索的 PayzeCardToken 模型实例是否过期。
如果数据库中未填写到期日期,则方法将返回 false。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; $token = PayzeCardToken::latest()->get(); $token->isExpired();
是否活动(非过期)
您可以检查已检索的 PayzeCardToken 模型实例是否过期。
如果数据库中未填写到期日期,则方法将返回 true。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; $card = PayzeCardToken::latest()->get(); $card->isActive();
标记为默认
您可以设置当前卡为默认卡。所有其他卡将自动取消标记。
use PayzeIO\LaravelPayze\Models\PayzeCardToken; $card = PayzeCardToken::latest()->get(); $card->markAsDefault();
日志模型
您可以通过 PayzeIO\LaravelPayze\Models\PayzeLog
模型访问数据库中的所有日志。
获取所有日志
use PayzeIO\LaravelPayze\Models\PayzeLog; PayzeLog::all();
废弃的交易
状态为 Created
的已弃用交易在约 10 分钟后自动拒绝,因此您必须运行计划任务来更新这些交易的状态。
如果您尚未配置计划任务,请在此处阅读如何配置。
在 app/Console/Kernel.php
的 $commands
变量中注册我们的控制台命令
use PayzeIO\LaravelPayze\Console\Commands\UpdateIncompleteTransactions; protected $commands = [ // Other commands UpdateIncompleteTransactions::class, ];
然后,在 app/Console/Kernel.php
的 schedule
函数中添加一个命令。我们建议每 30 分钟运行一次作业,但这完全取决于您和您的应用程序需求。
use PayzeIO\LaravelPayze\Console\Commands\UpdateIncompleteTransactions; protected function schedule(Schedule $schedule) { // Other commands $schedule->command(UpdateIncompleteTransactions::class)->everyThirtyMinutes(); }