WooCommerce Stripe Payment Gateway - Version 4.8.0

Version Description

  • 2021-01-28 =
  • Fix - Filter more disallowed characters from statement descriptors.

See changelog for all versions.

Download this release

Release Info

Developer automattic
Plugin Icon 128x128 WooCommerce Stripe Payment Gateway
Version 4.8.0
Comparing to
See all releases

Code changes from version 4.7.0 to 4.8.0

assets/js/stripe-admin.js CHANGED
@@ -1,3 +1,5 @@
 
 
1
  jQuery( function( $ ) {
2
  'use strict';
3
 
@@ -122,6 +124,27 @@ jQuery( function( $ ) {
122
 
123
  $( 'form' ).find( 'input, select' ).off( 'change input', disableConnect );
124
  } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
  }
126
  };
127
 
1
+ +/* global wc_stripe_settings_params */
2
+
3
  jQuery( function( $ ) {
4
  'use strict';
5
 
124
 
125
  $( 'form' ).find( 'input, select' ).off( 'change input', disableConnect );
126
  } );
127
+
128
+ // Webhook verification checks for timestamp within 5 minutes so warn if
129
+ // server time is off from browser time by > 4 minutes.
130
+ var timeDifference = Date.now() / 1000 - wc_stripe_settings_params.time;
131
+ var isTimeOutOfSync = Math.abs( timeDifference ) > 4 * 60;
132
+ $( '#woocommerce_stripe_test_webhook_secret, #woocommerce_stripe_webhook_secret' )
133
+ .on( 'change input', function() {
134
+ var $td = $( this ).closest( 'td' );
135
+ var $warning = $td.find( '.webhook_secret_time_sync_warning' );
136
+ var hasWebhookSecretValue = $( this ).val().length > 0;
137
+
138
+ if ( hasWebhookSecretValue ){
139
+ var isWarningShown = $warning.length > 0;
140
+ if ( isTimeOutOfSync && ! isWarningShown ) {
141
+ $td.append( '<p class="webhook_secret_time_sync_warning">' + wc_stripe_settings_params.i18n_out_of_sync + '</p>' );
142
+ }
143
+ } else {
144
+ $warning.remove();
145
+ }
146
+ } )
147
+ .change();
148
  }
149
  };
150
 
