From 96b748112394d247fd1cd989f0c9cab183aef45c Mon Sep 17 00:00:00 2001 From: Edward Yang Date: Mon, 8 Aug 2022 16:14:13 +0800 Subject: [PATCH] fixed payment --- .../Controllers/Account/OrderController.php | 28 --------- beike/Shop/Routes/shop.php | 1 - beike/Shop/Services/PaymentService.php | 48 ++-------------- .../Stripe/Controllers/StripeController.php | 47 +++++++++++++++ plugins/Stripe/Routes/shop.php | 15 +++++ .../Stripe/Services/StripePaymentService.php | 57 +++++++++++++++++++ .../Stripe/Views/checkout/payment.blade.php | 3 +- 7 files changed, 125 insertions(+), 74 deletions(-) create mode 100644 plugins/Stripe/Controllers/StripeController.php create mode 100644 plugins/Stripe/Routes/shop.php create mode 100644 plugins/Stripe/Services/StripePaymentService.php diff --git a/beike/Shop/Http/Controllers/Account/OrderController.php b/beike/Shop/Http/Controllers/Account/OrderController.php index 5fb9d4ef..8e40dce5 100644 --- a/beike/Shop/Http/Controllers/Account/OrderController.php +++ b/beike/Shop/Http/Controllers/Account/OrderController.php @@ -81,32 +81,4 @@ class OrderController extends Controller $order = OrderRepo::getOrderByNumber($number, $customer); return (new PaymentService($order))->pay(); } - - - /** - * 订单支付页面 - * - * @param Request $request - * @param $number - * @return array - * @throws \Exception - */ - public function capture(Request $request, $number): array - { - try { - $customer = current_customer(); - $order = OrderRepo::getOrderByNumber($number, $customer); - $creditCardData = $request->all(); - $result = (new PaymentService($order))->capture($creditCardData); - if ($result) { - $order->status = 'paid'; - $order->save(); - return json_success('支付成功'); - } else { - return json_success('支付失败'); - } - } catch (\Exception $e) { - return json_fail($e->getMessage()); - } - } } diff --git a/beike/Shop/Routes/shop.php b/beike/Shop/Routes/shop.php index c184b652..253c2e67 100644 --- a/beike/Shop/Routes/shop.php +++ b/beike/Shop/Routes/shop.php @@ -69,7 +69,6 @@ Route::prefix('/') Route::post('checkout/confirm', [CheckoutController::class, 'confirm'])->name('checkout.confirm'); Route::get('orders/{number}/success', [OrderController::class, 'success'])->name('orders.success'); Route::get('orders/{number}/pay', [OrderController::class, 'pay'])->name('orders.pay'); - Route::post('orders/{number}/pay', [OrderController::class, 'capture'])->name('orders.capture'); }); Route::prefix('account') diff --git a/beike/Shop/Services/PaymentService.php b/beike/Shop/Services/PaymentService.php index 0e0ca17e..92aa4218 100644 --- a/beike/Shop/Services/PaymentService.php +++ b/beike/Shop/Services/PaymentService.php @@ -22,17 +22,15 @@ use Stripe\Token; class PaymentService { - private $order; - - private $orderId; - - private $paymentMethodCode; + protected $order; + protected $orderId; + protected $paymentMethodCode; public function __construct($order) { $customer = current_customer(); if (is_numeric($order)) { - $this->order = OrderRepo::getOrderByIdOrNumber($this->orderId, $customer); + $this->order = OrderRepo::getOrderByIdOrNumber($order, $customer); } elseif ($order instanceof Order) { $this->order = $order; } @@ -61,42 +59,4 @@ class PaymentService $paymentView = view($viewPath, ['order' => $this->order])->render(); return view('checkout.payment', ['order' => $this->order, 'payment' => $paymentView]); } - - - /** - * @throws ApiErrorException - */ - public function capture($creditCardData): bool - { - $apiKey = plugin_setting('stripe.secret_key'); - Stripe::setApiKey($apiKey); - $token = Token::create([ - 'card' => [ - 'number' => $creditCardData['cardnum'], - 'exp_year' => $creditCardData['year'], - 'exp_month' => $creditCardData['month'], - 'cvc' => $creditCardData['cvv'], - ], - ]); - - // $customer = Customer::create([ - // 'email' => $this->order->email, - // ]); - // $customerId = $customer['id']; - - $tokenId = $token['id']; - $total = round($this->order->total, 2) * 100; - $stripeChargeParameters = array( - 'amount' => $total, - 'currency' => $this->order->currency_code, - 'metadata' => array( - 'orderId' => $this->order->id, - ), - 'source' => $tokenId, - // 'customer' => $customerId, - ); - - $charge = \Stripe\Charge::create($stripeChargeParameters); - return $charge['paid'] && $charge['captured']; - } } diff --git a/plugins/Stripe/Controllers/StripeController.php b/plugins/Stripe/Controllers/StripeController.php new file mode 100644 index 00000000..39b57ea8 --- /dev/null +++ b/plugins/Stripe/Controllers/StripeController.php @@ -0,0 +1,47 @@ + + * @created 2022-08-08 15:58:36 + * @modified 2022-08-08 15:58:36 + */ + +namespace Plugin\Stripe\Controllers; + +use Beike\Repositories\OrderRepo; +use Beike\Shop\Http\Controllers\Controller; +use Beike\Shop\Services\PaymentService; +use Illuminate\Http\Request; +use Plugin\Stripe\Services\StripePaymentService; + +class StripeController extends Controller +{ + /** + * 订单支付扣款 + * + * @param Request $request + * @return array + */ + public function capture(Request $request): array + { + try { + $number = request('order_number'); + $customer = current_customer(); + $order = OrderRepo::getOrderByNumber($number, $customer); + $creditCardData = $request->all(); + $result = (new StripePaymentService($order))->capture($creditCardData); + if ($result) { + $order->status = 'paid'; + $order->save(); + return json_success('支付成功'); + } else { + return json_success('支付失败'); + } + } catch (\Exception $e) { + return json_fail($e->getMessage()); + } + } +} diff --git a/plugins/Stripe/Routes/shop.php b/plugins/Stripe/Routes/shop.php new file mode 100644 index 00000000..74f6326f --- /dev/null +++ b/plugins/Stripe/Routes/shop.php @@ -0,0 +1,15 @@ + + * @created 2022-08-04 16:17:44 + * @modified 2022-08-04 16:17:44 + */ + +use Illuminate\Support\Facades\Route; +use Plugin\Stripe\Controllers\StripeController; + +Route::post('/stripe/capture', [StripeController::class, 'capture'])->name('plugin.stripe_capture'); diff --git a/plugins/Stripe/Services/StripePaymentService.php b/plugins/Stripe/Services/StripePaymentService.php new file mode 100644 index 00000000..f7bba386 --- /dev/null +++ b/plugins/Stripe/Services/StripePaymentService.php @@ -0,0 +1,57 @@ + + * @created 2022-08-08 16:09:21 + * @modified 2022-08-08 16:09:21 + */ + +namespace Plugin\Stripe\Services; + +use Stripe\Token; +use Stripe\Stripe; +use Beike\Shop\Services\PaymentService; +use Stripe\Exception\ApiErrorException; + +class StripePaymentService extends PaymentService +{ + /** + * @throws ApiErrorException + */ + public function capture($creditCardData): bool + { + $apiKey = plugin_setting('stripe.secret_key'); + Stripe::setApiKey($apiKey); + $token = Token::create([ + 'card' => [ + 'number' => $creditCardData['cardnum'], + 'exp_year' => $creditCardData['year'], + 'exp_month' => $creditCardData['month'], + 'cvc' => $creditCardData['cvv'], + ], + ]); + + // $customer = Customer::create([ + // 'email' => $this->order->email, + // ]); + // $customerId = $customer['id']; + + $tokenId = $token['id']; + $total = round($this->order->total, 2) * 100; + $stripeChargeParameters = array( + 'amount' => $total, + 'currency' => $this->order->currency_code, + 'metadata' => array( + 'orderId' => $this->order->id, + ), + 'source' => $tokenId, + // 'customer' => $customerId, + ); + + $charge = \Stripe\Charge::create($stripeChargeParameters); + return $charge['paid'] && $charge['captured']; + } +} diff --git a/plugins/Stripe/Views/checkout/payment.blade.php b/plugins/Stripe/Views/checkout/payment.blade.php index be1feccb..f94584a4 100644 --- a/plugins/Stripe/Views/checkout/payment.blade.php +++ b/plugins/Stripe/Views/checkout/payment.blade.php @@ -50,6 +50,7 @@ data: { form: { + order_number: @json($order->number ?? null), cardnum: '', year: '', month: '', @@ -99,7 +100,7 @@ console.log(this.form); - $http.post(`/orders/${this.source.order.number}/pay`, this.form).then((res) => { + $http.post(`/plugin/stripe/capture`, this.form).then((res) => { console.log(res) }) });