stripe = $stripe; $this->stripe->init(); $this->ensureApplePayDomainIsValidated(); } /** * Authorization page for browser pay. * * @param array $data * @return RedirectResponse */ public function authorizeView(array $data): RedirectResponse { return redirect()->route('client.payment_methods.index'); } /** * Handle the authorization for browser pay. * * @param Request $request * @return RedirectResponse */ public function authorizeResponse(Request $request): RedirectResponse { return redirect()->route('client.payment_methods.index'); } public function paymentView(array $data): View { $payment_intent_data = [ 'amount' => $this->stripe->convertToStripeAmount($data['total']['amount_with_fee'], $this->stripe->client->currency()->precision, $this->stripe->client->currency()), 'currency' => $this->stripe->client->getCurrencyCode(), 'customer' => $this->stripe->findOrCreateCustomer(), 'description' => $this->stripe->decodeUnicodeString(ctrans('texts.invoices') . ': ' . collect($data['invoices'])->pluck('invoice_number')), ]; $data['gateway'] = $this->stripe; $data['pi_client_secret'] = $this->stripe->createPaymentIntent($payment_intent_data)->client_secret; $data['payment_request_data'] = [ 'country' => $this->stripe->client->country->iso_3166_2, 'currency' => strtolower( $this->stripe->client->getCurrencyCode() ), 'total' => [ 'label' => $payment_intent_data['description'], 'amount' => $payment_intent_data['amount'], ], 'requestPayerName' => true, 'requestPayerEmail' => true ]; return render('gateways.stripe.browser_pay.pay', $data); } /** * Handle payment response for browser pay. * * @param PaymentResponseRequest $request * @return RedirectResponse|App\PaymentDrivers\Stripe\never */ public function paymentResponse(PaymentResponseRequest $request) { // if ($request->shouldUseToken()) { // $charge = \Stripe\Charge::create([ // 'amount' => $this->stripe->convertToStripeAmount($this->stripe->payment_hash->data->amount_with_fee, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), // 'currency' => $this->stripe->client->getCurrencyCode(), // 'customer' => $this->stripe->findOrCreateCustomer()->id, // 'source' => $request->token, // ], $this->stripe->stripe_connect_auth); // } $gateway_response = json_decode($request->gateway_response); $this->stripe->payment_hash ->withData('gateway_response', $gateway_response) ->withData('payment_intent', PaymentIntent::retrieve($gateway_response->id, $this->stripe->stripe_connect_auth)); if ($gateway_response->status === 'succeeded') { if ($request->shouldStoreToken()) { // $this->storePaymentMethod(); } return $this->processSuccessfulPayment(); } return $this->processUnsuccessfulPayment(); } protected function storePaymentMethod() { $customer = new \stdClass; $customer->id = $this->stripe->findOrCreateCustomer()->id; $payment_method = $this->stripe->payment_hash->data->gateway_response->payment_method; $this->stripe->attach($payment_method, $customer); $method = $this->stripe->getStripePaymentMethod($payment_method); try { $payment_meta = new \stdClass; $payment_meta->exp_month = (string) $method->card->exp_month; $payment_meta->exp_year = (string) $method->card->exp_year; $payment_meta->brand = (string) $method->card->brand; $payment_meta->last4 = (string) $method->card->last4; $payment_meta->type = GatewayType::APPLE_PAY; $data = [ 'payment_meta' => $payment_meta, 'token' => $method->id, 'payment_method_id' => GatewayType::APPLE_PAY, ]; $this->stripe->storeGatewayToken($data, ['gateway_customer_reference' => $customer->id]); } catch (\Exception $e) { return $this->stripe->processInternallyFailedPayment($this->stripe, $e); } } /** * Handle successful payment for browser pay. * * @return RedirectResponse */ protected function processSuccessfulPayment() { $gateway_response = $this->stripe->payment_hash->data->gateway_response; $payment_intent = $this->stripe->payment_hash->data->payment_intent; $this->stripe->logSuccessfulGatewayResponse(['response' => $gateway_response, 'data' => $this->stripe->payment_hash], SystemLog::TYPE_STRIPE); $payment_method = $this->stripe->getStripePaymentMethod($gateway_response->payment_method); $data = [ 'payment_method' => $gateway_response->payment_method, 'payment_type' => PaymentType::parseCardType(strtolower($payment_method->card->brand)), 'amount' => $this->stripe->convertFromStripeAmount($gateway_response->amount, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), 'transaction_reference' => optional($payment_intent->charges->data[0])->id, 'gateway_type_id' => GatewayType::APPLE_PAY, ]; $this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, ['amount' => $data['amount']]); $this->stripe->payment_hash->save(); $payment = $this->stripe->createPayment($data, Payment::STATUS_COMPLETED); SystemLogger::dispatch( ['response' => $gateway_response, 'data' => $data], SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_SUCCESS, SystemLog::TYPE_STRIPE, $this->stripe->client, $this->stripe->client->company, ); return redirect()->route('client.payments.show', ['payment' => $this->stripe->encodePrimaryKey($payment->id)]); } /** * Handle unsuccessful payment for browser pay. * * @return never */ protected function processUnsuccessfulPayment() { $server_response = $this->stripe->payment_hash->data->gateway_response; $this->stripe->sendFailureMail($server_response->cancellation_reason); $message = [ 'server_response' => $server_response, 'data' => $this->stripe->payment_hash->data, ]; SystemLogger::dispatch( $message, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::TYPE_STRIPE, $this->stripe->client, $this->stripe->client->company, ); throw new PaymentFailed('Failed to process the payment.', 500); } /** * Ensure Apple Pay domain is verified. * * @return void * @throws ApiErrorException */ protected function ensureApplePayDomainIsValidated() { $config = $this->stripe->company_gateway->getConfig(); if (property_exists($config, 'apple_pay_domain_id')) { return; } $domain = config('ninja.app_url'); if (Ninja::isHosted()) { $domain = isset($this->stripe_driver->company_gateway->company->portal_domain) ? $this->stripe_driver->company_gateway->company->portal_domain : $this->stripe_driver->company_gateway->company->domain(); } $response = ApplePayDomain::create([ 'domain_name' => $domain, ]); $config->apple_pay_domain_id = $response->id; $this->stripe->company_gateway->setConfig($config); $this->stripe->company_gateway->save(); } }