assets/js/stripe-admin.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(i){"use strict";var e={isTestMode:function(){return i("#woocommerce_stripe_testmode").is(":checked")},getSecretKey:function(){return e.isTestMode()?i("#woocommerce_stripe_test_secret_key").val():i("#woocommerce_stripe_secret_key").val()},init:function(){i(document.body).on("change","#woocommerce_stripe_testmode",function(){var e=i("#woocommerce_stripe_test_secret_key").parents("tr").eq(0),t=i("#woocommerce_stripe_test_publishable_key").parents("tr").eq(0),o=i("#woocommerce_stripe_test_webhook_secret").parents("tr").eq(0),s=i("#woocommerce_stripe_secret_key").parents("tr").eq(0),r=i("#woocommerce_stripe_publishable_key").parents("tr").eq(0),c=i("#woocommerce_stripe_webhook_secret").parents("tr").eq(0);i(this).is(":checked")?(e.show(),t.show(),o.show(),s.hide(),r.hide(),c.hide()):(e.hide(),t.hide(),o.hide(),s.show(),r.show(),c.show())}),i("#woocommerce_stripe_testmode").trigger("change"),i("#woocommerce_stripe_payment_request").on("change",function(){i(this).is(":checked")?i("#woocommerce_stripe_payment_request_button_theme, #woocommerce_stripe_payment_request_button_type, #woocommerce_stripe_payment_request_button_height").closest("tr").show():i("#woocommerce_stripe_payment_request_button_theme, #woocommerce_stripe_payment_request_button_type, #woocommerce_stripe_payment_request_button_height").closest("tr").hide()}).trigger("change"),i("#woocommerce_stripe_payment_request_button_type").on("change",function(){"custom"===i(this).val()?i("#woocommerce_stripe_payment_request_button_label").closest("tr").show():i("#woocommerce_stripe_payment_request_button_label").closest("tr").hide()}).trigger("change"),i("#woocommerce_stripe_payment_request_button_type").on("change",function(){"branded"===i(this).val()?i("#woocommerce_stripe_payment_request_button_branded_type").closest("tr").show():i("#woocommerce_stripe_payment_request_button_branded_type").closest("tr").hide()}).trigger("change"),i(".wc-stripe-3ds-missing").each(function(){var e=i(this);e.find(".notice-dismiss").on("click.wc-stripe-dismiss-notice",function(){i.ajax({type:"head",url:window.location.href+"&stripe_dismiss_3ds="+e.data("nonce")})})}),i("#woocommerce_stripe_test_secret_key, #woocommerce_stripe_secret_key, #woocommerce_stripe_test_webhook_secret, #woocommerce_stripe_webhook_secret").after('<button class="wc-stripe-toggle-secret" style="height: 30px; margin-left: 2px; cursor: pointer"><span class="dashicons dashicons-visibility"></span></button>'),i(".wc-stripe-toggle-secret").on("click",function(e){e.preventDefault();var t=i(this).closest("button").find(".dashicons"),o=i(this).closest("tr").find(".input-text");"text"==o.attr("type")?(o.attr("type","password"),t.removeClass("dashicons-hidden"),t.addClass("dashicons-visibility")):(o.attr("type","text"),t.removeClass("dashicons-visibility"),t.addClass("dashicons-hidden"))}),i("form").find("input, select").on("change input",function e(){i("#wc_stripe_connect_button").addClass("disabled"),i("#wc_stripe_connect_button").on("click",function(){return!1}),i("#woocommerce_stripe_api_credentials").next("p").append(" (Please save changes before selecting this button.)"),i("form").find("input, select").off("change input",e)})}};e.init()});
1
+ jQuery(function(i){"use strict";var e={isTestMode:function(){return i("#woocommerce_stripe_testmode").is(":checked")},getSecretKey:function(){return e.isTestMode()?i("#woocommerce_stripe_test_secret_key").val():i("#woocommerce_stripe_secret_key").val()},init:function(){i(document.body).on("change","#woocommerce_stripe_testmode",function(){var e=i("#woocommerce_stripe_test_secret_key").parents("tr").eq(0),t=i("#woocommerce_stripe_test_publishable_key").parents("tr").eq(0),o=i("#woocommerce_stripe_test_webhook_secret").parents("tr").eq(0),s=i("#woocommerce_stripe_secret_key").parents("tr").eq(0),r=i("#woocommerce_stripe_publishable_key").parents("tr").eq(0),c=i("#woocommerce_stripe_webhook_secret").parents("tr").eq(0);i(this).is(":checked")?(e.show(),t.show(),o.show(),s.hide(),r.hide(),c.hide()):(e.hide(),t.hide(),o.hide(),s.show(),r.show(),c.show())}),i("#woocommerce_stripe_testmode").trigger("change"),i("#woocommerce_stripe_payment_request").on("change",function(){i(this).is(":checked")?i("#woocommerce_stripe_payment_request_button_theme, #woocommerce_stripe_payment_request_button_type, #woocommerce_stripe_payment_request_button_height").closest("tr").show():i("#woocommerce_stripe_payment_request_button_theme, #woocommerce_stripe_payment_request_button_type, #woocommerce_stripe_payment_request_button_height").closest("tr").hide()}).trigger("change"),i("#woocommerce_stripe_payment_request_button_type").on("change",function(){"custom"===i(this).val()?i("#woocommerce_stripe_payment_request_button_label").closest("tr").show():i("#woocommerce_stripe_payment_request_button_label").closest("tr").hide()}).trigger("change"),i("#woocommerce_stripe_payment_request_button_type").on("change",function(){"branded"===i(this).val()?i("#woocommerce_stripe_payment_request_button_branded_type").closest("tr").show():i("#woocommerce_stripe_payment_request_button_branded_type").closest("tr").hide()}).trigger("change"),i(".wc-stripe-3ds-missing").each(function(){var e=i(this);e.find(".notice-dismiss").on("click.wc-stripe-dismiss-notice",function(){i.ajax({type:"head",url:window.location.href+"&stripe_dismiss_3ds="+e.data("nonce")})})}),i("#woocommerce_stripe_test_secret_key, #woocommerce_stripe_secret_key, #woocommerce_stripe_test_webhook_secret, #woocommerce_stripe_webhook_secret").after('<button class="wc-stripe-toggle-secret" style="height: 30px; margin-left: 2px; cursor: pointer"><span class="dashicons dashicons-visibility"></span></button>'),i(".wc-stripe-toggle-secret").on("click",function(e){e.preventDefault();var t=i(this).closest("button").find(".dashicons"),o=i(this).closest("tr").find(".input-text");"text"==o.attr("type")?(o.attr("type","password"),t.removeClass("dashicons-hidden"),t.addClass("dashicons-visibility")):(o.attr("type","text"),t.removeClass("dashicons-visibility"),t.addClass("dashicons-hidden"))}),i("form").find("input, select").on("change input",function e(){i("#wc_stripe_connect_button").addClass("disabled"),i("#wc_stripe_connect_button").on("click",function(){return!1}),i("#woocommerce_stripe_api_credentials").next("p").append(" (Please save changes before selecting this button.)"),i("form").find("input, select").off("change input",e)});var e=Date.now()/1e3-wc_stripe_settings_params.time,s=240<Math.abs(e);i("#woocommerce_stripe_test_webhook_secret, #woocommerce_stripe_webhook_secret").on("change input",function(){var e=i(this).closest("td"),t=e.find(".webhook_secret_time_sync_warning");if(0<i(this).val().length){var o=0<t.length;s&&!o&&e.append('<p class="webhook_secret_time_sync_warning">'+wc_stripe_settings_params.i18n_out_of_sync+"</p>")}else t.remove()}).change()}};e.init()});
assets/js/stripe-payment-request.js CHANGED
@@ -147,21 +147,16 @@ jQuery( function( $ ) {
147
  },
148
 
149
  /**
150
- * Abort payment and display error messages.
151
  *
152
- * @since 3.1.0
153
- * @version 4.0.0
154
- * @param {PaymentResponse} payment Payment response instance.
155
- * @param {String} message Error message to display.
156
  */
157
- abortPayment: function( payment, message ) {
158
- payment.complete( 'fail' );
159
-
160
  $( '.woocommerce-error' ).remove();
161
 
162
  if ( wc_stripe_payment_request_params.is_product_page ) {
163
- var element = $( '.product' );
164
-
165
  element.before( message );
166
 
167
  $( 'html, body' ).animate({
@@ -169,15 +164,26 @@ jQuery( function( $ ) {
169
  }, 600 );
170
  } else {
171
  var $form = $( '.shop_table.cart' ).closest( 'form' );
172
-
173
  $form.before( message );
174
-
175
  $( 'html, body' ).animate({
176
  scrollTop: $form.prev( '.woocommerce-error' ).offset().top
177
  }, 600 );
178
  }
179
  },
180
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  /**
182
  * Complete payment.
183
  *
@@ -325,7 +331,7 @@ jQuery( function( $ ) {
325
  * Starts the payment request
326
  *
327
  * @since 4.0.0
328
- * @version 4.0.0
329
  */
330
  startPaymentRequest: function( cart ) {
331
  var paymentDetails,
@@ -350,54 +356,66 @@ jQuery( function( $ ) {
350
  paymentDetails = cart.order_data;
351
  }
352
 
353
- var paymentRequest = stripe.paymentRequest( options );
354
-
355
- var elements = stripe.elements( { locale: wc_stripe_payment_request_params.button.locale } );
356
- var prButton = wc_stripe_payment_request.createPaymentRequestButton( elements, paymentRequest );
 
357
 
358
- // Check the availability of the Payment Request API first.
359
- paymentRequest.canMakePayment().then( function( result ) {
360
- if ( ! result ) {
361
- return;
362
- }
363
- paymentRequestType = result.applePay ? 'apple_pay' : 'payment_request_api';
364
- wc_stripe_payment_request.attachPaymentRequestButtonEventListeners( prButton, paymentRequest );
365
- wc_stripe_payment_request.showPaymentRequestButton( prButton );
366
- } );
367
 
368
- // Possible statuses success, fail, invalid_payer_name, invalid_payer_email, invalid_payer_phone, invalid_shipping_address.
369
- paymentRequest.on( 'shippingaddresschange', function( evt ) {
370
- $.when( wc_stripe_payment_request.updateShippingOptions( paymentDetails, evt.shippingAddress ) ).then( function( response ) {
371
- evt.updateWith( { status: response.result, shippingOptions: response.shipping_options, total: response.total, displayItems: response.displayItems } );
372
- } );
373
- } );
374
 
375
- paymentRequest.on( 'shippingoptionchange', function( evt ) {
376
- $.when( wc_stripe_payment_request.updateShippingDetails( paymentDetails, evt.shippingOption ) ).then( function( response ) {
377
- if ( 'success' === response.result ) {
378
- evt.updateWith( { status: 'success', total: response.total, displayItems: response.displayItems } );
379
  }
 
 
 
 
380
 
381
- if ( 'fail' === response.result ) {
382
- evt.updateWith( { status: 'fail' } );
383
- }
 
 
384
  } );
385
- } );
386
 
387
- paymentRequest.on( 'source', function( evt ) {
388
- // Check if we allow prepaid cards.
389
- if ( 'no' === wc_stripe_payment_request_params.stripe.allow_prepaid_card && 'prepaid' === evt.source.card.funding ) {
390
- wc_stripe_payment_request.abortPayment( evt, wc_stripe_payment_request.getErrorMessageHTML( wc_stripe_payment_request_params.i18n.no_prepaid_card ) );
391
- } else {
392
- $.when( wc_stripe_payment_request.processSource( evt, paymentRequestType ) ).then( function( response ) {
393
  if ( 'success' === response.result ) {
394
- wc_stripe_payment_request.completePayment( evt, response.redirect );
395
- } else {
396
- wc_stripe_payment_request.abortPayment( evt, response.messages );
 
 
397
  }
398
  } );
399
- }
400
- } );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
401
  },
402
 
403
  getSelectedProductData: function() {
147
  },
148
 
149
  /**
150
+ * Display error messages.
151
  *
152
+ * @since 4.8.0
153
+ * @param {Object} message DOM object with error message to display.
 
 
154
  */
155
+ displayErrorMessage: function( message ) {
 
 
156
  $( '.woocommerce-error' ).remove();
157
 
158
  if ( wc_stripe_payment_request_params.is_product_page ) {
159
+ var element = $( '.product' ).first();
 
160
  element.before( message );
161
 
162
  $( 'html, body' ).animate({
164
  }, 600 );
165
  } else {
166
  var $form = $( '.shop_table.cart' ).closest( 'form' );
 
167
  $form.before( message );
 
168
  $( 'html, body' ).animate({
169
  scrollTop: $form.prev( '.woocommerce-error' ).offset().top
170
  }, 600 );
171
  }
172
  },
173
 
174
+ /**
175
+ * Abort payment and display error messages.
176
+ *
177
+ * @since 3.1.0
178
+ * @version 4.8.0
179
+ * @param {PaymentResponse} payment Payment response instance.
180
+ * @param {Object} message DOM object with error message to display.
181
+ */
182
+ abortPayment: function( payment, message ) {
183
+ payment.complete( 'fail' );
184
+ wc_stripe_payment_request.displayErrorMessage( message );
185
+ },
186
+
187
  /**
188
  * Complete payment.
189
  *
331
  * Starts the payment request
332
  *
333
  * @since 4.0.0
334
+ * @version 4.8.0
335
  */
336
  startPaymentRequest: function( cart ) {
337
  var paymentDetails,
356
  paymentDetails = cart.order_data;
357
  }
358
 
359
+ // Puerto Rico (PR) is the only US territory/possession that's supported by Stripe.
360
+ // Since it's considered a US state by Stripe, we need to do some special mapping.
361
+ if ( 'PR' === options.country ) {
362
+ options.country = 'US';
363
+ }
364
 
365
+ // Handle errors thrown by Stripe, so we don't break the product page
366
+ try {
367
+ var paymentRequest = stripe.paymentRequest( options );
 
 
 
 
 
 
368
 
369
+ var elements = stripe.elements( { locale: wc_stripe_payment_request_params.button.locale } );
370
+ var prButton = wc_stripe_payment_request.createPaymentRequestButton( elements, paymentRequest );
 
 
 
 
371
 
372
+ // Check the availability of the Payment Request API first.
373
+ paymentRequest.canMakePayment().then( function( result ) {
374
+ if ( ! result ) {
375
+ return;
376
  }
377
+ paymentRequestType = result.applePay ? 'apple_pay' : 'payment_request_api';
378
+ wc_stripe_payment_request.attachPaymentRequestButtonEventListeners( prButton, paymentRequest );
379
+ wc_stripe_payment_request.showPaymentRequestButton( prButton );
380
+ } );
381
 
382
+ // Possible statuses success, fail, invalid_payer_name, invalid_payer_email, invalid_payer_phone, invalid_shipping_address.
383
+ paymentRequest.on( 'shippingaddresschange', function( evt ) {
384
+ $.when( wc_stripe_payment_request.updateShippingOptions( paymentDetails, evt.shippingAddress ) ).then( function( response ) {
385
+ evt.updateWith( { status: response.result, shippingOptions: response.shipping_options, total: response.total, displayItems: response.displayItems } );
386
+ } );
387
  } );
 
388
 
389
+ paymentRequest.on( 'shippingoptionchange', function( evt ) {
390
+ $.when( wc_stripe_payment_request.updateShippingDetails( paymentDetails, evt.shippingOption ) ).then( function( response ) {
 
 
 
 
391
  if ( 'success' === response.result ) {
392
+ evt.updateWith( { status: 'success', total: response.total, displayItems: response.displayItems } );
393
+ }
394
+
395
+ if ( 'fail' === response.result ) {
396
+ evt.updateWith( { status: 'fail' } );
397
  }
398
  } );
399
+ } );
400
+
401
+ paymentRequest.on( 'source', function( evt ) {
402
+ // Check if we allow prepaid cards.
403
+ if ( 'no' === wc_stripe_payment_request_params.stripe.allow_prepaid_card && 'prepaid' === evt.source.card.funding ) {
404
+ wc_stripe_payment_request.abortPayment( evt, wc_stripe_payment_request.getErrorMessageHTML( wc_stripe_payment_request_params.i18n.no_prepaid_card ) );
405
+ } else {
406
+ $.when( wc_stripe_payment_request.processSource( evt, paymentRequestType ) ).then( function( response ) {
407
+ if ( 'success' === response.result ) {
408
+ wc_stripe_payment_request.completePayment( evt, response.redirect );
409
+ } else {
410
+ wc_stripe_payment_request.abortPayment( evt, response.messages );
411
+ }
412
+ } );
413
+ }
414
+ } );
415
+ } catch( e ) {
416
+ // Leave for troubleshooting
417
+ console.error( e );
418
+ }
419
  },
420
 
421
  getSelectedProductData: function() {
assets/js/stripe-payment-request.min.js CHANGED
@@ -1 +1 @@
1
- jQuery(function(i){"use strict";var o,p=Stripe(wc_stripe_payment_request_params.stripe.key),u={getAjaxURL:function(t){return wc_stripe_payment_request_params.ajax_url.toString().replace("%%endpoint%%","wc_stripe_"+t)},getCartDetails:function(){var t={security:wc_stripe_payment_request_params.nonce.payment};i.ajax({type:"POST",data:t,url:u.getAjaxURL("get_cart_details"),success:function(t){u.startPaymentRequest(t)}})},getAttributes:function(){var t=i(".variations_form").find(".variations select"),a={},n=0,s=0;return t.each(function(){var t=i(this).data("attribute_name")||i(this).attr("name"),e=i(this).val()||"";0<e.length&&s++,n++,a[t]=e}),{count:n,chosenCount:s,data:a}},processSource:function(t,e){var a=u.getOrderData(t,e);return i.ajax({type:"POST",data:a,dataType:"json",url:u.getAjaxURL("create_order")})},getOrderData:function(t,e){var a=t.source,n=a.owner.email,s=a.owner.phone,r=a.owner.address,i=a.owner.name,o=t.shippingAddress,p={_wpnonce:wc_stripe_payment_request_params.nonce.checkout,billing_first_name:null!==i?i.split(" ").slice(0,1).join(" "):"",billing_last_name:null!==i?i.split(" ").slice(1).join(" "):"",billing_company:"",billing_email:null!==n?n:t.payerEmail,billing_phone:null!==s?s:t.payerPhone&&t.payerPhone.replace("/[() -]/g",""),billing_country:null!==r?r.country:"",billing_address_1:null!==r?r.line1:"",billing_address_2:null!==r?r.line2:"",billing_city:null!==r?r.city:"",billing_state:null!==r?r.state:"",billing_postcode:null!==r?r.postal_code:"",shipping_first_name:"",shipping_last_name:"",shipping_company:"",shipping_country:"",shipping_address_1:"",shipping_address_2:"",shipping_city:"",shipping_state:"",shipping_postcode:"",shipping_method:[null===t.shippingOption?null:t.shippingOption.id],order_comments:"",payment_method:"stripe",ship_to_different_address:1,terms:1,stripe_source:a.id,payment_request_type:e};return o&&(p.shipping_first_name=o.recipient.split(" ").slice(0,1).join(" "),p.shipping_last_name=o.recipient.split(" ").slice(1).join(" "),p.shipping_company=o.organization,p.shipping_country=o.country,p.shipping_address_1=void 0===o.addressLine[0]?"":o.addressLine[0],p.shipping_address_2=void 0===o.addressLine[1]?"":o.addressLine[1],p.shipping_city=o.city,p.shipping_state=o.region,p.shipping_postcode=o.postalCode),p},getErrorMessageHTML:function(t){return i('<div class="woocommerce-error" />').text(t)},abortPayment:function(t,e){if(t.complete("fail"),i(".woocommerce-error").remove(),wc_stripe_payment_request_params.is_product_page){var a=i(".product");a.before(e),i("html, body").animate({scrollTop:a.prev(".woocommerce-error").offset().top},600)}else{var n=i(".shop_table.cart").closest("form");n.before(e),i("html, body").animate({scrollTop:n.prev(".woocommerce-error").offset().top},600)}},completePayment:function(t,e){u.block(),t.complete("success"),window.location=e},block:function(){i.blockUI({message:null,overlayCSS:{background:"#fff",opacity:.6}})},updateShippingOptions:function(t,e){var a={security:wc_stripe_payment_request_params.nonce.shipping,country:e.country,state:e.region,postcode:e.postalCode,city:e.city,address:void 0===e.addressLine[0]?"":e.addressLine[0],address_2:void 0===e.addressLine[1]?"":e.addressLine[1],payment_request_type:o,is_product_page:wc_stripe_payment_request_params.is_product_page};return i.ajax({type:"POST",data:a,url:u.getAjaxURL("get_shipping_options")})},updateShippingDetails:function(t,e){var a={security:wc_stripe_payment_request_params.nonce.update_shipping,shipping_method:[e.id],payment_request_type:o,is_product_page:wc_stripe_payment_request_params.is_product_page};return i.ajax({type:"POST",data:a,url:u.getAjaxURL("update_shipping_method")})},addToCart:function(){var t=i(".single_add_to_cart_button").val();i(".single_variation_wrap").length&&(t=i(".single_variation_wrap").find('input[name="product_id"]').val());var n={security:wc_stripe_payment_request_params.nonce.add_to_cart,product_id:t,qty:i(".quantity .qty").val(),attributes:i(".variations_form").length?u.getAttributes().data:[]},e=i("form.cart").serializeArray();return i.each(e,function(t,e){if(/^addon-/.test(e.name))if(/\[\]$/.test(e.name)){var a=e.name.substring(0,e.name.length-2);n[a]?n[a].push(e.value):n[a]=[e.value]}else n[e.name]=e.value}),i.ajax({type:"POST",data:n,url:u.getAjaxURL("add_to_cart")})},clearCart:function(){var t={security:wc_stripe_payment_request_params.nonce.clear_cart};return i.ajax({type:"POST",data:t,url:u.getAjaxURL("clear_cart"),success:function(t){}})},getRequestOptionsFromLocal:function(){return{total:wc_stripe_payment_request_params.product.total,currency:wc_stripe_payment_request_params.checkout.currency_code,country:wc_stripe_payment_request_params.checkout.country_code,requestPayerName:!0,requestPayerEmail:!0,requestPayerPhone:wc_stripe_payment_request_params.checkout.needs_payer_phone,requestShipping:wc_stripe_payment_request_params.product.requestShipping,displayItems:wc_stripe_payment_request_params.product.displayItems}},startPaymentRequest:function(t){var a,e;a=wc_stripe_payment_request_params.is_product_page?e=u.getRequestOptionsFromLocal():(e={total:t.order_data.total,currency:t.order_data.currency,country:t.order_data.country_code,requestPayerName:!0,requestPayerEmail:!0,requestPayerPhone:wc_stripe_payment_request_params.checkout.needs_payer_phone,requestShipping:!!t.shipping_required,displayItems:t.order_data.displayItems},t.order_data);var n=p.paymentRequest(e),s=p.elements({locale:wc_stripe_payment_request_params.button.locale}),r=u.createPaymentRequestButton(s,n);n.canMakePayment().then(function(t){t&&(o=t.applePay?"apple_pay":"payment_request_api",u.attachPaymentRequestButtonEventListeners(r,n),u.showPaymentRequestButton(r))}),n.on("shippingaddresschange",function(e){i.when(u.updateShippingOptions(a,e.shippingAddress)).then(function(t){e.updateWith({status:t.result,shippingOptions:t.shipping_options,total:t.total,displayItems:t.displayItems})})}),n.on("shippingoptionchange",function(e){i.when(u.updateShippingDetails(a,e.shippingOption)).then(function(t){"success"===t.result&&e.updateWith({status:"success",total:t.total,displayItems:t.displayItems}),"fail"===t.result&&e.updateWith({status:"fail"})})}),n.on("source",function(e){"no"===wc_stripe_payment_request_params.stripe.allow_prepaid_card&&"prepaid"===e.source.card.funding?u.abortPayment(e,u.getErrorMessageHTML(wc_stripe_payment_request_params.i18n.no_prepaid_card)):i.when(u.processSource(e,o)).then(function(t){"success"===t.result?u.completePayment(e,t.redirect):u.abortPayment(e,t.messages)})})},getSelectedProductData:function(){var t=i(".single_add_to_cart_button").val();i(".single_variation_wrap").length&&(t=i(".single_variation_wrap").find('input[name="product_id"]').val());var e=(i("#product-addons-total").data("price_data")||[]).reduce(function(t,e){return t+e.cost},0),a={security:wc_stripe_payment_request_params.nonce.get_selected_product_data,product_id:t,qty:i(".quantity .qty").val(),attributes:i(".variations_form").length?u.getAttributes().data:[],addon_value:e};return i.ajax({type:"POST",data:a,url:u.getAjaxURL("get_selected_product_data")})},debounce:function(n,s,r){var i;return function(){var t=this,e=arguments,a=r&&!i;clearTimeout(i),i=setTimeout(function(){i=null,r||s.apply(t,e)},n),a&&s.apply(t,e)}},createPaymentRequestButton:function(t,e){var a;if(wc_stripe_payment_request_params.button.is_custom&&(a=i(wc_stripe_payment_request_params.button.css_selector)).length)return a.data("isCustom",!0),a;if(wc_stripe_payment_request_params.button.is_branded){if(u.shouldUseGooglePayBrand())return(a=u.createGooglePayButton()).data("isBranded",!0),a;wc_stripe_payment_request_params.button.type="long"===wc_stripe_payment_request_params.button.branded_type?"buy":"default"}return t.create("paymentRequestButton",{paymentRequest:e,style:{paymentRequestButton:{type:wc_stripe_payment_request_params.button.type,theme:wc_stripe_payment_request_params.button.theme,height:wc_stripe_payment_request_params.button.height+"px"}}})},isCustomPaymentRequestButton:function(t){return t&&"function"==typeof t.data&&t.data("isCustom")},isBrandedPaymentRequestButton:function(t){return t&&"function"==typeof t.data&&t.data("isBranded")},shouldUseGooglePayBrand:function(){var t=window.navigator.userAgent.toLowerCase(),e=/chrome/.test(t)&&!/edge|edg|opr|brave\//.test(t)&&"Google Inc."===window.navigator.vendor,a=e&&window.navigator.brave;return e&&!a},createGooglePayButton:function(){var t=wc_stripe_payment_request_params.button.theme,e=wc_stripe_payment_request_params.button.branded_type,a=wc_stripe_payment_request_params.button.locale,n=wc_stripe_payment_request_params.button.height;t=["dark","light"].includes(t)?t:"light",e=["short","long"].includes(e)?e:"long";var s=i('<button type="button" id="wc-stripe-branded-button" aria-label="Google Pay" class="gpay-button"></button>');s.css("height",n+"px"),s.addClass(t+" "+e),"long"===e&&function(t,e,a){t.css("background-image","url("+e+")");var n=document.createElement("img");n.onerror=function(){t.css("background-image","url("+a+")")},n.src=e}(s,"https://www.gstatic.com/instantbuy/svg/"+t+"/"+a+".svg","https://www.gstatic.com/instantbuy/svg/"+t+"/en.svg");return s},attachPaymentRequestButtonEventListeners:function(t,e){t.on("click",function(t){i("body").addClass("woocommerce-stripe-prb-clicked")}),wc_stripe_payment_request_params.is_product_page?u.attachProductPageEventListeners(t,e):u.attachCartPageEventListeners(t,e)},attachProductPageEventListeners:function(e,a){var n=[],s=i(".single_add_to_cart_button");e.on("click",function(t){return s.is(".disabled")?(t.preventDefault(),void(s.is(".wc-variation-is-unavailable")?window.alert(wc_add_to_cart_variation_params.i18n_unavailable_text):s.is(".wc-variation-selection-needed")&&window.alert(wc_add_to_cart_variation_params.i18n_make_a_selection_text))):0<n.length?(t.preventDefault(),void window.alert(n)):(u.addToCart(),void((u.isCustomPaymentRequestButton(e)||u.isBrandedPaymentRequestButton(e))&&(t.preventDefault(),a.show())))}),i(document.body).on("woocommerce_variation_has_changed",function(){u.blockPaymentRequestButton(e),i.when(u.getSelectedProductData()).then(function(t){i.when(a.update({total:t.total,displayItems:t.displayItems})).then(function(){u.unblockPaymentRequestButton(e)})})}),i(".quantity").on("input",".qty",function(){u.blockPaymentRequestButton(e)}),i(".quantity").on("input",".qty",u.debounce(250,function(){u.blockPaymentRequestButton(e),n=[],i.when(u.getSelectedProductData()).then(function(t){t.error?(n=[t.error],u.unblockPaymentRequestButton(e)):i.when(a.update({total:t.total,displayItems:t.displayItems})).then(function(){u.unblockPaymentRequestButton(e)})})}))},attachCartPageEventListeners:function(t,e){(wc_stripe_payment_request_params.button.is_custom&&u.isCustomPaymentRequestButton(t)||wc_stripe_payment_request_params.button.is_branded&&u.isBrandedPaymentRequestButton(t))&&t.on("click",function(t){t.preventDefault(),e.show()})},showPaymentRequestButton:function(t){u.isCustomPaymentRequestButton(t)?(t.addClass("is-active"),i("#wc-stripe-payment-request-wrapper, #wc-stripe-payment-request-button-separator").show()):u.isBrandedPaymentRequestButton(t)?(i("#wc-stripe-payment-request-wrapper, #wc-stripe-payment-request-button-separator").show(),i("#wc-stripe-payment-request-button").html(t)):i("#wc-stripe-payment-request-button").length&&(i("#wc-stripe-payment-request-wrapper, #wc-stripe-payment-request-button-separator").show(),t.mount("#wc-stripe-payment-request-button"))},blockPaymentRequestButton:function(t){i("#wc-stripe-payment-request-button").data("blockUI.isBlocked")||(i("#wc-stripe-payment-request-button").block({message:null}),u.isCustomPaymentRequestButton(t)&&t.addClass("is-blocked"))},unblockPaymentRequestButton:function(t){i("#wc-stripe-payment-request-button").unblock(),u.isCustomPaymentRequestButton(t)&&t.removeClass("is-blocked")},init:function(){wc_stripe_payment_request_params.is_product_page?u.startPaymentRequest(""):u.getCartDetails()}};u.init(),i(document.body).on("updated_cart_totals",function(){u.init()}),i(document.body).on("updated_checkout",function(){u.init()})});
1
+ jQuery(function(i){"use strict";var o,u=Stripe(wc_stripe_payment_request_params.stripe.key),p={getAjaxURL:function(t){return wc_stripe_payment_request_params.ajax_url.toString().replace("%%endpoint%%","wc_stripe_"+t)},getCartDetails:function(){var t={security:wc_stripe_payment_request_params.nonce.payment};i.ajax({type:"POST",data:t,url:p.getAjaxURL("get_cart_details"),success:function(t){p.startPaymentRequest(t)}})},getAttributes:function(){var t=i(".variations_form").find(".variations select"),a={},n=0,r=0;return t.each(function(){var t=i(this).data("attribute_name")||i(this).attr("name"),e=i(this).val()||"";0<e.length&&r++,n++,a[t]=e}),{count:n,chosenCount:r,data:a}},processSource:function(t,e){var a=p.getOrderData(t,e);return i.ajax({type:"POST",data:a,dataType:"json",url:p.getAjaxURL("create_order")})},getOrderData:function(t,e){var a=t.source,n=a.owner.email,r=a.owner.phone,s=a.owner.address,i=a.owner.name,o=t.shippingAddress,u={_wpnonce:wc_stripe_payment_request_params.nonce.checkout,billing_first_name:null!==i?i.split(" ").slice(0,1).join(" "):"",billing_last_name:null!==i?i.split(" ").slice(1).join(" "):"",billing_company:"",billing_email:null!==n?n:t.payerEmail,billing_phone:null!==r?r:t.payerPhone&&t.payerPhone.replace("/[() -]/g",""),billing_country:null!==s?s.country:"",billing_address_1:null!==s?s.line1:"",billing_address_2:null!==s?s.line2:"",billing_city:null!==s?s.city:"",billing_state:null!==s?s.state:"",billing_postcode:null!==s?s.postal_code:"",shipping_first_name:"",shipping_last_name:"",shipping_company:"",shipping_country:"",shipping_address_1:"",shipping_address_2:"",shipping_city:"",shipping_state:"",shipping_postcode:"",shipping_method:[null===t.shippingOption?null:t.shippingOption.id],order_comments:"",payment_method:"stripe",ship_to_different_address:1,terms:1,stripe_source:a.id,payment_request_type:e};return o&&(u.shipping_first_name=o.recipient.split(" ").slice(0,1).join(" "),u.shipping_last_name=o.recipient.split(" ").slice(1).join(" "),u.shipping_company=o.organization,u.shipping_country=o.country,u.shipping_address_1=void 0===o.addressLine[0]?"":o.addressLine[0],u.shipping_address_2=void 0===o.addressLine[1]?"":o.addressLine[1],u.shipping_city=o.city,u.shipping_state=o.region,u.shipping_postcode=o.postalCode),u},getErrorMessageHTML:function(t){return i('<div class="woocommerce-error" />').text(t)},displayErrorMessage:function(t){if(i(".woocommerce-error").remove(),wc_stripe_payment_request_params.is_product_page){var e=i(".product").first();e.before(t),i("html, body").animate({scrollTop:e.prev(".woocommerce-error").offset().top},600)}else{var a=i(".shop_table.cart").closest("form");a.before(t),i("html, body").animate({scrollTop:a.prev(".woocommerce-error").offset().top},600)}},abortPayment:function(t,e){t.complete("fail"),p.displayErrorMessage(e)},completePayment:function(t,e){p.block(),t.complete("success"),window.location=e},block:function(){i.blockUI({message:null,overlayCSS:{background:"#fff",opacity:.6}})},updateShippingOptions:function(t,e){var a={security:wc_stripe_payment_request_params.nonce.shipping,country:e.country,state:e.region,postcode:e.postalCode,city:e.city,address:void 0===e.addressLine[0]?"":e.addressLine[0],address_2:void 0===e.addressLine[1]?"":e.addressLine[1],payment_request_type:o,is_product_page:wc_stripe_payment_request_params.is_product_page};return i.ajax({type:"POST",data:a,url:p.getAjaxURL("get_shipping_options")})},updateShippingDetails:function(t,e){var a={security:wc_stripe_payment_request_params.nonce.update_shipping,shipping_method:[e.id],payment_request_type:o,is_product_page:wc_stripe_payment_request_params.is_product_page};return i.ajax({type:"POST",data:a,url:p.getAjaxURL("update_shipping_method")})},addToCart:function(){var t=i(".single_add_to_cart_button").val();i(".single_variation_wrap").length&&(t=i(".single_variation_wrap").find('input[name="product_id"]').val());var n={security:wc_stripe_payment_request_params.nonce.add_to_cart,product_id:t,qty:i(".quantity .qty").val(),attributes:i(".variations_form").length?p.getAttributes().data:[]},e=i("form.cart").serializeArray();return i.each(e,function(t,e){if(/^addon-/.test(e.name))if(/\[\]$/.test(e.name)){var a=e.name.substring(0,e.name.length-2);n[a]?n[a].push(e.value):n[a]=[e.value]}else n[e.name]=e.value}),i.ajax({type:"POST",data:n,url:p.getAjaxURL("add_to_cart")})},clearCart:function(){var t={security:wc_stripe_payment_request_params.nonce.clear_cart};return i.ajax({type:"POST",data:t,url:p.getAjaxURL("clear_cart"),success:function(t){}})},getRequestOptionsFromLocal:function(){return{total:wc_stripe_payment_request_params.product.total,currency:wc_stripe_payment_request_params.checkout.currency_code,country:wc_stripe_payment_request_params.checkout.country_code,requestPayerName:!0,requestPayerEmail:!0,requestPayerPhone:wc_stripe_payment_request_params.checkout.needs_payer_phone,requestShipping:wc_stripe_payment_request_params.product.requestShipping,displayItems:wc_stripe_payment_request_params.product.displayItems}},startPaymentRequest:function(t){var a,e;a=wc_stripe_payment_request_params.is_product_page?e=p.getRequestOptionsFromLocal():(e={total:t.order_data.total,currency:t.order_data.currency,country:t.order_data.country_code,requestPayerName:!0,requestPayerEmail:!0,requestPayerPhone:wc_stripe_payment_request_params.checkout.needs_payer_phone,requestShipping:!!t.shipping_required,displayItems:t.order_data.displayItems},t.order_data),"PR"===e.country&&(e.country="US");try{var n=u.paymentRequest(e),r=u.elements({locale:wc_stripe_payment_request_params.button.locale}),s=p.createPaymentRequestButton(r,n);n.canMakePayment().then(function(t){t&&(o=t.applePay?"apple_pay":"payment_request_api",p.attachPaymentRequestButtonEventListeners(s,n),p.showPaymentRequestButton(s))}),n.on("shippingaddresschange",function(e){i.when(p.updateShippingOptions(a,e.shippingAddress)).then(function(t){e.updateWith({status:t.result,shippingOptions:t.shipping_options,total:t.total,displayItems:t.displayItems})})}),n.on("shippingoptionchange",function(e){i.when(p.updateShippingDetails(a,e.shippingOption)).then(function(t){"success"===t.result&&e.updateWith({status:"success",total:t.total,displayItems:t.displayItems}),"fail"===t.result&&e.updateWith({status:"fail"})})}),n.on("source",function(e){"no"===wc_stripe_payment_request_params.stripe.allow_prepaid_card&&"prepaid"===e.source.card.funding?p.abortPayment(e,p.getErrorMessageHTML(wc_stripe_payment_request_params.i18n.no_prepaid_card)):i.when(p.processSource(e,o)).then(function(t){"success"===t.result?p.completePayment(e,t.redirect):p.abortPayment(e,t.messages)})})}catch(t){console.error(t)}},getSelectedProductData:function(){var t=i(".single_add_to_cart_button").val();i(".single_variation_wrap").length&&(t=i(".single_variation_wrap").find('input[name="product_id"]').val());var e=(i("#product-addons-total").data("price_data")||[]).reduce(function(t,e){return t+e.cost},0),a={security:wc_stripe_payment_request_params.nonce.get_selected_product_data,product_id:t,qty:i(".quantity .qty").val(),attributes:i(".variations_form").length?p.getAttributes().data:[],addon_value:e};return i.ajax({type:"POST",data:a,url:p.getAjaxURL("get_selected_product_data")})},debounce:function(n,r,s){var i;return function(){var t=this,e=arguments,a=s&&!i;clearTimeout(i),i=setTimeout(function(){i=null,s||r.apply(t,e)},n),a&&r.apply(t,e)}},createPaymentRequestButton:function(t,e){var a;if(wc_stripe_payment_request_params.button.is_custom&&(a=i(wc_stripe_payment_request_params.button.css_selector)).length)return a.data("isCustom",!0),a;if(wc_stripe_payment_request_params.button.is_branded){if(p.shouldUseGooglePayBrand())return(a=p.createGooglePayButton()).data("isBranded",!0),a;wc_stripe_payment_request_params.button.type="long"===wc_stripe_payment_request_params.button.branded_type?"buy":"default"}return t.create("paymentRequestButton",{paymentRequest:e,style:{paymentRequestButton:{type:wc_stripe_payment_request_params.button.type,theme:wc_stripe_payment_request_params.button.theme,height:wc_stripe_payment_request_params.button.height+"px"}}})},isCustomPaymentRequestButton:function(t){return t&&"function"==typeof t.data&&t.data("isCustom")},isBrandedPaymentRequestButton:function(t){return t&&"function"==typeof t.data&&t.data("isBranded")},shouldUseGooglePayBrand:function(){var t=window.navigator.userAgent.toLowerCase(),e=/chrome/.test(t)&&!/edge|edg|opr|brave\//.test(t)&&"Google Inc."===window.navigator.vendor,a=e&&window.navigator.brave;return e&&!a},createGooglePayButton:function(){var t=wc_stripe_payment_request_params.button.theme,e=wc_stripe_payment_request_params.button.branded_type,a=wc_stripe_payment_request_params.button.locale,n=wc_stripe_payment_request_params.button.height;t=["dark","light"].includes(t)?t:"light",e=["short","long"].includes(e)?e:"long";var r=i('<button type="button" id="wc-stripe-branded-button" aria-label="Google Pay" class="gpay-button"></button>');r.css("height",n+"px"),r.addClass(t+" "+e),"long"===e&&function(t,e,a){t.css("background-image","url("+e+")");var n=document.createElement("img");n.onerror=function(){t.css("background-image","url("+a+")")},n.src=e}(r,"https://www.gstatic.com/instantbuy/svg/"+t+"/"+a+".svg","https://www.gstatic.com/instantbuy/svg/"+t+"/en.svg");return r},attachPaymentRequestButtonEventListeners:function(t,e){t.on("click",function(t){i("body").addClass("woocommerce-stripe-prb-clicked")}),wc_stripe_payment_request_params.is_product_page?p.attachProductPageEventListeners(t,e):p.attachCartPageEventListeners(t,e)},attachProductPageEventListeners:function(e,a){var n=[],r=i(".single_add_to_cart_button");e.on("click",function(t){return r.is(".disabled")?(t.preventDefault(),void(r.is(".wc-variation-is-unavailable")?window.alert(wc_add_to_cart_variation_params.i18n_unavailable_text):r.is(".wc-variation-selection-needed")&&window.alert(wc_add_to_cart_variation_params.i18n_make_a_selection_text))):0<n.length?(t.preventDefault(),void window.alert(n)):(p.addToCart(),void((p.isCustomPaymentRequestButton(e)||p.isBrandedPaymentRequestButton(e))&&(t.preventDefault(),a.show())))}),i(document.body).on("woocommerce_variation_has_changed",function(){p.blockPaymentRequestButton(e),i.when(p.getSelectedProductData()).then(function(t){i.when(a.update({total:t.total,displayItems:t.displayItems})).then(function(){p.unblockPaymentRequestButton(e)})})}),i(".quantity").on("input",".qty",function(){p.blockPaymentRequestButton(e)}),i(".quantity").on("input",".qty",p.debounce(250,function(){p.blockPaymentRequestButton(e),n=[],i.when(p.getSelectedProductData()).then(function(t){t.error?(n=[t.error],p.unblockPaymentRequestButton(e)):i.when(a.update({total:t.total,displayItems:t.displayItems})).then(function(){p.unblockPaymentRequestButton(e)})})}))},attachCartPageEventListeners:function(t,e){(wc_stripe_payment_request_params.button.is_custom&&p.isCustomPaymentRequestButton(t)||wc_stripe_payment_request_params.button.is_branded&&p.isBrandedPaymentRequestButton(t))&&t.on("click",function(t){t.preventDefault(),e.show()})},showPaymentRequestButton:function(t){p.isCustomPaymentRequestButton(t)?(t.addClass("is-active"),i("#wc-stripe-payment-request-wrapper, #wc-stripe-payment-request-button-separator").show()):p.isBrandedPaymentRequestButton(t)?(i("#wc-stripe-payment-request-wrapper, #wc-stripe-payment-request-button-separator").show(),i("#wc-stripe-payment-request-button").html(t)):i("#wc-stripe-payment-request-button").length&&(i("#wc-stripe-payment-request-wrapper, #wc-stripe-payment-request-button-separator").show(),t.mount("#wc-stripe-payment-request-button"))},blockPaymentRequestButton:function(t){i("#wc-stripe-payment-request-button").data("blockUI.isBlocked")||(i("#wc-stripe-payment-request-button").block({message:null}),p.isCustomPaymentRequestButton(t)&&t.addClass("is-blocked"))},unblockPaymentRequestButton:function(t){i("#wc-stripe-payment-request-button").unblock(),p.isCustomPaymentRequestButton(t)&&t.removeClass("is-blocked")},init:function(){wc_stripe_payment_request_params.is_product_page?p.startPaymentRequest(""):p.getCartDetails()}};p.init(),i(document.body).on("updated_cart_totals",function(){p.init()}),i(document.body).on("updated_checkout",function(){p.init()})});
changelog.txt CHANGED
@@ -1,5 +1,12 @@
1
  *** Changelog ***
2
 
 
 
 
 
 
 
 
3
  = 4.7.0 - 2020-12-22 =
4
  * Fix - Updating subscription payment methods from the "My Account" page now adds a note to the subscription.
5
  * Fix - Link is now correctly formatted in readme.txt.
1
  *** Changelog ***
2
 
3
+ = 4.8.0 - 2021-01-28 =
4
+ * Fix - Filter more disallowed characters from statement descriptors.
5
+ * Fix - Payment request button for Puerto Rico.
6
+ * Fix - Handle error if country is not supported for payment request button.
7
+ * Fix - Trim the refund reason to a max of 500 characters.
8
+ * Tweak - Display warning on webhook secret when server time is off from device time.
9
+
10
  = 4.7.0 - 2020-12-22 =
11
  * Fix - Updating subscription payment methods from the "My Account" page now adds a note to the subscription.
12
  * Fix - Link is now correctly formatted in readme.txt.
includes/abstracts/abstract-wc-stripe-payment-gateway.php CHANGED
@@ -819,7 +819,7 @@ abstract class WC_Stripe_Payment_Gateway extends WC_Payment_Gateway_CC {
819
  * Refund a charge.
820
  *
821
  * @since 3.1.0
822
- * @version 4.0.0
823
  * @param int $order_id
824
  * @param float $amount
825
  * @return bool
@@ -851,6 +851,13 @@ abstract class WC_Stripe_Payment_Gateway extends WC_Payment_Gateway_CC {
851
  }
852
 
853
  if ( $reason ) {
 
 
 
 
 
 
 
854
  $request['metadata'] = array(
855
  'reason' => $reason,
856
  );
819
  * Refund a charge.
820
  *
821
  * @since 3.1.0
822
+ * @version 4.8.0
823
  * @param int $order_id
824
  * @param float $amount
825
  * @return bool
851
  }
852
 
853
  if ( $reason ) {
854
+ // Trim the refund reason to a max of 500 characters due to Stripe limits: https://stripe.com/docs/api/metadata.
855
+ if ( strlen( $reason ) > 500 ) {
856
+ $reason = function_exists( 'mb_substr' ) ? mb_substr( $reason, 0, 450 ) : substr( $reason, 0, 450 );
857
+ // Add some explainer text indicating where to find the full refund reason.
858
+ $reason = $reason . '... [See WooCommerce order page for full text.]';
859
+ }
860
+
861
  $request['metadata'] = array(
862
  'reason' => $reason,
863
  );
includes/admin/stripe-settings.php CHANGED
@@ -130,7 +130,7 @@ return apply_filters(
130
  'statement_descriptor' => array(
131
  'title' => __( 'Statement Descriptor', 'woocommerce-gateway-stripe' ),
132
  'type' => 'text',
133
- 'description' => __( 'Statement descriptors are limited to 22 characters, cannot use the special characters >, <, ", \, \', *, and must not consist solely of numbers. This will appear on your customer\'s statement in capital letters.', 'woocommerce-gateway-stripe' ),
134
  'default' => '',
135
  'desc_tip' => true,
136
  ),
130
  'statement_descriptor' => array(
131
  'title' => __( 'Statement Descriptor', 'woocommerce-gateway-stripe' ),
132
  'type' => 'text',
133
+ 'description' => __( 'Statement descriptors are limited to 22 characters, cannot use the special characters >, <, ", \, \', *, /, (, ), {, }, and must not consist solely of numbers. This will appear on your customer\'s statement in capital letters.', 'woocommerce-gateway-stripe' ),
134
  'default' => '',
135
  'desc_tip' => true,
136
  ),
includes/class-wc-gateway-stripe.php CHANGED
@@ -140,6 +140,7 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
140
  add_filter( 'woocommerce_payment_successful_result', array( $this, 'modify_successful_payment_result' ), 99999, 2 );
141
  add_action( 'set_logged_in_cookie', array( $this, 'set_cookie_on_current_request' ) );
142
  add_filter( 'woocommerce_get_checkout_payment_url', array( $this, 'get_checkout_payment_url' ), 10, 2 );
 
143
 
144
  // Note: display error is in the parent class.
145
  add_action( 'admin_notices', array( $this, 'display_errors' ), 9999 );
@@ -350,7 +351,18 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
350
 
351
  $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
352
 
353
- wp_enqueue_script( 'woocommerce_stripe_admin', plugins_url( 'assets/js/stripe-admin' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array(), WC_STRIPE_VERSION, true );
 
 
 
 
 
 
 
 
 
 
 
354
  }
355
 
356
  /**
@@ -1202,4 +1214,20 @@ class WC_Gateway_Stripe extends WC_Stripe_Payment_Gateway {
1202
  }
1203
  return $value;
1204
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1205
  }
140
  add_filter( 'woocommerce_payment_successful_result', array( $this, 'modify_successful_payment_result' ), 99999, 2 );
141
  add_action( 'set_logged_in_cookie', array( $this, 'set_cookie_on_current_request' ) );
142
  add_filter( 'woocommerce_get_checkout_payment_url', array( $this, 'get_checkout_payment_url' ), 10, 2 );
143
+ add_filter( 'woocommerce_settings_api_sanitized_fields_' . $this->id, array( $this, 'settings_api_sanitized_fields' ) );
144
 
145
  // Note: display error is in the parent class.
146
  add_action( 'admin_notices', array( $this, 'display_errors' ), 9999 );
351
 
352
  $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
353
 
354
+ wp_register_script( 'woocommerce_stripe_admin', plugins_url( 'assets/js/stripe-admin' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array(), WC_STRIPE_VERSION, true );
355
+
356
+ $params = array(
357
+ 'time' => time(),
358
+ 'i18n_out_of_sync' => wp_kses(
359
+ __( '<strong>Warning:</strong> your site\'s time does not match the time on your browser and may be incorrect. Some payment methods depend on webhook verification and verifying webhooks with a signing secret depends on your site\'s time being correct, so please check your site\'s time before setting a webhook secret. You may need to contact your site\'s hosting provider to correct the site\'s time.', 'woocommerce-gateway-stripe' ),
360
+ array( 'strong' => array() )
361
+ ),
362
+ );
363
+ wp_localize_script( 'woocommerce_stripe_admin', 'wc_stripe_settings_params', $params );
364
+
365
+ wp_enqueue_script( 'woocommerce_stripe_admin' );
366
  }
367
 
368
  /**
1214
  }
1215
  return $value;
1216
  }
1217
+
1218
+ /**
1219
+ * Ensures the statement descriptor about to be saved to options does not contain any invalid characters.
1220
+ *
1221
+ * @since 4.8.0
1222
+ * @param $settings WC_Settings_API settings to be filtered
1223
+ * @return Filtered settings
1224
+ */
1225
+ public function settings_api_sanitized_fields( $settings ) {
1226
+ if ( is_array( $settings ) ) {
1227
+ if ( array_key_exists( 'statement_descriptor', $settings ) ) {
1228
+ $settings['statement_descriptor'] = WC_Stripe_Helper::clean_statement_descriptor( $settings['statement_descriptor']);
1229
+ }
1230
+ }
1231
+ return $settings;
1232
+ }
1233
  }
includes/class-wc-stripe-helper.php CHANGED
@@ -451,19 +451,26 @@ class WC_Stripe_Helper {
451
  /**
452
  * Sanitize statement descriptor text.
453
  *
454
- * Stripe requires max of 22 characters and no
455
- * special characters with ><"'.
456
  *
457
  * @since 4.0.0
458
  * @param string $statement_descriptor
459
  * @return string $statement_descriptor Sanitized statement descriptor
460
  */
461
  public static function clean_statement_descriptor( $statement_descriptor = '' ) {
462
- $disallowed_characters = array( '<', '>', '"', "'" );
463
 
464
- // Remove special characters.
 
 
 
 
 
 
 
465
  $statement_descriptor = str_replace( $disallowed_characters, '', $statement_descriptor );
466
 
 
467
  $statement_descriptor = substr( trim( $statement_descriptor ), 0, 22 );
468
 
469
  return $statement_descriptor;
451
  /**
452
  * Sanitize statement descriptor text.
453
  *
454
+ * Stripe requires max of 22 characters and no special characters.
 
455
  *
456
  * @since 4.0.0
457
  * @param string $statement_descriptor
458
  * @return string $statement_descriptor Sanitized statement descriptor
459
  */
460
  public static function clean_statement_descriptor( $statement_descriptor = '' ) {
461
+ $disallowed_characters = array( '<', '>', '\\', '*', '"', "'", '/', '(', ')', '{', '}' );
462
 
463
+ // Strip any tags.
464
+ $statement_descriptor = strip_tags( $statement_descriptor );
465
+
466
+ // Strip any HTML entities.
467
+ // Props https://stackoverflow.com/questions/657643/how-to-remove-html-special-chars .
468
+ $statement_descriptor = preg_replace( "/&#?[a-z0-9]{2,8};/i", "", $statement_descriptor );
469
+
470
+ // Next, remove any remaining disallowed characters.
471
  $statement_descriptor = str_replace( $disallowed_characters, '', $statement_descriptor );
472
 
473
+ // Trim any whitespace at the ends and limit to 22 characters.
474
  $statement_descriptor = substr( trim( $statement_descriptor ), 0, 22 );
475
 
476
  return $statement_descriptor;
includes/class-wc-stripe-webhook-handler.php CHANGED
@@ -104,7 +104,7 @@ class WC_Stripe_Webhook_Handler extends WC_Stripe_Payment_Gateway {
104
  // Verify the timestamp.
105
  $timestamp = intval( $matches['timestamp'] );
106
  if ( abs( $timestamp - time() ) > 5 * MINUTE_IN_SECONDS ) {
107
- return;
108
  }
109
 
110
  // Generate the expected signature.
104
  // Verify the timestamp.
105
  $timestamp = intval( $matches['timestamp'] );
106
  if ( abs( $timestamp - time() ) > 5 * MINUTE_IN_SECONDS ) {
107
+ return false;
108
  }
109
 
110
  // Generate the expected signature.
languages/woocommerce-gateway-stripe.pot CHANGED
@@ -1,15 +1,15 @@
1
- # Copyright (C) 2020 WooCommerce
2
  # This file is distributed under the same license as the WooCommerce Stripe Gateway package.
3
  msgid ""
4
  msgstr ""
5
- "Project-Id-Version: WooCommerce Stripe Gateway 4.7.0\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://wordpress.org/support/plugin/woocommerce-gateway-stripe\n"
8
- "POT-Creation-Date: 2020-12-22 16:57:55+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
- "PO-Revision-Date: 2020-MO-DA HO:MI+ZONE\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
  "X-Generator: node-wp-i18n 1.2.3\n"
@@ -63,7 +63,7 @@ msgid "Stripe charge complete (Charge ID: %s)"
63
  msgstr ""
64
 
65
  #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:455
66
- #: includes/class-wc-gateway-stripe.php:496
67
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:185
68
  msgid "Payment processing failed. Please retry."
69
  msgstr ""
@@ -79,16 +79,16 @@ msgstr ""
79
  msgid "Invalid payment method. Please input a new card number."
80
  msgstr ""
81
 
82
- #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:910
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:910
88
  msgid "Pre-Authorization Released"
89
  msgstr ""
90
 
91
- #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:928
92
  msgid "There was a problem adding the payment method."
93
  msgstr ""
94
 
@@ -693,8 +693,9 @@ msgstr ""
693
  #: includes/admin/stripe-settings.php:133
694
  msgid ""
695
  "Statement descriptors are limited to 22 characters, cannot use the special "
696
- "characters >, <, \", \\, ', *, and must not consist solely of numbers. This "
697
- "will appear on your customer's statement in capital letters."
 
698
  msgstr ""
699
 
700
  #: includes/admin/stripe-settings.php:138
@@ -893,14 +894,14 @@ msgid ""
893
  "details to Stripe for verification."
894
  msgstr ""
895
 
896
- #: includes/class-wc-gateway-stripe.php:180
897
  #. translators: 1) Opening anchor tag 2) closing anchor tag
898
  msgid ""
899
  "If your billing address has been changed for saved payment methods, be sure "
900
  "to remove any %1$ssaved payment methods%2$s on file and re-add them."
901
  msgstr ""
902
 
903
- #: includes/class-wc-gateway-stripe.php:257
904
  #. translators: link to Stripe testing page
905
  msgid ""
906
  "TEST MODE ENABLED. In test mode, you can use the card number "
@@ -909,73 +910,83 @@ msgid ""
909
  "card numbers."
910
  msgstr ""
911
 
912
- #: includes/class-wc-gateway-stripe.php:296
913
  msgid "Credit or debit card"
914
  msgstr ""
915
 
916
- #: includes/class-wc-gateway-stripe.php:304
917
  msgid "Card Number"
918
  msgstr ""
919
 
920
- #: includes/class-wc-gateway-stripe.php:315
921
  msgid "Expiry Date"
922
  msgstr ""
923
 
924
- #: includes/class-wc-gateway-stripe.php:323
925
  msgid "Card Code (CVC)"
926
  msgstr ""
927
 
928
- #: includes/class-wc-gateway-stripe.php:408
 
 
 
 
 
 
 
 
 
 
929
  msgid "Please accept the terms and conditions first"
930
  msgstr ""
931
 
932
- #: includes/class-wc-gateway-stripe.php:409
933
  msgid "Please fill in required checkout fields first"
934
  msgstr ""
935
 
936
- #: includes/class-wc-gateway-stripe.php:438
937
- #: includes/class-wc-gateway-stripe.php:483
938
  msgid ""
939
  "Sorry, we're not accepting prepaid cards at this time. Your credit card has "
940
  "not been charged. Please try with alternative payment method."
941
  msgstr ""
942
 
943
- #: includes/class-wc-gateway-stripe.php:439
944
  msgid "Please enter your IBAN account name."
945
  msgstr ""
946
 
947
- #: includes/class-wc-gateway-stripe.php:440
948
  msgid "Please enter your IBAN account number."
949
  msgstr ""
950
 
951
- #: includes/class-wc-gateway-stripe.php:441
952
  msgid "We couldn't initiate the payment. Please try again."
953
  msgstr ""
954
 
955
- #: includes/class-wc-gateway-stripe.php:452
956
  msgid "Billing First Name and Last Name are required."
957
  msgstr ""
958
 
959
- #: includes/class-wc-gateway-stripe.php:724
960
  #. translators: error message
961
  msgid "This represents the fee Stripe collects for the transaction."
962
  msgstr ""
963
 
964
- #: includes/class-wc-gateway-stripe.php:725
965
  msgid "Stripe Fee:"
966
  msgstr ""
967
 
968
- #: includes/class-wc-gateway-stripe.php:761
969
  msgid ""
970
  "This represents the net total that will be credited to your Stripe bank "
971
  "account. This may be in the currency that is set in your Stripe account."
972
  msgstr ""
973
 
974
- #: includes/class-wc-gateway-stripe.php:762
975
  msgid "Stripe Payout:"
976
  msgstr ""
977
 
978
- #: includes/class-wc-gateway-stripe.php:825
979
  #: includes/class-wc-stripe-order-handler.php:158
980
  #: includes/class-wc-stripe-webhook-handler.php:233
981
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:284
@@ -986,7 +997,7 @@ msgid ""
986
  "later."
987
  msgstr ""
988
 
989
- #: includes/class-wc-gateway-stripe.php:878
990
  msgid ""
991
  "Almost there!\n"
992
  "\n"
@@ -994,36 +1005,36 @@ msgid ""
994
  "done is for you to authorize the payment with your bank."
995
  msgstr ""
996
 
997
- #: includes/class-wc-gateway-stripe.php:1119
998
  #: includes/class-wc-stripe-webhook-handler.php:674
999
  #: includes/class-wc-stripe-webhook-handler.php:713
1000
  #. translators: 1) The error message that was received from Stripe.
1001
  msgid "Stripe SCA authentication failed. Reason: %s"
1002
  msgstr ""
1003
 
1004
- #: includes/class-wc-gateway-stripe.php:1120
1005
  msgid "Stripe SCA authentication failed."
1006
  msgstr ""
1007
 
1008
- #: includes/class-wc-gateway-stripe.php:1177
1009
  msgid ""
1010
  "The \"Live Publishable Key\" should start with \"pk_live\", enter the "
1011
  "correct key."
1012
  msgstr ""
1013
 
1014
- #: includes/class-wc-gateway-stripe.php:1185
1015
  msgid ""
1016
  "The \"Live Secret Key\" should start with \"sk_live\" or \"rk_live\", enter "
1017
  "the correct key."
1018
  msgstr ""
1019
 
1020
- #: includes/class-wc-gateway-stripe.php:1193
1021
  msgid ""
1022
  "The \"Test Publishable Key\" should start with \"pk_test\", enter the "
1023
  "correct key."
1024
  msgstr ""
1025
 
1026
- #: includes/class-wc-gateway-stripe.php:1201
1027
  msgid ""
1028
  "The \"Test Secret Key\" should start with \"sk_test\" or \"rk_test\", enter "
1029
  "the correct key."
1
+ # Copyright (C) 2021 WooCommerce
2
  # This file is distributed under the same license as the WooCommerce Stripe Gateway package.
3
  msgid ""
4
  msgstr ""
5
+ "Project-Id-Version: WooCommerce Stripe Gateway 4.8.0\n"
6
  "Report-Msgid-Bugs-To: "
7
  "https://wordpress.org/support/plugin/woocommerce-gateway-stripe\n"
8
+ "POT-Creation-Date: 2021-01-28 19:54:35+00:00\n"
9
  "MIME-Version: 1.0\n"
10
  "Content-Type: text/plain; charset=utf-8\n"
11
  "Content-Transfer-Encoding: 8bit\n"
12
+ "PO-Revision-Date: 2021-MO-DA HO:MI+ZONE\n"
13
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
  "Language-Team: LANGUAGE <LL@li.org>\n"
15
  "X-Generator: node-wp-i18n 1.2.3\n"
63
  msgstr ""
64
 
65
  #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:455
66
+ #: includes/class-wc-gateway-stripe.php:508
67
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:185
68
  msgid "Payment processing failed. Please retry."
69
  msgstr ""
79
  msgid "Invalid payment method. Please input a new card number."
80
  msgstr ""
81
 
82
+ #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:917
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:917
88
  msgid "Pre-Authorization Released"
89
  msgstr ""
90
 
91
+ #: includes/abstracts/abstract-wc-stripe-payment-gateway.php:935
92
  msgid "There was a problem adding the payment method."
93
  msgstr ""
94
 
693
  #: includes/admin/stripe-settings.php:133
694
  msgid ""
695
  "Statement descriptors are limited to 22 characters, cannot use the special "
696
+ "characters >, <, \", \\, ', *, /, (, ), {, }, and must not consist solely "
697
+ "of numbers. This will appear on your customer's statement in capital "
698
+ "letters."
699
  msgstr ""
700
 
701
  #: includes/admin/stripe-settings.php:138
894
  "details to Stripe for verification."
895
  msgstr ""
896
 
897
+ #: includes/class-wc-gateway-stripe.php:181
898
  #. translators: 1) Opening anchor tag 2) closing anchor tag
899
  msgid ""
900
  "If your billing address has been changed for saved payment methods, be sure "
901
  "to remove any %1$ssaved payment methods%2$s on file and re-add them."
902
  msgstr ""
903
 
904
+ #: includes/class-wc-gateway-stripe.php:258
905
  #. translators: link to Stripe testing page
906
  msgid ""
907
  "TEST MODE ENABLED. In test mode, you can use the card number "
910
  "card numbers."
911
  msgstr ""
912
 
913
+ #: includes/class-wc-gateway-stripe.php:297
914
  msgid "Credit or debit card"
915
  msgstr ""
916
 
917
+ #: includes/class-wc-gateway-stripe.php:305
918
  msgid "Card Number"
919
  msgstr ""
920
 
921
+ #: includes/class-wc-gateway-stripe.php:316
922
  msgid "Expiry Date"
923
  msgstr ""
924
 
925
+ #: includes/class-wc-gateway-stripe.php:324
926
  msgid "Card Code (CVC)"
927
  msgstr ""
928
 
929
+ #: includes/class-wc-gateway-stripe.php:359
930
+ msgid ""
931
+ "<strong>Warning:</strong> your site's time does not match the time on your "
932
+ "browser and may be incorrect. Some payment methods depend on webhook "
933
+ "verification and verifying webhooks with a signing secret depends on your "
934
+ "site's time being correct, so please check your site's time before setting "
935
+ "a webhook secret. You may need to contact your site's hosting provider to "
936
+ "correct the site's time."
937
+ msgstr ""
938
+
939
+ #: includes/class-wc-gateway-stripe.php:420
940
  msgid "Please accept the terms and conditions first"
941
  msgstr ""
942
 
943
+ #: includes/class-wc-gateway-stripe.php:421
944
  msgid "Please fill in required checkout fields first"
945
  msgstr ""
946
 
947
+ #: includes/class-wc-gateway-stripe.php:450
948
+ #: includes/class-wc-gateway-stripe.php:495
949
  msgid ""
950
  "Sorry, we're not accepting prepaid cards at this time. Your credit card has "
951
  "not been charged. Please try with alternative payment method."
952
  msgstr ""
953
 
954
+ #: includes/class-wc-gateway-stripe.php:451
955
  msgid "Please enter your IBAN account name."
956
  msgstr ""
957
 
958
+ #: includes/class-wc-gateway-stripe.php:452
959
  msgid "Please enter your IBAN account number."
960
  msgstr ""
961
 
962
+ #: includes/class-wc-gateway-stripe.php:453
963
  msgid "We couldn't initiate the payment. Please try again."
964
  msgstr ""
965
 
966
+ #: includes/class-wc-gateway-stripe.php:464
967
  msgid "Billing First Name and Last Name are required."
968
  msgstr ""
969
 
970
+ #: includes/class-wc-gateway-stripe.php:736
971
  #. translators: error message
972
  msgid "This represents the fee Stripe collects for the transaction."
973
  msgstr ""
974
 
975
+ #: includes/class-wc-gateway-stripe.php:737
976
  msgid "Stripe Fee:"
977
  msgstr ""
978
 
979
+ #: includes/class-wc-gateway-stripe.php:773
980
  msgid ""
981
  "This represents the net total that will be credited to your Stripe bank "
982
  "account. This may be in the currency that is set in your Stripe account."
983
  msgstr ""
984
 
985
+ #: includes/class-wc-gateway-stripe.php:774
986
  msgid "Stripe Payout:"
987
  msgstr ""
988
 
989
+ #: includes/class-wc-gateway-stripe.php:837
990
  #: includes/class-wc-stripe-order-handler.php:158
991
  #: includes/class-wc-stripe-webhook-handler.php:233
992
  #: includes/compat/class-wc-stripe-sepa-subs-compat.php:284
997
  "later."
998
  msgstr ""
999
 
1000
+ #: includes/class-wc-gateway-stripe.php:890
1001
  msgid ""
1002
  "Almost there!\n"
1003
  "\n"
1005
  "done is for you to authorize the payment with your bank."
1006
  msgstr ""
1007
 
1008
+ #: includes/class-wc-gateway-stripe.php:1131
1009
  #: includes/class-wc-stripe-webhook-handler.php:674
1010
  #: includes/class-wc-stripe-webhook-handler.php:713
1011
  #. translators: 1) The error message that was received from Stripe.
1012
  msgid "Stripe SCA authentication failed. Reason: %s"
1013
  msgstr ""
1014
 
1015
+ #: includes/class-wc-gateway-stripe.php:1132
1016
  msgid "Stripe SCA authentication failed."
1017
  msgstr ""
1018
 
1019
+ #: includes/class-wc-gateway-stripe.php:1189
1020
  msgid ""
1021
  "The \"Live Publishable Key\" should start with \"pk_live\", enter the "
1022
  "correct key."
1023
  msgstr ""
1024
 
1025
+ #: includes/class-wc-gateway-stripe.php:1197
1026
  msgid ""
1027
  "The \"Live Secret Key\" should start with \"sk_live\" or \"rk_live\", enter "
1028
  "the correct key."
1029
  msgstr ""
1030
 
1031
+ #: includes/class-wc-gateway-stripe.php:1205
1032
  msgid ""
1033
  "The \"Test Publishable Key\" should start with \"pk_test\", enter the "
1034
  "correct key."
1035
  msgstr ""
1036
 
1037
+ #: includes/class-wc-gateway-stripe.php:1213
1038
  msgid ""
1039
  "The \"Test Secret Key\" should start with \"sk_test\" or \"rk_test\", enter "
1040
  "the correct key."
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: credit card, stripe, apple pay, payment request, google pay, sepa, sofort,
4
  Requires at least: 4.4
5
  Tested up to: 5.5
6
  Requires PHP: 5.6
7
- Stable tag: 4.7.0
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
  Attributions: thorsten-stripe
@@ -126,13 +126,8 @@ If you get stuck, you can ask for help in the Plugin Forum.
126
 
127
  == Changelog ==
128
 
129
- = 4.7.0 - 2020-12-22 =
130
- * Fix - Updating subscription payment methods from the "My Account" page now adds a note to the subscription.
131
- * Fix - Link is now correctly formatted in readme.txt.
132
- * Fix - Using SCA cards for subscriptions renewal payments now works as intended.
133
- * Fix - Cards added under "My Account -> Payment Methods -> Add Payment Method" will now handle SCA properly.
134
- * Fix - Changing a payment method for a subscription in "My Account -> Subscriptions" will now handle SCA properly.
135
- * Fix - Missing space causing fatal errors for certain WooCommerce Inbox Note features.
136
 
137
- [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce-gateway-stripe/master/changelog.txt).
138
 
4
  Requires at least: 4.4
5
  Tested up to: 5.5
6
  Requires PHP: 5.6
7
+ Stable tag: 4.8.0
8
  License: GPLv3
9
  License URI: https://www.gnu.org/licenses/gpl-3.0.html
10
  Attributions: thorsten-stripe
126
 
127
  == Changelog ==
128
 
129
+ = 4.8.0 - 2021-01-28 =
130
+ * Fix - Filter more disallowed characters from statement descriptors.
 
 
 
 
 
131
 
132
+ [See changelog for all versions](https://raw.githubusercontent.com/woocommerce/woocommerce-gateway-stripe/trunk/changelog.txt).
133
 
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.7.0
9
  * Requires at least: 4.4
10
- * Tested up to: 5.5
11
  * WC requires at least: 3.0
12
- * WC tested up to: 4.3
13
  * Text Domain: woocommerce-gateway-stripe
14
  * Domain Path: /languages
15
  *
@@ -22,10 +22,10 @@ if ( ! defined( 'ABSPATH' ) ) {
22
  /**
23
  * Required minimums and constants
24
  */
25
- define( 'WC_STRIPE_VERSION', '4.7.0' ); // WRCS: DEFINED_VERSION.
26
  define( 'WC_STRIPE_MIN_PHP_VER', '5.6.0' );
27
  define( 'WC_STRIPE_MIN_WC_VER', '3.0' );
28
- define( 'WC_STRIPE_FUTURE_MIN_WC_VER', '3.0' );
29
  define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
30
  define( 'WC_STRIPE_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
31
  define( 'WC_STRIPE_PLUGIN_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
5
  * Description: Take credit card payments on your store using Stripe.
6
  * Author: WooCommerce
7
  * Author URI: https://woocommerce.com/
8
+ * Version: 4.8.0
9
  * Requires at least: 4.4
10
+ * Tested up to: 5.6
11
  * WC requires at least: 3.0
12
+ * WC tested up to: 4.9
13
  * Text Domain: woocommerce-gateway-stripe
14
  * Domain Path: /languages
15
  *
22
  /**
23
  * Required minimums and constants
24
  */
25
+ define( 'WC_STRIPE_VERSION', '4.8.0' ); // WRCS: DEFINED_VERSION.
26
  define( 'WC_STRIPE_MIN_PHP_VER', '5.6.0' );
27
  define( 'WC_STRIPE_MIN_WC_VER', '3.0' );
28
+ define( 'WC_STRIPE_FUTURE_MIN_WC_VER', '3.3' );
29
  define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
30
  define( 'WC_STRIPE_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
31
  define( 'WC_STRIPE_PLUGIN_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) );