From d6f518dff69c760139a69b71e7463828ef921c1f Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Thu, 25 May 2023 09:53:49 +0000 Subject: [PATCH] =?UTF-8?q?!107=20Order=20Payment=20*=20wip=20*=20add=20ex?= =?UTF-8?q?ceptions=20*=20order->orderPayments=20ui=20*=20add=20order=20pa?= =?UTF-8?q?yments=20*=20paypal=20=E5=92=8C=20stripe=20=E4=BF=9D=E5=AD=98?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E6=95=B0=E6=8D=AE=20*=20add=20order=20paymen?= =?UTF-8?q?t.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Http/Controllers/OrderController.php | 2 +- beike/Exceptions/InvalidException.php | 17 ++++++ beike/Models/Order.php | 5 ++ beike/Models/OrderPayment.php | 21 +++++++ beike/Repositories/OrderPaymentRepo.php | 61 +++++++++++++++++++ beike/Services/StateMachineService.php | 28 +++++++++ ...023_05_11_055643_create_order_payments.php | 36 +++++++++++ .../Paypal/Controllers/PaypalController.php | 3 + .../Stripe/Controllers/StripeController.php | 12 +++- .../admin/views/pages/orders/form.blade.php | 48 ++++++++++++++- resources/lang/en/admin/order.php | 9 +++ resources/lang/zh_cn/admin/order.php | 8 +++ 12 files changed, 244 insertions(+), 6 deletions(-) create mode 100644 beike/Exceptions/InvalidException.php create mode 100644 beike/Models/OrderPayment.php create mode 100644 beike/Repositories/OrderPaymentRepo.php create mode 100644 database/migrations/2023_05_11_055643_create_order_payments.php diff --git a/beike/Admin/Http/Controllers/OrderController.php b/beike/Admin/Http/Controllers/OrderController.php index 07ca08a7..848a71c3 100644 --- a/beike/Admin/Http/Controllers/OrderController.php +++ b/beike/Admin/Http/Controllers/OrderController.php @@ -71,7 +71,7 @@ class OrderController extends Controller */ public function show(Request $request, Order $order) { - $order->load(['orderTotals', 'orderHistories', 'orderShipments']); + $order->load(['orderTotals', 'orderHistories', 'orderShipments', 'orderPayments']); $data = hook_filter('admin.order.show.data', ['order' => $order, 'html_items' => []]); $data['statuses'] = StateMachineService::getInstance($order)->nextBackendStatuses(); $data = hook_filter('admin.order.show.data', $data); diff --git a/beike/Exceptions/InvalidException.php b/beike/Exceptions/InvalidException.php new file mode 100644 index 00000000..976654ba --- /dev/null +++ b/beike/Exceptions/InvalidException.php @@ -0,0 +1,17 @@ + + * @created 2023-05-25 14:48:12 + * @modified 2023-05-25 14:48:12 + */ + +namespace Beike\Exceptions; + +class InvalidException extends \Exception +{ + +} \ No newline at end of file diff --git a/beike/Models/Order.php b/beike/Models/Order.php index ca13ed75..b636a042 100644 --- a/beike/Models/Order.php +++ b/beike/Models/Order.php @@ -59,6 +59,11 @@ class Order extends Base return $this->hasMany(OrderShipment::class); } + public function orderPayments(): HasMany + { + return $this->hasMany(OrderPayment::class); + } + public function subTotal() { $totals = $this->orderTotals; diff --git a/beike/Models/OrderPayment.php b/beike/Models/OrderPayment.php new file mode 100644 index 00000000..ede415a6 --- /dev/null +++ b/beike/Models/OrderPayment.php @@ -0,0 +1,21 @@ + + * @created 2023-05-25 10:02:52 + * @modified 2023-05-25 10:02:52 + */ + +namespace Beike\Models; + +class OrderPayment extends Base +{ + protected $table = 'order_payments'; + + protected $fillable = [ + 'order_id', 'transaction_id', 'request', 'response', 'callback', 'receipt', + ]; +} diff --git a/beike/Repositories/OrderPaymentRepo.php b/beike/Repositories/OrderPaymentRepo.php new file mode 100644 index 00000000..f538ddb0 --- /dev/null +++ b/beike/Repositories/OrderPaymentRepo.php @@ -0,0 +1,61 @@ + + * @created 2023-05-25 10:02:39 + * @modified 2023-05-25 10:02:39 + */ + +namespace Beike\Repositories; + +use Beike\Models\OrderPayment; + +class OrderPaymentRepo +{ + /** + * @param $orderId + * @param $data + * @return mixed + * @throws \Throwable + */ + public static function createOrUpdatePayment($orderId, $data): mixed + { + $orderId = (int) $orderId; + if (empty($orderId) || empty($data)) { + return null; + } + + $orderPayment = OrderPayment::query()->where('order_id', $orderId)->first(); + if (empty($orderPayment)) { + $orderPayment = new OrderPayment(); + } + + $paymentData = [ + 'order_id' => $orderId, + ]; + + if (isset($data['transaction_id'])) { + $paymentData['transaction_id'] = $data['transaction_id']; + } + if (isset($data['request'])) { + $paymentData['request'] = json_encode($data['request'] ?? []); + } + if (isset($data['response'])) { + $paymentData['response'] = json_encode($data['response'] ?? []); + } + if (isset($data['callback'])) { + $paymentData['callback'] = json_encode($data['callback'] ?? []); + } + if (isset($data['receipt'])) { + $paymentData['receipt'] = $data['receipt']; + } + + $orderPayment->fill($paymentData); + $orderPayment->saveOrFail(); + + return $orderPayment; + } +} diff --git a/beike/Services/StateMachineService.php b/beike/Services/StateMachineService.php index ecf306b8..1e3599c6 100644 --- a/beike/Services/StateMachineService.php +++ b/beike/Services/StateMachineService.php @@ -15,6 +15,7 @@ use Beike\Models\Order; use Beike\Models\OrderHistory; use Beike\Models\OrderShipment; use Beike\Models\Product; +use Beike\Repositories\OrderPaymentRepo; use Throwable; class StateMachineService @@ -29,6 +30,8 @@ class StateMachineService private array $shipment; + private array $payment; + public const CREATED = 'created'; // 已创建 public const UNPAID = 'unpaid'; // 待支付 @@ -116,6 +119,19 @@ class StateMachineService return $this; } + /** + * 设置支付信息 + * + * @param array $payment + * @return $this + */ + public function setPayment(array $payment = []): self + { + $this->payment = $payment; + + return $this; + } + /** * 获取所有订单状态列表 * @@ -340,6 +356,18 @@ class StateMachineService } } + /** + * 添加发货单号 + * @throws Throwable + */ + private function addPayment($oldCode, $newCode) + { + if (empty($this->payment)) { + return; + } + OrderPaymentRepo::createOrUpdatePayment($this->orderId, $this->payment); + } + /** * 发送新订单通知 */ diff --git a/database/migrations/2023_05_11_055643_create_order_payments.php b/database/migrations/2023_05_11_055643_create_order_payments.php new file mode 100644 index 00000000..f30666f8 --- /dev/null +++ b/database/migrations/2023_05_11_055643_create_order_payments.php @@ -0,0 +1,36 @@ +id(); + $table->integer('order_id'); + $table->string('transaction_id')->nullable(); + $table->string('request')->nullable(); + $table->string('response')->nullable(); + $table->string('callback')->nullable(); + $table->string('receipt')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_payments'); + } +}; diff --git a/plugins/Paypal/Controllers/PaypalController.php b/plugins/Paypal/Controllers/PaypalController.php index 71117f73..2798948b 100644 --- a/plugins/Paypal/Controllers/PaypalController.php +++ b/plugins/Paypal/Controllers/PaypalController.php @@ -15,6 +15,7 @@ namespace Plugin\Paypal\Controllers; +use Beike\Repositories\OrderPaymentRepo; use Beike\Repositories\OrderRepo; use Beike\Services\StateMachineService; use Illuminate\Http\JsonResponse; @@ -96,8 +97,10 @@ class PaypalController $customer = current_customer(); $order = OrderRepo::getOrderByNumber($orderNumber, $customer); + OrderPaymentRepo::createOrUpdatePayment($order->id, ['request' => $data]); $paypalOrderId = $data['paypalOrderId']; $result = $this->paypalClient->capturePaymentOrder($paypalOrderId); + OrderPaymentRepo::createOrUpdatePayment($order->id, ['response' => $result]); try { DB::beginTransaction(); diff --git a/plugins/Stripe/Controllers/StripeController.php b/plugins/Stripe/Controllers/StripeController.php index 969eef71..d0907e38 100644 --- a/plugins/Stripe/Controllers/StripeController.php +++ b/plugins/Stripe/Controllers/StripeController.php @@ -11,6 +11,7 @@ namespace Plugin\Stripe\Controllers; +use Beike\Repositories\OrderPaymentRepo; use Beike\Repositories\OrderRepo; use Beike\Services\StateMachineService; use Beike\Shop\Http\Controllers\Controller; @@ -24,6 +25,7 @@ class StripeController extends Controller * * @param Request $request * @return array + * @throws \Throwable */ public function capture(Request $request): array { @@ -32,14 +34,18 @@ class StripeController extends Controller $customer = current_customer(); $order = OrderRepo::getOrderByNumber($number, $customer); $creditCardData = $request->all(); - $result = (new StripePaymentService($order))->capture($creditCardData); + + OrderPaymentRepo::createOrUpdatePayment($order->id, ['request' => $creditCardData]); + $result = (new StripePaymentService($order))->capture($creditCardData); + OrderPaymentRepo::createOrUpdatePayment($order->id, ['response' => $result]); + if ($result) { - StateMachineService::getInstance($order)->changeStatus(StateMachineService::PAID); + StateMachineService::getInstance($order)->setShipment()->changeStatus(StateMachineService::PAID); return json_success(trans('Stripe::common.capture_success')); } - return json_success(trans('Stripe::common.capture_fail')); + return json_success(trans('Stripe::common.capture_fail')); } catch (\Exception $e) { return json_fail($e->getMessage()); diff --git a/resources/beike/admin/views/pages/orders/form.blade.php b/resources/beike/admin/views/pages/orders/form.blade.php index cc6c947d..4e3e5374 100644 --- a/resources/beike/admin/views/pages/orders/form.blade.php +++ b/resources/beike/admin/views/pages/orders/form.blade.php @@ -208,6 +208,50 @@ @endhookwrapper + @if ($order->orderPayments) + @hookwrapper('admin.order.form.payments') +
+
{{ __('admin/order.payments_history') }}
+
+
+ + + + + + + + + + + + + + + @foreach ($order->orderPayments as $payment) + + + + + + + + + + + @endforeach + +
{{ __('admin/order.order_id') }}{{ __('admin/order.text_transaction_id') }}{{ __('admin/order.text_request') }}{{ __('admin/order.text_response') }}{{ __('admin/order.text_callback') }}{{ __('admin/order.text_receipt') }}{{ __('order.created_at') }}{{ __('order.updated_at') }}
{{ $payment->order_id }}{{ $payment->transaction_id }}{{ $payment->request }}{{ $payment->response }}{{ $payment->callback }} + @if ($payment->receipt) + {{ __('admin/order.text_click_view') }} + @endif + {{ $payment->created_at }}{{ $payment->updated_at }}
+
+
+
+ @endhookwrapper + @endif + @if ($order->orderShipments) @hookwrapper('admin.order.form.shipments')
@@ -219,7 +263,7 @@ {{ __('order.express_company') }} {{ __('order.express_number') }} - {{ __('order.history_created_at') }} + {{ __('order.updated_at') }} @@ -265,7 +309,7 @@ {{ __('order.history_status') }} {{ __('order.history_comment') }} - {{ __('order.history_created_at') }} + {{ __('order.updated_at') }} diff --git a/resources/lang/en/admin/order.php b/resources/lang/en/admin/order.php index ef48c44d..b5b00d89 100644 --- a/resources/lang/en/admin/order.php +++ b/resources/lang/en/admin/order.php @@ -23,4 +23,13 @@ return [ 'notify' => 'Whether to remind', 'orders_update_status' => 'Update Status', 'error_status' => 'Please select a status', + 'payments_history' => 'Payment History', + 'text_response' => 'Pesponse', + 'text_request' => 'Pequest', + 'text_callback' => 'Callback', + 'text_callback' => 'Callback', + 'text_receipt' => 'Receipt', + 'order_id' => 'Order Id', + 'text_transaction_id' => 'Transaction Id', + 'text_click_view' => 'Click To View', ]; diff --git a/resources/lang/zh_cn/admin/order.php b/resources/lang/zh_cn/admin/order.php index a69142de..9a743bdb 100644 --- a/resources/lang/zh_cn/admin/order.php +++ b/resources/lang/zh_cn/admin/order.php @@ -23,4 +23,12 @@ return [ 'notify' => '是否提醒', 'orders_update_status' => '更新状态', 'error_status' => '请选择状态', + 'payments_history' => '支付记录', + 'text_response' => '返回数据', + 'text_request' => '请求参数', + 'text_callback' => '回调', + 'text_receipt' => '凭据', + 'order_id' => '订单ID', + 'text_transaction_id' => '交易ID', + 'text_click_view' => '点击查看', ];