mirror of
				https://github.com/invoiceninja/invoiceninja.git
				synced 2025-10-31 15:37:30 -04:00 
			
		
		
		
	Handle Alipay payments
- Refactored main Alipay class - Added new N/A translation - Fixed issue with alipay.js
This commit is contained in:
		
							parent
							
								
									e24e25f9f0
								
							
						
					
					
						commit
						0942169d4f
					
				| @ -218,8 +218,9 @@ class PaymentController extends Controller | ||||
|             'amount_with_fee' => $invoice_totals + $fee_totals, | ||||
|         ]; | ||||
| 
 | ||||
|         if($is_credit_payment) | ||||
|         if($is_credit_payment) { | ||||
|             return $this->processCreditPayment($request, $data); | ||||
|         } | ||||
| 
 | ||||
|         return $gateway | ||||
|             ->driver(auth()->user()->client) | ||||
|  | ||||
| @ -13,6 +13,8 @@ | ||||
| namespace App\PaymentDrivers\Stripe; | ||||
| 
 | ||||
| use App\Events\Payment\PaymentWasCreated; | ||||
| use App\Exceptions\PaymentFailed; | ||||
| use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest; | ||||
| use App\Http\Requests\Payments\PaymentWebhookRequest; | ||||
| use App\Jobs\Mail\PaymentFailureMailer; | ||||
| use App\Jobs\Util\SystemLogger; | ||||
| @ -37,81 +39,88 @@ class Alipay | ||||
|     public function paymentView(array $data) | ||||
|     { | ||||
|         $data['gateway'] = $this->stripe; | ||||
|         $data['return_url'] = $this->buildReturnUrl($data); | ||||
|         $data['return_url'] = $this->buildReturnUrl(); | ||||
|         $data['currency'] = $this->stripe->client->getCurrencyCode(); | ||||
|         $data['stripe_amount'] = $this->stripe->convertToStripeAmount($data['amount_with_fee'], $this->stripe->client->currency()->precision); | ||||
|         $data['invoices'] = $this->stripe->payment_hash->invoices(); | ||||
| 
 | ||||
|         $this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, ['stripe_amount' => $data['stripe_amount']]); | ||||
|         $this->stripe->payment_hash->save(); | ||||
| 
 | ||||
|         return render('gateways.stripe.alipay.pay', $data); | ||||
|     } | ||||
| 
 | ||||
|     private function buildReturnUrl($data): string | ||||
|     private function buildReturnUrl(): string | ||||
|     { | ||||
|         return route('client.payments.response', [ | ||||
|             'company_gateway_id' => $this->stripe->company_gateway->id, | ||||
|             'gateway_type_id' => GatewayType::ALIPAY, | ||||
|             'hashed_ids' => implode(',', $data['hashed_ids']), | ||||
|             'amount' => $data['amount'], | ||||
|             'fee' => $data['fee'], | ||||
|             'payment_hash' => $this->stripe->payment_hash->hash, | ||||
|             'payment_method_id' => GatewayType::ALIPAY, | ||||
|         ]); | ||||
|     } | ||||
| 
 | ||||
|     public function paymentResponse($request) | ||||
|     public function paymentResponse(PaymentResponseRequest $request) | ||||
|     { | ||||
|         $state = array_merge($request->all(), []); | ||||
|         $amount = $state['amount'] + $state['fee']; | ||||
|         $state['amount'] = $this->stripe->convertToStripeAmount($amount, $this->stripe->client->currency()->precision); | ||||
|         $this->stripe->payment_hash->data = array_merge((array) $this->stripe->payment_hash->data, $request->all()); | ||||
|         $this->stripe->payment_hash->save(); | ||||
| 
 | ||||
|         if ($request->redirect_status == 'succeeded') { | ||||
|             return $this->processSuccesfulRedirect($state); | ||||
|             return $this->processSuccesfulRedirect(); | ||||
|         } | ||||
| 
 | ||||
|         return $this->processUnsuccesfulRedirect($state); | ||||
|         return $this->processUnsuccesfulRedirect(); | ||||
|     } | ||||
| 
 | ||||
