WooCommerce Stripe Payment Gateway - Version 4.3.1

Version Description

2019-11-12 = * Fix - Overwrite the previous Apple Pay verification file if it has changed. * Fix - Avoid re-mounting card elements if they are already mounted in the DOM. * Fix - Compatibility with WooCommerce Deposits by retrieving order statuses in a different way. * Fix - Duplicate payment notifications for subscriptions. * Fix - Use the same customer after a new credit card has been entered. * Fix - Google Pay buttons on subscriptions. * Add - A filter, which allows all subscriptions' payment methods to be overwritten when adding a new payment method.

Download this release

Release Info

Developer woothemes
Plugin Icon 128x128 WooCommerce Stripe Payment Gateway
Version 4.3.1
Comparing to
See all releases

Code changes from version 4.3.0 to 4.3.1

assets/js/stripe.js CHANGED
@@ -136,7 +136,12 @@ jQuery( function( $ ) {
136
  */
137
  if ( 'yes' === wc_stripe_params.is_checkout ) {
138
  $( document.body ).on( 'updated_checkout', function() {
139
- // Don't mount elements a second time.
 
 
 
 
 
140
  if ( stripe_card ) {
141
  wc_stripe_form.unmountElements();
142
  }
136
  */
137
  if ( 'yes' === wc_stripe_params.is_checkout ) {
138
  $( document.body ).on( 'updated_checkout', function() {
139
+ // Don't re-mount if already mounted in DOM.
140
+ if ( $( '#stripe-card-element' ).children().length ) {
141
+ return;
142
+ }
143
+
144
+ // Unmount prior to re-mounting.
145
  if ( stripe_card ) {
146
  wc_stripe_form.unmountElements();
147
  }
assets/js/stripe.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(c){"use strict";try{var o=Stripe(wc_stripe_params.key)}catch(e){return void console.log(e)}var t,n,i,e=Object.keys(wc_stripe_params.elements_options).length?wc_stripe_params.elements_options:{},r=Object.keys(wc_stripe_params.sepa_elements_options).length?wc_stripe_params.sepa_elements_options:{},s=o.elements(e),a=s.create("iban",r),m={getAjaxURL:function(e){return wc_stripe_params.ajaxurl.toString().replace("%%endpoint%%","wc_stripe_"+e)},unmountElements:function(){"yes"===wc_stripe_params.inline_cc_form?t.unmount("#stripe-card-element"):(t.unmount("#stripe-card-element"),n.unmount("#stripe-exp-element"),i.unmount("#stripe-cvc-element"))},mountElements:function(){if(c("#stripe-card-element").length){if("yes"===wc_stripe_params.inline_cc_form)return t.mount("#stripe-card-element");t.mount("#stripe-card-element"),n.mount("#stripe-exp-element"),i.mount("#stripe-cvc-element")}},createElements:function(){var e={base:{iconColor:"#666EE8",color:"#31325F",fontSize:"15px","::placeholder":{color:"#CFD7E0"}}},r={focus:"focused",empty:"empty",invalid:"invalid"};e=wc_stripe_params.elements_styling?wc_stripe_params.elements_styling:e,r=wc_stripe_params.elements_classes?wc_stripe_params.elements_classes:r,"yes"===wc_stripe_params.inline_cc_form?(t=s.create("card",{style:e,hidePostalCode:!0})).addEventListener("change",function(e){m.onCCFormChange(),e.error&&c(document.body).trigger("stripeError",e)}):(t=s.create("cardNumber",{style:e,classes:r}),n=s.create("cardExpiry",{style:e,classes:r}),i=s.create("cardCvc",{style:e,classes:r}),t.addEventListener("change",function(e){m.onCCFormChange(),m.updateCardBrand(e.brand),e.error&&c(document.body).trigger("stripeError",e)}),n.addEventListener("change",function(e){m.onCCFormChange(),e.error&&c(document.body).trigger("stripeError",e)}),i.addEventListener("change",function(e){m.onCCFormChange(),e.error&&c(document.body).trigger("stripeError",e)})),"yes"===wc_stripe_params.is_checkout?c(document.body).on("updated_checkout",function(){t&&m.unmountElements(),m.mountElements(),c("#stripe-iban-element").length&&a.mount("#stripe-iban-element")}):(c("form#add_payment_method").length||c("form#order_review").length)&&(m.mountElements(),c("#stripe-iban-element").length&&a.mount("#stripe-iban-element"))},updateCardBrand:function(e){var r={visa:"stripe-visa-brand",mastercard:"stripe-mastercard-brand",amex:"stripe-amex-brand",discover:"stripe-discover-brand",diners:"stripe-diners-brand",jcb:"stripe-jcb-brand",unknown:"stripe-credit-card-brand"},t=c(".stripe-card-brand"),n="stripe-credit-card-brand";e in r&&(n=r[e]),c.each(r,function(e,r){t.removeClass(r)}),t.addClass(n)},init:function(){"yes"!==wc_stripe_params.is_change_payment_page&&"yes"!==wc_stripe_params.is_pay_for_order_page||c(document.body).trigger("wc-credit-card-form-init"),c("form.woocommerce-checkout").length&&(this.form=c("form.woocommerce-checkout")),c("form.woocommerce-checkout").on("checkout_place_order_stripe checkout_place_order_stripe_bancontact checkout_place_order_stripe_sofort checkout_place_order_stripe_giropay checkout_place_order_stripe_ideal checkout_place_order_stripe_alipay checkout_place_order_stripe_sepa",this.onSubmit),c("form#order_review").length&&(this.form=c("form#order_review")),c("form#order_review, form#add_payment_method").on("submit",this.onSubmit),c("form#add_payment_method").length&&(this.form=c("form#add_payment_method")),c("form.woocommerce-checkout").on("change",this.reset),c(document).on("stripeError",this.onError).on("checkout_error",this.reset),a.on("change",this.onSepaError),m.createElements(),window.addEventListener("hashchange",m.onHashChange),m.maybeConfirmIntent()},isStripeChosen:function(){return c("#payment_method_stripe, #payment_method_stripe_bancontact, #payment_method_stripe_sofort, #payment_method_stripe_giropay, #payment_method_stripe_ideal, #payment_method_stripe_alipay, #payment_method_stripe_sepa, #payment_method_stripe_eps, #payment_method_stripe_multibanco").is(":checked")||c("#payment_method_stripe").is(":checked")&&"new"===c('input[name="wc-stripe-payment-token"]:checked').val()||c("#payment_method_stripe_sepa").is(":checked")&&"new"===c('input[name="wc-stripe-payment-token"]:checked').val()},isStripeSaveCardChosen:function(){return c("#payment_method_stripe").is(":checked")&&c('input[name="wc-stripe-payment-token"]').is(":checked")&&"new"!==c('input[name="wc-stripe-payment-token"]:checked').val()||c("#payment_method_stripe_sepa").is(":checked")&&c('input[name="wc-stripe_sepa-payment-token"]').is(":checked")&&"new"!==c('input[name="wc-stripe_sepa-payment-token"]:checked').val()},isStripeCardChosen:function(){return c("#payment_method_stripe").is(":checked")},isBancontactChosen:function(){return c("#payment_method_stripe_bancontact").is(":checked")},isGiropayChosen:function(){return c("#payment_method_stripe_giropay").is(":checked")},isIdealChosen:function(){return c("#payment_method_stripe_ideal").is(":checked")},isSofortChosen:function(){return c("#payment_method_stripe_sofort").is(":checked")},isAlipayChosen:function(){return c("#payment_method_stripe_alipay").is(":checked")},isSepaChosen:function(){return c("#payment_method_stripe_sepa").is(":checked")},isP24Chosen:function(){return c("#payment_method_stripe_p24").is(":checked")},isEpsChosen:function(){return c("#payment_method_stripe_eps").is(":checked")},isMultibancoChosen:function(){return c("#payment_method_stripe_multibanco").is(":checked")},hasSource:function(){return 0<c("input.stripe-source").length},isMobile:function(){return!!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},block:function(){m.isMobile()||m.form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){m.form&&m.form.unblock()},getSelectedPaymentElement:function(){return c('.payment_methods input[name="payment_method"]:checked')},getOwnerDetails:function(){var e=c("#billing_first_name").length?c("#billing_first_name").val():wc_stripe_params.billing_first_name,r=c("#billing_last_name").length?c("#billing_last_name").val():wc_stripe_params.billing_last_name,t={name:"",address:{},email:"",phone:""};return t.name=e,t.name=e&&r?e+" "+r:c("#stripe-payment-data").data("full-name"),t.email=c("#billing_email").val(),t.phone=c("#billing_phone").val(),(void 0===t.phone||t.phone.length<=0)&&delete t.phone,(void 0===t.email||t.email.length<=0)&&(c("#stripe-payment-data").data("email").length?t.email=c("#stripe-payment-data").data("email"):delete t.email),(void 0===t.name||t.name.length<=0)&&delete t.name,t.address.line1=c("#billing_address_1").val()||wc_stripe_params.billing_address_1,t.address.line2=c("#billing_address_2").val()||wc_stripe_params.billing_address_2,t.address.state=c("#billing_state").val()||wc_stripe_params.billing_state,t.address.city=c("#billing_city").val()||wc_stripe_params.billing_city,t.address.postal_code=c("#billing_postcode").val()||wc_stripe_params.billing_postcode,t.address.country=c("#billing_country").val()||wc_stripe_params.billing_country,{owner:t}},createSource:function(){var e=m.getOwnerDetails();return m.isSepaChosen()?(e.currency=c("#stripe-sepa_debit-payment-data").data("currency"),e.mandate={notification_method:wc_stripe_params.sepa_mandate_notification},e.type="sepa_debit",o.createSource(a,e).then(m.sourceResponse)):o.createSource(t,e).then(m.sourceResponse)},sourceResponse:function(e){if(e.error)return c(document.body).trigger("stripeError",e);m.reset(),m.form.append(c('<input type="hidden" />').addClass("stripe-source").attr("name","stripe_source").val(e.source.id)),c("form#add_payment_method").length&&c(m.form).off("submit",m.form.onSubmit),m.form.submit()},onSubmit:function(){return!m.isStripeChosen()||(!(!m.isStripeSaveCardChosen()&&!m.hasSource())||(!!(m.isBancontactChosen()||m.isGiropayChosen()||m.isIdealChosen()||m.isAlipayChosen()||m.isSofortChosen()||m.isP24Chosen()||m.isEpsChosen()||m.isMultibancoChosen())||(m.block(),m.createSource(),!1)))},onCCFormChange:function(){m.reset()},reset:function(){c(".wc-stripe-error, .stripe-source").remove()},onSepaError:function(e){var r=m.getSelectedPaymentElement().parents("li").eq(0).find(".stripe-source-errors");if(!e.error)return c(r).html("");console.log(e.error.message),c(r).html('<ul class="woocommerce_error woocommerce-error wc-stripe-error"><li /></ul>'),c(r).find("li").text(e.error.message)},onError:function(e,r){var t,n=r.error.message,o=m.getSelectedPaymentElement().closest("li"),i=o.find(".woocommerce-SavedPaymentMethods-tokenInput");if(i.length){var s=i.filter(":checked");t=s.closest(".woocommerce-SavedPaymentMethods-new").length?c("#wc-stripe-cc-form .stripe-source-errors"):s.closest("li").find(".stripe-source-errors")}else t=o.find(".stripe-source-errors");if(m.isSepaChosen()&&"invalid_owner_name"===r.error.code&&wc_stripe_params.hasOwnProperty(r.error.code)){var a='<ul class="woocommerce-error"><li /></ul>';return a.find("li").text(wc_stripe_params[r.error.code]),m.submitError(a)}"email_invalid"===r.error.code?n=wc_stripe_params.email_invalid:"invalid_request_error"!==r.error.type&&"api_connection_error"!==r.error.type&&"api_error"!==r.error.type&&"authentication_error"!==r.error.type&&"rate_limit_error"!==r.error.type||(n=wc_stripe_params.invalid_request_error),"card_error"===r.error.type&&wc_stripe_params.hasOwnProperty(r.error.code)&&(n=wc_stripe_params[r.error.code]),"validation_error"===r.error.type&&wc_stripe_params.hasOwnProperty(r.error.code)&&(n=wc_stripe_params[r.error.code]),m.reset(),c(".woocommerce-NoticeGroup-checkout").remove(),console.log(r.error.message),c(t).html('<ul class="woocommerce_error woocommerce-error wc-stripe-error"><li /></ul>'),c(t).find("li").text(n),c(".wc-stripe-error").length&&c("html, body").animate({scrollTop:c(".wc-stripe-error").offset().top-200},200),m.unblock(),c.unblockUI()},submitError:function(e){c(".woocommerce-NoticeGroup-checkout, .woocommerce-error, .woocommerce-message").remove(),m.form.prepend('<div class="woocommerce-NoticeGroup woocommerce-NoticeGroup-checkout">'+e+"</div>"),m.form.removeClass("processing").unblock(),m.form.find(".input-text, select, input:checkbox").blur();var r="";c("#add_payment_method").length&&(r=c("#add_payment_method")),c("#order_review").length&&(r=c("#order_review")),c("form.checkout").length&&(r=c("form.checkout")),r.length&&c("html, body").animate({scrollTop:r.offset().top-100},500),c(document.body).trigger("checkout_error"),m.unblock()},onHashChange:function(){var e=window.location.hash.match(/^#?confirm-(pi|si)-([^:]+):(.+)$/);if(e&&!(e.length<4)){var r=e[1],t=e[2],n=decodeURIComponent(e[3]);window.location.hash="",m.openIntentModal(t,n,!1,"si"===r)}},maybeConfirmIntent:function(){if(c("#stripe-intent-id").length&&c("#stripe-intent-return").length){var e=c("#stripe-intent-id").val(),r=c("#stripe-intent-return").val();m.openIntentModal(e,r,!0,!1)}},openIntentModal:function(e,t,r,n){o[n?"handleCardSetup":"handleCardPayment"](e).then(function(e){if(e.error)throw e.error;var r=e[n?"setupIntent":"paymentIntent"];"requires_capture"!==r.status&&"succeeded"!==r.status||(window.location=t)}).catch(function(e){if(r)return window.location=t;c(document.body).trigger("stripeError",{error:e}),m.form&&m.form.removeClass("processing"),c.get(t+"&is_ajax")})}};m.init()});
1
+ jQuery(function(c){"use strict";try{var o=Stripe(wc_stripe_params.key)}catch(e){return void console.log(e)}var t,n,i,e=Object.keys(wc_stripe_params.elements_options).length?wc_stripe_params.elements_options:{},r=Object.keys(wc_stripe_params.sepa_elements_options).length?wc_stripe_params.sepa_elements_options:{},s=o.elements(e),a=s.create("iban",r),m={getAjaxURL:function(e){return wc_stripe_params.ajaxurl.toString().replace("%%endpoint%%","wc_stripe_"+e)},unmountElements:function(){"yes"===wc_stripe_params.inline_cc_form?t.unmount("#stripe-card-element"):(t.unmount("#stripe-card-element"),n.unmount("#stripe-exp-element"),i.unmount("#stripe-cvc-element"))},mountElements:function(){if(c("#stripe-card-element").length){if("yes"===wc_stripe_params.inline_cc_form)return t.mount("#stripe-card-element");t.mount("#stripe-card-element"),n.mount("#stripe-exp-element"),i.mount("#stripe-cvc-element")}},createElements:function(){var e={base:{iconColor:"#666EE8",color:"#31325F",fontSize:"15px","::placeholder":{color:"#CFD7E0"}}},r={focus:"focused",empty:"empty",invalid:"invalid"};e=wc_stripe_params.elements_styling?wc_stripe_params.elements_styling:e,r=wc_stripe_params.elements_classes?wc_stripe_params.elements_classes:r,"yes"===wc_stripe_params.inline_cc_form?(t=s.create("card",{style:e,hidePostalCode:!0})).addEventListener("change",function(e){m.onCCFormChange(),e.error&&c(document.body).trigger("stripeError",e)}):(t=s.create("cardNumber",{style:e,classes:r}),n=s.create("cardExpiry",{style:e,classes:r}),i=s.create("cardCvc",{style:e,classes:r}),t.addEventListener("change",function(e){m.onCCFormChange(),m.updateCardBrand(e.brand),e.error&&c(document.body).trigger("stripeError",e)}),n.addEventListener("change",function(e){m.onCCFormChange(),e.error&&c(document.body).trigger("stripeError",e)}),i.addEventListener("change",function(e){m.onCCFormChange(),e.error&&c(document.body).trigger("stripeError",e)})),"yes"===wc_stripe_params.is_checkout?c(document.body).on("updated_checkout",function(){c("#stripe-card-element").children().length||(t&&m.unmountElements(),m.mountElements(),c("#stripe-iban-element").length&&a.mount("#stripe-iban-element"))}):(c("form#add_payment_method").length||c("form#order_review").length)&&(m.mountElements(),c("#stripe-iban-element").length&&a.mount("#stripe-iban-element"))},updateCardBrand:function(e){var r={visa:"stripe-visa-brand",mastercard:"stripe-mastercard-brand",amex:"stripe-amex-brand",discover:"stripe-discover-brand",diners:"stripe-diners-brand",jcb:"stripe-jcb-brand",unknown:"stripe-credit-card-brand"},t=c(".stripe-card-brand"),n="stripe-credit-card-brand";e in r&&(n=r[e]),c.each(r,function(e,r){t.removeClass(r)}),t.addClass(n)},init:function(){"yes"!==wc_stripe_params.is_change_payment_page&&"yes"!==wc_stripe_params.is_pay_for_order_page||c(document.body).trigger("wc-credit-card-form-init"),c("form.woocommerce-checkout").length&&(this.form=c("form.woocommerce-checkout")),c("form.woocommerce-checkout").on("checkout_place_order_stripe checkout_place_order_stripe_bancontact checkout_place_order_stripe_sofort checkout_place_order_stripe_giropay checkout_place_order_stripe_ideal checkout_place_order_stripe_alipay checkout_place_order_stripe_sepa",this.onSubmit),c("form#order_review").length&&(this.form=c("form#order_review")),c("form#order_review, form#add_payment_method").on("submit",this.onSubmit),c("form#add_payment_method").length&&(this.form=c("form#add_payment_method")),c("form.woocommerce-checkout").on("change",this.reset),c(document).on("stripeError",this.onError).on("checkout_error",this.reset),a.on("change",this.onSepaError),m.createElements(),window.addEventListener("hashchange",m.onHashChange),m.maybeConfirmIntent()},isStripeChosen:function(){return c("#payment_method_stripe, #payment_method_stripe_bancontact, #payment_method_stripe_sofort, #payment_method_stripe_giropay, #payment_method_stripe_ideal, #payment_method_stripe_alipay, #payment_method_stripe_sepa, #payment_method_stripe_eps, #payment_method_stripe_multibanco").is(":checked")||c("#payment_method_stripe").is(":checked")&&"new"===c('input[name="wc-stripe-payment-token"]:checked').val()||c("#payment_method_stripe_sepa").is(":checked")&&"new"===c('input[name="wc-stripe-payment-token"]:checked').val()},isStripeSaveCardChosen:function(){return c("#payment_method_stripe").is(":checked")&&c('input[name="wc-stripe-payment-token"]').is(":checked")&&"new"!==c('input[name="wc-stripe-payment-token"]:checked').val()||c("#payment_method_stripe_sepa").is(":checked")&&c('input[name="wc-stripe_sepa-payment-token"]').is(":checked")&&"new"!==c('input[name="wc-stripe_sepa-payment-token"]:checked').val()},isStripeCardChosen:function(){return c("#payment_method_stripe").is(":checked")},isBancontactChosen:function(){return c("#payment_method_stripe_bancontact").is(":checked")},isGiropayChosen:function(){return c("#payment_method_stripe_giropay").is(":checked")},isIdealChosen:function(){return c("#payment_method_stripe_ideal").is(":checked")},isSofortChosen:function(){return c("#payment_method_stripe_sofort").is(":checked")},isAlipayChosen:function(){return c("#payment_method_stripe_alipay").is(":checked")},isSepaChosen:function(){return c("#payment_method_stripe_sepa").is(":checked")},isP24Chosen:function(){return c("#payment_method_stripe_p24").is(":checked")},isEpsChosen:function(){return c("#payment_method_stripe_eps").is(":checked")},isMultibancoChosen:function(){return c("#payment_method_stripe_multibanco").is(":checked")},hasSource:function(){return 0<c("input.stripe-source").length},isMobile:function(){return!!/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},block:function(){m.isMobile()||m.form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){m.form&&m.form.unblock()},getSelectedPaymentElement:function(){return c('.payment_methods input[name="payment_method"]:checked')},getOwnerDetails:function(){var e=c("#billing_first_name").length?c("#billing_first_name").val():wc_stripe_params.billing_first_name,r=c("#billing_last_name").length?c("#billing_last_name").val():wc_stripe_params.billing_last_name,t={name:"",address:{},email:"",phone:""};return t.name=e,t.name=e&&r?e+" "+r:c("#stripe-payment-data").data("full-name"),t.email=c("#billing_email").val(),t.phone=c("#billing_phone").val(),(void 0===t.phone||t.phone.length<=0)&&delete t.phone,(void 0===t.email||t.email.length<=0)&&(c("#stripe-payment-data").data("email").length?t.email=c("#stripe-payment-data").data("email"):delete t.email),(void 0===t.name||t.name.length<=0)&&delete t.name,t.address.line1=c("#billing_address_1").val()||wc_stripe_params.billing_address_1,t.address.line2=c("#billing_address_2").val()||wc_stripe_params.billing_address_2,t.address.state=c("#billing_state").val()||wc_stripe_params.billing_state,t.address.city=c("#billing_city").val()||wc_stripe_params.billing_city,t.address.postal_code=c("#billing_postcode").val()||wc_stripe_params.billing_postcode,t.address.country=c("#billing_country").val()||wc_stripe_params.billing_country,{owner:t}},createSource:function(){var e=m.getOwnerDetails();return m.isSepaChosen()?(e.currency=c("#stripe-sepa_debit-payment-data").data("currency"),e.mandate={notification_method:wc_stripe_params.sepa_mandate_notification},e.type="sepa_debit",o.createSource(a,e).then(m.sourceResponse)):o.createSource(t,e).then(m.sourceResponse)},sourceResponse:function(e){if(e.error)return c(document.body).trigger("stripeError",e);m.reset(),m.form.append(c('<input type="hidden" />').addClass("stripe-source").attr("name","stripe_source").val(e.source.id)),c("form#add_payment_method").length&&c(m.form).off("submit",m.form.onSubmit),m.form.submit()},onSubmit:function(){return!m.isStripeChosen()||(!(!m.isStripeSaveCardChosen()&&!m.hasSource())||(!!(m.isBancontactChosen()||m.isGiropayChosen()||m.isIdealChosen()||m.isAlipayChosen()||m.isSofortChosen()||m.isP24Chosen()||m.isEpsChosen()||m.isMultibancoChosen())||(m.block(),m.createSource(),!1)))},onCCFormChange:function(){m.reset()},reset:function(){c(".wc-stripe-error, .stripe-source").remove()},onSepaError:function(e){var r=m.getSelectedPaymentElement().parents("li").eq(0).find(".stripe-source-errors");if(!e.error)return c(r).html("");console.log(e.error.message),c(r).html('<ul class="woocommerce_error woocommerce-error wc-stripe-error"><li /></ul>'),c(r).find("li").text(e.error.message)},onError:function(e,r){var t,n=r.error.message,o=m.getSelectedPaymentElement().closest("li"),i=o.find(".woocommerce-SavedPaymentMethods-tokenInput");if(i.length){var s=i.filter(":checked");t=s.closest(".woocommerce-SavedPaymentMethods-new").length?c("#wc-stripe-cc-form .stripe-source-errors"):s.closest("li").find(".stripe-source-errors")}else t=o.find(".stripe-source-errors");if(m.isSepaChosen()&&"invalid_owner_name"===r.error.code&&wc_stripe_params.hasOwnProperty(r.error.code)){var a='<ul class="woocommerce-error"><li /></ul>';return a.find("li").text(wc_stripe_params[r.error.code]),m.submitError(a)}"email_invalid"===r.error.code?n=wc_stripe_params.email_invalid:"invalid_request_error"!==r.error.type&&"api_connection_error"!==r.error.type&&"api_error"!==r.error.type&&"authentication_error"!==r.error.type&&"rate_limit_error"!==r.error.type||(n=wc_stripe_params.invalid_request_error),"card_error"===r.error.type&&wc_stripe_params.hasOwnProperty(r.error.code)&&(n=wc_stripe_params[r.error.code]),"validation_error"===r.error.type&&wc_stripe_params.hasOwnProperty(r.error.code)&&(n=wc_stripe_params[r.error.code]),m.reset(),c(".woocommerce-NoticeGroup-checkout").remove(),console.log(r.error.message),c(t).html('<ul class="woocommerce_error woocommerce-error wc-stripe-error"><li /></ul>'),c(t).find("li").text(n),c(".wc-stripe-error").length&&c("html, body").animate({scrollTop:c(".wc-stripe-error").offset().top-200},200),m.unblock(),c.unblockUI()},submitError:function(e){c(".woocommerce-NoticeGroup-checkout, .woocommerce-error, .woocommerce-message").remove(),m.form.prepend('<div class="woocommerce-NoticeGroup woocommerce-NoticeGroup-checkout">'+e+"</div>"),m.form.removeClass("processing").unblock(),m.form.find(".input-text, select, input:checkbox").blur();var r="";c("#add_payment_method").length&&(r=c("#add_payment_method")),c("#order_review").length&&(r=c("#order_review")),c("form.checkout").length&&(r=c("form.checkout")),r.length&&c("html, body").animate({scrollTop:r.offset().top-100},500),c(document.body).trigger("checkout_error"),m.unblock()},onHashChange:function(){var e=window.location.hash.match(/^#?confirm-(pi|si)-([^:]+):(.+)$/);if(e&&!(e.length<4)){var r=e[1],t=e[2],n=decodeURIComponent(e[3]);window.location.hash="",m.openIntentModal(t,n,!1,"si"===r)}},maybeConfirmIntent:function(){if(c("#stripe-intent-id").length&&c("#stripe-intent-return").length){var e=c("#stripe-intent-id").val(),r=c("#stripe-intent-return").val();m.openIntentModal(e,r,!0,!1)}},openIntentModal:function(e,t,r,n){o[n?"handleCardSetup":"handleCardPayment"](e).then(function(e){if(e.error)throw e.error;var r=e[n?"setupIntent":"paymentIntent"];"requires_capture"!==r.status&&"succeeded"!==r.status||(window.location=t)}).catch(function(e){if(r)return window.location=t;c(document.body).trigger("stripeError",{error:e}),m.form&&m.form.removeClass("processing"),c.get(t+"&is_ajax")})}};m.init()});
changelog.txt CHANGED
@@ -1,5 +1,14 @@
1
  *** Changelog ***
2
 
 
 
 
 
 
 
 
 
 
3
  = 4.3.0 2019-10-17 =
4
  * Add - For WooCommerce Subscriptions optimize the payment flow for subsequent subscription payments when authentication may be required by using the `setup_future_usage` parameter for the first subscription payment
5
  * Add - Allow customer to authenticate payment even if they are not charged right away for WooCommerce Subscriptions and Pre-Orders, for example for a WooCommerce Subscription that has a free trial
1
  *** Changelog ***
2
 
3
+ = 4.3.1 2019-11-12 =
4
+ * Fix - Overwrite the previous Apple Pay verification file if it has changed.
5
+ * Fix - Avoid re-mounting card elements if they are already mounted in the DOM.
6
+ * Fix - Compatibility with WooCommerce Deposits by retrieving order statuses in a different way.
7
+ * Fix - Duplicate payment notifications for subscriptions.
8
+ * Fix - Use the same customer after a new credit card has been entered.
9
+ * Fix - Google Pay buttons on subscriptions.
10
+ * Add - A filter, which allows all subscriptions' payment methods to be overwritten when adding a new payment method.
11
+
12
  = 4.3.0 2019-10-17 =
13
  * Add - For WooCommerce Subscriptions optimize the payment flow for subsequent subscription payments when authentication may be required by using the `setup_future_usage` parameter for the first subscription payment
14
  * Add - Allow customer to authenticate payment even if they are not charged right away for WooCommerce Subscriptions and Pre-Orders, for example for a WooCommerce Subscription that has a free trial
includes/abstracts/abstract-wc-stripe-payment-gateway.php CHANGED
@@ -576,8 +576,12 @@ abstract class WC_Stripe_Payment_Gateway extends WC_Payment_Gateway_CC {
576
  * @throws Exception When card was not added or for and invalid card.
577
  * @return object
578
  */
579
- public function prepare_source( $user_id, $force_save_source = false ) {
580
- $customer = new WC_Stripe_Customer( $user_id );
 
 
 
 
581
  $force_save_source = apply_filters( 'wc_stripe_force_save_source', $force_save_source, $customer );
582
  $source_object = '';
583
  $source_id = '';
@@ -641,6 +645,8 @@ abstract class WC_Stripe_Payment_Gateway extends WC_Payment_Gateway_CC {
641
  if ( ! $customer_id ) {
642
  $customer->set_id( $customer->create_customer() );
643
  $customer_id = $customer->get_id();
 
 
644
  }
645
 
646
  if ( empty( $source_object ) && ! $is_token ) {
@@ -1204,18 +1210,18 @@ abstract class WC_Stripe_Payment_Gateway extends WC_Payment_Gateway_CC {
1204
  * @param stdClass $intent The intent that is being processed.
1205
  * @return bool A flag that indicates whether the order is already locked.
1206
  */
1207
- public function lock_order_payment( $order, $intent ) {
1208
  $order_id = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $order->id : $order->get_id();
1209
  $transient_name = 'wc_stripe_processing_intent_' . $order_id;
1210
  $processing = get_transient( $transient_name );
1211
 
1212
  // Block the process if the same intent is already being handled.
1213
- if ( $processing === $intent->id ) {
1214
  return true;
1215
  }
1216
 
1217
  // Save the new intent as a transient, eventually overwriting another one.
1218
- set_transient( $transient_name, $intent->id, 5 * MINUTE_IN_SECONDS );
1219
 
1220
  return false;
1221
  }
576
  * @throws Exception When card was not added or for and invalid card.
577
  * @return object
578
  */
579
+ public function prepare_source( $user_id, $force_save_source = false, $existing_customer_id = null ) {
580
+ $customer = new WC_Stripe_Customer( $user_id );
581
+ if ( ! empty( $existing_customer_id ) ) {
582
+ $customer->set_id( $existing_customer_id );
583
+ }
584
+
585
  $force_save_source = apply_filters( 'wc_stripe_force_save_source', $force_save_source, $customer );
586
  $source_object = '';
587
  $source_id = '';
645
  if ( ! $customer_id ) {
646
  $customer->set_id( $customer->create_customer() );
647
  $customer_id = $customer->get_id();
648
+ } else {
649
+ $customer->update_customer();
650
  }
651
 
652
  if ( empty( $source_object ) && ! $is_token ) {
1210
  * @param stdClass $intent The intent that is being processed.
1211
  * @return bool A flag that indicates whether the order is already locked.
1212
  */
1213
+ public function lock_order_payment( $order, $intent = null ) {
1214
  $order_id = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $order->id : $order->get_id();
1215
  $transient_name = 'wc_stripe_processing_intent_' . $order_id;
1216
  $processing = get_transient( $transient_name );
1217
 
1218
  // Block the process if the same intent is already being handled.
1219
+ if ( "-1" === $processing || ( isset( $intent->id ) && $processing === $intent->id ) ) {
1220
  return true;
1221
  }
1222
 
1223
  // Save the new intent as a transient, eventually overwriting another one.
1224
+ set_transient( $transient_name, empty( $intent ) ? '-1' : $intent->id, 5 * MINUTE_IN_SECONDS );
1225
 
1226
  return false;
1227
  }
includes/class-wc-gateway-stripe.php CHANGED
@@ -578,7 +578,18 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
578
  return $this->pre_orders->process_pre_order( $order_id );
579
  }
580
 
581
- $prepared_source = $this->prepare_source( get_current_user_id(), $force_save_source );
 
 
 
 
 
 
 
 
 
 
 
582
 
583
  $this->maybe_disallow_prepaid_card( $prepared_source );
584
  $this->check_source( $prepared_source );
@@ -593,11 +604,6 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
593
 
594
  WC_Stripe_Logger::log( "Info: Begin processing payment for order $order_id for the amount of {$order->get_total()}" );
595
 
596
- $intent = $this->get_intent_from_order( $order );
597
- if ( isset( $intent->object ) && 'setup_intent' === $intent->object ) {
598
- $intent = false; // This function can only deal with *payment* intents
599
- }
600
-
601
  if ( $intent ) {
602
  $intent = $this->update_existing_intent( $intent, $order, $prepared_source );
603
  } else {
@@ -1018,7 +1024,7 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
1018
  clean_post_cache( $order->get_id() );
1019
  $order = wc_get_order( $order->get_id() );
1020
 
1021
- if ( 'pending' !== $order->get_status() && 'failed' !== $order->get_status() ) {
1022
  // If payment has already been completed, this function is redundant.
1023
  return;
1024
  }
@@ -1054,7 +1060,7 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
1054
  */
1055
  public function failed_sca_auth( $order, $intent ) {
1056
  // If the order has already failed, do not repeat the same message.
1057
- if ( 'failed' === $order->get_status() ) {
1058
  return;
1059
  }
1060
 
578
  return $this->pre_orders->process_pre_order( $order_id );
579
  }
580
 
581
+ // Check whether there is an existing intent.
582
+ $intent = $this->get_intent_from_order( $order );
583
+ if ( isset( $intent->object ) && 'setup_intent' === $intent->object ) {
584
+ $intent = false; // This function can only deal with *payment* intents
585
+ }
586
+
587
+ $stripe_customer_id = null;
588
+ if ( $intent && ! empty( $intent->customer ) ) {
589
+ $stripe_customer_id = $intent->customer;
590
+ }
591
+
592
+ $prepared_source = $this->prepare_source( get_current_user_id(), $force_save_source, $stripe_customer_id );
593
 
594
  $this->maybe_disallow_prepaid_card( $prepared_source );
595
  $this->check_source( $prepared_source );
604
 
605
  WC_Stripe_Logger::log( "Info: Begin processing payment for order $order_id for the amount of {$order->get_total()}" );
606
 
 
 
 
 
 
607
  if ( $intent ) {
608
  $intent = $this->update_existing_intent( $intent, $order, $prepared_source );
609
  } else {
1024
  clean_post_cache( $order->get_id() );
1025
  $order = wc_get_order( $order->get_id() );
1026
 
1027
+ if ( ! $order->has_status( array( 'pending', 'failed' ) ) ) {
1028
  // If payment has already been completed, this function is redundant.
1029
  return;
1030
  }
1060
  */
1061
  public function failed_sca_auth( $order, $intent ) {
1062
  // If the order has already failed, do not repeat the same message.
1063
+ if ( $order->has_status( 'failed' ) ) {
1064
  return;
1065
  }
1066
 
includes/class-wc-stripe-api.php CHANGED
@@ -96,8 +96,10 @@ class WC_Stripe_API {
96
  * @version 4.0.6
97
  * @param array $request
98
  * @param string $api
 
99
  * @param bool $with_headers To get the response with headers.
100
- * @return array|WP_Error
 
101
  */
102
  public static function request( $request, $api = 'charges', $method = 'POST', $with_headers = false ) {
103
  WC_Stripe_Logger::log( "{$api} request: " . print_r( $request, true ) );
96
  * @version 4.0.6
97
  * @param array $request
98
  * @param string $api
99
+ * @param string $method
100
  * @param bool $with_headers To get the response with headers.
101
+ * @return stdClass|array
102
+ * @throws WC_Stripe_Exception
103
  */
104
  public static function request( $request, $api = 'charges', $method = 'POST', $with_headers = false ) {
105
  WC_Stripe_Logger::log( "{$api} request: " . print_r( $request, true ) );
includes/class-wc-stripe-apple-pay-registration.php CHANGED
@@ -60,6 +60,8 @@ class WC_Stripe_Apple_Pay_Registration {
60
  public $apple_pay_verify_notice;
61
 
62
  public function __construct() {
 
 
63
  $this->stripe_settings = get_option( 'woocommerce_stripe_settings', array() );
64
  $this->stripe_enabled = $this->get_option( 'enabled' );
65
  $this->payment_request = 'yes' === $this->get_option( 'payment_request', 'yes' );
@@ -162,34 +164,56 @@ class WC_Stripe_Apple_Pay_Registration {
162
  }
163
 
164
  /**
165
- * Processes the Apple Pay domain verification.
166
  *
167
- * @since 3.1.0
168
- * @version 3.1.0
 
 
 
169
  */
170
- public function process_apple_pay_verification() {
171
- try {
172
  $path = untrailingslashit( $_SERVER['DOCUMENT_ROOT'] );
173
  $dir = '.well-known';
174
  $file = 'apple-developer-merchantid-domain-association';
175
  $fullpath = $path . '/' . $dir . '/' . $file;
176
 
177
- if ( $this->apple_pay_domain_set && file_exists( $fullpath ) ) {
178
- return;
 
 
179
  }
180
 
181
  if ( ! file_exists( $path . '/' . $dir ) ) {
182
  if ( ! @mkdir( $path . '/' . $dir, 0755 ) ) { // @codingStandardsIgnoreLine
183
- throw new Exception( __( 'Unable to create domain association folder to domain root.', 'woocommerce-gateway-stripe' ) );
 
184
  }
185
  }
186
 
187
- if ( ! file_exists( $fullpath ) ) {
188
- if ( ! @copy( WC_STRIPE_PLUGIN_PATH . '/' . $file, $fullpath ) ) { // @codingStandardsIgnoreLine
189
- throw new Exception( __( 'Unable to copy domain association file to domain root.', 'woocommerce-gateway-stripe' ) );
190
- }
191
  }
192
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
193
  // At this point then the domain association folder and file should be available.
194
  // Proceed to verify/and or verify again.
195
  $this->register_apple_pay_domain( $this->secret_key );
60
  public $apple_pay_verify_notice;
61
 
62
  public function __construct() {
63
+ add_action( 'woocommerce_stripe_updated', array( $this, 'update_verification_file' ) );
64
+
65
  $this->stripe_settings = get_option( 'woocommerce_stripe_settings', array() );
66
  $this->stripe_enabled = $this->get_option( 'enabled' );
67
  $this->payment_request = 'yes' === $this->get_option( 'payment_request', 'yes' );
164
  }
165
 
166
  /**
167
+ * Updates the Apple Pay domain verification file.
168
  *
169
+ * @param bool $force True to create the file if it didn't exist, false for just updating the file if needed.
170
+ *
171
+ * @version 4.3.0
172
+ * @since 4.3.0
173
+ * @return bool True on success, false on failure.
174
  */
175
+ public function update_verification_file( $force = false ) {
 
176
  $path = untrailingslashit( $_SERVER['DOCUMENT_ROOT'] );
177
  $dir = '.well-known';
178
  $file = 'apple-developer-merchantid-domain-association';
179
  $fullpath = $path . '/' . $dir . '/' . $file;
180
 
181
+ $existing_contents = @file_get_contents( $fullpath );
182
+ $new_contents = @file_get_contents( WC_STRIPE_PLUGIN_PATH . '/' . $file );
183
+ if ( ( ! $existing_contents && ! $force ) || $existing_contents === $new_contents ) {
184
+ return true;
185
  }
186
 
187
  if ( ! file_exists( $path . '/' . $dir ) ) {
188
  if ( ! @mkdir( $path . '/' . $dir, 0755 ) ) { // @codingStandardsIgnoreLine
189
+ WC_Stripe_Logger::log( 'Error: ' . __( 'Unable to create domain association folder to domain root.', 'woocommerce-gateway-stripe' ) );
190
+ return false;
191
  }
192
  }
193
 
194
+ if ( ! @copy( WC_STRIPE_PLUGIN_PATH . '/' . $file, $fullpath ) ) { // @codingStandardsIgnoreLine
195
+ WC_Stripe_Logger::log( 'Error: ' . __( 'Unable to copy domain association file to domain root.', 'woocommerce-gateway-stripe' ) );
196
+ return false;
 
197
  }
198
 
199
+ WC_Stripe_Logger::log( 'Domain association file updated.' );
200
+ return true;
201
+ }
202
+
203
+ /**
204
+ * Processes the Apple Pay domain verification.
205
+ *
206
+ * @since 3.1.0
207
+ * @version 3.1.0
208
+ */
209
+ public function process_apple_pay_verification() {
210
+ if ( ! $this->update_verification_file( true ) ) {
211
+ $this->stripe_settings['apple_pay_domain_set'] = 'no';
212
+ update_option( 'woocommerce_stripe_settings', $this->stripe_settings );
213
+ return;
214
+ }
215
+
216
+ try {
217
  // At this point then the domain association folder and file should be available.
218
  // Proceed to verify/and or verify again.
219
  $this->register_apple_pay_domain( $this->secret_key );
includes/class-wc-stripe-customer.php CHANGED
@@ -94,11 +94,12 @@ class WC_Stripe_Customer {
94
  }
95
 
96
  /**
97
- * Create a customer via API.
98
- * @param array $args
99
- * @return WP_Error|int
 
100
  */
101
- public function create_customer( $args = array() ) {
102
  $billing_email = isset( $_POST['billing_email'] ) ? filter_var( $_POST['billing_email'], FILTER_SANITIZE_EMAIL ) : '';
103
  $user = $this->get_user();
104
 
@@ -136,11 +137,19 @@ class WC_Stripe_Customer {
136
  );
137
  }
138
 
139
- $metadata = array();
140
-
141
  $defaults['metadata'] = apply_filters( 'wc_stripe_customer_metadata', $metadata, $user );
142
 
143
- $args = wp_parse_args( $args, $defaults );
 
 
 
 
 
 
 
 
 
144
  $response = WC_Stripe_API::request( apply_filters( 'wc_stripe_create_customer_args', $args ), 'customers' );
145
 
146
  if ( ! empty( $response->error ) ) {
@@ -160,6 +169,30 @@ class WC_Stripe_Customer {
160
  return $response->id;
161
  }
162
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
163
  /**
164
  * Checks to see if error is of invalid request
165
  * error and it is no such customer.
94
  }
95
 
96
  /**
97
+ * Generates the customer request, used for both creating and updating customers.
98
+ *
99
+ * @param array $args Additional arguments (optional).
100
+ * @return array
101
  */
102
+ protected function generate_customer_request( $args = array() ) {
103
  $billing_email = isset( $_POST['billing_email'] ) ? filter_var( $_POST['billing_email'], FILTER_SANITIZE_EMAIL ) : '';
104
  $user = $this->get_user();
105
 
137
  );
138
  }
139
 
140
+ $metadata = array();
 
141
  $defaults['metadata'] = apply_filters( 'wc_stripe_customer_metadata', $metadata, $user );
142
 
143
+ return wp_parse_args( $args, $defaults );
144
+ }
145
+
146
+ /**
147
+ * Create a customer via API.
148
+ * @param array $args
149
+ * @return WP_Error|int
150
+ */
151
+ public function create_customer( $args = array() ) {
152
+ $args = $this->generate_customer_request( $args );
153
  $response = WC_Stripe_API::request( apply_filters( 'wc_stripe_create_customer_args', $args ), 'customers' );
154
 
155
  if ( ! empty( $response->error ) ) {
169
  return $response->id;
170
  }
171
 
172
+ /**
173
+ * Updates the Stripe customer through the API.
174
+ *
175
+ * @param array $args Additional arguments for the request (optional).
176
+ */
177
+ public function update_customer( $args = array() ) {
178
+ if ( empty( $this->id ) ) {
179
+ throw new WC_Stripe_Exception( 'id_required_to_update_user', __( 'Attempting to update a Stripe customer without a customer ID.', 'woocommerce-gateway-stripe' ) );
180
+ }
181
+
182
+ $args = $this->generate_customer_request( $args );
183
+ $args = apply_filters( 'wc_stripe_update_customer_args', $args );
184
+ $response = WC_Stripe_API::request( $args, 'customers/' . $this->id );
185
+
186
+ if ( ! empty( $response->error ) ) {
187
+ throw new WC_Stripe_Exception( print_r( $response, true ), $response->error->message );
188
+ }
189
+
190
+ $this->clear_cache();
191
+ $this->set_customer_data( $response );
192
+
193
+ do_action( 'woocommerce_stripe_update_customer', $args, $response );
194
+ }
195
+
196
  /**
197
  * Checks to see if error is of invalid request
198
  * error and it is no such customer.
includes/class-wc-stripe-order-handler.php CHANGED
@@ -69,7 +69,7 @@ class WC_Stripe_Order_Handler extends WC_Stripe_Payment_Gateway {
69
  return;
70
  }
71
 
72
- if ( 'processing' === $order->get_status() || 'completed' === $order->get_status() || 'on-hold' === $order->get_status() ) {
73
  return;
74
  }
75
 
69
  return;
70
  }
71
 
72
+ if ( $order->has_status( array( 'processing', 'completed', 'on-hold' ) ) ) {
73
  return;
74
  }
75
 
includes/class-wc-stripe-webhook-handler.php CHANGED
@@ -172,11 +172,11 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
172
  $is_pending_receiver = ( 'receiver' === $notification->data->object->flow );
173
 
174
  try {
175
- if ( 'processing' === $order->get_status() || 'completed' === $order->get_status() ) {
176
  return;
177
  }
178
 
179
- if ( 'on-hold' === $order->get_status() && ! $is_pending_receiver ) {
180
  return;
181
  }
182
 
@@ -382,7 +382,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
382
 
383
  $order_id = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $order->id : $order->get_id();
384
 
385
- if ( 'on-hold' !== $order->get_status() ) {
386
  return;
387
  }
388
 
@@ -421,7 +421,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
421
  $order_id = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $order->id : $order->get_id();
422
 
423
  // If order status is already in failed status don't continue.
424
- if ( 'failed' === $order->get_status() ) {
425
  return;
426
  }
427
 
@@ -457,7 +457,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
457
  return;
458
  }
459
 
460
- if ( 'cancelled' !== $order->get_status() ) {
461
  $order->update_status( 'cancelled', __( 'This payment has cancelled.', 'woocommerce-gateway-stripe' ) );
462
  }
463
 
@@ -587,7 +587,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
587
  /* translators: 1) The reason type. */
588
  $message = sprintf( __( 'The opened review for this order is now closed. Reason: (%s)', 'woocommerce-gateway-stripe' ), $notification->data->object->reason );
589
 
590
- if ( 'on-hold' === $order->get_status() ) {
591
  if ( apply_filters( 'wc_stripe_webhook_review_change_order_status', true, $order, $notification ) ) {
592
  $order->update_status( 'processing', $message );
593
  } else {
@@ -660,7 +660,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
660
  return;
661
  }
662
 
663
- if ( 'pending' !== $order->get_status() && 'failed' !== $order->get_status() ) {
664
  return;
665
  }
666
 
@@ -701,7 +701,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
701
  return;
702
  }
703
 
704
- if ( 'pending' !== $order->get_status() && 'failed' !== $order->get_status() ) {
705
  return;
706
  }
707
 
172
  $is_pending_receiver = ( 'receiver' === $notification->data->object->flow );
173
 
174
  try {
175
+ if ( $order->has_status( array( 'processing', 'completed' ) ) ) {
176
  return;
177
  }
178
 
179
+ if ( $order->has_status( 'on-hold' ) && ! $is_pending_receiver ) {
180
  return;
181
  }
182
 
382
 
383
  $order_id = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $order->id : $order->get_id();
384
 
385
+ if ( ! $order->has_status( 'on-hold' ) ) {
386
  return;
387
  }
388
 
421
  $order_id = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $order->id : $order->get_id();
422
 
423
  // If order status is already in failed status don't continue.
424
+ if ( $order->has_status( 'failed' ) ) {
425
  return;
426
  }
427
 
457
  return;
458
  }
459
 
460
+ if ( ! $order->has_status( 'cancelled' ) ) {
461
  $order->update_status( 'cancelled', __( 'This payment has cancelled.', 'woocommerce-gateway-stripe' ) );
462
  }
463
 
587
  /* translators: 1) The reason type. */
588
  $message = sprintf( __( 'The opened review for this order is now closed. Reason: (%s)', 'woocommerce-gateway-stripe' ), $notification->data->object->reason );
589
 
590
+ if ( $order->has_status( 'on-hold' ) ) {
591
  if ( apply_filters( 'wc_stripe_webhook_review_change_order_status', true, $order, $notification ) ) {
592
  $order->update_status( 'processing', $message );
593
  } else {
660
  return;
661
  }
662
 
663
+ if ( ! $order->has_status( array( 'pending', 'failed' ) ) ) {
664
  return;
665
  }
666
 
701
  return;
702
  }
703
 
704
+ if ( ! $order->has_status( array( 'pending', 'failed' ) ) ) {
705
  return;
706
  }
707
 
includes/compat/class-wc-stripe-sepa-subs-compat.php CHANGED
@@ -74,18 +74,21 @@ class WC_Stripe_Sepa_Subs_Compat extends WC_Gateway_Stripe_Sepa {
74
  * @since 4.1.11
75
  */
76
  public function display_update_subs_payment_checkout() {
 
77
  if (
78
  apply_filters( 'wc_stripe_display_update_subs_payment_method_card_checkbox', true ) &&
79
- wcs_user_has_subscription( get_current_user_id(), '', 'active' ) &&
80
  is_add_payment_method_page()
81
  ) {
82
- printf(
83
- '<p class="form-row">
84
- <input id="wc-%1$s-update-subs-payment-method-card" name="wc-%1$s-update-subs-payment-method-card" type="checkbox" value="true" style="width:auto;" />
85
- <label for="wc-%1$s-update-subs-payment-method-card" style="display:inline;">%2$s</label>
86
- </p>',
87
- esc_attr( $this->id ),
88
- esc_html( apply_filters( 'wc_stripe_save_to_subs_text', __( 'Update the Payment Method used for all of my active subscriptions (optional).', 'woocommerce-gateway-stripe' ) ) )
 
 
89
  );
90
  }
91
  }
@@ -100,10 +103,11 @@ class WC_Stripe_Sepa_Subs_Compat extends WC_Gateway_Stripe_Sepa {
100
  public function handle_add_payment_method_success( $source_id, $source_object ) {
101
  if ( isset( $_POST[ 'wc-' . $this->id . '-update-subs-payment-method-card' ] ) ) {
102
  $all_subs = wcs_get_users_subscriptions();
 
103
 
104
  if ( ! empty( $all_subs ) ) {
105
  foreach ( $all_subs as $sub ) {
106
- if ( 'active' === $sub->get_status() ) {
107
  update_post_meta( $sub->get_id(), '_stripe_source_id', $source_id );
108
  update_post_meta( $sub->get_id(), '_payment_method', $this->id );
109
  update_post_meta( $sub->get_id(), '_payment_method_title', $this->method_title );
74
  * @since 4.1.11
75
  */
76
  public function display_update_subs_payment_checkout() {
77
+ $subs_statuses = apply_filters( 'wc_stripe_update_subs_payment_method_card_statuses', array( 'active' ) );
78
  if (
79
  apply_filters( 'wc_stripe_display_update_subs_payment_method_card_checkbox', true ) &&
80
+ wcs_user_has_subscription( get_current_user_id(), '', $subs_statuses ) &&
81
  is_add_payment_method_page()
82
  ) {
83
+ $label = esc_html( apply_filters( 'wc_stripe_save_to_subs_text', __( 'Update the Payment Method used for all of my active subscriptions.', 'woocommerce-gateway-stripe' ) ) );
84
+ $id = sprintf( 'wc-%1$s-update-subs-payment-method-card', $this->id );
85
+ woocommerce_form_field(
86
+ $id,
87
+ array(
88
+ 'type' => 'checkbox',
89
+ 'label' => $label,
90
+ 'default' => apply_filters( 'wc_stripe_save_to_subs_checked', false ),
91
+ )
92
  );
93
  }
94
  }
103
  public function handle_add_payment_method_success( $source_id, $source_object ) {
104
  if ( isset( $_POST[ 'wc-' . $this->id . '-update-subs-payment-method-card' ] ) ) {
105
  $all_subs = wcs_get_users_subscriptions();
106
+ $subs_statuses = apply_filters( 'wc_stripe_update_subs_payment_method_card_statuses', array( 'active' ) );
107
 
108
  if ( ! empty( $all_subs ) ) {
109
  foreach ( $all_subs as $sub ) {
110
+ if ( $sub->has_status( $subs_statuses ) ) {
111
  update_post_meta( $sub->get_id(), '_stripe_source_id', $source_id );
112
  update_post_meta( $sub->get_id(), '_payment_method', $this->id );
113
  update_post_meta( $sub->get_id(), '_payment_method_title', $this->method_title );
includes/compat/class-wc-stripe-subs-compat.php CHANGED
@@ -83,18 +83,21 @@ class WC_Stripe_Subs_Compat extends WC_Gateway_Stripe {
83
  * @since 4.1.11
84
  */
85
  public function display_update_subs_payment_checkout() {
 
86
  if (
87
  apply_filters( 'wc_stripe_display_update_subs_payment_method_card_checkbox', true ) &&
88
- wcs_user_has_subscription( get_current_user_id(), '', 'active' ) &&
89
  is_add_payment_method_page()
90
  ) {
91
- printf(
92
- '<p class="form-row">
93
- <input id="wc-%1$s-update-subs-payment-method-card" name="wc-%1$s-update-subs-payment-method-card" type="checkbox" value="true" style="width:auto;" />
94
- <label for="wc-%1$s-update-subs-payment-method-card" style="display:inline;">%2$s</label>
95
- </p>',
96
- esc_attr( $this->id ),
97
- esc_html( apply_filters( 'wc_stripe_save_to_subs_text', __( 'Update the Payment Method used for all of my active subscriptions (optional).', 'woocommerce-gateway-stripe' ) ) )
 
 
98
  );
99
  }
100
  }
@@ -109,10 +112,11 @@ class WC_Stripe_Subs_Compat extends WC_Gateway_Stripe {
109
  public function handle_add_payment_method_success( $source_id, $source_object ) {
110
  if ( isset( $_POST[ 'wc-' . $this->id . '-update-subs-payment-method-card' ] ) ) {
111
  $all_subs = wcs_get_users_subscriptions();
 
112
 
113
  if ( ! empty( $all_subs ) ) {
114
  foreach ( $all_subs as $sub ) {
115
- if ( 'active' === $sub->get_status() ) {
116
  update_post_meta( $sub->get_id(), '_stripe_source_id', $source_id );
117
  update_post_meta( $sub->get_id(), '_payment_method', $this->id );
118
  update_post_meta( $sub->get_id(), '_payment_method_title', $this->method_title );
@@ -247,8 +251,9 @@ class WC_Stripe_Subs_Compat extends WC_Gateway_Stripe {
247
  $prepared_source->source = '';
248
  }
249
 
250
- $response = $this->create_and_confirm_intent_for_off_session( $renewal_order, $prepared_source, $amount );
251
 
 
252
  $is_authentication_required = $this->is_authentication_required_for_payment( $response );
253
 
254
  // It's only a failed payment if it's an error and it's not of the type 'authentication_required'.
@@ -310,6 +315,8 @@ class WC_Stripe_Subs_Compat extends WC_Gateway_Stripe {
310
 
311
  $this->process_response( end( $response->charges->data ), $renewal_order );
312
  }
 
 
313
  } catch ( WC_Stripe_Exception $e ) {
314
  WC_Stripe_Logger::log( 'Error: ' . $e->getMessage() );
315
 
83
  * @since 4.1.11
84
  */
85
  public function display_update_subs_payment_checkout() {
86
+ $subs_statuses = apply_filters( 'wc_stripe_update_subs_payment_method_card_statuses', array( 'active' ) );
87
  if (
88
  apply_filters( 'wc_stripe_display_update_subs_payment_method_card_checkbox', true ) &&
89
+ wcs_user_has_subscription( get_current_user_id(), '', $subs_statuses ) &&
90
  is_add_payment_method_page()
91
  ) {
92
+ $label = esc_html( apply_filters( 'wc_stripe_save_to_subs_text', __( 'Update the Payment Method used for all of my active subscriptions.', 'woocommerce-gateway-stripe' ) ) );
93
+ $id = sprintf( 'wc-%1$s-update-subs-payment-method-card', $this->id );
94
+ woocommerce_form_field(
95
+ $id,
96
+ array(
97
+ 'type' => 'checkbox',
98
+ 'label' => $label,
99
+ 'default' => apply_filters( 'wc_stripe_save_to_subs_checked', false ),
100
+ )
101
  );
102
  }
103
  }
112
  public function handle_add_payment_method_success( $source_id, $source_object ) {
113
  if ( isset( $_POST[ 'wc-' . $this->id . '-update-subs-payment-method-card' ] ) ) {
114
  $all_subs = wcs_get_users_subscriptions();
115
+ $subs_statuses = apply_filters( 'wc_stripe_update_subs_payment_method_card_statuses', array( 'active' ) );
116
 
117
  if ( ! empty( $all_subs ) ) {
118
  foreach ( $all_subs as $sub ) {
119
+ if ( $sub->has_status( $subs_statuses ) ) {
120
  update_post_meta( $sub->get_id(), '_stripe_source_id', $source_id );
121
  update_post_meta( $sub->get_id(), '_payment_method', $this->id );
122
  update_post_meta( $sub->get_id(), '_payment_method_title', $this->method_title );
251
  $prepared_source->source = '';
252
  }
253
 
254
+ $this->lock_order_payment( $renewal_order );
255
 
256
+ $response = $this->create_and_confirm_intent_for_off_session( $renewal_order, $prepared_source, $amount );
257
  $is_authentication_required = $this->is_authentication_required_for_payment( $response );
258
 
259
  // It's only a failed payment if it's an error and it's not of the type 'authentication_required'.
315
 
316
  $this->process_response( end( $response->charges->data ), $renewal_order );
317
  }
318
+
319
+ $this->unlock_order_payment( $renewal_order );
320
  } catch ( WC_Stripe_Exception $e ) {
321
  WC_Stripe_Logger::log( 'Error: ' . $e->getMessage() );
322
 
includes/payment-methods/class-wc-stripe-payment-request.php CHANGED
@@ -917,14 +917,15 @@ class WC_Stripe_Payment_Request {
917
 
918
  WC()->shipping->reset_shipping();
919
 
920
- $product_id = absint( $_POST['product_id'] );
921
- $qty = ! isset( $_POST['qty'] ) ? 1 : absint( $_POST['qty'] );
922
- $product = wc_get_product( $product_id );
 
923
 
924
  // First empty the cart to prevent wrong calculation.
925
  WC()->cart->empty_cart();
926
 
927
- if ( 'variable' === ( WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $product->product_type : $product->get_type() ) && isset( $_POST['attributes'] ) ) {
928
  $attributes = array_map( 'wc_clean', $_POST['attributes'] );
929
 
930
  if ( WC_Stripe_Helper::is_wc_lt( '3.0' ) ) {
@@ -937,7 +938,7 @@ class WC_Stripe_Payment_Request {
937
  WC()->cart->add_to_cart( $product->get_id(), $qty, $variation_id, $attributes );
938
  }
939
 
940
- if ( 'simple' === ( WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $product->product_type : $product->get_type() ) ) {
941
  WC()->cart->add_to_cart( $product->get_id(), $qty );
942
  }
943
 
917
 
918
  WC()->shipping->reset_shipping();
919
 
920
+ $product_id = absint( $_POST['product_id'] );
921
+ $qty = ! isset( $_POST['qty'] ) ? 1 : absint( $_POST['qty'] );
922
+ $product = wc_get_product( $product_id );
923
+ $product_type = WC_Stripe_Helper::is_wc_lt( '3.0' ) ? $product->product_type : $product->get_type();
924
 
925
  // First empty the cart to prevent wrong calculation.
926
  WC()->cart->empty_cart();
927
 
928
+ if ( ( 'variable' === $product_type || 'variable-subscription' === $product_type ) && isset( $_POST['attributes'] ) ) {
929
  $attributes = array_map( 'wc_clean', $_POST['attributes'] );
930
 
931
  if ( WC_Stripe_Helper::is_wc_lt( '3.0' ) ) {
938
  WC()->cart->add_to_cart( $product->get_id(), $qty, $variation_id, $attributes );
939
  }
940
 
941
+ if ( 'simple' === $product_type || 'subscription' === $product_type ) {
942
  WC()->cart->add_to_cart( $product->get_id(), $qty );
943
  }
944
 
languages/woocommerce-gateway-stripe.pot CHANGED
@@ -3,8 +3,9 @@
3
  msgid ""
4
  msgstr ""
5
  "Project-Id-Version: WooCommerce Stripe Gateway 4.3.0\n"
6
- "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/stripe-git\n"
7
- "POT-Creation-Date: 2019-10-17 20:55:54+00:00\n"
 
8
  "MIME-Version: 1.0\n"
9
  "Content-Type: text/plain; charset=utf-8\n"
10
  "Content-Transfer-Encoding: 8bit\n"
@@ -74,20 +75,20 @@ msgid ""
74
  "cancel to remove the pre-authorization."
75
  msgstr ""
76
 
77
- #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:615
78
  msgid "Invalid payment method. Please input a new card number."
79
  msgstr ""
80
 
81
- #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:895
82
  #. translators: 1) dollar amount 2) transaction id 3) refund message
83
  msgid "Refunded %1$s - Refund ID: %2$s - Reason: %3$s"
84
  msgstr ""
85
 
86
- #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:895
87
  msgid "Pre-Authorization Released"
88
  msgstr ""
89
 
90
- #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:913
91
  msgid "There was a problem adding the payment method."
92
  msgstr ""
93
 
@@ -210,8 +211,8 @@ msgstr ""
210
 
211
  #: includes/admin/class-wc-stripe-privacy.php:41
212
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:463
213
- #: includes/compat/class-wc-stripe-subs-compat.php:527
214
- #: includes/compat/class-wc-stripe-subs-compat.php:542
215
  msgid "N/A"
216
  msgstr ""
217
 
@@ -828,37 +829,37 @@ msgstr ""
828
  msgid "Billing First Name and Last Name are required."
829
  msgstr ""
830
 
831
- #: includes/class-wc-gateway-stripe.php:716
832
  #. translators: error message
833
  msgid "This represents the fee Stripe collects for the transaction."
834
  msgstr ""
835
 
836
- #: includes/class-wc-gateway-stripe.php:717
837
  msgid "Stripe Fee:"
838
  msgstr ""
839
 
840
- #: includes/class-wc-gateway-stripe.php:753
841
  msgid ""
842
  "This represents the net total that will be credited to your Stripe bank "
843
  "account. This may be in the currency that is set in your Stripe account."
844
  msgstr ""
845
 
846
- #: includes/class-wc-gateway-stripe.php:754
847
  msgid "Stripe Payout:"
848
  msgstr ""
849
 
850
- #: includes/class-wc-gateway-stripe.php:801
851
  #: includes/class-wc-stripe-order-handler.php:162
852
  #: includes/class-wc-stripe-webhook-handler.php:238
853
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:263
854
- #: includes/compat/class-wc-stripe-subs-compat.php:271
855
  #: includes/payment-methods/class-wc-gateway-stripe-sepa.php:373
856
  msgid ""
857
  "Sorry, we are unable to process your payment at this time. Please retry "
858
  "later."
859
  msgstr ""
860
 
861
- #: includes/class-wc-gateway-stripe.php:854
862
  msgid ""
863
  "Almost there!\n"
864
  "\n"
@@ -866,57 +867,61 @@ msgid ""
866
  "done is for you to authorize the payment with your bank."
867
  msgstr ""
868
 
869
- #: includes/class-wc-gateway-stripe.php:1066
870
  #: includes/class-wc-stripe-webhook-handler.php:685
871
  #: includes/class-wc-stripe-webhook-handler.php:724
872
  #. translators: 1) The error message that was received from Stripe.
873
  msgid "Stripe SCA authentication failed. Reason: %s"
874
  msgstr ""
875
 
876
- #: includes/class-wc-gateway-stripe.php:1067
877
  msgid "Stripe SCA authentication failed."
878
  msgstr ""
879
 
880
- #: includes/class-wc-stripe-api.php:138 includes/class-wc-stripe-api.php:172
881
  msgid "There was a problem connecting to the Stripe API endpoint."
882
  msgstr ""
883
 
884
- #: includes/class-wc-stripe-apple-pay-registration.php:127
885
  msgid "Unable to verify domain - missing secret key."
886
  msgstr ""
887
 
888
- #: includes/class-wc-stripe-apple-pay-registration.php:151
889
- #: includes/class-wc-stripe-apple-pay-registration.php:160
890
  #. translators: error message
891
  msgid "Unable to verify domain - %s"
892
  msgstr ""
893
 
894
- #: includes/class-wc-stripe-apple-pay-registration.php:183
895
  msgid "Unable to create domain association folder to domain root."
896
  msgstr ""
897
 
898
- #: includes/class-wc-stripe-apple-pay-registration.php:189
899
  msgid "Unable to copy domain association file to domain root."
900
  msgstr ""
901
 
902
- #: includes/class-wc-stripe-apple-pay-registration.php:246
903
  #. translators: 1) HTML anchor open tag 2) HTML anchor closing tag
904
  msgid ""
905
  "Apple Pay domain verification failed. Please check the %1$slog%2$s to see "
906
  "the issue. (Logging must be enabled to see recorded logs)"
907
  msgstr ""
908
 
909
- #: includes/class-wc-stripe-customer.php:120
910
  #. translators: %1$s First name, %2$s Second name, %3$s Username.
911
  msgid "Name: %1$s %2$s, Username: %s"
912
  msgstr ""
913
 
914
- #: includes/class-wc-stripe-customer.php:131
915
  #. translators: %1$s First name, %2$s Second name.
916
  msgid "Name: %1$s %2$s, Guest"
917
  msgstr ""
918
 
919
- #: includes/class-wc-stripe-customer.php:209
 
 
 
 
920
  msgid "Unable to add payment source."
921
  msgstr ""
922
 
@@ -1150,8 +1155,8 @@ msgid "Unable to store payment details. Please try again."
1150
  msgstr ""
1151
 
1152
  #: includes/compat/class-wc-stripe-pre-orders-compat.php:121
1153
- #: includes/compat/class-wc-stripe-subs-compat.php:303
1154
- #: includes/compat/class-wc-stripe-subs-compat.php:606
1155
  msgid "Stripe charge awaiting authentication by user: %s."
1156
  msgstr ""
1157
 
@@ -1173,20 +1178,20 @@ msgid "Customer not found"
1173
  msgstr ""
1174
 
1175
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:386
1176
- #: includes/compat/class-wc-stripe-subs-compat.php:450
1177
  #. translators: error message
1178
  msgid "A \"Stripe Customer ID\" value is required."
1179
  msgstr ""
1180
 
1181
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:388
1182
- #: includes/compat/class-wc-stripe-subs-compat.php:452
1183
  msgid ""
1184
  "Invalid customer ID. A valid \"Stripe Customer ID\" must begin with "
1185
  "\"cus_\"."
1186
  msgstr ""
1187
 
1188
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:397
1189
- #: includes/compat/class-wc-stripe-subs-compat.php:461
1190
  msgid ""
1191
  "Invalid source ID. A valid source \"Stripe Source ID\" must begin with "
1192
  "\"src_\" or \"card_\"."
@@ -1197,11 +1202,11 @@ msgstr ""
1197
  msgid "Via SEPA Direct Debit ending in %1$s"
1198
  msgstr ""
1199
 
1200
- #: includes/compat/class-wc-stripe-subs-compat.php:295
1201
  msgid "This transaction requires authentication."
1202
  msgstr ""
1203
 
1204
- #: includes/compat/class-wc-stripe-subs-compat.php:542
1205
  #. translators: 1) card brand 2) last 4 digits
1206
  msgid "Via %1$s card ending in %2$s"
1207
  msgstr ""
3
  msgid ""
4
  msgstr ""
5
  "Project-Id-Version: WooCommerce Stripe Gateway 4.3.0\n"
6
+ "Report-Msgid-Bugs-To: "
7
+ "https://wordpress.org/support/plugin/woocommerce-gateway-stripe\n"
8
+ "POT-Creation-Date: 2019-11-12 11:30:47+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
75
  "cancel to remove the pre-authorization."
76
  msgstr ""
77
 
78
+ #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:619
79
  msgid "Invalid payment method. Please input a new card number."
80
  msgstr ""
81
 
82
+ #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:901
83
  #. translators: 1) dollar amount 2) transaction id 3) refund message
84
  msgid "Refunded %1$s - Refund ID: %2$s - Reason: %3$s"
85
  msgstr ""
86
 
87
+ #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:901
88
  msgid "Pre-Authorization Released"
89
  msgstr ""
90
 
91
+ #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:919
92
  msgid "There was a problem adding the payment method."
93
  msgstr ""
94
 
211
 
212
  #: includes/admin/class-wc-stripe-privacy.php:41
213
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:463
214
+ #: includes/compat/class-wc-stripe-subs-compat.php:530
215
+ #: includes/compat/class-wc-stripe-subs-compat.php:545
216
  msgid "N/A"
217
  msgstr ""
218
 
829
  msgid "Billing First Name and Last Name are required."
830
  msgstr ""
831
 
832
+ #: includes/class-wc-gateway-stripe.php:720
833
  #. translators: error message
834
  msgid "This represents the fee Stripe collects for the transaction."
835
  msgstr ""
836
 
837
+ #: includes/class-wc-gateway-stripe.php:721
838
  msgid "Stripe Fee:"
839
  msgstr ""
840
 
841
+ #: includes/class-wc-gateway-stripe.php:757
842
  msgid ""
843
  "This represents the net total that will be credited to your Stripe bank "
844
  "account. This may be in the currency that is set in your Stripe account."
845
  msgstr ""
846
 
847
+ #: includes/class-wc-gateway-stripe.php:758
848
  msgid "Stripe Payout:"
849
  msgstr ""
850
 
851
+ #: includes/class-wc-gateway-stripe.php:805
852
  #: includes/class-wc-stripe-order-handler.php:162
853
  #: includes/class-wc-stripe-webhook-handler.php:238
854
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:263
855
+ #: includes/compat/class-wc-stripe-subs-compat.php:272
856
  #: includes/payment-methods/class-wc-gateway-stripe-sepa.php:373
857
  msgid ""
858
  "Sorry, we are unable to process your payment at this time. Please retry "
859
  "later."
860
  msgstr ""
861
 
862
+ #: includes/class-wc-gateway-stripe.php:858
863
  msgid ""
864
  "Almost there!\n"
865
  "\n"
867
  "done is for you to authorize the payment with your bank."
868
  msgstr ""
869
 
870
+ #: includes/class-wc-gateway-stripe.php:1070
871
  #: includes/class-wc-stripe-webhook-handler.php:685
872
  #: includes/class-wc-stripe-webhook-handler.php:724
873
  #. translators: 1) The error message that was received from Stripe.
874
  msgid "Stripe SCA authentication failed. Reason: %s"
875
  msgstr ""
876
 
877
+ #: includes/class-wc-gateway-stripe.php:1071
878
  msgid "Stripe SCA authentication failed."
879
  msgstr ""
880
 
881
+ #: includes/class-wc-stripe-api.php:140 includes/class-wc-stripe-api.php:174
882
  msgid "There was a problem connecting to the Stripe API endpoint."
883
  msgstr ""
884
 
885
+ #: includes/class-wc-stripe-apple-pay-registration.php:129
886
  msgid "Unable to verify domain - missing secret key."
887
  msgstr ""
888
 
889
+ #: includes/class-wc-stripe-apple-pay-registration.php:153
890
+ #: includes/class-wc-stripe-apple-pay-registration.php:162
891
  #. translators: error message
892
  msgid "Unable to verify domain - %s"
893
  msgstr ""
894
 
895
+ #: includes/class-wc-stripe-apple-pay-registration.php:189
896
  msgid "Unable to create domain association folder to domain root."
897
  msgstr ""
898
 
899
+ #: includes/class-wc-stripe-apple-pay-registration.php:195
900
  msgid "Unable to copy domain association file to domain root."
901
  msgstr ""
902
 
903
+ #: includes/class-wc-stripe-apple-pay-registration.php:270
904
  #. translators: 1) HTML anchor open tag 2) HTML anchor closing tag
905
  msgid ""
906
  "Apple Pay domain verification failed. Please check the %1$slog%2$s to see "
907
  "the issue. (Logging must be enabled to see recorded logs)"
908
  msgstr ""
909
 
910
+ #: includes/class-wc-stripe-customer.php:121
911
  #. translators: %1$s First name, %2$s Second name, %3$s Username.
912
  msgid "Name: %1$s %2$s, Username: %s"
913
  msgstr ""
914
 
915
+ #: includes/class-wc-stripe-customer.php:132
916
  #. translators: %1$s First name, %2$s Second name.
917
  msgid "Name: %1$s %2$s, Guest"
918
  msgstr ""
919
 
920
+ #: includes/class-wc-stripe-customer.php:179
921
+ msgid "Attempting to update a Stripe customer without a customer ID."
922
+ msgstr ""
923
+
924
+ #: includes/class-wc-stripe-customer.php:242
925
  msgid "Unable to add payment source."
926
  msgstr ""
927
 
1155
  msgstr ""
1156
 
1157
  #: includes/compat/class-wc-stripe-pre-orders-compat.php:121
1158
+ #: includes/compat/class-wc-stripe-subs-compat.php:304
1159
+ #: includes/compat/class-wc-stripe-subs-compat.php:609
1160
  msgid "Stripe charge awaiting authentication by user: %s."
1161
  msgstr ""
1162
 
1178
  msgstr ""
1179
 
1180
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:386
1181
+ #: includes/compat/class-wc-stripe-subs-compat.php:453
1182
  #. translators: error message
1183
  msgid "A \"Stripe Customer ID\" value is required."
1184
  msgstr ""
1185
 
1186
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:388
1187
+ #: includes/compat/class-wc-stripe-subs-compat.php:455
1188
  msgid ""
1189
  "Invalid customer ID. A valid \"Stripe Customer ID\" must begin with "
1190
  "\"cus_\"."
1191
  msgstr ""
1192
 
1193
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:397
1194
+ #: includes/compat/class-wc-stripe-subs-compat.php:464
1195
  msgid ""
1196
  "Invalid source ID. A valid source \"Stripe Source ID\" must begin with "
1197
  "\"src_\" or \"card_\"."
1202
  msgid "Via SEPA Direct Debit ending in %1$s"
1203
  msgstr ""
1204
 
1205
+ #: includes/compat/class-wc-stripe-subs-compat.php:296
1206
  msgid "This transaction requires authentication."
1207
  msgstr ""
1208
 
1209
+ #: includes/compat/class-wc-stripe-subs-compat.php:545
1210
  #. translators: 1) card brand 2) last 4 digits
1211
  msgid "Via %1$s card ending in %2$s"
1212
  msgstr ""
readme.txt CHANGED
@@ -2,9 +2,9 @@
2
  Contributors: automattic, royho, akeda, mattyza, bor0, woothemes
3
  Tags: credit card, stripe, apple pay, payment request, google pay, sepa, sofort, bancontact, alipay, giropay, ideal, p24, woocommerce, automattic
4
  Requires at least: 4.4
5
- Tested up to: 5.2.4
6
  Requires PHP: 5.6
7
- Stable tag: 4.3.0
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
  Attributions: thorsten-stripe
@@ -113,6 +113,15 @@ If you get stuck, you can ask for help in the Plugin Forum.
113
 
114
  == Changelog ==
115
 
 
 
 
 
 
 
 
 
 
116
  = 4.3.0 2019-10-17 =
117
  * Add - For WooCommerce Subscriptions optimize the payment flow for subsequent subscription payments when authentication may be required by using the `setup_future_usage` parameter for the first subscription payment
118
  * Add - Allow customer to authenticate payment even if they are not charged right away for WooCommerce Subscriptions and Pre-Orders, for example for a WooCommerce Subscription that has a free trial
@@ -123,9 +132,6 @@ If you get stuck, you can ask for help in the Plugin Forum.
123
  * Fix - Avoid idempotency key errors for Pre-Orders
124
  * Fix - Use unique anchor for link about checkout styling changes
125
 
126
- = 4.2.5 - 2019-10-02 =
127
- * Fix - WooCommerce Subscriptions that use only the Stripe customer ID can again be renewed
128
-
129
  [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce-gateway-stripe/master/changelog.txt).
130
 
131
  == Upgrade Notice ==
2
  Contributors: automattic, royho, akeda, mattyza, bor0, woothemes
3
  Tags: credit card, stripe, apple pay, payment request, google pay, sepa, sofort, bancontact, alipay, giropay, ideal, p24, woocommerce, automattic
4
  Requires at least: 4.4
5
+ Tested up to: 5.3.0
6
  Requires PHP: 5.6
7
+ Stable tag: 4.3.1
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
  Attributions: thorsten-stripe
113
 
114
  == Changelog ==
115
 
116
+ = 4.3.1 2019-11-12 =
117
+ * Fix - Overwrite the previous Apple Pay verification file if it has changed.
118
+ * Fix - Avoid re-mounting card elements if they are already mounted in the DOM.
119
+ * Fix - Compatibility with WooCommerce Deposits by retrieving order statuses in a different way.
120
+ * Fix - Duplicate payment notifications for subscriptions.
121
+ * Fix - Use the same customer after a new credit card has been entered.
122
+ * Fix - Google Pay buttons on subscriptions.
123
+ * Add - A filter, which allows all subscriptions' payment methods to be overwritten when adding a new payment method.
124
+
125
  = 4.3.0 2019-10-17 =
126
  * Add - For WooCommerce Subscriptions optimize the payment flow for subsequent subscription payments when authentication may be required by using the `setup_future_usage` parameter for the first subscription payment
127
  * Add - Allow customer to authenticate payment even if they are not charged right away for WooCommerce Subscriptions and Pre-Orders, for example for a WooCommerce Subscription that has a free trial
132
  * Fix - Avoid idempotency key errors for Pre-Orders
133
  * Fix - Use unique anchor for link about checkout styling changes
134
 
 
 
 
135
  [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce-gateway-stripe/master/changelog.txt).
136
 
137
  == Upgrade Notice ==
woocommerce-gateway-stripe.php CHANGED
@@ -5,11 +5,11 @@
5
  * Description: Take credit card payments on your store using Stripe.
6
  * Author: WooCommerce
7
  * Author URI: https://woocommerce.com/
8
- * Version: 4.3.0
9
  * Requires at least: 4.4
10
- * Tested up to: 5.2.4
11
  * WC requires at least: 2.6
12
- * WC tested up to: 3.7.1
13
  * Text Domain: woocommerce-gateway-stripe
14
  * Domain Path: /languages
15
  *
@@ -46,7 +46,7 @@ function woocommerce_gateway_stripe_init() {
46
  /**
47
  * Required minimums and constants
48
  */
49
- define( 'WC_STRIPE_VERSION', '4.3.0' );
50
  define( 'WC_STRIPE_MIN_PHP_VER', '5.6.0' );
51
  define( 'WC_STRIPE_MIN_WC_VER', '2.6.0' );
52
  define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
5
  * Description: Take credit card payments on your store using Stripe.
6
  * Author: WooCommerce
7
  * Author URI: https://woocommerce.com/
8
+ * Version: 4.3.1
9
  * Requires at least: 4.4
10
+ * Tested up to: 5.3.0
11
  * WC requires at least: 2.6
12
+ * WC tested up to: 3.8
13
  * Text Domain: woocommerce-gateway-stripe
14
  * Domain Path: /languages
15
  *
46
  /**
47
  * Required minimums and constants
48
  */
49
+ define( 'WC_STRIPE_VERSION', '4.3.1' );
50
  define( 'WC_STRIPE_MIN_PHP_VER', '5.6.0' );
51
  define( 'WC_STRIPE_MIN_WC_VER', '2.6.0' );
52
  define( 'WC_STRIPE_MAIN_FILE', __FILE__ );