const STRIPE_PAYMENT_METHOD_NAME = 'STRIPE'; // const STRIPE_PK_KEY = 'pk_live_qh8yYnYAc9drCSt4FYH5pjot'; var createdToken = null; // Creates an Stripe end user account in MessengerSell function updateCustomerWithToken(stripeToken) { var dataToInclude = { stripeToken: stripeToken }; updateCustomer(dataToInclude).end(); } async function createPaymentIntent() { console.log('createPaymentIntent(): using ' + selectedPaymentMethod + ' payment method!'); var paymentRequest = { customerId: customerId, label: createLabelObject(), couponCode: null, standardNote: null, selectedProductOption: selectedProductOption, selectedShippingMethod: selectedShippingMethod, selectedPaymentMethod: selectedPaymentMethod, shoppingCartId: null, stripeToken: createdToken, shippingAddress: buildShippingAddress(), isChiringoCart: parent.IS_CHIRINGO_CART, }; console.log('createPaymentIntent(): paying for ' + JSON.stringify(paymentRequest, null, 2)); var paymentIntentResponse = await request.post('/beta/payment/stripe/paymentIntent') .set('X-Request-ID', correlationId) .send(paymentRequest); console.log('createPaymentIntent(): obtained payment intent ' + JSON.stringify(paymentIntentResponse, null, 2)); if (!paymentIntentResponse || !paymentIntentResponse.body || !paymentIntentResponse.body.paymentIntent || !paymentIntentResponse.body.paymentIntent.client_secret) { console.error('createPaymentIntent(): Stripe did not return any payment intent...'); return null; } console.log('createPaymentIntent(): PI_Secret ' + paymentIntentResponse.body.paymentIntent.client_secret); return { paymentIntent: paymentIntentResponse, paymentRequest: paymentRequest }; } async function confirmPaymentIntent(stripeElementsObject, paymentIntent, paymentRequest, cardElement) { var paymentIntentSecret = paymentIntent.body.paymentIntent.client_secret; var result = await stripeElementsObject.confirmCardPayment(paymentIntentSecret, { payment_method: { card: cardElement } }); if (result.error) { unsetButtonAsLoading('paybutton'); console.error('confirmPaymentIntent(): could not continue the payment intent ' + JSON.stringify(result.error, null, 2)); // TODO: Inform the customer that there was an error. var errorElement = document.getElementById('card-errors'); errorElement.textContent = result.error.message; return; } console.log('confirmPaymentIntent(): SUCCESSFULLY payment intent emitted ' + JSON.stringify(result, null, 2)); return result; } async function stripePay(params) { if (!params) return; var stripeElementsObject = params.stripeEmbedded; var paymentIntent = params.paymentIntent; var paymentRequest = params.paymentRequest; var cardElement = params.cardElement; // 1) Turn confirm payment request in synchronous var intentConfirmation = await confirmPaymentIntent(stripeElementsObject, paymentIntent, paymentRequest, cardElement); if (intentConfirmation.paymentIntent.status != 'succeeded') { showPaymentFailedAlert(null); return; } updateFunnelState(paymentRequest.label[0].label, null, FUNNEL_STATES.PAYMENT_WENT_THROUGH); // 2) Store the transaction as pending var intentConfirmationAndPaymentRequest = { paymentRequest: paymentRequest, intentConfirmation: intentConfirmation, shippingAddress: buildShippingAddress(), selectedShippingMethod: selectedShippingMethod, isChiringoCart: parent.IS_CHIRINGO_CART } console.log('stripePay(): the transaction confirmation looks like ' + JSON.stringify(intentConfirmation, null, 2)); var intentStorageResult = await request.post('/beta/payment/stripe/paymentIntent/store') .set('X-Request-ID', correlationId) .send(intentConfirmationAndPaymentRequest); console.log('stripePay(): the transaction storage result looks like ' + JSON.stringify(intentStorageResult, null, 2)); return intentStorageResult; // 3) Craft a response according to what was returned by /beta/payment/stripe/charge // return request.post('/beta/payment/stripe/charge') // .set('X-Request-ID', correlationId) // .send(paymentRequest); } $(document).ready(function() { PAYMENT_METHOD_CHARGE_FUNCTIONS[STRIPE_PAYMENT_METHOD_NAME] = stripePay; // PAYMENT_METHOD_FURTHER_ACTION_FUNCTIONS[STRIPE_PAYMENT_METHOD_NAME] = handleExternalAutorization; });