|     public function processSuccesfulRedirect($state) | ||||
|     public function processSuccesfulRedirect() | ||||
|     { | ||||
|         $state['charge_id'] = $state['source']; | ||||
| 
 | ||||
|         $this->stripe->init(); | ||||
| 
 | ||||
|         $state['payment_type'] = PaymentType::ALIPAY; | ||||
| 
 | ||||
|         $data = [ | ||||
|             'payment_method' => $state['charge_id'], | ||||
|             'payment_type' => $state['payment_type'], | ||||
|             'amount' => $state['amount'], | ||||
|             'payment_method' => $this->stripe->payment_hash->data->source, | ||||
|             'payment_type' => PaymentType::ALIPAY, | ||||
|             'amount' => $this->stripe->convertFromStripeAmount($this->stripe->payment_hash->data->stripe_amount, $this->stripe->client->currency()->precision), | ||||
|             'transaction_reference' => ctrans('texts.n/a'), | ||||
|         ]; | ||||
| 
 | ||||
|         $payment = $this->stripe->createPayment($data, Payment::STATUS_PENDING); | ||||
|         $payment = $this->stripe->createPayment($data, \App\Models\Payment::STATUS_PENDING); | ||||
| 
 | ||||
|         if (isset($state['hashed_ids'])) { | ||||
|             $this->stripe->attachInvoices($payment, $state['hashed_ids']); | ||||
|         } | ||||
| 
 | ||||
|         event(new PaymentWasCreated($payment, $payment->company, Ninja::eventVars())); | ||||
| 
 | ||||
|         $logger_message = [ | ||||
|             'server_response' => $state, | ||||
|             'data' => $data, | ||||
|         ]; | ||||
| 
 | ||||
|         SystemLogger::dispatch($logger_message, SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::EVENT_GATEWAY_SUCCESS, SystemLog::TYPE_STRIPE, $this->stripe->client); | ||||
|         SystemLogger::dispatch( | ||||
|             ['response' => $this->stripe->payment_hash->data, 'data' => $data], | ||||
|             SystemLog::CATEGORY_GATEWAY_RESPONSE, | ||||
|             SystemLog::EVENT_GATEWAY_SUCCESS, | ||||
|             SystemLog::TYPE_STRIPE, | ||||
|             $this->stripe->client | ||||
|         ); | ||||
| 
 | ||||
|         return redirect()->route('client.payments.show', ['payment' => $this->stripe->encodePrimaryKey($payment->id)]); | ||||
|     } | ||||
| 
 | ||||
