mirror of
https://github.com/lkddi/Xboard.git
synced 2026-04-03 10:30:51 +08:00
- Implement Workerman-based `xboard:ws-server` for real-time node synchronization. - Support custom routes, outbounds, and certificate configurations via JSON. - Optimize scheduled tasks with `lazyById` to minimize memory footprint. - Enhance reactivity using Observers for `Plan`, `Server`, and `ServerRoute`. - Expand protocol support for `httpupgrade`, `h2`, and `mieru`.
136 lines
4.2 KiB
PHP
136 lines
4.2 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Exceptions\ApiException;
|
|
use App\Models\Payment;
|
|
use App\Services\Plugin\PluginManager;
|
|
use App\Services\Plugin\HookManager;
|
|
|
|
class PaymentService
|
|
{
|
|
public $method;
|
|
protected $config;
|
|
protected $payment;
|
|
protected $pluginManager;
|
|
protected $class;
|
|
|
|
public function __construct($method, $id = NULL, $uuid = NULL)
|
|
{
|
|
$this->method = $method;
|
|
$this->pluginManager = app(PluginManager::class);
|
|
|
|
if ($method === 'temp') {
|
|
return;
|
|
}
|
|
|
|
if ($id) {
|
|
$paymentModel = Payment::find($id);
|
|
if (!$paymentModel) {
|
|
throw new ApiException('payment not found');
|
|
}
|
|
$payment = $paymentModel->toArray();
|
|
}
|
|
if ($uuid) {
|
|
$paymentModel = Payment::where('uuid', $uuid)->first();
|
|
if (!$paymentModel) {
|
|
throw new ApiException('payment not found');
|
|
}
|
|
$payment = $paymentModel->toArray();
|
|
}
|
|
|
|
$this->config = [];
|
|
if (isset($payment)) {
|
|
$this->config = is_string($payment['config']) ? json_decode($payment['config'], true) : $payment['config'];
|
|
$this->config['enable'] = $payment['enable'];
|
|
$this->config['id'] = $payment['id'];
|
|
$this->config['uuid'] = $payment['uuid'];
|
|
$this->config['notify_domain'] = $payment['notify_domain'] ?? '';
|
|
}
|
|
|
|
$paymentMethods = $this->getAvailablePaymentMethods();
|
|
if (isset($paymentMethods[$this->method])) {
|
|
$pluginCode = $paymentMethods[$this->method]['plugin_code'];
|
|
$paymentPlugins = $this->pluginManager->getEnabledPaymentPlugins();
|
|
foreach ($paymentPlugins as $plugin) {
|
|
if ($plugin->getPluginCode() === $pluginCode) {
|
|
$plugin->setConfig($this->config);
|
|
$this->payment = $plugin;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
$this->payment = new $this->class($this->config);
|
|
}
|
|
|
|
public function notify($params)
|
|
{
|
|
if (!$this->config['enable'])
|
|
throw new ApiException('gate is not enable');
|
|
return $this->payment->notify($params);
|
|
}
|
|
|
|
public function pay($order)
|
|
{
|
|
// custom notify domain name
|
|
$notifyUrl = url("/api/v1/guest/payment/notify/{$this->method}/{$this->config['uuid']}");
|
|
if ($this->config['notify_domain']) {
|
|
$parseUrl = parse_url($notifyUrl);
|
|
$notifyUrl = $this->config['notify_domain'] . $parseUrl['path'];
|
|
}
|
|
|
|
return $this->payment->pay([
|
|
'notify_url' => $notifyUrl,
|
|
'return_url' => source_base_url('/#/order/' . $order['trade_no']),
|
|
'trade_no' => $order['trade_no'],
|
|
'total_amount' => $order['total_amount'],
|
|
'user_id' => $order['user_id'],
|
|
'stripe_token' => $order['stripe_token']
|
|
]);
|
|
}
|
|
|
|
public function form()
|
|
{
|
|
$form = $this->payment->form();
|
|
$result = [];
|
|
foreach ($form as $key => $field) {
|
|
$result[$key] = [
|
|
'type' => $field['type'],
|
|
'label' => $field['label'] ?? '',
|
|
'placeholder' => $field['placeholder'] ?? '',
|
|
'description' => $field['description'] ?? '',
|
|
'value' => $this->config[$key] ?? $field['default'] ?? '',
|
|
'options' => $field['select_options'] ?? $field['options'] ?? []
|
|
];
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 获取所有可用的支付方式
|
|
*/
|
|
public function getAvailablePaymentMethods(): array
|
|
{
|
|
$methods = [];
|
|
|
|
$methods = HookManager::filter('available_payment_methods', $methods);
|
|
|
|
return $methods;
|
|
}
|
|
|
|
/**
|
|
* 获取所有支付方式名称列表(用于管理后台)
|
|
*/
|
|
public static function getAllPaymentMethodNames(): array
|
|
{
|
|
$pluginManager = app(PluginManager::class);
|
|
$pluginManager->initializeEnabledPlugins();
|
|
|
|
$instance = new self('temp');
|
|
$methods = $instance->getAvailablePaymentMethods();
|
|
|
|
return array_keys($methods);
|
|
}
|
|
}
|