orkhanahmadov / laravel-goldenpay
Laravel的Goldenpay包
Requires
- php: ^7.3|^8.0
- illuminate/console: ^8.0
- illuminate/contracts: ^8.0
- illuminate/database: ^8.0
- illuminate/http: ^8.0
- illuminate/queue: ^8.0
- illuminate/support: ^8.0
- orkhanahmadov/goldenpay: ^2.2
Requires (Dev)
- laravel/legacy-factories: ^1.0
- orchestra/testbench: ^6.0
- phpunit/phpunit: ^9.0
This package is auto-updated.
Last update: 2024-08-29 05:23:42 UTC
README
完整的Goldenpay集成Laravel包。
目录
要求
安装
您可以通过composer安装此包
composer require orkhanahmadov/laravel-goldenpay
运行此命令以发布所需的迁移文件
php artisan vendor:publish --provider="Orkhanahmadov\LaravelGoldenpay\LaravelGoldenpayServiceProvider" --tag=migrations
使用
首先,在.env
文件中设置您的Goldenpay商户名称和认证密钥。您可以从Goldenpay仪表板获取这些信息。
GOLDENPAY_AUTH_KEY=your-auth-key GOLDENPAY_MERCHANT_NAME=your-merchant-name
要使用Goldenpay服务,您需要Orkhanahmadov\LaravelGoldenpay\Goldenpay
的实例。您可以使用Laravel的服务容器实例化此类,例如通过将其注入到您的控制器中
use Orkhanahmadov\LaravelGoldenpay\Goldenpay; class MyController { public function index(Goldenpay $goldenpay) { // } }
或者您可以使用Laravel的服务解析器来创建类的实例
use Orkhanahmadov\LaravelGoldenpay\Goldenpay; class MyClass { public function doSomething() { $goldenpay = app(Goldenpay::class); // } }
可用方法
payment()
基于传递的凭据准备支付,并接受4个参数
Amount
- 支付金额,仅接受整数。例如,如果您想创建10.25的支付,则将其作为1025传递。Card type
- 需要Orkhanahmadov\Goldenpay\Enums\CardType
的实例。《CardType::VISA()` 用于VISA,《CardType::MASTERCARD()` 用于MasterCardDescription
- 支付描述Language
(可选) - 设置支付页面界面语言。需要Orkhanahmadov\Goldenpay\Enums\Language
的实例。《Language::EN()` 用于英语,《Language::RU()` 用于俄语,《Language::AZ()` 用于阿塞拜疆语。如果没有传递,则服务将使用Laravel的活动区域设置。
$goldenpay = app(Goldenpay::class); $goldenpay->payment(1000, CardType::MASTERCARD(), 'my payment');
方法返回创建的Orkhanahmadov\LaravelGoldenpay\Models\Payment
模型实例。
您可以使用$payment_url
属性来获取唯一的支付URL,并将用户重定向到该URL以开始支付。
$payment = $goldenpay->payment(1000, CardType::MASTERCARD(), 'my payment'); $payment->payment_url; // redirect user to this URL to start payment
result()
根据之前支付的关键字检查支付结果。接受单个参数
Payment
- 这是Goldenpay的支付关键字作为字符串,或之前创建的Orkhanahmadov\LaravelGoldenpay\Models\Payment
模型实例。
$goldenpay = app(Goldenpay::class); $paymentModel = $goldenpay->payment(1000, CardType::MASTERCARD(), 'my payment'); $result = $goldenpay->result($paymentModel); // or $result = $goldenpay->result('1234-ABCD-5678');
方法返回带有Goldenpay响应的更新后的Orkhanahmadov\LaravelGoldenpay\Models\Payment
模型实例。
控制器
Goldenpay要求拥有成功和失败支付的端点。对于这些端点中的每一个,Goldenpay都会发送带有附加的payment_key
查询字符串的GET请求。要获取支付结果,您需要创建一个路由来接受这些请求,并使用接收到的payment_key
获取支付结果。
包附带一个控制器,可帮助简化此过程。要开始,首先为成功或失败的支付创建一个GET路由,并将完整的URL添加到Goldenpay仪表板中的相应字段。
Route::get('payments/successful', 'App\Http\Controllers\Payment\SuccessfulPaymentController@index');
为您的新路由创建一个控制器类,并扩展Orkhanahmadov\LaravelGoldenpay\Http\Controllers\GoldenpayController
。
use Orkhanahmadov\LaravelGoldenpay\Http\Controllers\GoldenpayController; class SuccessfulPaymentController extends GoldenpayController { public function index() { // return a view or JSON, totally up to you } }
通过扩展Orkhanahmadov\LaravelGoldenpay\Http\Controllers\GoldenpayController
,您的控制器将自动根据payment_key
查询字符串检查支付结果。
在您的控制器中,您可以通过访问$payment
属性来访问Goldenpay的支付结果。
public function index() { $this->payment->status; // will return payment status $this->payment->successful; // will return true if payment was successful or false if unsuccessful }
您可以使用相同的端点来处理成功和失败的支付,并基于$this->payment->successful
状态显示用户想要的内容,或者您创建单独的端点和控制器,并在两个控制器中扩展Orkhanahmadov\LaravelGoldenpay\Http\Controllers\GoldenpayController
。
模型
包附带Orkhanahmadov\LaravelGoldenpay\Models\Payment
Eloquent模型。模型为每次支付存储以下信息
payment_key
- 字符串,Goldenpay提供的唯一支付关键字amount
- 整数,支付金额card_type
- 枚举,"m" 表示万事达卡,"v" 表示维萨卡language
- 枚举,"en" 表示英语,"ru" 表示俄语,"lv" 表示阿塞拜疆语description
- 字符串,支付描述status
- 整数,支付状态代码message
- 字符串,支付状态消息reference_number
- 字符串,支付参考号card_number
- 字符串,加密,用于支付的卡号payment_date
- 日期时间,支付日期checks
- 整数,支付检查次数
除了常见的Eloquent功能外,此模型还具有特定的访问器、作用域和关系能力,您可以使用这些能力。
访问器
successful
- 如果支付标记为成功则返回true
,否则返回false
payment_url
- 返回支付页面URL。如果支付标记为成功则返回null
formatted_amount
- 返回十进制形式的 "amount"card_number_decrypted
- 返回解密后的 "card_number" 值。如果卡号加密已关闭则返回null
作用域
whereSuccessful()
- 只过滤 "successful" 支付wherePending()
- 只过滤 "pending" 支付。待支付是指未成功且在30分钟内创建或支付检查次数少于3次的支付。
关系
您可以将任何现有的Eloquent模型转换为 "payable" 并将其与Goldenpay支付相关联。在现有模型中使用 Orkhanahmadov\LaravelGoldenpay\Traits\Payable
特性来建立直接模型关系。使用特性需要您的模型中定义 amount()
和 description()
方法。
amount()
- 必须返回整数形式的支付金额description()
- 必须返回支付实例的描述
use Illuminate\Database\Eloquent\Model; use Orkhanahmadov\LaravelGoldenpay\Traits\Payable; class Product extends Model { use Payable; protected $fillable = [ 'name', 'color', 'size', 'price', ]; protected $casts = [ 'price' => 'float', // lets image that you store price as float, like "15.70" in "products" table ]; protected function amount(): int { // this method needs to return integer value of price return $this->price * 100; } protected function description(): string { // this method needs to return description for payment instance // try to use both unique and easy to read identifier return $this->id . ' - ' . $this->name . ' - ' . $this->color; } }
现在 Product
模型与Goldenpay支付具有直接关系。通过使用 Payable
,您的模型也获得了访问与支付相关的关联和支付方式的权限。
createPayment()
$product = Product::find(1); $product->createPayment(CardType::VISA()); // uses product amount() and description() to create new payment instance
您也可以为特定支付重写 amount
和 description()
$product->createPayment(CardType::VISA(), 2599, 'my custom description');
方法接受以下参数
卡类型
-Orkhanahmadov\Goldenpay\Enums\CardType
的实例金额
(可选) - 当使用时将覆盖模型中的amount()
方法值描述
(可选) - 当使用时将覆盖模型中的description()
方法值语言
(可选) - 当跳过时将使用Laravel的locale。实例为Orkhanahmadov\Goldenpay\Enums\Language
。
方法返回创建的 Orkhanahmadov\LaravelGoldenpay\Models\Payment
实例。
payments()
Eloquent关系方法。返回与模型相关联的所有支付。
$product = Product::find(1); $product->payments; // returns collection of related Payment models $product->payments()->where('amount', '>=', 10000); // use it as regular Eloquent relationship
successfulPayments()
Eloquent关系方法。返回与模型相关联的所有成功支付。
$product = Product::find(1); $product->successfulPayments; // returns collection of related Payment models $product->successfulPayments()->where('amount', '>=', 10000); // use it as regular Eloquent relationship
命令
该包附带用于检查支付结果的 artisan 命令。
php artisan goldenpay:result
执行上述命令将遍历所有 "pending" 支付并更新它们的结果。
命令也接受支付键作为参数以检查单个支付结果。
php artisan goldenpay:result 1234-ABCD-5678
Goldenpay需要手动检查支付以确定其最终状态。例如,用户可能访问支付页面然后关闭浏览器窗口而不输入任何内容。这些支付情况需要手动检查以确定其状态。您可以使用Laravel的 任务调度 在Cron作业上运行 goldenpay:result
命令。
protected function schedule(Schedule $schedule) { $schedule->command('goldenpay:result')->everyFiveMinutes(); }
因为Goldenpay表示每个支付会话仅在15分钟内是活动的,所以建议频率为每5或10分钟一次。
事件
该包附带Laravel事件,这些事件在特定条件下被触发。
可用事件类
Orkhanahmadov\LaravelGoldenpay\Events\PaymentCreatedEvent
- 当创建新支付时触发Orkhanahmadov\LaravelGoldenpay\Events\PaymentCheckedEvent
- 当支付结果检查时触发Orkhanahmadov\LaravelGoldenpay\Events\PaymentSuccessfulEvent
- 当支付成功最终化时触发
每个事件都会接收到Orkhanahmadov\LaravelGoldenpay\Models\Payment
Eloquent模型的实例,作为公开的$payment
属性。
您可以设置事件监听器,当特定支付事件触发时执行。
protected $listen = [ 'Orkhanahmadov\LaravelGoldenpay\Events\PaymentSuccessfulEvent' => [ 'App\Listeners\SendPaymentInvoice', 'App\Listeners\SendProductLicense', ], ];
配置
运行此命令以发布包配置文件
php artisan vendor:publish --provider="Orkhanahmadov\LaravelGoldenpay\LaravelGoldenpayServiceProvider" --tag=config
配置文件包含以下设置
auth_key
- 定义Goldenpay的"auth key",默认为.env
变量merchant_name
- 定义Goldenpay的"商户名称",默认为.env
变量table_name
- 定义Goldenpay支付数据库表的名称。默认:"goldenpay_payments"encrypt_card_numbers
- 定义在创建支付或获取支付结果时是否需要自动加密"card_number"字段。默认为true
,如果您想禁用自动加密,请将其更改为false
。建议保持为true
以提供额外的安全层。警告!如果您在支付表中已有记录,更改此值将破坏加密/解密。旧值将不会自动加密/解密,您需要手动操作。payment_events
- 支付事件相关设置enabled
- 定义是否启用支付事件。设置为false
以禁用所有支付事件checked
- "支付检查"事件类。默认使用Orkhanahmadov\LaravelGoldenpay\Events\PaymentCreatedEvent
类created
- "支付创建"事件类。默认使用Orkhanahmadov\LaravelGoldenpay\Events\PaymentCheckedEvent
类successful
- "支付成功"事件类。默认使用Orkhanahmadov\LaravelGoldenpay\Events\PaymentSuccessfulEvent
类
如果您想为特定支付事件使用自己的事件类,可以替换类命名空间为您的类命名空间。每个支付事件都会接收到Orkhanahmadov\LaravelGoldenpay\Models\Payment
Eloquent模型的实例。因此,请确保将支付模型作为依赖项添加到您的事件类构造函数签名中,或者您可以扩展已将支付模型作为依赖项的Orkhanahmadov\LaravelGoldenpay\Events\PaymentEvent
类。
将特定支付事件设置为null
将禁用该事件而不会中断其他事件。
测试
composer test
贡献
请参阅CONTRIBUTING以获取详细信息。
安全
如果您发现任何安全相关的问题,请通过ahmadov90@gmail.com发送电子邮件,而不是使用问题跟踪器。
致谢
支持我
如果您喜欢我的工作,如果我的开源贡献帮助了您或您的公司,请考虑通过Github Sponsors支持我。
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。