|     public function processUnsuccesfulRedirect($state) | ||||
|     public function processUnsuccesfulRedirect() | ||||
|     { | ||||
|         PaymentFailureMailer::dispatch($this->stripe->client, $state['charge']->failure_message, $this->stripe->client->company, $state['amount']); | ||||
|         $server_response = $this->stripe->payment_hash->data; | ||||
| 
 | ||||
|         PaymentFailureMailer::dispatch($this->stripe->client, $server_response->redirect_status, $this->stripe->client->company, $server_response->amount); | ||||
| 
 | ||||
|         PaymentFailureMailer::dispatch( | ||||
|             $this->stripe->client, | ||||
|             $server_response, | ||||
|             $this->stripe->client->company, | ||||
|             $this->stripe->convertFromStripeAmount($this->stripe->payment_hash->data->stripe_amount, $this->stripe->client->currency()->precision) | ||||
|         ); | ||||
| 
 | ||||
|         $message = [ | ||||
|             'server_response' => $state['charge'], | ||||
|             'data' => $state, | ||||
|             '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); | ||||
|         SystemLogger::dispatch( | ||||
|             $message, | ||||
|             SystemLog::CATEGORY_GATEWAY_RESPONSE, | ||||
|             SystemLog::EVENT_GATEWAY_FAILURE, | ||||
|             SystemLog::TYPE_STRIPE, | ||||
|             $this->stripe->client | ||||
|         ); | ||||
| 
 | ||||
|         throw new Exception('Failed to process the payment.', 1); | ||||
|         throw new PaymentFailed('Failed to process the payment.', 500); | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										2
									
								
								public/js/clients/payments/stripe-alipay.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								public/js/clients/payments/stripe-alipay.js
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,2 @@ | ||||
| /*! For license information please see stripe-alipay.js.LICENSE.txt */ | ||||
| !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=7)}({"+keB":function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}new function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n(this,"setupStripe",(function(){return r.stripe=Stripe(r.key),r})),n(this,"handle",(function(){var e={type:"alipay",amount:document.querySelector('meta[name="amount"]').content,currency:document.querySelector('meta[name="currency"]').content,redirect:{return_url:document.querySelector('meta[name="return-url"]').content}};document.getElementById("pay-now").addEventListener("click",(function(t){document.getElementById("pay-now-button").disabled=!0,document.querySelector("#pay-now-button > svg").classList.add("hidden"),document.querySelector("#pay-now-button > span").classList.remove("hidden"),r.stripe.createSource(e).then((function(e){if(e.hasOwnProperty("source"))return window.location=e.source.redirect.url;document.getElementById("pay-now-button").disabled=!1,document.querySelector("#pay-now-button > svg").classList.remove("hidden"),document.querySelector("#pay-now-button > span").classList.add("hidden"),this.errors.textContent="",this.errors.textContent=e.error.message,this.errors.hidden=!1}))}))})),this.key=t,this.errors=document.getElementById("errors")}(document.querySelector('meta[name="stripe-publishable-key"]').content).setupStripe().handle()},7:function(e,t,n){e.exports=n("+keB")}}); | ||||
| !function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=7)}({"+keB":function(e,t){function n(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}new function e(t){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),n(this,"setupStripe",(function(){return r.stripe=Stripe(r.key),r})),n(this,"handle",(function(){var e={type:"alipay",amount:document.querySelector('meta[name="amount"]').content,currency:document.querySelector('meta[name="currency"]').content,redirect:{return_url:document.querySelector('meta[name="return-url"]').content}};document.getElementById("pay-now").addEventListener("click",(function(t){document.getElementById("pay-now").disabled=!0,document.querySelector("#pay-now > svg").classList.add("hidden"),document.querySelector("#pay-now > span").classList.remove("hidden"),r.stripe.createSource(e).then((function(e){if(e.hasOwnProperty("source"))return window.location=e.source.redirect.url;document.getElementById("pay-now").disabled=!1,document.querySelector("#pay-now > svg").classList.remove("hidden"),document.querySelector("#pay-now > span").classList.add("hidden"),this.errors.textContent="",this.errors.textContent=e.error.message,this.errors.hidden=!1}))}))})),this.key=t,this.errors=document.getElementById("errors")}(document.querySelector('meta[name="stripe-publishable-key"]').content).setupStripe().handle()},7:function(e,t,n){e.exports=n("+keB")}}); | ||||
| @ -8,7 +8,7 @@ | ||||
|     "/js/clients/payments/card-js.min.js": "/js/clients/payments/card-js.min.js?id=5469146cd629ea1b5c20", | ||||
|     "/js/clients/payments/checkout.com.js": "/js/clients/payments/checkout.com.js?id=4d5d992da65a0c422291", | ||||
|     "/js/clients/payments/stripe-ach.js": "/js/clients/payments/stripe-ach.js?id=c4012ad90f17d60432ad", | ||||
|     "/js/clients/payments/stripe-alipay.js": "/js/clients/payments/stripe-alipay.js?id=37404fa506870a7451a4", | ||||
|     "/js/clients/payments/stripe-alipay.js": "/js/clients/payments/stripe-alipay.js?id=6dbe9316b98deea55421", | ||||
|     "/js/clients/payments/stripe-credit-card.js": "/js/clients/payments/stripe-credit-card.js?id=f4659d26a26d2f408397", | ||||
|     "/js/clients/payments/stripe-sofort.js": "/js/clients/payments/stripe-sofort.js?id=7f5b13e34c75e63c015e", | ||||
|     "/js/clients/quotes/action-selectors.js": "/js/clients/quotes/action-selectors.js?id=16dfb55f9387a3b6e752", | ||||
|  | ||||
							
								
								
									
										12
									
								
								resources/js/clients/payments/stripe-alipay.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								resources/js/clients/payments/stripe-alipay.js
									
									
									
									
										vendored
									
									
								
							| @ -32,18 +32,18 @@ class ProcessAlipay { | ||||
|         }; | ||||
| 
 | ||||
|         document.getElementById('pay-now').addEventListener('click', (e) => { | ||||
|             document.getElementById('pay-now-button').disabled = true; | ||||
|             document.querySelector('#pay-now-button > svg').classList.add('hidden'); | ||||
|             document.querySelector('#pay-now-button > span').classList.remove('hidden'); | ||||
|             document.getElementById('pay-now').disabled = true; | ||||
|             document.querySelector('#pay-now > svg').classList.add('hidden'); | ||||
|             document.querySelector('#pay-now > span').classList.remove('hidden'); | ||||
| 
 | ||||
|             this.stripe.createSource(data).then(function(result) { | ||||
|                 if (result.hasOwnProperty('source')) { | ||||
|                     return (window.location = result.source.redirect.url); | ||||
|                 } | ||||
| 
 | ||||
|                 document.getElementById('pay-now-button').disabled = false; | ||||
|                 document.querySelector('#pay-now-button > svg').classList.remove('hidden'); | ||||
|                 document.querySelector('#pay-now-button > span').classList.add('hidden'); | ||||
|                 document.getElementById('pay-now').disabled = false; | ||||
|                 document.querySelector('#pay-now > svg').classList.remove('hidden'); | ||||
|                 document.querySelector('#pay-now > span').classList.add('hidden'); | ||||
| 
 | ||||
|                 this.errors.textContent = ''; | ||||
|                 this.errors.textContent = result.error.message; | ||||
|  | ||||
| @ -3294,4 +3294,6 @@ return [ | ||||
|     'payment_method_saving_failed' => 'Payment method can\'t be saved for future use.', | ||||
|      | ||||
|     'pay_with' => 'Pay with', | ||||
| 
 | ||||
|     'n/a' => 'N/A', | ||||
| ]; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user