Version Description
- 2021-11-16 =
- Feature - Add support for disabling funding methods
- Feature - Allow updating of expiration dates for credit cards in 'My Account'
- Tweak - Update 'device data' capture inner workings
See changelog for all versions.
=
Download this release
Release Info
Developer | automattic |
Plugin | WooCommerce PayPal Powered by Braintree Payment Gateway |
Version | 2.6.2 |
Comparing to | |
See all releases |
Code changes from version 2.6.1 to 2.6.2
- DEVELOPER.md +0 -62
- assets/css/frontend/wc-braintree.min.css +1 -1
- assets/images/button/connect-braintree.png +0 -0
- assets/images/button/connect-braintree@2x.png +0 -0
- assets/images/button/connect-braintree@3x.png +0 -0
- assets/js/frontend/wc-braintree-my-payment-methods.min.js +1 -0
- assets/js/frontend/wc-braintree.min.js +1 -1
- changelog.txt +249 -0
- class-wc-braintree.php +11 -1
- i18n/languages/woocommerce-gateway-paypal-powered-by-braintree.pot +101 -31
- includes/api/class-wc-braintree-api.php +18 -0
- includes/api/requests/class-wc-braintree-api-payment-method-request.php +17 -0
- includes/class-wc-braintree-my-payment-methods.php +222 -0
- includes/class-wc-gateway-braintree-credit-card.php +1 -1
- includes/class-wc-gateway-braintree-paypal.php +44 -10
- includes/class-wc-gateway-braintree.php +1 -1
- includes/payment-forms/abstract-wc-braintree-payment-form.php +4 -4
- includes/payment-forms/class-wc-braintree-paypal-payment-form.php +1 -3
- lib/ssl/api_braintreegateway_com.ca.crt +0 -0
- readme.txt +6 -242
- vendor/autoload.php +1 -1
- vendor/composer/ClassLoader.php +141 -14
- vendor/composer/InstalledVersions.php +340 -227
- vendor/composer/autoload_classmap.php +1 -0
- vendor/composer/autoload_real.php +8 -6
- vendor/composer/autoload_static.php +9 -4
- vendor/composer/installed.json +89 -83
- vendor/composer/installed.php +38 -39
- woocommerce-gateway-paypal-powered-by-braintree.php +1 -1
DEVELOPER.md
DELETED
@@ -1,62 +0,0 @@
|
|
1 |
-
# DEVELOPER.md
|
2 |
-
|
3 |
-
## Test cases
|
4 |
-
|
5 |
-
* Complete a purchase for a simple product using the Credit Card subflow
|
6 |
-
* Complete a purchase for a simple product using the PayPal subflow
|
7 |
-
|
8 |
-
* Complete a purchase for a simple subscription using the Credit Card subflow
|
9 |
-
* Using WCS_DEBUG and Tools > Scheduled Actions, run woocommerce_scheduled_subscription_payment for that subscription
|
10 |
-
|
11 |
-
* Complete a purchase for a simple subscription using the PayPal subflow
|
12 |
-
* Using WCS_DEBUG and Tools > Scheduled Actions, run woocommerce_scheduled_subscription_payment for that subscription
|
13 |
-
|
14 |
-
## Checkout Form Logic
|
15 |
-
|
16 |
-
* Since the payment methods can be refreshed as the user enters their billing and
|
17 |
-
shipping information, the extension's `script.js` periodically checks the state of the
|
18 |
-
form ( using `wcCheckPaypalBraintree` ) and loads ( `wcLoadPaypalBraintree` ) and
|
19 |
-
unloads ( `wcUnloadPaypalBraintree` ) PayPal Braintree as necessary.
|
20 |
-
|
21 |
-
### Hosted Fields Flow
|
22 |
-
|
23 |
-
* The credit card number, CVV and expiration date fields on the checkout form are emitted as
|
24 |
-
simple DIVs by WC_Gateway_Paypal_Braintree::payment_fields, and then the extension's `script.js`
|
25 |
-
wcLoadPaypalBraintree function calls `braintree.js` braintree.setup to take them over.
|
26 |
-
|
27 |
-
* braintree.setup replaces each of those three fields with a "hosted" iframe served by
|
28 |
-
braintreegateway.com - this means that the credit card number, CVV and expiration date entries
|
29 |
-
cannot be seen by the merchant's site's javascript and thus supports PCI compliance.
|
30 |
-
|
31 |
-
* When the user clicks the **Place Order** button on the checkout form, `braintree.js` intercepts
|
32 |
-
the click and requests a nonce (basically a payment token) for the credit card data the
|
33 |
-
user has entered. We detect that click as well and interrupt the form submittal that
|
34 |
-
would happen. Then, when the nonce request returns from Braintree, the nonce is saved
|
35 |
-
in a form hidden field ( `#paypalbraintree_nonce` ) and we submit the form.
|
36 |
-
|
37 |
-
### PayPal Button on Checkout Form (Checkout with PayPal) Flow
|
38 |
-
|
39 |
-
* If the customer would rather not enter their credit card, exp and CVV values, a PayPal
|
40 |
-
button is also injected into the form by `braintree.js`
|
41 |
-
* When the user clicks on the **PayPal** button on the checkout form, `braintree.js` intercepts
|
42 |
-
the click and displays a modal for the customer to sign in to PayPal to complete their payment. When
|
43 |
-
the customer completes sign in, a nonce is saved in a form hidden field ( `#paypalbraintree_nonce` )
|
44 |
-
and we submit the form.
|
45 |
-
* **NOTE: The currencies supported for Checkout with PayPal are limited compared to the Hosted Fields
|
46 |
-
flow. See https://developers.braintreepayments.com/guides/paypal/checkout-with-paypal/javascript/v2#currency-support **
|
47 |
-
|
48 |
-
## Debugging
|
49 |
-
|
50 |
-
### Checkout with PayPal Button Style Problems
|
51 |
-
|
52 |
-
* Unlike the hosted fields, the PayPal Button can pick up styles from the theme. The extension's
|
53 |
-
`styles.css` resets a few that Storefront was setting, in the context of the PayPal button, but
|
54 |
-
other themes may need additional styles to be reset.
|
55 |
-
|
56 |
-
### Errors during the PayPal Button on Checkout Form Flow
|
57 |
-
|
58 |
-
* If you get a 'Sorry we cannot connect to PayPal. Please try again in a few minutes. Try Again?' message
|
59 |
-
after clicking on the PayPal Button and signing in, open the Network tab in the browser's Developer Tools
|
60 |
-
and then click 'Try Again?' You will see a more detailed error message in the response to the GET request
|
61 |
-
there.
|
62 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
assets/css/frontend/wc-braintree.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
.woocommerce #wc_braintree_paypal_container,.woocommerce #wc_braintree_paypal_credit_container{margin-bottom:1em}.woocommerce #wc_braintree_paypal_container #braintree-paypal-button,.woocommerce #wc_braintree_paypal_container button,.woocommerce #wc_braintree_paypal_credit_container #braintree-paypal-button,.woocommerce #wc_braintree_paypal_credit_container button{box-shadow:none;margin-bottom:10px;background:none;border:none}.woocommerce #wc_braintree_paypal_container img,.woocommerce #wc_braintree_paypal_credit_container img{float:none!important;max-height:100%!important}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account{padding:1em 0;border-top:1px solid #bbb;border-bottom:1px solid #bbb}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account .name,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account .name{display:inline-block;margin-right:.5em;font-weight:700}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account .email,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account .email{opacity:.5}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account .cancel,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account .cancel{float:right}.woocommerce #payment div.payment_method_braintree_credit_card label.sv-wc-payment-gateway-payment-form-saved-payment-method,.woocommerce #payment div.payment_method_braintree_credit_card label[for=wc-braintree-credit-card-use-new-payment-method],.woocommerce #payment div.payment_method_braintree_credit_card label[for=wc-braintree-paypal-use-new-payment-method],.woocommerce #payment div.payment_method_braintree_paypal label.sv-wc-payment-gateway-payment-form-saved-payment-method,.woocommerce #payment div.payment_method_braintree_paypal label[for=wc-braintree-credit-card-use-new-payment-method],.woocommerce #payment div.payment_method_braintree_paypal label[for=wc-braintree-paypal-use-new-payment-method]{margin-left:3px}.woocommerce #payment div.payment_method_braintree_credit_card iframe{margin:0 0 0 6px}.woocommerce #payment div.payment_method_braintree_credit_card div.form-row{padding:3px}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field{height:3em;padding:3px;border:1px solid #ccc;border-radius:3px;transition:border-color .16s;-webkit-transition:border-color .16s;background-color:#fff}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-cc-plain.svg);background-repeat:no-repeat;background-position:99%;background-size:50px 31px}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-visa{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-visa.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-master-card{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-mastercard.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-american-express{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-amex.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-diners-club{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-dinersclub.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-maestro{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-maestro.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-jcb{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-jcb.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-discover{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-discover.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-invalid{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-cc-invalid.svg)}@media only screen and (max-width:320px){.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number{background-image:none}}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-focused{box-shadow:0 0 .1875em #3498db}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-focused.braintree-hosted-fields-invalid,.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-focused.braintree-hosted-fields-valid{box-shadow:0 0 .1875em #69bf29}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-valid{border-color:#69bf29}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-invalid{border-color:#a00}#wc-braintree-credit-card-3dsecure-container{display:none;position:fixed;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,.7);z-index:3000;cursor:pointer}#wc-braintree-credit-card-3dsecure-container iframe{overflow:auto;margin:auto;position:absolute;top:0;left:0;bottom:0;right:0;background:#fff;padding:1em;box-sizing:content-box;border-radius:5px}#add_payment_method ul.payment_methods li{list-style-type:none}#add_payment_method ul.payment_methods li label[for=payment_method_braintree_credit_card],#add_payment_method ul.payment_methods li label[for=payment_method_braintree_paypal]{line-height:2.3em}#add_payment_method ul.payment_methods li input[type=radio]#payment_method_braintree_credit_card,#add_payment_method ul.payment_methods li input[type=radio]#payment_method_braintree_paypal{margin-left:5px}#add_payment_method ul.payment_methods li img{vertical-align:middle;margin:3px 0 0 .5em;padding:0;position:relative;box-shadow:none}#add_payment_method ul.payment_methods li img+img{margin-left:2px}#add_payment_method ul.payment_methods li #braintree-paypal-loggedout img{max-height:none;margin:0}
|
1 |
+
.woocommerce #wc_braintree_paypal_container,.woocommerce #wc_braintree_paypal_credit_container{margin-bottom:1em}.woocommerce #wc_braintree_paypal_container #braintree-paypal-button,.woocommerce #wc_braintree_paypal_container button,.woocommerce #wc_braintree_paypal_credit_container #braintree-paypal-button,.woocommerce #wc_braintree_paypal_credit_container button{box-shadow:none;margin-bottom:10px;background:none;border:none}.woocommerce #wc_braintree_paypal_container img,.woocommerce #wc_braintree_paypal_credit_container img{float:none!important;max-height:100%!important}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account{padding:1em 0;border-top:1px solid #bbb;border-bottom:1px solid #bbb}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account .name,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account .name{display:inline-block;margin-right:.5em;font-weight:700}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account .email,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account .email{opacity:.5}.woocommerce #wc_braintree_paypal_container .wc-braintree-paypal-account .cancel,.woocommerce #wc_braintree_paypal_credit_container .wc-braintree-paypal-account .cancel{float:right}.woocommerce #payment div.payment_method_braintree_credit_card label.sv-wc-payment-gateway-payment-form-saved-payment-method,.woocommerce #payment div.payment_method_braintree_credit_card label[for=wc-braintree-credit-card-use-new-payment-method],.woocommerce #payment div.payment_method_braintree_credit_card label[for=wc-braintree-paypal-use-new-payment-method],.woocommerce #payment div.payment_method_braintree_paypal label.sv-wc-payment-gateway-payment-form-saved-payment-method,.woocommerce #payment div.payment_method_braintree_paypal label[for=wc-braintree-credit-card-use-new-payment-method],.woocommerce #payment div.payment_method_braintree_paypal label[for=wc-braintree-paypal-use-new-payment-method]{margin-left:3px}.woocommerce #payment div.payment_method_braintree_credit_card iframe{margin:0 0 0 6px}.woocommerce #payment div.payment_method_braintree_credit_card div.form-row{padding:3px}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field{height:3em;padding:3px;border:1px solid #ccc;border-radius:3px;transition:border-color .16s;-webkit-transition:border-color .16s;background-color:#fff}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-cc-plain.svg);background-repeat:no-repeat;background-position:99%;background-size:50px 31px}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-visa{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-visa.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-master-card{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-mastercard.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-american-express{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-amex.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-diners-club{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-dinersclub.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-maestro{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-maestro.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-jcb{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-jcb.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-discover{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-discover.svg)}.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number.card-type-invalid{background-image:url(../../../vendor/skyverge/wc-plugin-framework/woocommerce/payment-gateway/assets/images/card-cc-invalid.svg)}@media only screen and (max-width:320px){.woocommerce #payment div.payment_method_braintree_credit_card .wc-braintree-hosted-field-card-number{background-image:none}}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-focused{box-shadow:0 0 .1875em #3498db}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-focused.braintree-hosted-fields-invalid,.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-focused.braintree-hosted-fields-valid{box-shadow:0 0 .1875em #69bf29}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-valid{border-color:#69bf29}.woocommerce #payment div.payment_method_braintree_credit_card .braintree-hosted-fields-invalid{border-color:#a00}#wc-braintree-credit-card-3dsecure-container{display:none;position:fixed;top:0;left:0;bottom:0;right:0;background:rgba(0,0,0,.7);z-index:3000;cursor:pointer}#wc-braintree-credit-card-3dsecure-container iframe{overflow:auto;margin:auto;position:absolute;top:0;left:0;bottom:0;right:0;background:#fff;padding:1em;box-sizing:content-box;border-radius:5px}#add_payment_method ul.payment_methods li{list-style-type:none}#add_payment_method ul.payment_methods li label[for=payment_method_braintree_credit_card],#add_payment_method ul.payment_methods li label[for=payment_method_braintree_paypal]{line-height:2.3em}#add_payment_method ul.payment_methods li input[type=radio]#payment_method_braintree_credit_card,#add_payment_method ul.payment_methods li input[type=radio]#payment_method_braintree_paypal{margin-left:5px}#add_payment_method ul.payment_methods li img{vertical-align:middle;margin:3px 0 0 .5em;padding:0;position:relative;box-shadow:none}#add_payment_method ul.payment_methods li img+img{margin-left:2px}#add_payment_method ul.payment_methods li #braintree-paypal-loggedout img{max-height:none;margin:0}table.woocommerce-MyAccount-paymentMethods td.woocommerce-PaymentMethod--expires .edit.wc-braintree input{width:60px}
|
assets/images/button/connect-braintree.png
CHANGED
File without changes
|
assets/images/button/connect-braintree@2x.png
CHANGED
File without changes
|
assets/images/button/connect-braintree@3x.png
CHANGED
File without changes
|
assets/js/frontend/wc-braintree-my-payment-methods.min.js
ADDED
@@ -0,0 +1 @@
|
|
|
1 |
+
"use strict";var _createClass=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}();function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(function(){jQuery(document).ready(function(n){var a;function t(e){_classCallCheck(this,t);e=_possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return e.save_method=e.save_method.bind(e),e}return a=window.WC_Braintree_My_Payment_Methods_Handler=(_inherits(t,SV_WC_Payment_Methods_Handler_v5_10_7),_createClass(t,[{key:"save_method",value:function(e){var t,r,o=this;if(!function(e,t){if(!(e instanceof t))throw new Error("Bound instance method accessed before binding")}(this,a),e.preventDefault(),t=n(e.currentTarget),0!==(r=t.parents("tr")).find("input[name=plugin-id][value="+this.slug+"]").length)return this.block_ui(),r.next(".error").remove(),e={action:"wc_"+this.id+"_save_payment_method",nonce:this.ajax_nonce,token_id:r.find("input[name=token-id]").val(),data:r.find("input[name]").serialize()},n.post(this.ajax_url,e).done(function(e){return e.success?(null!=e.data.title&&r.find(".woocommerce-PaymentMethod--method").html(e.data.title),null!=e.data.expires&&r.find(".woocommerce-PaymentMethod--expires").html(e.data.expires),null!=e.data.nonce&&(o.ajax_nonce=e.data.nonce),t.siblings(".cancel-edit").removeClass("cancel-edit").addClass("edit").text(o.i18n.edit_button).addClass("button"),o.disable_editing_ui()):o.display_error(r,e.data)}).fail(function(e,t,n){return o.display_error(r,n)}).always(function(){return o.unblock_ui()})}}]),t),n(document.body).trigger("wc_braintree_my_payment_methods_handler_loaded")})}).call(void 0);
|
assets/js/frontend/wc-braintree.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
"use strict";var _get=function e(t,n,r){null===t&&(t=Function.prototype);var i=Object.getOwnPropertyDescriptor(t,n);if(void 0!==i){if("value"in i)return i.value;i=i.get;return void 0!==i?i.call(r):void 0}t=Object.getPrototypeOf(t);if(null!==t)return e(t,n,r)},_createClass=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}();function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(function(){function u(e,t){if(!(e instanceof t))throw new Error("Bound instance method accessed before binding")}var c=[].indexOf;jQuery(document).ready(function(s){var e,n,i;function t(e){_classCallCheck(this,t),this.show_integration_ui=this.show_integration_ui.bind(this),this.hide_integration_ui=this.hide_integration_ui.bind(this),this.id=e.id,this.id_dasherized=e.id_dasherized,this.name=e.name,this.type=e.type,this.debug=e.debug,this.client_token_nonce=e.client_token_nonce,this.ajax_url=e.ajax_url,this.integration_error_message=e.integration_error_message,this.payment_error_message=e.payment_error_message,this.params=window.sv_wc_payment_gateway_payment_form_params}function a(e){_classCallCheck(this,a);var t=_possibleConstructorReturn(this,(a.__proto__||Object.getPrototypeOf(a)).call(this,e));return t.show_integration_ui=t.show_integration_ui.bind(t),t.hide_integration_ui=t.hide_integration_ui.bind(t),t.csc_required=e.csc_required,t.hosted_fields_styles=e.hosted_fields_styles,t.threeds=e.threeds,t.enabled_card_types=e.enabled_card_types,t.init(),t}function r(e){_classCallCheck(this,r);var t=_possibleConstructorReturn(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,e));return t.do_integration_ready=t.do_integration_ready.bind(t),t.on_approve=t.on_approve.bind(t),t.get_linked_account_html=t.get_linked_account_html.bind(t),t.is_test_environment=e.is_test_environment,t.is_paypal_pay_later_enabled=e.is_paypal_pay_later_enabled,t.is_paypal_card_enabled=e.is_paypal_card_enabled,t.disabled_funding_options=e.paypal_disabled_funding_options,t.force_buyer_country=e.force_buyer_country,t.must_login_message=e.must_login_message,t.must_login_add_method_message=e.must_login_add_method_message,t.button_styles=e.button_styles,t.cart_payment_nonce=e.cart_payment_nonce,t.paypal_intent=e.paypal_intent,t.init(),t}function o(e){_classCallCheck(this,o);var t=_possibleConstructorReturn(this,(o.__proto__||Object.getPrototypeOf(o)).call(this,e));return t.is_paypal_card_enabled=!1,t.set_payment_method_nonce=e.set_payment_method_nonce,t.cart_handler_url=e.cart_handler_url,t.form=s("form.woocommerce-cart-form"),t.form_ui_selector="",t.setup_braintree(),s(document.body).on("updated_cart_totals",function(){return t.setup_braintree()}),t}function _(e){_classCallCheck(this,_);var t=_possibleConstructorReturn(this,(_.__proto__||Object.getPrototypeOf(_)).call(this,e));return t.do_integration_ready=t.do_integration_ready.bind(t),t.validate_product_button=t.validate_product_button.bind(t),t.validate_product_data=t.validate_product_data.bind(t),t.is_paypal_card_enabled=!1,t.product_checkout_nonce=e.product_checkout_nonce,t.product_checkout_url=e.product_checkout_url,t.is_product_page=e.is_product_page,t.validate_product_url=e.validate_product_url,t.validate_product_nonce=e.validate_product_nonce,t.should_validate_product_data=e.should_validate_product_data,t.form=s("form.woocommerce-cart-form"),t.form_ui_selector="",t.is_product_page&&t.handle_product_page(),t.setup_braintree(),s(document.body).on("updated_cart_totals",function(){return t.setup_braintree()}),t}return window.WC_Braintree_Payment_Form_Handler=(_createClass(t,[{key:"init",value:function(){return this.is_sdk_ready()?s("form.checkout").length?this.handle_checkout_page():s("form#order_review").length?this.handle_pay_page():s("form#add_payment_method").length?this.handle_add_payment_method_page():void 0:console.error("Braintree SDK is missing.")}},{key:"handle_checkout_page",value:function(){var e=this;return this.form=s("form.checkout"),this.form_ui_selector=".woocommerce-checkout-payment",s(document.body).on("updated_checkout",function(){if(!e.setting_up)return s('iframe[name^="braintree-"]').remove(),e.setup_braintree()}),s(document.body).on("updated_checkout",function(){return e.handle_saved_payment_methods()}),s(document.body).on("checkout_error",function(){return e.handle_checkout_error()}),this.form.on("checkout_place_order_"+this.id,function(){if(e.is_selected())return e.block_ui(),e.verify_form()})}},{key:"handle_checkout_error",value:function(){return this.unblock_ui()}},{key:"handle_pay_page",value:function(){var e=this;return this.form=s("form#order_review"),this.form_ui_selector="#payment",this.handle_saved_payment_methods(),this.setup_braintree(),this.form.submit(function(){if(e.is_selected())return e.block_ui(),e.verify_form()})}},{key:"handle_add_payment_method_page",value:function(){var e=this;return this.form=s("form#add_payment_method"),this.form_ui_selector="#payment",this.setup_braintree(),this.form.submit(function(){if(e.is_selected())return e.block_ui(),e.verify_form()})}},{key:"verify_form",value:function(){return!!this.using_payment_token()||!!this.has_payment_nonce()&&void 0}},{key:"submit_form",value:function(e){return s("input[name=wc_"+this.id+"_payment_nonce]").val(e),this.form.submit()}},{key:"handle_saved_payment_methods",value:function(){var n=this,e=s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form");if(s("input.js-wc-"+this.id_dasherized+"-payment-token").change(function(){return s("input.js-wc-"+n.id_dasherized+"-payment-token:checked").val()?e.slideUp(200):e.slideDown(200)}).change(),s("input#createaccount").change(function(e){var t=s("input.js-wc-"+n.id_dasherized+"-tokenize-payment-method").closest("p.form-row");return s(e.target).is(":checked")?(t.slideDown(),t.next().show()):(t.hide(),t.next().hide())}),!s("input#createaccount").is(":checked"))return s("input#createaccount").change()}},{key:"setup_braintree",value:function(){if(!s("#wc-"+this.id_dasherized+"-account-number-hosted iframe").data("ready"))return this.setting_up=!0,this.block_ui(),s("input[name=wc_"+this.id+"_payment_nonce]").val(""),this.create_client()}},{key:"create_client",value:function(){var r=this;return this.log("Creating client."),this.get_client_token().done(function(e){return e.success?braintree.client.create({authorization:e.data}).then(function(e){return r.client=e,r.log("Client ready."),r.setup_integration()}).catch(function(e){return r.handle_integration_error(e),r.unblock_ui()}):r.handle_integration_error(e.data)}).fail(function(e,t,n){return r.handle_integration_error({message:"Could not retrieve the client token via AJAX: "+n}),r.unblock_ui()})}},{key:"get_client_token",value:function(){this.id;var e={action:"wc_"+this.id+"_get_client_token",nonce:this.client_token_nonce};return s.post(this.ajax_url,e)}},{key:"setup_integration",value:function(){var t=this;return this.log("Creating integration."),this.get_integration_class().create(this.get_integration_options()).then(function(e){return t.integration=e,t.show_integration_ui(),s("#wc-"+t.id_dasherized+"-account-number-hosted iframe").data("ready",!0),t.do_integration_ready(),s(document).trigger("wc_"+t.id+"_integration_ready",t.integration),t.log("Integration ready."),t.setting_up=!1}).catch(function(e){return t.handle_integration_error(e),t.unblock_ui(),t.setting_up=!1})}},{key:"refresh_braintree",value:function(){var e=this;if(null!=this.integration&&!this.refreshing&&!this.setting_up)return this.log("Refreshing integration."),this.refreshing=!0,this.block_ui(),this.integration.teardown(function(){return e.integration=null,e.refreshing=!1,e.setup_braintree()})}},{key:"teardown_braintree",value:function(){var e=this;if(null!=this.integration&&!this.tearing_down&&!this.setting_up)return this.log("Tearing down integration."),this.tearing_down=!0,this.block_ui(),this.integration.teardown(function(){return e.integration=null,e.tearing_down=!1,e.unblock_ui()})}},{key:"do_integration_ready",value:function(){}},{key:"get_integration_options",value:function(){return{client:this.client}}},{key:"get_integration_class",value:function(){}},{key:"handle_integration_error",value:function(e){return this.log("Integration error. "+e.message,e,"error"),this.hide_integration_ui(),this.unblock_ui()}},{key:"handle_payment_error",value:function(e){return this.log("Payment error. "+e.message,e,"error"),this.render_error(this.get_user_message(e)),this.unblock_ui()}},{key:"render_error",value:function(e){return s(".woocommerce-error, .woocommerce-message").remove(),this.form.prepend('<div class="woocommerce-error">'+e+"</div>").removeClass("processing").unblock(),s("html, body").animate({scrollTop:this.form.offset().top-100},1e3),s("input[name=wc_"+this.id+"_payment_nonce]").val(""),this.form.trigger("wc_"+this.id+"_rendered_error"),s(document.body).trigger("checkout_error"),this.unblock_ui()}},{key:"get_user_message",value:function(){return this.payment_error_message}},{key:"show_integration_ui",value:function(){if(s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").find(".woocommerce-error").remove(),s("input#createaccount").length&&s("input#createaccount").is(":checked"))return s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").find(".form-row").show()}},{key:"hide_integration_ui",value:function(){return s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").prepend('<div class="woocommerce-error">'+this.integration_error_message+"</div>"),s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").find(".form-row").hide()}},{key:"block_ui",value:function(){return s(this.form_ui_selector).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})}},{key:"unblock_ui",value:function(){return s(this.form_ui_selector).unblock()}},{key:"is_selected",value:function(){return this.get_selected_gateway_id()===this.id}},{key:"is_sdk_ready",value:function(){return"undefined"!=typeof braintree&&null!==braintree&&null!=braintree.client&&null!=this.get_integration_class()}},{key:"has_payment_nonce",value:function(){return this.form.find("input[name=wc_"+this.id+"_payment_nonce]").val()}},{key:"using_payment_token",value:function(){return this.form.find("input.js-wc-"+this.id_dasherized+"-payment-token:checked").val()}},{key:"get_selected_gateway_id",value:function(){return this.form.find("input[name=payment_method]:checked").val()}},{key:"log",value:function(e,t){t=1<arguments.length&&void 0!==t?t:null;if(this.debug)return console.log(this.name+": "+e),t?console.log(t):void 0}}]),t),s(document.body).trigger("wc_braintree_payment_form_handler_loaded"),e=window.WC_Braintree_Credit_Card_Payment_Form_Handler=(_inherits(a,WC_Braintree_Payment_Form_Handler),_createClass(a,[{key:"handle_checkout_error",value:function(){return _get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"handle_checkout_error",this).call(this),s("input[name=wc_"+this.id+"_payment_nonce]").val(""),s("input[name=wc-"+this.id_dasherized+"-card-type]").val(""),s("input[name=wc-"+this.id_dasherized+"-3d-secure-verified]").val(0)}},{key:"verify_form",value:function(){var e;return this.has_payment_nonce()||!this.csc_required&&this.using_payment_token()?(e=s("input.js-wc-braintree-credit-card-payment-token:checked"),this.should_verify_3d_secure_token(e)?(this.verify_3d_secure(e.data("nonce"),null,e),!1):_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"verify_form",this).call(this)):(this.tokenize_payment(),!1)}},{key:"tokenize_payment",value:function(){var t=this;return this.integration.tokenize().then(function(e){if(t.log("Payment method received.",e),null!=e.nonce&&null!=e.details&&null!=e.details.bin)return t.should_verify_3d_secure(e)?t.verify_3d_secure(e.nonce,e.details.bin):t.submit_form(e.nonce)}).catch(function(e){return t.handle_payment_error(e)})}},{key:"get_integration_options",value:function(){var e={client:this.client,fields:{number:{selector:"#wc-braintree-credit-card-account-number-hosted",placeholder:s("#wc-braintree-credit-card-account-number-hosted").data("placeholder")},cvv:{selector:"#wc-braintree-credit-card-csc-hosted",placeholder:s("#wc-braintree-credit-card-csc-hosted").data("placeholder")},expirationDate:{selector:"#wc-braintree-credit-card-expiry-hosted",placeholder:s("#wc-braintree-credit-card-expiry-hosted").data("placeholder")}},styles:this.hosted_fields_styles};return this.csc_required&&this.using_payment_token()&&(delete e.fields.number,delete e.fields.expirationDate),this.csc_required||delete e.fields.cvv,e}},{key:"get_integration_class",value:function(){return braintree.hostedFields}},{key:"do_integration_ready",value:function(){var t=this;return this.integration.on("cardTypeChange",function(e){return t.on_card_type_change(e)}),!this.csc_required&&s("input.js-wc-braintree-credit-card-payment-token:checked").val()&&this.teardown_braintree(),this.unblock_ui()}},{key:"handle_saved_payment_methods",value:function(){var e,t,n=this;return _get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"handle_saved_payment_methods",this).call(this),t=s("div.js-wc-braintree-credit-card-new-payment-method-form"),e=s("div.wc-braintree-hosted-field-card-csc-parent"),s("input.js-wc-braintree-credit-card-payment-token").change(function(){return s("input.js-wc-braintree-credit-card-payment-token:checked").val()?n.csc_required&&e.hasClass("form-row-last")?(e.removeClass("form-row-last").addClass("form-row-first"),t.after(e),n.refresh_braintree()):void 0:(n.csc_required&&e.hasClass("form-row-first")&&(e.removeClass("form-row-first").addClass("form-row-last"),t.find("div.wc-braintree-hosted-field-card-expiry-parent").after(e)),n.refresh_braintree())}).change()}},{key:"get_user_message",value:function(e){var t,n,r,i=[];if("CUSTOMER"===e.type)switch(e.code){case"HOSTED_FIELDS_FIELDS_EMPTY":this.csc_required&&i.push(this.params.cvv_missing),this.using_payment_token()||(i.push(this.params.card_number_missing),i.push(this.params.card_exp_date_invalid));break;case"HOSTED_FIELDS_FIELDS_INVALID":if(null!=e.details)for(t=0,n=(r=e.details.invalidFieldKeys).length;t<n;t++)switch(r[t]){case"number":i.push(this.params.card_number_invalid);break;case"cvv":i.push(this.params.cvv_length_invalid);break;case"expirationDate":i.push(this.params.card_exp_date_invalid)}}else"NETWORK"===e.type&&null!=e.details.originalError.error.message&&(e=e.details.originalError.error.message,/given name format is invalid/.test(e)&&i.push(this.params.first_name_unsupported_characters),/surname format is invalid/.test(e)&&i.push(this.params.last_name_unsupported_characters));return i.length?i.join("<br/>"):_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"get_user_message",this).call(this)}},{key:"on_card_type_change",value:function(e){var t,n;if(null!=e.cards)return(t=s("#wc-braintree-credit-card-account-number-hosted")).attr("class",function(e,t){return t.replace(/(^|\s)card-type-\S+/g,"")}),e.cards.length?1===e.cards.length?(n=e.cards[0],s("input[name=wc-"+this.id_dasherized+"-card-type]").val(n.type),null!=n.type&&(e=n.type,0<=c.call(this.enabled_card_types,e))?t.addClass("card-type-"+n.type):t.addClass("card-type-invalid")):void 0:t.addClass("card-type-invalid")}},{key:"is_3d_secure_enabled",value:function(){return this.threeds.enabled&&null!=braintree.threeDSecure}},{key:"setup_integration",value:function(){var t=this;return this.threeds.enabled&&(this.threeds.enabled=this.client.getConfiguration().gatewayConfiguration.threeDSecureEnabled),this.is_3d_secure_enabled()?(s("input[name=wc-"+this.id_dasherized+"-3d-secure-enabled]").val(1),this.threeDSecure&&this.threeDSecure.teardown(),braintree.threeDSecure.create({version:2,client:this.client}).then(function(e){return t.threeDSecure=e,s(document.body).on("click","#wc-braintree-credit-card-3dsecure-container",function(e){return s(e.currentTarget).fadeOut(200),t.threeDSecure.cancelVerifyCard(),t.unblock_ui()}),_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"setup_integration",t).call(t)}).catch(function(e){return t.handle_integration_error(e)})):_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"setup_integration",this).call(this)}},{key:"should_verify_3d_secure",value:function(e){var t=e.details.cardType;return this.is_3d_secure_enabled()&&"CreditCard"===e.type&&0<=c.call(this.threeds.card_types,t)}},{key:"should_verify_3d_secure_token",value:function(e){if(this.is_3d_secure_enabled()&&e.val()&&e.data("nonce")&&!e.data("verified"))return!0}},{key:"verify_3d_secure",value:function(e,t,n){var r=this,i=2<arguments.length&&void 0!==n?n:null,a=s("#billing_state").val(),o=s("#billing_country").val(),_=s("#shipping_state").val(),n=s("#shipping_country").val(),o=s("input[name=billing_first_name]").val()?{givenName:s("input[name=billing_first_name]").val().latinise(),surname:s("input[name=billing_last_name]").val().latinise(),phoneNumber:s("input[name=billing_phone]").val(),streetAddress:s("input[name=billing_address_1]").val(),extendedAddress:s("input[name=billing_address_2]").val(),locality:s("#billing_city").val(),region:"string"==typeof a&&a.length<=2?a:"",postalCode:s("input[name=billing_postcode]").val(),countryCodeAlpha2:"string"==typeof o&&o.length<=2?o:""}:{},n=s("input[name=shipping_first_name]").val()?{shippingGivenName:s("input[name=shipping_first_name]").val().latinise(),shippingSurname:s("input[name=shipping_last_name]").val().latinise(),shippingAddress:{streetAddress:s("input[name=shipping_address_1]").val(),extendedAddress:s("input[name=shipping_address_2]").val(),locality:s("input[name=shipping_city]").val(),region:"string"==typeof _&&_.length<=2?_:"",postalCode:s("input[name=shipping_postcode]").val(),countryCodeAlpha2:"string"==typeof n&&n.length<=2?n:""}}:{},n={nonce:e,amount:s("input[name=wc-"+this.id_dasherized+"-3d-secure-order-total]").val(),email:s("input[name=billing_email]").val(),billingAddress:o,additionalInformation:n,onLookupComplete:function(e,t){r.log("3D Secure lookup complete.",e);try{return t()}catch(e){return r.handle_payment_error(e)}}};return"1"===s("input[name=wc-"+this.id_dasherized+"-cart-contains-subscription]").val()&&(n.challengeRequested=!0),this.log("Verifying 3D Secure.",n),this.threeDSecure.verifyCard(n).then(function(e){return r.log("3D Secure response received.",e),r.threeds.liability_shift_always_required&&!e.liabilityShifted?r.render_error(r.threeds.failure_message):(null!=i&&i.data("verified",!0),s("input[name=wc-"+r.id_dasherized+"-3d-secure-verified]").val(1),r.submit_form(e.nonce))}).catch(function(e){return r.handle_payment_error(e)})}},{key:"show_integration_ui",value:function(){return u(this,e),_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"show_integration_ui",this).call(this),s(".wc-braintree-hosted-field-parent").show()}},{key:"hide_integration_ui",value:function(){return u(this,e),_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"hide_integration_ui",this).call(this),s(".wc-braintree-hosted-field-parent").hide()}}]),a),s(document.body).trigger("wc_braintree_credit_card_payment_form_handler_loaded"),n=window.WC_Braintree_PayPal_Payment_Form_Handler=(_inherits(r,WC_Braintree_Payment_Form_Handler),_createClass(r,[{key:"init",value:function(){var t=this;return _get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"init",this).call(this),s("input[name=wc_"+this.id+"_payment_nonce]").val(this.cart_payment_nonce),s(document.body).on("click",'input[name="payment_method"], input.js-wc-braintree-paypal-payment-token',function(){return t.toggle_order_button()}),s(document.body).on("payment_method_selected",function(){return t.toggle_order_button()}),s(document.body).on("click",".wc-braintree-paypal-account .cancel",function(e){return e.preventDefault(),s(e.currentTarget).parent().remove(),t.setup_braintree()}),s(document.body).on("update_checkout",function(e){return t.teardown_braintree()})}},{key:"toggle_order_button",value:function(){return!this.is_selected()||this.has_payment_nonce()||this.using_payment_token()?s("#place_order").show():s("#place_order").hide()}},{key:"verify_form",value:function(){var e=_get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"verify_form",this).call(this);return this.has_payment_nonce()||this.using_payment_token()||this.render_error(this.must_login_message),e}},{key:"handle_payment_error",value:function(e){return _get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"handle_payment_error",this).call(this,e),this.cart_payment_nonce=!1,this.setup_braintree()}},{key:"get_integration_class",value:function(){return braintree.paypalCheckout}},{key:"setup_braintree",value:function(){return this.cart_payment_nonce?this.unblock_ui():(_get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"setup_braintree",this).call(this),s("input.js-wc-braintree-paypal-tokenize-payment-method").prop("disabled",!1),this.toggle_order_button())}},{key:"do_integration_ready",value:function(){return u(this,n),this.cart_payment_nonce?this.unblock_ui():(this.load_paypal_sdk(),this.set_device_data())}},{key:"load_paypal_sdk",value:function(){var e,t=this,n=this.get_sdk_options();return this.paypal_sdk_loaded&&this.previous_paypal_sdk_options&&JSON.stringify(this.previous_paypal_sdk_options)===JSON.stringify(n)?this.do_paypal_sdk_loaded():(e=n,this.paypal_sdk_messages_component_loaded&&(e.components="buttons"),this.integration.loadPayPalSDK(e,function(){return t.paypal_sdk_loaded=!0,t.previous_paypal_sdk_options=n,paypal.Messages&&(t.paypal_sdk_messages_component_loaded=!0),t.do_paypal_sdk_loaded()}))}},{key:"do_paypal_sdk_loaded",value:function(){var t=this,e=this.is_single_use()?"checkout":"vault";return this.render_pay_later_messaging(),this.render_button(this.integration.createPayment({flow:e,intent:this.is_single_use()?this.paypal_intent:"tokenize",amount:this.get_order_amount(),currency:this.get_store_currency(),locale:this.get_store_locale()}),this.get_button_styles(),"#wc_braintree_paypal_container").then(function(){return"undefined"===t.get_button_styles().height&&s("#wc_braintree_paypal_container").css({width:"100%"}),t.unblock_ui()}).catch(function(e){return t.log("Could not render the PayPal button. "+e.message,e),t.hide_integration_ui(),t.unblock_ui()})}},{key:"render_pay_later_messaging",value:function(){var t=this,e=s("#wc_braintree_paypal_pay_later_messaging_container");if(e.length)return paypal.Messages?paypal.Messages({amount:this.get_order_amount()}).render("#wc_braintree_paypal_pay_later_messaging_container").catch(function(e){return t.log("Could not render the PayPal Pay Later messeging. "+e.message,e)}):e.hide()}},{key:"render_button",value:function(e,t,n){var r=this;return s(n).html(""),t={env:this.is_test_environment?"sandbox":"production",commit:this.button_is_pay_now(),style:t,onApprove:function(e,t){return r.on_approve(e,t)},onError:function(e){return r.handle_integration_error(e)}},this.is_single_use()?t.createOrder=function(){return e}:t.createBillingAgreement=function(){return e},paypal.Buttons(t).render(n)}},{key:"button_is_pay_now",value:function(){return!s("form#add_payment_method").length}},{key:"get_button_styles",value:function(){return this.button_styles}},{key:"on_approve",value:function(e){var t=this;return u(this,n),this.block_ui(),this.integration.tokenizePayment(e).then(function(e){return t.log("Payment method tokenized.",e),t.set_payment_method(e)}).catch(function(e){return t.handle_payment_error(e),t.unblock_ui()})}},{key:"set_payment_method",value:function(e){return s("input[name=wc_"+this.id+"_payment_nonce]").val(e.nonce),s("#wc_braintree_paypal_container").html(this.get_linked_account_html(e.details)),this.is_single_use()&&s("input.js-wc-braintree-paypal-tokenize-payment-method").prop("disabled",!0),s("#place_order").show(),this.form.submit()}},{key:"handle_saved_payment_methods",value:function(){var t=this;return _get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"handle_saved_payment_methods",this).call(this),s("input.js-wc-braintree-paypal-tokenize-payment-method").change(function(e){if(null!=t.integration&&s(e.target).is(":visible"))return t.block_ui(),t.do_integration_ready()}).change()}},{key:"get_linked_account_html",value:function(e){var t;return u(this,n),t=s("<div class='wc-"+this.id_dasherized+"-account'></div>"),null!=e.firstName&&null!=e.lastName&&t.append("<span class='name'>"+e.firstName+" "+e.lastName+"</span>"),t.append("<span class='email'>"+e.email+"</span>"),t.append("<a href='#' class='cancel'>Cancel</a>"),t}},{key:"is_single_use",value:function(){var e=s("input[name=wc-braintree-paypal-tokenize-payment-method]");return 0===e.length||("checkbox"===e.attr("type")?!e.is(":checked"):!e.val())}},{key:"get_order_amount",value:function(){return s("input[name=wc_braintree_paypal_amount]").val()}},{key:"get_store_currency",value:function(){return s("input[name=wc_braintree_paypal_currency]").val()}},{key:"get_store_locale",value:function(){return s("input[name=wc_braintree_paypal_locale]").val()}},{key:"get_sdk_options",value:function(){var e=[[],this.disabled_funding_options],t=e[0],n=e[1];return this.is_paypal_card_enabled||n.push("card"),(this.is_paypal_pay_later_enabled?t:n).push("paylater"),e={components:this.is_paypal_pay_later_enabled?"buttons,messages":"buttons",currency:this.get_store_currency(),intent:this.is_single_use()?this.paypal_intent:"tokenize",vault:!this.is_single_use(),commit:this.button_is_pay_now()},this.force_buyer_country&&(e["buyer-country"]=this.force_buyer_country),t.length&&(e["enable-funding"]=t.join(",")),n.length&&(e["disable-funding"]=n.join(",")),e}},{key:"set_device_data",value:function(){if(braintree&&braintree.dataCollector)return braintree.dataCollector.create({client:this.client,paypal:!0}).then(function(e){if(e&&e.deviceData)return s("#wc_braintree_paypal_device_data").val(e.deviceData)})}}]),r),s(document.body).trigger("wc_braintree_paypal_payment_form_handler_loaded"),window.WC_Braintree_PayPal_Cart_Handler=(_inherits(o,WC_Braintree_PayPal_Payment_Form_Handler),_createClass(o,[{key:"button_is_pay_now",value:function(){return!1}},{key:"set_payment_method",value:function(e){var t=this;if(null!=e.nonce)return e.wp_nonce=this.set_payment_method_nonce,s.ajax({type:"POST",url:this.cart_handler_url,data:e,dataType:"json"}).done(function(e){if(t.log("Cart response received.",e),null!=e.redirect_url)return window.location=e.redirect_url}).fail(function(e){return t.log("Error setting the PayPal cart data.",e,"error")}).always(function(){return t.unblock_ui()})}},{key:"is_single_use",value:function(){return"1"===s("input[name=wc_braintree_paypal_single_use]").val()}},{key:"has_payment_nonce",value:function(){return!1}}]),o),s(document.body).trigger("wc_braintree_paypal_cart_handler_loaded"),i=window.WC_Braintree_PayPal_Product_Button_Handler=(_inherits(_,WC_Braintree_PayPal_Payment_Form_Handler),_createClass(_,[{key:"handle_product_page",value:function(){return this.product_form={element:s("form.cart"),is_variable:s("form.cart").hasClass("variations_form")},this.should_validate_product_data&&this.product_form.element.on("change",this.validate_product_button),this.product_form.is_variable&&s(document.body).on("woocommerce_variation_has_changed",this.validate_product_button),this.validate_product_button()}},{key:"do_integration_ready",value:function(){if(u(this,i),_get(_.prototype.__proto__||Object.getPrototypeOf(_.prototype),"do_integration_ready",this).call(this),this.is_product_page)return this.validate_product_button()}},{key:"validate_product_button",value:function(){if(u(this,i),this.product_form.is_variable&&this.product_form.element.find(".single_add_to_cart_button").is(".disabled"))this.hide_button();else{if(!this.should_validate_product_data)return this.show_button();this.validate_product_data(this.show_button,this.hide_button)}}},{key:"validate_product_data",value:function(t,n){var r=this;return u(this,i),s.ajax({type:"POST",url:this.validate_product_url,data:{wp_nonce:this.validate_product_nonce,product_id:s("input[name=wc_braintree_paypal_product_id]").val(),cart_form:s("form.cart").serialize()}}).done(function(e){return e.data.is_valid?(e.data.order_amount&&r.maybe_update_order_amount(e.data.order_amount),t()):n()}).fail(n)}},{key:"hide_button",value:function(){return s("#wc_braintree_paypal_container, #wc_braintree_paypal_pay_later_messaging_container").slideUp()}},{key:"show_button",value:function(){return s("#wc_braintree_paypal_container, #wc_braintree_paypal_pay_later_messaging_container").slideDown()}},{key:"maybe_update_order_amount",value:function(e){if(parseFloat(e)!==parseFloat(this.get_order_amount()))return s('[name="wc_braintree_paypal_amount"]').val(e),this.refresh_braintree()}},{key:"button_is_pay_now",value:function(){return!1}},{key:"set_payment_method",value:function(e){var t=this;if(null!=e.nonce)return(e=e).wp_nonce=this.product_checkout_nonce,e.product_id=s("input[name=wc_braintree_paypal_product_id]").val(),e.cart_form=s("form.cart").serialize(),s.ajax({type:"POST",url:this.product_checkout_url,data:e,dataType:"json"}).done(function(e){if(t.log("Cart response received.",e),null!=e.redirect_url)return window.location=e.redirect_url}).fail(function(e){return t.log("Error setting the PayPal cart data.",e,"error")}).always(function(){return t.unblock_ui()})}},{key:"is_single_use",value:function(){return"1"===s("input[name=wc_braintree_paypal_single_use]").val()}},{key:"has_payment_nonce",value:function(){return!1}}]),_),s(document.body).trigger("wc_braintree_paypal_product_button_handler_loaded")})}).call(void 0);
|
1 |
+
"use strict";var _get=function e(t,n,r){null===t&&(t=Function.prototype);var i=Object.getOwnPropertyDescriptor(t,n);if(void 0!==i){if("value"in i)return i.value;i=i.get;return void 0!==i?i.call(r):void 0}t=Object.getPrototypeOf(t);if(null!==t)return e(t,n,r)},_createClass=function(){function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(e,t,n){return t&&r(e.prototype,t),n&&r(e,n),e}}();function _possibleConstructorReturn(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function _inherits(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(function(){function u(e,t){if(!(e instanceof t))throw new Error("Bound instance method accessed before binding")}var c=[].indexOf;jQuery(document).ready(function(s){var e,n,i;function t(e){_classCallCheck(this,t),this.show_integration_ui=this.show_integration_ui.bind(this),this.hide_integration_ui=this.hide_integration_ui.bind(this),this.id=e.id,this.id_dasherized=e.id_dasherized,this.name=e.name,this.type=e.type,this.debug=e.debug,this.client_token_nonce=e.client_token_nonce,this.ajax_url=e.ajax_url,this.integration_error_message=e.integration_error_message,this.payment_error_message=e.payment_error_message,this.params=window.sv_wc_payment_gateway_payment_form_params}function a(e){_classCallCheck(this,a);var t=_possibleConstructorReturn(this,(a.__proto__||Object.getPrototypeOf(a)).call(this,e));return t.show_integration_ui=t.show_integration_ui.bind(t),t.hide_integration_ui=t.hide_integration_ui.bind(t),t.csc_required=e.csc_required,t.hosted_fields_styles=e.hosted_fields_styles,t.threeds=e.threeds,t.enabled_card_types=e.enabled_card_types,t.init(),t}function r(e){_classCallCheck(this,r);var t=_possibleConstructorReturn(this,(r.__proto__||Object.getPrototypeOf(r)).call(this,e));return t.do_integration_ready=t.do_integration_ready.bind(t),t.on_approve=t.on_approve.bind(t),t.get_linked_account_html=t.get_linked_account_html.bind(t),t.is_test_environment=e.is_test_environment,t.is_paypal_pay_later_enabled=e.is_paypal_pay_later_enabled,t.is_paypal_card_enabled=e.is_paypal_card_enabled,t.disabled_funding_options=e.paypal_disabled_funding_options,t.force_buyer_country=e.force_buyer_country,t.must_login_message=e.must_login_message,t.must_login_add_method_message=e.must_login_add_method_message,t.button_styles=e.button_styles,t.cart_payment_nonce=e.cart_payment_nonce,t.paypal_intent=e.paypal_intent,t.init(),t}function o(e){_classCallCheck(this,o);var t=_possibleConstructorReturn(this,(o.__proto__||Object.getPrototypeOf(o)).call(this,e));return t.is_paypal_card_enabled=!1,t.set_payment_method_nonce=e.set_payment_method_nonce,t.cart_handler_url=e.cart_handler_url,t.form=s("form.woocommerce-cart-form"),t.form_ui_selector="",t.setup_braintree(),s(document.body).on("updated_cart_totals",function(){return t.setup_braintree()}),t}function _(e){_classCallCheck(this,_);var t=_possibleConstructorReturn(this,(_.__proto__||Object.getPrototypeOf(_)).call(this,e));return t.do_integration_ready=t.do_integration_ready.bind(t),t.validate_product_button=t.validate_product_button.bind(t),t.validate_product_data=t.validate_product_data.bind(t),t.is_paypal_card_enabled=!1,t.product_checkout_nonce=e.product_checkout_nonce,t.product_checkout_url=e.product_checkout_url,t.is_product_page=e.is_product_page,t.validate_product_url=e.validate_product_url,t.validate_product_nonce=e.validate_product_nonce,t.should_validate_product_data=e.should_validate_product_data,t.form=s("form.woocommerce-cart-form"),t.form_ui_selector="",t.is_product_page&&t.handle_product_page(),t.setup_braintree(),s(document.body).on("updated_cart_totals",function(){return t.setup_braintree()}),t}return window.WC_Braintree_Payment_Form_Handler=(_createClass(t,[{key:"init",value:function(){return this.is_sdk_ready()?s("form.checkout").length?this.handle_checkout_page():s("form#order_review").length?this.handle_pay_page():s("form#add_payment_method").length?this.handle_add_payment_method_page():void 0:console.error("Braintree SDK is missing.")}},{key:"handle_checkout_page",value:function(){var e=this;return this.form=s("form.checkout"),this.form_ui_selector=".woocommerce-checkout-payment",s(document.body).on("updated_checkout",function(){if(!e.setting_up)return s('iframe[name^="braintree-"]').remove(),e.setup_braintree()}),s(document.body).on("updated_checkout",function(){return e.handle_saved_payment_methods()}),s(document.body).on("checkout_error",function(){return e.handle_checkout_error()}),this.form.on("checkout_place_order_"+this.id,function(){if(e.is_selected())return e.block_ui(),e.verify_form()})}},{key:"handle_checkout_error",value:function(){return this.unblock_ui()}},{key:"handle_pay_page",value:function(){var e=this;return this.form=s("form#order_review"),this.form_ui_selector="#payment",this.handle_saved_payment_methods(),this.setup_braintree(),this.form.submit(function(){if(e.is_selected())return e.block_ui(),e.verify_form()})}},{key:"handle_add_payment_method_page",value:function(){var e=this;return this.form=s("form#add_payment_method"),this.form_ui_selector="#payment",this.setup_braintree(),this.form.submit(function(){if(e.is_selected())return e.block_ui(),e.verify_form()})}},{key:"verify_form",value:function(){return!!this.using_payment_token()||!!this.has_payment_nonce()&&void 0}},{key:"submit_form",value:function(e){return s("input[name=wc_"+this.id+"_payment_nonce]").val(e),this.form.submit()}},{key:"handle_saved_payment_methods",value:function(){var n=this,e=s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form");if(s("input.js-wc-"+this.id_dasherized+"-payment-token").change(function(){return s("input.js-wc-"+n.id_dasherized+"-payment-token:checked").val()?e.slideUp(200):e.slideDown(200)}).change(),s("input#createaccount").change(function(e){var t=s("input.js-wc-"+n.id_dasherized+"-tokenize-payment-method").closest("p.form-row");return s(e.target).is(":checked")?(t.slideDown(),t.next().show()):(t.hide(),t.next().hide())}),!s("input#createaccount").is(":checked"))return s("input#createaccount").change()}},{key:"setup_braintree",value:function(){if(!s("#wc-"+this.id_dasherized+"-account-number-hosted iframe").data("ready"))return this.setting_up=!0,this.block_ui(),s("input[name=wc_"+this.id+"_payment_nonce]").val(""),this.create_client()}},{key:"create_client",value:function(){var r=this;return this.log("Creating client."),this.get_client_token().done(function(e){return e.success?braintree.client.create({authorization:e.data}).then(function(e){return r.client=e,r.log("Client ready."),r.setup_integration()}).catch(function(e){return r.handle_integration_error(e),r.unblock_ui()}):r.handle_integration_error(e.data)}).fail(function(e,t,n){return r.handle_integration_error({message:"Could not retrieve the client token via AJAX: "+n}),r.unblock_ui()})}},{key:"get_client_token",value:function(){this.id;var e={action:"wc_"+this.id+"_get_client_token",nonce:this.client_token_nonce};return s.post(this.ajax_url,e)}},{key:"setup_integration",value:function(){var t=this;return this.set_device_data(),this.log("Creating integration."),this.get_integration_class().create(this.get_integration_options()).then(function(e){return t.integration=e,t.show_integration_ui(),s("#wc-"+t.id_dasherized+"-account-number-hosted iframe").data("ready",!0),t.do_integration_ready(),s(document).trigger("wc_"+t.id+"_integration_ready",t.integration),t.log("Integration ready."),t.setting_up=!1}).catch(function(e){return t.handle_integration_error(e),t.unblock_ui(),t.setting_up=!1})}},{key:"refresh_braintree",value:function(){var e=this;if(null!=this.integration&&!this.refreshing&&!this.setting_up)return this.log("Refreshing integration."),this.refreshing=!0,this.block_ui(),this.integration.teardown(function(){return e.integration=null,e.refreshing=!1,e.setup_braintree()})}},{key:"teardown_braintree",value:function(){var e=this;if(null!=this.integration&&!this.tearing_down&&!this.setting_up)return this.log("Tearing down integration."),this.tearing_down=!0,this.block_ui(),this.integration.teardown(function(){return e.integration=null,e.tearing_down=!1,e.unblock_ui()})}},{key:"set_device_data",value:function(){if(braintree&&braintree.dataCollector)return braintree.dataCollector.create({client:this.client}).then(function(e){if(e&&e.deviceData)return s("input[id*='wc_braintree_device_data']").val(e.deviceData)})}},{key:"do_integration_ready",value:function(){}},{key:"get_integration_options",value:function(){return{client:this.client}}},{key:"get_integration_class",value:function(){}},{key:"handle_integration_error",value:function(e){return this.log("Integration error. "+e.message,e,"error"),this.hide_integration_ui(),this.unblock_ui()}},{key:"handle_payment_error",value:function(e){return this.log("Payment error. "+e.message,e,"error"),this.render_error(this.get_user_message(e)),this.unblock_ui()}},{key:"render_error",value:function(e){return s(".woocommerce-error, .woocommerce-message").remove(),this.form.prepend('<div class="woocommerce-error">'+e+"</div>").removeClass("processing").unblock(),s("html, body").animate({scrollTop:this.form.offset().top-100},1e3),s("input[name=wc_"+this.id+"_payment_nonce]").val(""),this.form.trigger("wc_"+this.id+"_rendered_error"),s(document.body).trigger("checkout_error"),this.unblock_ui()}},{key:"get_user_message",value:function(){return this.payment_error_message}},{key:"show_integration_ui",value:function(){if(s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").find(".woocommerce-error").remove(),s("input#createaccount").length&&s("input#createaccount").is(":checked"))return s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").find(".form-row").show()}},{key:"hide_integration_ui",value:function(){return s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").prepend('<div class="woocommerce-error">'+this.integration_error_message+"</div>"),s("div.js-wc-"+this.id_dasherized+"-new-payment-method-form").find(".form-row").hide()}},{key:"block_ui",value:function(){return s(this.form_ui_selector).block({message:null,overlayCSS:{background:"#fff",opacity:.6}})}},{key:"unblock_ui",value:function(){return s(this.form_ui_selector).unblock()}},{key:"is_selected",value:function(){return this.get_selected_gateway_id()===this.id}},{key:"is_sdk_ready",value:function(){return"undefined"!=typeof braintree&&null!==braintree&&null!=braintree.client&&null!=this.get_integration_class()}},{key:"has_payment_nonce",value:function(){return this.form.find("input[name=wc_"+this.id+"_payment_nonce]").val()}},{key:"using_payment_token",value:function(){return this.form.find("input.js-wc-"+this.id_dasherized+"-payment-token:checked").val()}},{key:"get_selected_gateway_id",value:function(){return this.form.find("input[name=payment_method]:checked").val()}},{key:"log",value:function(e,t){t=1<arguments.length&&void 0!==t?t:null;if(this.debug)return console.log(this.name+": "+e),t?console.log(t):void 0}}]),t),s(document.body).trigger("wc_braintree_payment_form_handler_loaded"),e=window.WC_Braintree_Credit_Card_Payment_Form_Handler=(_inherits(a,WC_Braintree_Payment_Form_Handler),_createClass(a,[{key:"handle_checkout_error",value:function(){return _get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"handle_checkout_error",this).call(this),s("input[name=wc_"+this.id+"_payment_nonce]").val(""),s("input[name=wc-"+this.id_dasherized+"-card-type]").val(""),s("input[name=wc-"+this.id_dasherized+"-3d-secure-verified]").val(0)}},{key:"verify_form",value:function(){var e;return this.has_payment_nonce()||!this.csc_required&&this.using_payment_token()?(e=s("input.js-wc-braintree-credit-card-payment-token:checked"),this.should_verify_3d_secure_token(e)?(this.verify_3d_secure(e.data("nonce"),null,e),!1):_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"verify_form",this).call(this)):(this.tokenize_payment(),!1)}},{key:"tokenize_payment",value:function(){var t=this;return this.integration.tokenize().then(function(e){if(t.log("Payment method received.",e),null!=e.nonce&&null!=e.details&&null!=e.details.bin)return t.should_verify_3d_secure(e)?t.verify_3d_secure(e.nonce,e.details.bin):t.submit_form(e.nonce)}).catch(function(e){return t.handle_payment_error(e)})}},{key:"get_integration_options",value:function(){var e={client:this.client,fields:{number:{selector:"#wc-braintree-credit-card-account-number-hosted",placeholder:s("#wc-braintree-credit-card-account-number-hosted").data("placeholder")},cvv:{selector:"#wc-braintree-credit-card-csc-hosted",placeholder:s("#wc-braintree-credit-card-csc-hosted").data("placeholder")},expirationDate:{selector:"#wc-braintree-credit-card-expiry-hosted",placeholder:s("#wc-braintree-credit-card-expiry-hosted").data("placeholder")}},styles:this.hosted_fields_styles};return this.csc_required&&this.using_payment_token()&&(delete e.fields.number,delete e.fields.expirationDate),this.csc_required||delete e.fields.cvv,e}},{key:"get_integration_class",value:function(){return braintree.hostedFields}},{key:"do_integration_ready",value:function(){var t=this;return this.integration.on("cardTypeChange",function(e){return t.on_card_type_change(e)}),!this.csc_required&&s("input.js-wc-braintree-credit-card-payment-token:checked").val()&&this.teardown_braintree(),this.unblock_ui()}},{key:"handle_saved_payment_methods",value:function(){var e,t,n=this;return _get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"handle_saved_payment_methods",this).call(this),t=s("div.js-wc-braintree-credit-card-new-payment-method-form"),e=s("div.wc-braintree-hosted-field-card-csc-parent"),s("input.js-wc-braintree-credit-card-payment-token").change(function(){return s("input.js-wc-braintree-credit-card-payment-token:checked").val()?n.csc_required&&e.hasClass("form-row-last")?(e.removeClass("form-row-last").addClass("form-row-first"),t.after(e),n.refresh_braintree()):void 0:(n.csc_required&&e.hasClass("form-row-first")&&(e.removeClass("form-row-first").addClass("form-row-last"),t.find("div.wc-braintree-hosted-field-card-expiry-parent").after(e)),n.refresh_braintree())}).change()}},{key:"get_user_message",value:function(e){var t,n,r,i=[];if("CUSTOMER"===e.type)switch(e.code){case"HOSTED_FIELDS_FIELDS_EMPTY":this.csc_required&&i.push(this.params.cvv_missing),this.using_payment_token()||(i.push(this.params.card_number_missing),i.push(this.params.card_exp_date_invalid));break;case"HOSTED_FIELDS_FIELDS_INVALID":if(null!=e.details)for(t=0,n=(r=e.details.invalidFieldKeys).length;t<n;t++)switch(r[t]){case"number":i.push(this.params.card_number_invalid);break;case"cvv":i.push(this.params.cvv_length_invalid);break;case"expirationDate":i.push(this.params.card_exp_date_invalid)}}else"NETWORK"===e.type&&null!=e.details.originalError.error.message&&(e=e.details.originalError.error.message,/given name format is invalid/.test(e)&&i.push(this.params.first_name_unsupported_characters),/surname format is invalid/.test(e)&&i.push(this.params.last_name_unsupported_characters));return i.length?i.join("<br/>"):_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"get_user_message",this).call(this)}},{key:"on_card_type_change",value:function(e){var t,n;if(null!=e.cards)return(t=s("#wc-braintree-credit-card-account-number-hosted")).attr("class",function(e,t){return t.replace(/(^|\s)card-type-\S+/g,"")}),e.cards.length?1===e.cards.length?(n=e.cards[0],s("input[name=wc-"+this.id_dasherized+"-card-type]").val(n.type),null!=n.type&&(e=n.type,0<=c.call(this.enabled_card_types,e))?t.addClass("card-type-"+n.type):t.addClass("card-type-invalid")):void 0:t.addClass("card-type-invalid")}},{key:"is_3d_secure_enabled",value:function(){return this.threeds.enabled&&null!=braintree.threeDSecure}},{key:"setup_integration",value:function(){var t=this;return this.threeds.enabled&&(this.threeds.enabled=this.client.getConfiguration().gatewayConfiguration.threeDSecureEnabled),this.is_3d_secure_enabled()?(s("input[name=wc-"+this.id_dasherized+"-3d-secure-enabled]").val(1),this.threeDSecure&&this.threeDSecure.teardown(),braintree.threeDSecure.create({version:2,client:this.client}).then(function(e){return t.threeDSecure=e,s(document.body).on("click","#wc-braintree-credit-card-3dsecure-container",function(e){return s(e.currentTarget).fadeOut(200),t.threeDSecure.cancelVerifyCard(),t.unblock_ui()}),_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"setup_integration",t).call(t)}).catch(function(e){return t.handle_integration_error(e)})):_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"setup_integration",this).call(this)}},{key:"should_verify_3d_secure",value:function(e){var t=e.details.cardType;return this.is_3d_secure_enabled()&&"CreditCard"===e.type&&0<=c.call(this.threeds.card_types,t)}},{key:"should_verify_3d_secure_token",value:function(e){if(this.is_3d_secure_enabled()&&e.val()&&e.data("nonce")&&!e.data("verified"))return!0}},{key:"verify_3d_secure",value:function(e,t,n){var r=this,i=2<arguments.length&&void 0!==n?n:null,a=s("#billing_state").val(),o=s("#billing_country").val(),_=s("#shipping_state").val(),n=s("#shipping_country").val(),o=s("input[name=billing_first_name]").val()?{givenName:s("input[name=billing_first_name]").val().latinise(),surname:s("input[name=billing_last_name]").val().latinise(),phoneNumber:s("input[name=billing_phone]").val(),streetAddress:s("input[name=billing_address_1]").val(),extendedAddress:s("input[name=billing_address_2]").val(),locality:s("#billing_city").val(),region:"string"==typeof a&&a.length<=2?a:"",postalCode:s("input[name=billing_postcode]").val(),countryCodeAlpha2:"string"==typeof o&&o.length<=2?o:""}:{},n=s("input[name=shipping_first_name]").val()?{shippingGivenName:s("input[name=shipping_first_name]").val().latinise(),shippingSurname:s("input[name=shipping_last_name]").val().latinise(),shippingAddress:{streetAddress:s("input[name=shipping_address_1]").val(),extendedAddress:s("input[name=shipping_address_2]").val(),locality:s("input[name=shipping_city]").val(),region:"string"==typeof _&&_.length<=2?_:"",postalCode:s("input[name=shipping_postcode]").val(),countryCodeAlpha2:"string"==typeof n&&n.length<=2?n:""}}:{},n={nonce:e,amount:s("input[name=wc-"+this.id_dasherized+"-3d-secure-order-total]").val(),email:s("input[name=billing_email]").val(),billingAddress:o,additionalInformation:n,onLookupComplete:function(e,t){r.log("3D Secure lookup complete.",e);try{return t()}catch(e){return r.handle_payment_error(e)}}};return"1"===s("input[name=wc-"+this.id_dasherized+"-cart-contains-subscription]").val()&&(n.challengeRequested=!0),this.log("Verifying 3D Secure.",n),this.threeDSecure.verifyCard(n).then(function(e){return r.log("3D Secure response received.",e),r.threeds.liability_shift_always_required&&!e.liabilityShifted?r.render_error(r.threeds.failure_message):(null!=i&&i.data("verified",!0),s("input[name=wc-"+r.id_dasherized+"-3d-secure-verified]").val(1),r.submit_form(e.nonce))}).catch(function(e){return r.handle_payment_error(e)})}},{key:"show_integration_ui",value:function(){return u(this,e),_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"show_integration_ui",this).call(this),s(".wc-braintree-hosted-field-parent").show()}},{key:"hide_integration_ui",value:function(){return u(this,e),_get(a.prototype.__proto__||Object.getPrototypeOf(a.prototype),"hide_integration_ui",this).call(this),s(".wc-braintree-hosted-field-parent").hide()}}]),a),s(document.body).trigger("wc_braintree_credit_card_payment_form_handler_loaded"),n=window.WC_Braintree_PayPal_Payment_Form_Handler=(_inherits(r,WC_Braintree_Payment_Form_Handler),_createClass(r,[{key:"init",value:function(){var t=this;return _get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"init",this).call(this),s("input[name=wc_"+this.id+"_payment_nonce]").val(this.cart_payment_nonce),s(document.body).on("click",'input[name="payment_method"], input.js-wc-braintree-paypal-payment-token',function(){return t.toggle_order_button()}),s(document.body).on("payment_method_selected",function(){return t.toggle_order_button()}),s(document.body).on("click",".wc-braintree-paypal-account .cancel",function(e){return e.preventDefault(),s(e.currentTarget).parent().remove(),t.setup_braintree()}),s(document.body).on("update_checkout",function(e){return t.teardown_braintree()})}},{key:"toggle_order_button",value:function(){return!this.is_selected()||this.has_payment_nonce()||this.using_payment_token()?s("#place_order").show():s("#place_order").hide()}},{key:"verify_form",value:function(){var e=_get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"verify_form",this).call(this);return this.has_payment_nonce()||this.using_payment_token()||this.render_error(this.must_login_message),e}},{key:"handle_payment_error",value:function(e){return _get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"handle_payment_error",this).call(this,e),this.cart_payment_nonce=!1,this.setup_braintree()}},{key:"get_integration_class",value:function(){return braintree.paypalCheckout}},{key:"setup_braintree",value:function(){return this.cart_payment_nonce?this.unblock_ui():(_get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"setup_braintree",this).call(this),s("input.js-wc-braintree-paypal-tokenize-payment-method").prop("disabled",!1),this.toggle_order_button())}},{key:"do_integration_ready",value:function(){return u(this,n),this.cart_payment_nonce?this.unblock_ui():this.load_paypal_sdk()}},{key:"load_paypal_sdk",value:function(){var e,t=this,n=this.get_sdk_options();return this.paypal_sdk_loaded&&this.previous_paypal_sdk_options&&JSON.stringify(this.previous_paypal_sdk_options)===JSON.stringify(n)?this.do_paypal_sdk_loaded():(e=n,this.paypal_sdk_messages_component_loaded&&(e.components="buttons"),this.integration.loadPayPalSDK(e,function(){return t.paypal_sdk_loaded=!0,t.previous_paypal_sdk_options=n,paypal.Messages&&(t.paypal_sdk_messages_component_loaded=!0),t.do_paypal_sdk_loaded()}))}},{key:"do_paypal_sdk_loaded",value:function(){var t=this,e=this.is_single_use()?"checkout":"vault";return this.render_pay_later_messaging(),this.render_button(this.integration.createPayment({flow:e,intent:this.is_single_use()?this.paypal_intent:"tokenize",amount:this.get_order_amount(),currency:this.get_store_currency(),locale:this.get_store_locale()}),this.get_button_styles(),"#wc_braintree_paypal_container").then(function(){return"undefined"===t.get_button_styles().height&&s("#wc_braintree_paypal_container").css({width:"100%"}),t.unblock_ui()}).catch(function(e){return t.log("Could not render the PayPal button. "+e.message,e),t.hide_integration_ui(),t.unblock_ui()})}},{key:"render_pay_later_messaging",value:function(){var t=this,e=s("#wc_braintree_paypal_pay_later_messaging_container");if(e.length)return paypal.Messages?paypal.Messages({amount:this.get_order_amount()}).render("#wc_braintree_paypal_pay_later_messaging_container").catch(function(e){return t.log("Could not render the PayPal Pay Later messeging. "+e.message,e)}):e.hide()}},{key:"render_button",value:function(e,t,n){var r=this;return s(n).html(""),t={env:this.is_test_environment?"sandbox":"production",commit:this.button_is_pay_now(),style:t,onApprove:function(e,t){return r.on_approve(e,t)},onError:function(e){return r.handle_integration_error(e)}},this.is_single_use()?t.createOrder=function(){return e}:t.createBillingAgreement=function(){return e},paypal.Buttons(t).render(n)}},{key:"button_is_pay_now",value:function(){return!s("form#add_payment_method").length}},{key:"get_button_styles",value:function(){return this.button_styles}},{key:"on_approve",value:function(e){var t=this;return u(this,n),this.block_ui(),this.integration.tokenizePayment(e).then(function(e){return t.log("Payment method tokenized.",e),t.set_payment_method(e)}).catch(function(e){return t.handle_payment_error(e),t.unblock_ui()})}},{key:"set_payment_method",value:function(e){return s("input[name=wc_"+this.id+"_payment_nonce]").val(e.nonce),s("#wc_braintree_paypal_container").html(this.get_linked_account_html(e.details)),this.is_single_use()&&s("input.js-wc-braintree-paypal-tokenize-payment-method").prop("disabled",!0),s("#place_order").show(),this.form.submit()}},{key:"handle_saved_payment_methods",value:function(){var t=this;return _get(r.prototype.__proto__||Object.getPrototypeOf(r.prototype),"handle_saved_payment_methods",this).call(this),s("input.js-wc-braintree-paypal-tokenize-payment-method").change(function(e){if(null!=t.integration&&s(e.target).is(":visible"))return t.block_ui(),t.do_integration_ready()}).change()}},{key:"get_linked_account_html",value:function(e){var t;return u(this,n),t=s("<div class='wc-"+this.id_dasherized+"-account'></div>"),null!=e.firstName&&null!=e.lastName&&t.append("<span class='name'>"+e.firstName+" "+e.lastName+"</span>"),t.append("<span class='email'>"+e.email+"</span>"),t.append("<a href='#' class='cancel'>Cancel</a>"),t}},{key:"is_single_use",value:function(){var e=s("input[name=wc-braintree-paypal-tokenize-payment-method]");return 0===e.length||("checkbox"===e.attr("type")?!e.is(":checked"):!e.val())}},{key:"get_order_amount",value:function(){return s("input[name=wc_braintree_paypal_amount]").val()}},{key:"get_store_currency",value:function(){return s("input[name=wc_braintree_paypal_currency]").val()}},{key:"get_store_locale",value:function(){return s("input[name=wc_braintree_paypal_locale]").val()}},{key:"get_sdk_options",value:function(){var e=[[],this.disabled_funding_options],t=e[0],n=e[1];return this.is_paypal_card_enabled||n.push("card"),(this.is_paypal_pay_later_enabled?t:n).push("paylater"),e={components:this.is_paypal_pay_later_enabled?"buttons,messages":"buttons",currency:this.get_store_currency(),intent:this.is_single_use()?this.paypal_intent:"tokenize",vault:!this.is_single_use(),commit:this.button_is_pay_now()},this.force_buyer_country&&(e["buyer-country"]=this.force_buyer_country),t.length&&(e["enable-funding"]=t.join(",")),n.length&&(e["disable-funding"]=n.join(",")),e}}]),r),s(document.body).trigger("wc_braintree_paypal_payment_form_handler_loaded"),window.WC_Braintree_PayPal_Cart_Handler=(_inherits(o,WC_Braintree_PayPal_Payment_Form_Handler),_createClass(o,[{key:"button_is_pay_now",value:function(){return!1}},{key:"set_payment_method",value:function(e){var t=this;if(null!=e.nonce)return e.wp_nonce=this.set_payment_method_nonce,s.ajax({type:"POST",url:this.cart_handler_url,data:e,dataType:"json"}).done(function(e){if(t.log("Cart response received.",e),null!=e.redirect_url)return window.location=e.redirect_url}).fail(function(e){return t.log("Error setting the PayPal cart data.",e,"error")}).always(function(){return t.unblock_ui()})}},{key:"is_single_use",value:function(){return"1"===s("input[name=wc_braintree_paypal_single_use]").val()}},{key:"has_payment_nonce",value:function(){return!1}}]),o),s(document.body).trigger("wc_braintree_paypal_cart_handler_loaded"),i=window.WC_Braintree_PayPal_Product_Button_Handler=(_inherits(_,WC_Braintree_PayPal_Payment_Form_Handler),_createClass(_,[{key:"handle_product_page",value:function(){return this.product_form={element:s("form.cart"),is_variable:s("form.cart").hasClass("variations_form")},this.should_validate_product_data&&this.product_form.element.on("change",this.validate_product_button),this.product_form.is_variable&&s(document.body).on("woocommerce_variation_has_changed",this.validate_product_button),this.validate_product_button()}},{key:"do_integration_ready",value:function(){if(u(this,i),_get(_.prototype.__proto__||Object.getPrototypeOf(_.prototype),"do_integration_ready",this).call(this),this.is_product_page)return this.validate_product_button()}},{key:"validate_product_button",value:function(){if(u(this,i),this.product_form.is_variable&&this.product_form.element.find(".single_add_to_cart_button").is(".disabled"))this.hide_button();else{if(!this.should_validate_product_data)return this.show_button();this.validate_product_data(this.show_button,this.hide_button)}}},{key:"validate_product_data",value:function(t,n){var r=this;return u(this,i),s.ajax({type:"POST",url:this.validate_product_url,data:{wp_nonce:this.validate_product_nonce,product_id:s("input[name=wc_braintree_paypal_product_id]").val(),cart_form:s("form.cart").serialize()}}).done(function(e){return e.data.is_valid?(e.data.order_amount&&r.maybe_update_order_amount(e.data.order_amount),t()):n()}).fail(n)}},{key:"hide_button",value:function(){return s("#wc_braintree_paypal_container, #wc_braintree_paypal_pay_later_messaging_container").slideUp()}},{key:"show_button",value:function(){return s("#wc_braintree_paypal_container, #wc_braintree_paypal_pay_later_messaging_container").slideDown()}},{key:"maybe_update_order_amount",value:function(e){if(parseFloat(e)!==parseFloat(this.get_order_amount()))return s('[name="wc_braintree_paypal_amount"]').val(e),this.refresh_braintree()}},{key:"button_is_pay_now",value:function(){return!1}},{key:"set_payment_method",value:function(e){var t=this;if(null!=e.nonce)return(e=e).wp_nonce=this.product_checkout_nonce,e.product_id=s("input[name=wc_braintree_paypal_product_id]").val(),e.cart_form=s("form.cart").serialize(),s.ajax({type:"POST",url:this.product_checkout_url,data:e,dataType:"json"}).done(function(e){if(t.log("Cart response received.",e),null!=e.redirect_url)return window.location=e.redirect_url}).fail(function(e){return t.log("Error setting the PayPal cart data.",e,"error")}).always(function(){return t.unblock_ui()})}},{key:"is_single_use",value:function(){return"1"===s("input[name=wc_braintree_paypal_single_use]").val()}},{key:"has_payment_nonce",value:function(){return!1}}]),_),s(document.body).trigger("wc_braintree_paypal_product_button_handler_loaded")})}).call(void 0);
|
changelog.txt
ADDED
@@ -0,0 +1,249 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
*** Changelog ***
|
2 |
+
|
3 |
+
= 2.6.2 - 2021-11-16 =
|
4 |
+
* Feature - Add support for disabling funding methods
|
5 |
+
* Feature - Allow updating of expiration dates for credit cards in 'My Account'
|
6 |
+
* Tweak - Update 'device data' capture inner workings
|
7 |
+
|
8 |
+
= 2.6.1 - 2021-05-27 =
|
9 |
+
* Fix - Address an uncaught exception when getting the payment methods for a customer
|
10 |
+
|
11 |
+
= 2.6.0 - 2021-04-19 =
|
12 |
+
* Tweak - Add a filter to allow customizing the disabled funding PayPal options
|
13 |
+
* Fix - Prevent a PHP notice triggered while trying to access the cart object too early in a request
|
14 |
+
|
15 |
+
= 2.5.0 - 2021-03-18 =
|
16 |
+
* Feature - Upgrade to the latest Braintree JavaScript SDK and add support to show PayPal Pay Later offers to eligible buyers
|
17 |
+
* Tweak - Add Kount support for US based merchants who are using API keys to connect to Braintree
|
18 |
+
* Misc - Include device data for all customer-initiated PayPal transactions to increase the accuracy of the Advanced Fraud Management Tools in determining when a transaction is fraudulent
|
19 |
+
* Misc - Update the SkyVerge plugin framework to 5.10.5
|
20 |
+
|
21 |
+
= 2.4.3 - 2020-10-22 =
|
22 |
+
* Fix - Fix a checkout error that removes the CSC field when a saved payment method is selected and the billing country is changed
|
23 |
+
|
24 |
+
= 2.4.2 - 2020-10-14 =
|
25 |
+
* Fix - Address a possible race condition when loading Braintree device data scripts in front end
|
26 |
+
|
27 |
+
= 2.4.1 - 2020-09-28 =
|
28 |
+
* Fix - Fix a fatal error in some server environments with no case sensitive file systems while WooCommerce Product Add-ons is active
|
29 |
+
|
30 |
+
= 2.4.0 - 2020-08-12 =
|
31 |
+
* Fix - Halt plugin loading and display a notice if cURL is not available on the server
|
32 |
+
* Misc - The plugin name is updated to Braintree for WooCommerce
|
33 |
+
* Misc - Add support for WooCommerce 4.3
|
34 |
+
* Misc - Update the SkyVerge plugin framework to v5.7.1
|
35 |
+
* Misc - Require PHP 5.6+
|
36 |
+
* Dev - Classes in the WC_Braintree\Plugin_Framework namespace are now deprecated, use the namespace for the included version of the SkyVerge plugin framework (SkyVerge\WooCommerce\PluginFramework\v5_7_1)
|
37 |
+
|
38 |
+
= 2.3.11 - 2020-06-03 =
|
39 |
+
* Tweak - New users and users who disconnect should use API keys to connect to Braintree - no changes required for users already connected via Braintree Auth
|
40 |
+
|
41 |
+
= 2.3.10 - 2020-05-04 =
|
42 |
+
* Misc - Add support for WooCommerce 4.1
|
43 |
+
|
44 |
+
= 2.3.9 - 2020-04-20 =
|
45 |
+
* Fix - Fix fatal error in PHP < 5.4
|
46 |
+
|
47 |
+
= 2.3.8 - 2020-03-10 =
|
48 |
+
* Misc - Add support for WooCommerce 4.0
|
49 |
+
|
50 |
+
= 2.3.7 - 2020-02-05 =
|
51 |
+
* Fix - Prevent error with payment fields shown in the Checkout page on WooCommerce 3.9 when the address fields are updated
|
52 |
+
|
53 |
+
= 2.3.6 - 2020-01-05 =
|
54 |
+
* Misc - Add support for WooCommerce 3.9
|
55 |
+
|
56 |
+
= 2.3.5 - 2019-12-12 =
|
57 |
+
* Fix - Fix redirect URL encoding when connecting via Braintree Auth
|
58 |
+
|
59 |
+
= 2.3.4 - 2019-12-10 =
|
60 |
+
* Tweak - Display informative message when 3D Secure fails due to unsupported characters in the customer name
|
61 |
+
|
62 |
+
= 2.3.3 - 2019-11-28 =
|
63 |
+
* Fix - Catch CardinalCommerce JS errors in unsupported browsers to prevent hung checkouts
|
64 |
+
|
65 |
+
= 2.3.2 - 2019-10-21 =
|
66 |
+
* Misc - Add support for WooCommerce 3.8
|
67 |
+
|
68 |
+
= 2.3.1 - 2019-10-16 =
|
69 |
+
* Fix - Prevent 3D Secure errors trying to purchase free trial subscriptions
|
70 |
+
* Fix - Fix a bug with regular expressions being used in PHP 7.3+
|
71 |
+
|
72 |
+
= 2.3.0 - 2019-10-03 =
|
73 |
+
* Feature - PayPal buy-now buttons can now be added to product pages
|
74 |
+
* Tweak - Enable PayPal Credit by default on new installs
|
75 |
+
* Fix - Fix a styling issue with the merchant account ID field in settings
|
76 |
+
* Fix - Fix a bug with a regular expression being used in PHP 7.3+
|
77 |
+
|
78 |
+
= 2.2.7 - 2019-09-12 =
|
79 |
+
* Fix - Fix JavaScript error blocking payments with 3D Secure from the Pay Order page
|
80 |
+
|
81 |
+
= 2.2.6 - 2019-08-07 =
|
82 |
+
* Tweak - Add support for 3D Secure 2.0
|
83 |
+
* Misc - Add support for WooCommerce 3.7
|
84 |
+
|
85 |
+
= 2.2.5 - 2019-06-06 =
|
86 |
+
* Fix - Regenerate client tokens on checkout refresh to use the customer's latest currency
|
87 |
+
* Fix - Ensure saved PayPal accounts display their associated email address if no nickname is set
|
88 |
+
|
89 |
+
= 2.2.4 - 2019-04-01 =
|
90 |
+
* Fix - Prevent an error when completing pre-orders that were placed using the PayPal gateway
|
91 |
+
|
92 |
+
= 2.2.3 - 2019-03-20 =
|
93 |
+
* Fix - Ensure Kount merchant ID is set in device data for stores using advanced fraud tools via Kount
|
94 |
+
|
95 |
+
= 2.2.2 - 2019-02-28 =
|
96 |
+
* Fix - Prevent JS errors when reloading the payment form in IE and Edge
|
97 |
+
|
98 |
+
= 2.2.1 - 2019-02-06 =
|
99 |
+
* Fix - Ensure updated order totals are used for validating 3D Secure when the checkout is refreshed
|
100 |
+
* Fix - Prevent 3D Secure errors when non-US region codes are used during validation
|
101 |
+
* Fix - Ensure payment forms are available for orders that start at $0 but require payment after shipping selection
|
102 |
+
* Fix - Update the recurring flag for new API requirements when processing subscription payments
|
103 |
+
* Misc - Reorder manual connection setting inputs to match documentation
|
104 |
+
|
105 |
+
= 2.2.0 - 2018-11-12 =
|
106 |
+
* Feature - Add Apple Pay support for iOS users to quickly place orders from the product, cart, and checkout pages
|
107 |
+
* Feature - Allow the PayPal button to be customized from the plugin settings
|
108 |
+
* Feature - Add PayPal Credit support
|
109 |
+
* Feature - Add support for auto-capturing orders when changed to a paid status
|
110 |
+
* Feature - Customers can now label their saved payment methods for easier identification when choosing how to pay
|
111 |
+
* Tweak - Improve the My Account Payment Methods table on desktop and mobile
|
112 |
+
* Tweak - Automatically enable 3D Secure when enabled in the merchant account
|
113 |
+
* Tweak - Allow users to set the card types that should process 3D Secure
|
114 |
+
* Tweak - Allow users to set the 3D Secure level and block transactions where liability is not shifted
|
115 |
+
* Fix - Fix an issue where duplicate addresses were added when processing transactions with a previously saved payment method
|
116 |
+
* Fix - Ensure the payment forms are re-created after shipping method selection
|
117 |
+
* Misc - Remove support for WooCommerce 2.5
|
118 |
+
|
119 |
+
= 2.1.4 - 2018-10-17 =
|
120 |
+
* Misc - Add support for WooCommerce 3.5
|
121 |
+
|
122 |
+
= 2.1.3 - 2018-08-01 =
|
123 |
+
* Tweak - Generalize the PayPal link error to allow for different PayPal button colors
|
124 |
+
* Fix - Ensure PayPal charges can still be captured when the Credit Card gateway is disabled
|
125 |
+
* Fix - Prevent stalled checkout when PayPal is cancelled or closed
|
126 |
+
* Fix - Prevent duplicate PayPal buttons when checkout is refreshed
|
127 |
+
* Fix - Don't reset the "Create Account" form when the checkout is refreshed
|
128 |
+
|
129 |
+
= 2.1.2 =
|
130 |
+
* Tweak - Add payment details to the customer data export and remove it for erasure requests
|
131 |
+
* Tweak - Remove payment tokens for customer data erasure requests
|
132 |
+
* Misc - Add support for WooCommerce 3.4
|
133 |
+
|
134 |
+
= 2.1.1 =
|
135 |
+
* Fix - Fix the payment form JavaScript compatibility with IE 11
|
136 |
+
|
137 |
+
= 2.1.0 =
|
138 |
+
* Feature - Upgrade to the latest Braintree JavaScript SDK for improved customer experience, reliability, and error handling
|
139 |
+
* Tweak - Add placeholder text for credit card inputs
|
140 |
+
* Tweak - Add responsive sizing to the PayPal buttons and update to the recommended styling for the Cart and Checkout pages
|
141 |
+
* Tweak - Add setting and filter to disable PayPal on the cart page
|
142 |
+
* Tweak - Update all translatable strings to the same text domain
|
143 |
+
* Tweak - Hide Kount as a fraud tool option for US-based stores as it's not currently supported
|
144 |
+
* Tweak - Only load the Braintree scripts when required on payment pages
|
145 |
+
* Fix - Ensure that new customers have their billing address stored in the vault on their first transaction
|
146 |
+
* Fix - Prevent linked PayPal accounts from being cleared if there are address errors at checkout
|
147 |
+
* Fix - Fix some deprecated function notices
|
148 |
+
|
149 |
+
= 2.0.4 =
|
150 |
+
* Fix - Prevent a fatal error when completing pre-orders
|
151 |
+
* Fix - Prevent JavaScript errors when applying a 100%-off coupon at checkout
|
152 |
+
|
153 |
+
= 2.0.3 =
|
154 |
+
* Fix - Add a missing namespace that could cause JavaScript issues with some configurations
|
155 |
+
|
156 |
+
= 2.0.2 =
|
157 |
+
* Fix - Ensure refunds succeed for legacy orders that are missing the necessary meta data
|
158 |
+
* Fix - Add fallbacks for certain subscriptions upgrades after WooCommerce 3.0 compatibility issues
|
159 |
+
* Fix - Default set the Require CSC setting for legacy upgrades to avoid inaccurate error notices at checkout
|
160 |
+
* Fix - Prevent PayPal JavaScript errors in certain cases
|
161 |
+
* Fix - Ensure subscriptions are not affected if Change Payment fails due to declines or other problems
|
162 |
+
* Fix - Ensure old payment methods can be removed by the customer after changing subscription payment to a new method
|
163 |
+
|
164 |
+
= 2.0.1 =
|
165 |
+
* Fix - Purchasing a subscription with PayPal could lead to a blank order note being added
|
166 |
+
* Fix - Ensure all upgrade routines run for users who have used both the SkyVerge Braintree and PayPal Powered by Braintree v1 in the past
|
167 |
+
* Fix - Issue where existing subscriptions in some cases couldn't switch to using a new PayPal account
|
168 |
+
* Fix - Ensure "Place Order" button always remains visible for PayPal when accepting terms
|
169 |
+
|
170 |
+
= 2.0.0 =
|
171 |
+
* Feature - Now supports non-USA Braintree merchant accounts! Bonjour, hola, hallo, and g'day :)
|
172 |
+
* Feature - Supports WooCommerce Pre-Orders plugin
|
173 |
+
* Feature - Credit cards and PayPal gateways can be enabled individually
|
174 |
+
* Feature - Customers can opt to save cards or link a PayPal account at checkout for future use, or use saved methods during checkout
|
175 |
+
* Feature - Customers can manage or add new payment methods from the account area
|
176 |
+
* Feature - Uses an enhanced payment form with retina icons
|
177 |
+
* Feature - Add multiple merchant IDs to support multi-currency shops (requires a currency switcher)
|
178 |
+
* Feature - Supports Advanced Fraud tools and Kount Direct
|
179 |
+
* Feature - Supports 3D Secure for Visa / MasterCard transactions
|
180 |
+
* Feature - Add dynamic descriptors to be displayed for the transaction on customer's credit card statements
|
181 |
+
* Feature - Can show detailed decline messages at checkout to better inform customers of transaction decline reasons
|
182 |
+
* Feature - Allows bulk action to capture charges
|
183 |
+
* Feature - Orders with only virtual items can now force a charge instead of authorization
|
184 |
+
* Tweak - Capturing a charge now moves order status to "processing" automatically
|
185 |
+
* Tweak - Voided orders are now marked as "cancelled" instead of "refunded"
|
186 |
+
* Tweak - Admins can now manually update Subscription payment methods and view payment tokens
|
187 |
+
* Fix - Subscription orders will no longer force a charge and allow an authorization depending on settings
|
188 |
+
* Fix - Handle Subscriptions renewal failures by failing the order
|
189 |
+
* Fix - Customers can switch Subscriptions payment methods on their own from the account
|
190 |
+
* Fix - Stores sandbox and live customer tokens separately to avoid `Customer ID is invalid.` messages
|
191 |
+
* Fix - Ensures that payment can be made from the "My Account" page for pending orders
|
192 |
+
* Misc - Adds support for WooCommerce 3.0+
|
193 |
+
* Misc - Removes support for WooCommerce 2.4 and lower
|
194 |
+
* Misc - Added upgrade routine from SkyVerge Braintree plugin to allow for migrating existing tokens and subscriptions
|
195 |
+
* Misc - Refactor for improved performance and stability
|
196 |
+
* Misc - Other small fixes and improvements
|
197 |
+
|
198 |
+
= 1.2.7 =
|
199 |
+
* Fix - If you connected but did not save the settings, the enabled value would not be set and scripts would not enqueue
|
200 |
+
* Fix - Disable customer initiated payment method changes - PayPal Braintree does not support zero amount transactions
|
201 |
+
* Tweak - On new installs, debug messages are no longer sent to the WooCommerce System Status log by default
|
202 |
+
|
203 |
+
= 1.2.6 =
|
204 |
+
* Fix - Issue where buyer unable to change subscription payment method with free-trial (order total is 0).
|
205 |
+
|
206 |
+
= 1.2.5 =
|
207 |
+
* Fix - Prevent void on unsettled transaction when refunding partially.
|
208 |
+
* Tweak - Add filter wc_gateway_paypal_braintree_sale_args to filter arguments passed to sale call.
|
209 |
+
|
210 |
+
= 1.2.4 =
|
211 |
+
* Fix - Free subscription trails not allowed.
|
212 |
+
* Fix - Subscription recurring billing after free trial not working.
|
213 |
+
|
214 |
+
= 1.2.3 =
|
215 |
+
* Fix - Handle uncaught exceptions thrown by Braintree SDK. API calls from SDK may throws exception, thus it need to be handled properly in try/catch block.
|
216 |
+
* Fix - Issue where deactivating WooCommerce might throws an error
|
217 |
+
|
218 |
+
= 1.2.2 =
|
219 |
+
* Tweak - Updated FAQ that emphasizes this plugin only works in the U.S. currently
|
220 |
+
* Fix - Updated JS SDK to 2.24.1 which should fixes issue where credit card fields working intermittently
|
221 |
+
* Tweak - Add filter on credit card icons
|
222 |
+
* Tweak - Provide default title for cards and PayPal account methods
|
223 |
+
|
224 |
+
= 1.2.1 =
|
225 |
+
* Fix - Issue where Subscriptions with free trial was not processed
|
226 |
+
* Fix - Missing "Change Payment" button in "My Subscriptions" section
|
227 |
+
* Tweak - Make enabled option default to 'yes'
|
228 |
+
* Tweak - Add adnmin notice to setup / connect after plugin is activated
|
229 |
+
* Fix - Consider more statuses (settling, submitted_for_settlement, settlement_pending) to mark order as in-processing
|
230 |
+
* Fix - Issue where settings section rendered twice
|
231 |
+
|
232 |
+
= 1.2.0 =
|
233 |
+
* Replace array initialization code that causes a fatal error on PHP 5.2 or earlier. PHP 5.4+ is still required, but this code prevented the compatibility check from running and displaying the version requirements
|
234 |
+
* Update to the latest Braintree SDK (3.8.0)
|
235 |
+
* Add authorize/capture feature, allowing delayed settlement
|
236 |
+
* Pre-fill certain merchant and store details when connecting
|
237 |
+
* Fix missing gateway title and transaction URL when order in-hold
|
238 |
+
|
239 |
+
= 1.1.0 =
|
240 |
+
* Fixed a bug which would cause the gateway settings to report that the gateway was enabled when it actually was not fully enabled.
|
241 |
+
* Updated contributors list
|
242 |
+
|
243 |
+
= 1.0.1 =
|
244 |
+
* Remove duplicate SSL warnings
|
245 |
+
* Update environment check to also check after activation for environment problems
|
246 |
+
* Fix link in enabled-but-not-connected notice
|
247 |
+
|
248 |
+
= 1.0.0 =
|
249 |
+
* Initial release
|
class-wc-braintree.php
CHANGED
@@ -35,7 +35,7 @@ class WC_Braintree extends Framework\SV_WC_Payment_Gateway_Plugin {
|
|
35 |
|
36 |
|
37 |
/** plugin version number */
|
38 |
-
const VERSION = '2.6.
|
39 |
|
40 |
/** Braintree JS SDK version */
|
41 |
const BRAINTREE_JS_SDK_VERSION = '3.73.1';
|
@@ -123,6 +123,7 @@ class WC_Braintree extends Framework\SV_WC_Payment_Gateway_Plugin {
|
|
123 |
require_once( $this->get_plugin_path() . '/includes/class-wc-payment-token-braintree-paypal.php' );
|
124 |
require_once( $this->get_plugin_path() . '/includes/class-wc-braintree-payment-method-handler.php' );
|
125 |
require_once( $this->get_plugin_path() . '/includes/class-wc-braintree-payment-method.php' );
|
|
|
126 |
|
127 |
// payment forms
|
128 |
require_once( $this->get_plugin_path() . '/includes/payment-forms/abstract-wc-braintree-payment-form.php' );
|
@@ -622,6 +623,15 @@ class WC_Braintree extends Framework\SV_WC_Payment_Gateway_Plugin {
|
|
622 |
return $this->frontend;
|
623 |
}
|
624 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
625 |
|
626 |
/**
|
627 |
* Returns the plugin name, localized
|
35 |
|
36 |
|
37 |
/** plugin version number */
|
38 |
+
const VERSION = '2.6.2';
|
39 |
|
40 |
/** Braintree JS SDK version */
|
41 |
const BRAINTREE_JS_SDK_VERSION = '3.73.1';
|
123 |
require_once( $this->get_plugin_path() . '/includes/class-wc-payment-token-braintree-paypal.php' );
|
124 |
require_once( $this->get_plugin_path() . '/includes/class-wc-braintree-payment-method-handler.php' );
|
125 |
require_once( $this->get_plugin_path() . '/includes/class-wc-braintree-payment-method.php' );
|
126 |
+
require_once( $this->get_plugin_path() . '/includes/class-wc-braintree-my-payment-methods.php' );
|
127 |
|
128 |
// payment forms
|
129 |
require_once( $this->get_plugin_path() . '/includes/payment-forms/abstract-wc-braintree-payment-form.php' );
|
623 |
return $this->frontend;
|
624 |
}
|
625 |
|
626 |
+
/**
|
627 |
+
* Overrides the default SV framework implementation of payment methods in My Account.
|
628 |
+
*
|
629 |
+
* @since 2.6.2
|
630 |
+
* @return \WC_Braintree_My_Payment_Methods
|
631 |
+
*/
|
632 |
+
public function get_my_payment_methods_instance() {
|
633 |
+
return new WC_Braintree_My_Payment_Methods( $this );
|
634 |
+
}
|
635 |
|
636 |
/**
|
637 |
* Returns the plugin name, localized
|
i18n/languages/woocommerce-gateway-paypal-powered-by-braintree.pot
CHANGED
@@ -2,10 +2,10 @@
|
|
2 |
# This file is distributed under the same license as the Braintree for WooCommerce Payment Gateway package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
-
"Project-Id-Version: Braintree for WooCommerce Payment Gateway 2.6.
|
6 |
"Report-Msgid-Bugs-To: "
|
7 |
"https://woocommerce.com/my-account/marketplace-ticket-form/\n"
|
8 |
-
"POT-Creation-Date: 2021-
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=utf-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
@@ -13,52 +13,52 @@ msgstr ""
|
|
13 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
14 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
15 |
|
16 |
-
#: class-wc-braintree.php:
|
17 |
msgid "Connected successfully."
|
18 |
msgstr ""
|
19 |
|
20 |
-
#: class-wc-braintree.php:
|
21 |
msgid "There was an error connecting your Braintree account. Please try again."
|
22 |
msgstr ""
|
23 |
|
24 |
-
#: class-wc-braintree.php:
|
25 |
msgid "Invalid connection request"
|
26 |
msgstr ""
|
27 |
|
28 |
-
#: class-wc-braintree.php:
|
29 |
msgid "Disconnected successfully."
|
30 |
msgstr ""
|
31 |
|
32 |
-
#: class-wc-braintree.php:
|
33 |
msgid "Invalid disconnect request"
|
34 |
msgstr ""
|
35 |
|
36 |
-
#: class-wc-braintree.php:
|
37 |
msgid ""
|
38 |
"Heads up! You've enabled advanced fraud tools for Braintree. Please make "
|
39 |
"sure that advanced fraud tools are also enabled in your Braintree account. "
|
40 |
"Need help? See the %1$sdocumentation%2$s."
|
41 |
msgstr ""
|
42 |
|
43 |
-
#: class-wc-braintree.php:
|
44 |
msgid ""
|
45 |
"Braintree for WooCommerce is almost ready. To get started, %1$sconnect your "
|
46 |
"Braintree account%2$s."
|
47 |
msgstr ""
|
48 |
|
49 |
-
#: class-wc-braintree.php:
|
50 |
msgid ""
|
51 |
"Upgrade successful! WooCommerce Braintree deactivated, and Braintree for "
|
52 |
"WooCommerce has been %1$sconfigured with your previous settings%2$s."
|
53 |
msgstr ""
|
54 |
|
55 |
-
#: class-wc-braintree.php:
|
56 |
msgid ""
|
57 |
"WooCommerce is not being forced over SSL -- Using PayPal with Braintree "
|
58 |
"requires that checkout to be forced over SSL."
|
59 |
msgstr ""
|
60 |
|
61 |
-
#: class-wc-braintree.php:
|
62 |
#. translators: Placeholders: %1$s - payment gateway name tag, %2$s - <a> tag,
|
63 |
#. %3$s - </a> tag
|
64 |
msgid ""
|
@@ -70,11 +70,11 @@ msgstr ""
|
|
70 |
msgid "Braintree for WooCommerce Payment Gateway"
|
71 |
msgstr ""
|
72 |
|
73 |
-
#: class-wc-braintree.php:
|
74 |
msgid "Configure Credit Card"
|
75 |
msgstr ""
|
76 |
|
77 |
-
#: class-wc-braintree.php:
|
78 |
msgid "Configure PayPal"
|
79 |
msgstr ""
|
80 |
|
@@ -98,33 +98,33 @@ msgstr ""
|
|
98 |
msgid "The CSC for the transaction was invalid or incorrect."
|
99 |
msgstr ""
|
100 |
|
101 |
-
#: includes/api/class-wc-braintree-api.php:
|
102 |
msgid ""
|
103 |
"Invalid Credentials, please double-check your API credentials (Merchant ID, "
|
104 |
"Public Key, Private Key, and Merchant Account ID) and try again."
|
105 |
msgstr ""
|
106 |
|
107 |
-
#: includes/api/class-wc-braintree-api.php:
|
108 |
msgid ""
|
109 |
"Authorization Failed, please verify the user for the API credentials "
|
110 |
"provided can perform transactions and that the request data is correct."
|
111 |
msgstr ""
|
112 |
|
113 |
-
#: includes/api/class-wc-braintree-api.php:
|
114 |
msgid "Braintree is currently down for maintenance, please try again later."
|
115 |
msgstr ""
|
116 |
|
117 |
-
#: includes/api/class-wc-braintree-api.php:
|
118 |
msgid "The record cannot be found, please contact support."
|
119 |
msgstr ""
|
120 |
|
121 |
-
#: includes/api/class-wc-braintree-api.php:
|
122 |
msgid ""
|
123 |
"Braintree encountered an error when processing your request, please try "
|
124 |
"again later or contact support."
|
125 |
msgstr ""
|
126 |
|
127 |
-
#: includes/api/class-wc-braintree-api.php:
|
128 |
msgid ""
|
129 |
"Braintree cannot verify your server's SSL certificate. Please contact your "
|
130 |
"hosting provider or try again later."
|
@@ -422,51 +422,61 @@ msgstr ""
|
|
422 |
msgid "Allow customers to check out with PayPal from the Cart page"
|
423 |
msgstr ""
|
424 |
|
425 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
426 |
msgid "Preview"
|
427 |
msgstr ""
|
428 |
|
429 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
430 |
#. translators: Placeholders: %1$s - payment method title (e.g. PayPal), %2$s -
|
431 |
#. transaction environment (either Sandbox or blank string), %3$s - type of
|
432 |
#. transaction (either Authorization or Payment)
|
433 |
msgid "%1$s %2$s %3$s Approved"
|
434 |
msgstr ""
|
435 |
|
436 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
437 |
#: includes/class-wc-gateway-braintree.php:1464
|
438 |
msgid "Sandbox"
|
439 |
msgstr ""
|
440 |
|
441 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
442 |
msgid "Authorization"
|
443 |
msgstr ""
|
444 |
|
445 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
446 |
msgid "Payment"
|
447 |
msgstr ""
|
448 |
|
449 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
450 |
#: includes/integrations/Pre_Orders.php:109
|
451 |
#. translators: Placeholders: %s - transaction ID
|
452 |
msgid "(Transaction ID %s)"
|
453 |
msgstr ""
|
454 |
|
455 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
456 |
msgid "PayPal Account Saved: %s"
|
457 |
msgstr ""
|
458 |
|
459 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
460 |
msgid "PayPal"
|
461 |
msgstr ""
|
462 |
|
463 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
464 |
msgid ""
|
465 |
"Click the PayPal icon below to sign into your PayPal account and pay "
|
466 |
"securely."
|
467 |
msgstr ""
|
468 |
|
469 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
470 |
msgid ""
|
471 |
"Displays Pay Later messaging for available offers. Vaulted payment/billing "
|
472 |
"agreement integrations and some merchant categories are not eligible to "
|
@@ -475,7 +485,7 @@ msgid ""
|
|
475 |
"action in accordance with the User agreement."
|
476 |
msgstr ""
|
477 |
|
478 |
-
#: includes/class-wc-gateway-braintree-paypal.php:
|
479 |
msgid ""
|
480 |
"Displays Pay Later messaging for available offers. Restrictions apply. "
|
481 |
"%1$sClick here to learn more.%2$s"
|
@@ -766,4 +776,64 @@ msgstr ""
|
|
766 |
#: includes/class-wc-gateway-braintree-paypal.php:316
|
767 |
msgctxt "button shape option"
|
768 |
msgid "Rectangle"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
769 |
msgstr ""
|
2 |
# This file is distributed under the same license as the Braintree for WooCommerce Payment Gateway package.
|
3 |
msgid ""
|
4 |
msgstr ""
|
5 |
+
"Project-Id-Version: Braintree for WooCommerce Payment Gateway 2.6.2\n"
|
6 |
"Report-Msgid-Bugs-To: "
|
7 |
"https://woocommerce.com/my-account/marketplace-ticket-form/\n"
|
8 |
+
"POT-Creation-Date: 2021-11-16 17:55:11+00:00\n"
|
9 |
"MIME-Version: 1.0\n"
|
10 |
"Content-Type: text/plain; charset=utf-8\n"
|
11 |
"Content-Transfer-Encoding: 8bit\n"
|
13 |
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
14 |
"Language-Team: LANGUAGE <LL@li.org>\n"
|
15 |
|
16 |
+
#: class-wc-braintree.php:311
|
17 |
msgid "Connected successfully."
|
18 |
msgstr ""
|
19 |
|
20 |
+
#: class-wc-braintree.php:314
|
21 |
msgid "There was an error connecting your Braintree account. Please try again."
|
22 |
msgstr ""
|
23 |
|
24 |
+
#: class-wc-braintree.php:344
|
25 |
msgid "Invalid connection request"
|
26 |
msgstr ""
|
27 |
|
28 |
+
#: class-wc-braintree.php:386
|
29 |
msgid "Disconnected successfully."
|
30 |
msgstr ""
|
31 |
|
32 |
+
#: class-wc-braintree.php:411
|
33 |
msgid "Invalid disconnect request"
|
34 |
msgstr ""
|
35 |
|
36 |
+
#: class-wc-braintree.php:504
|
37 |
msgid ""
|
38 |
"Heads up! You've enabled advanced fraud tools for Braintree. Please make "
|
39 |
"sure that advanced fraud tools are also enabled in your Braintree account. "
|
40 |
"Need help? See the %1$sdocumentation%2$s."
|
41 |
msgstr ""
|
42 |
|
43 |
+
#: class-wc-braintree.php:522
|
44 |
msgid ""
|
45 |
"Braintree for WooCommerce is almost ready. To get started, %1$sconnect your "
|
46 |
"Braintree account%2$s."
|
47 |
msgstr ""
|
48 |
|
49 |
+
#: class-wc-braintree.php:534
|
50 |
msgid ""
|
51 |
"Upgrade successful! WooCommerce Braintree deactivated, and Braintree for "
|
52 |
"WooCommerce has been %1$sconfigured with your previous settings%2$s."
|
53 |
msgstr ""
|
54 |
|
55 |
+
#: class-wc-braintree.php:547
|
56 |
msgid ""
|
57 |
"WooCommerce is not being forced over SSL -- Using PayPal with Braintree "
|
58 |
"requires that checkout to be forced over SSL."
|
59 |
msgstr ""
|
60 |
|
61 |
+
#: class-wc-braintree.php:582
|
62 |
#. translators: Placeholders: %1$s - payment gateway name tag, %2$s - <a> tag,
|
63 |
#. %3$s - </a> tag
|
64 |
msgid ""
|
70 |
msgid "Braintree for WooCommerce Payment Gateway"
|
71 |
msgstr ""
|
72 |
|
73 |
+
#: class-wc-braintree.php:697
|
74 |
msgid "Configure Credit Card"
|
75 |
msgstr ""
|
76 |
|
77 |
+
#: class-wc-braintree.php:697
|
78 |
msgid "Configure PayPal"
|
79 |
msgstr ""
|
80 |
|
98 |
msgid "The CSC for the transaction was invalid or incorrect."
|
99 |
msgstr ""
|
100 |
|
101 |
+
#: includes/api/class-wc-braintree-api.php:575
|
102 |
msgid ""
|
103 |
"Invalid Credentials, please double-check your API credentials (Merchant ID, "
|
104 |
"Public Key, Private Key, and Merchant Account ID) and try again."
|
105 |
msgstr ""
|
106 |
|
107 |
+
#: includes/api/class-wc-braintree-api.php:579
|
108 |
msgid ""
|
109 |
"Authorization Failed, please verify the user for the API credentials "
|
110 |
"provided can perform transactions and that the request data is correct."
|
111 |
msgstr ""
|
112 |
|
113 |
+
#: includes/api/class-wc-braintree-api.php:583
|
114 |
msgid "Braintree is currently down for maintenance, please try again later."
|
115 |
msgstr ""
|
116 |
|
117 |
+
#: includes/api/class-wc-braintree-api.php:587
|
118 |
msgid "The record cannot be found, please contact support."
|
119 |
msgstr ""
|
120 |
|
121 |
+
#: includes/api/class-wc-braintree-api.php:591
|
122 |
msgid ""
|
123 |
"Braintree encountered an error when processing your request, please try "
|
124 |
"again later or contact support."
|
125 |
msgstr ""
|
126 |
|
127 |
+
#: includes/api/class-wc-braintree-api.php:595
|
128 |
msgid ""
|
129 |
"Braintree cannot verify your server's SSL certificate. Please contact your "
|
130 |
"hosting provider or try again later."
|
422 |
msgid "Allow customers to check out with PayPal from the Cart page"
|
423 |
msgstr ""
|
424 |
|
425 |
+
#: includes/class-wc-gateway-braintree-paypal.php:390
|
426 |
+
msgid "Disable funding sources"
|
427 |
+
msgstr ""
|
428 |
+
|
429 |
+
#: includes/class-wc-gateway-braintree-paypal.php:395
|
430 |
+
msgid ""
|
431 |
+
"By default all possible funding sources will be shown. You can disable some "
|
432 |
+
"sources, if you wish."
|
433 |
+
msgstr ""
|
434 |
+
|
435 |
+
#: includes/class-wc-gateway-braintree-paypal.php:434
|
436 |
msgid "Preview"
|
437 |
msgstr ""
|
438 |
|
439 |
+
#: includes/class-wc-gateway-braintree-paypal.php:591
|
440 |
#. translators: Placeholders: %1$s - payment method title (e.g. PayPal), %2$s -
|
441 |
#. transaction environment (either Sandbox or blank string), %3$s - type of
|
442 |
#. transaction (either Authorization or Payment)
|
443 |
msgid "%1$s %2$s %3$s Approved"
|
444 |
msgstr ""
|
445 |
|
446 |
+
#: includes/class-wc-gateway-braintree-paypal.php:593
|
447 |
#: includes/class-wc-gateway-braintree.php:1464
|
448 |
msgid "Sandbox"
|
449 |
msgstr ""
|
450 |
|
451 |
+
#: includes/class-wc-gateway-braintree-paypal.php:594
|
452 |
msgid "Authorization"
|
453 |
msgstr ""
|
454 |
|
455 |
+
#: includes/class-wc-gateway-braintree-paypal.php:594
|
456 |
msgid "Payment"
|
457 |
msgstr ""
|
458 |
|
459 |
+
#: includes/class-wc-gateway-braintree-paypal.php:600
|
460 |
#: includes/integrations/Pre_Orders.php:109
|
461 |
#. translators: Placeholders: %s - transaction ID
|
462 |
msgid "(Transaction ID %s)"
|
463 |
msgstr ""
|
464 |
|
465 |
+
#: includes/class-wc-gateway-braintree-paypal.php:621
|
466 |
msgid "PayPal Account Saved: %s"
|
467 |
msgstr ""
|
468 |
|
469 |
+
#: includes/class-wc-gateway-braintree-paypal.php:728
|
470 |
msgid "PayPal"
|
471 |
msgstr ""
|
472 |
|
473 |
+
#: includes/class-wc-gateway-braintree-paypal.php:742
|
474 |
msgid ""
|
475 |
"Click the PayPal icon below to sign into your PayPal account and pay "
|
476 |
"securely."
|
477 |
msgstr ""
|
478 |
|
479 |
+
#: includes/class-wc-gateway-braintree-paypal.php:1171
|
480 |
msgid ""
|
481 |
"Displays Pay Later messaging for available offers. Vaulted payment/billing "
|
482 |
"agreement integrations and some merchant categories are not eligible to "
|
485 |
"action in accordance with the User agreement."
|
486 |
msgstr ""
|
487 |
|
488 |
+
#: includes/class-wc-gateway-braintree-paypal.php:1181
|
489 |
msgid ""
|
490 |
"Displays Pay Later messaging for available offers. Restrictions apply. "
|
491 |
"%1$sClick here to learn more.%2$s"
|
776 |
#: includes/class-wc-gateway-braintree-paypal.php:316
|
777 |
msgctxt "button shape option"
|
778 |
msgid "Rectangle"
|
779 |
+
msgstr ""
|
780 |
+
|
781 |
+
#: includes/class-wc-gateway-braintree-paypal.php:400
|
782 |
+
msgctxt "Name of payment method"
|
783 |
+
msgid "Credit or debit cards"
|
784 |
+
msgstr ""
|
785 |
+
|
786 |
+
#: includes/class-wc-gateway-braintree-paypal.php:401
|
787 |
+
msgctxt "Name of payment method"
|
788 |
+
msgid "BLIK"
|
789 |
+
msgstr ""
|
790 |
+
|
791 |
+
#: includes/class-wc-gateway-braintree-paypal.php:402
|
792 |
+
msgctxt "Name of payment method"
|
793 |
+
msgid "SEPA-Lastschrift"
|
794 |
+
msgstr ""
|
795 |
+
|
796 |
+
#: includes/class-wc-gateway-braintree-paypal.php:403
|
797 |
+
msgctxt "Name of payment method"
|
798 |
+
msgid "Bancontact"
|
799 |
+
msgstr ""
|
800 |
+
|
801 |
+
#: includes/class-wc-gateway-braintree-paypal.php:404
|
802 |
+
msgctxt "Name of payment method"
|
803 |
+
msgid "eps"
|
804 |
+
msgstr ""
|
805 |
+
|
806 |
+
#: includes/class-wc-gateway-braintree-paypal.php:405
|
807 |
+
msgctxt "Name of payment method"
|
808 |
+
msgid "giropay"
|
809 |
+
msgstr ""
|
810 |
+
|
811 |
+
#: includes/class-wc-gateway-braintree-paypal.php:406
|
812 |
+
msgctxt "Name of payment method"
|
813 |
+
msgid "iDEAL"
|
814 |
+
msgstr ""
|
815 |
+
|
816 |
+
#: includes/class-wc-gateway-braintree-paypal.php:407
|
817 |
+
msgctxt "Name of payment method"
|
818 |
+
msgid "Mercado Pago"
|
819 |
+
msgstr ""
|
820 |
+
|
821 |
+
#: includes/class-wc-gateway-braintree-paypal.php:408
|
822 |
+
msgctxt "Name of payment method"
|
823 |
+
msgid "MyBank"
|
824 |
+
msgstr ""
|
825 |
+
|
826 |
+
#: includes/class-wc-gateway-braintree-paypal.php:409
|
827 |
+
msgctxt "Name of payment method"
|
828 |
+
msgid "Przelewy24"
|
829 |
+
msgstr ""
|
830 |
+
|
831 |
+
#: includes/class-wc-gateway-braintree-paypal.php:410
|
832 |
+
msgctxt "Name of payment method"
|
833 |
+
msgid "Sofort"
|
834 |
+
msgstr ""
|
835 |
+
|
836 |
+
#: includes/class-wc-gateway-braintree-paypal.php:411
|
837 |
+
msgctxt "Name of payment method"
|
838 |
+
msgid "Venmo"
|
839 |
msgstr ""
|
includes/api/class-wc-braintree-api.php
CHANGED
@@ -379,6 +379,24 @@ class WC_Braintree_API extends Framework\SV_WC_API_Base implements Framework\SV_
|
|
379 |
return false;
|
380 |
}
|
381 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
382 |
|
383 |
/**
|
384 |
* Remove the given tokenized payment method for the customer
|
379 |
return false;
|
380 |
}
|
381 |
|
382 |
+
/**
|
383 |
+
* Updates a credit card token expiration date.
|
384 |
+
*
|
385 |
+
* @since 2.6.2
|
386 |
+
* @param string $token the payment method token.
|
387 |
+
* @param string $expiration_date the expiration date in MM/YY format.
|
388 |
+
*/
|
389 |
+
public function update_cc_token_expiration_date( $token, $expiration_date ) {
|
390 |
+
$request = $this->get_new_request(
|
391 |
+
array(
|
392 |
+
'type' => 'payment-method',
|
393 |
+
)
|
394 |
+
);
|
395 |
+
$request->update_expiration_date( $token, $expiration_date );
|
396 |
+
|
397 |
+
return $this->perform_request( $request );
|
398 |
+
}
|
399 |
+
|
400 |
|
401 |
/**
|
402 |
* Remove the given tokenized payment method for the customer
|
includes/api/requests/class-wc-braintree-api-payment-method-request.php
CHANGED
@@ -111,5 +111,22 @@ class WC_Braintree_API_Payment_Method_Request extends WC_Braintree_API_Vault_Req
|
|
111 |
$this->request_data = array( $token, $update_data );
|
112 |
}
|
113 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
|
115 |
}
|
111 |
$this->request_data = array( $token, $update_data );
|
112 |
}
|
113 |
|
114 |
+
/**
|
115 |
+
* @since 2.6.2
|
116 |
+
* @param string $token existing payment method token.
|
117 |
+
* @param string $expiration_date expiration date in MM/YY format.
|
118 |
+
*/
|
119 |
+
public function update_expiration_date( $token, $expiration_date ) {
|
120 |
+
$this->set_resource( 'paymentMethod' );
|
121 |
+
$this->set_callback( 'update' );
|
122 |
+
|
123 |
+
$update_data = array(
|
124 |
+
'expirationDate' => $expiration_date,
|
125 |
+
);
|
126 |
+
|
127 |
+
$this->request_data = array( $token, $update_data );
|
128 |
+
}
|
129 |
+
|
130 |
+
|
131 |
|
132 |
}
|
includes/class-wc-braintree-my-payment-methods.php
ADDED
@@ -0,0 +1,222 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* WooCommerce Braintree Gateway
|
4 |
+
*
|
5 |
+
* This source file is subject to the GNU General Public License v3.0
|
6 |
+
* that is bundled with this package in the file license.txt.
|
7 |
+
* It is also available through the world-wide-web at this URL:
|
8 |
+
* http://www.gnu.org/licenses/gpl-3.0.html
|
9 |
+
* If you did not receive a copy of the license and are unable to
|
10 |
+
* obtain it through the world-wide-web, please send an email
|
11 |
+
* to license@woocommerce.com so we can send you a copy immediately.
|
12 |
+
*
|
13 |
+
* DISCLAIMER
|
14 |
+
*
|
15 |
+
* Do not edit or add to this file if you wish to upgrade WooCommerce Braintree Gateway to newer
|
16 |
+
* versions in the future. If you wish to customize WooCommerce Braintree Gateway for your
|
17 |
+
* needs please refer to http://docs.woocommerce.com/document/braintree/
|
18 |
+
*
|
19 |
+
* @package WC-Braintree/Gateway/Payment_Methods
|
20 |
+
* @author WooCommerce
|
21 |
+
* @copyright Copyright: (c) 2016-2020, Automattic, Inc.
|
22 |
+
* @license http://www.gnu.org/licenses/gpl-3.0.html GNU General Public License v3.0
|
23 |
+
*/
|
24 |
+
|
25 |
+
use SkyVerge\WooCommerce\PluginFramework\v5_10_7 as Framework;
|
26 |
+
|
27 |
+
defined( 'ABSPATH' ) or exit;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* My Payment Methods Class
|
31 |
+
*
|
32 |
+
* Renders the My Payment Methods table on the My Account page and handles
|
33 |
+
* any associated actions (deleting a payment method, etc).
|
34 |
+
* Overrides the default implementation in the SkyVerge framework.
|
35 |
+
*
|
36 |
+
* @since 2.6.2
|
37 |
+
*/
|
38 |
+
class WC_Braintree_My_Payment_Methods extends Framework\SV_WC_Payment_Gateway_My_Payment_Methods {
|
39 |
+
|
40 |
+
/**
|
41 |
+
* Returns the JS handler class name. Overrides the one in the SV framework.
|
42 |
+
*
|
43 |
+
* @since 2.6.2
|
44 |
+
* @return string
|
45 |
+
*/
|
46 |
+
protected function get_js_handler_class_name() {
|
47 |
+
return 'WC_Braintree_My_Payment_Methods_Handler';
|
48 |
+
}
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Enqueue frontend CSS/JS.
|
52 |
+
*
|
53 |
+
* @since 2.6.2
|
54 |
+
*/
|
55 |
+
public function maybe_enqueue_styles_scripts() {
|
56 |
+
parent::maybe_enqueue_styles_scripts();
|
57 |
+
|
58 |
+
wp_enqueue_script( 'wc-braintree-my-payment-methods', $this->plugin->get_plugin_url() . '/assets/js/frontend/wc-braintree-my-payment-methods.min.js', array( 'jquery-tiptip', 'jquery' ), $this->plugin->get_version() );
|
59 |
+
}
|
60 |
+
|
61 |
+
/**
|
62 |
+
* Initializes the My Payment Methods table.
|
63 |
+
*
|
64 |
+
* @since 2.6.2
|
65 |
+
*/
|
66 |
+
public function init() {
|
67 |
+
parent::init();
|
68 |
+
|
69 |
+
if ( ! $this->is_payment_methods_page() ) {
|
70 |
+
return;
|
71 |
+
}
|
72 |
+
|
73 |
+
add_action( 'woocommerce_account_payment_methods_column_expires', [ $this, 'add_payment_method_expires' ] );
|
74 |
+
}
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Adds the Expires column content.
|
78 |
+
*
|
79 |
+
* @since 2.6.2
|
80 |
+
* @param array $method Payment method.
|
81 |
+
*/
|
82 |
+
public function add_payment_method_expires( $method ) {
|
83 |
+
$token = ( ! empty( $method['token'] ) ) ? $this->plugin->get_gateway( $this->plugin::CREDIT_CARD_GATEWAY_ID )->get_payment_tokens_handler()->get_token( get_current_user_id(), $method['token'] ) : null;
|
84 |
+
|
85 |
+
if ( ! $token ) {
|
86 |
+
return;
|
87 |
+
}
|
88 |
+
|
89 |
+
echo $this->get_payment_method_expires_html( $token );
|
90 |
+
}
|
91 |
+
|
92 |
+
/**
|
93 |
+
* Returns a token's expiration date HTML.
|
94 |
+
*
|
95 |
+
* @since 2.6.2
|
96 |
+
* @internal
|
97 |
+
* @param Framework\SV_WC_Payment_Gateway_Payment_Token $token Token object.
|
98 |
+
* @return string
|
99 |
+
*/
|
100 |
+
protected function get_payment_method_expires_html( $token ) {
|
101 |
+
$html = '';
|
102 |
+
$html .= '<div class="view">';
|
103 |
+
$html .= esc_html( $token->get_exp_date() );
|
104 |
+
$html .= '</div>';
|
105 |
+
$html .= '<div class="edit wc-braintree" style="display: none;">';
|
106 |
+
$html .= '<input type="text" class="expires" name="expires" placeholder="MM/YY" value="' . esc_attr( $token->get_exp_date() ) . '" />';
|
107 |
+
$html .= '</div>';
|
108 |
+
|
109 |
+
return $html;
|
110 |
+
}
|
111 |
+
|
112 |
+
/**
|
113 |
+
* Saves a payment method via AJAX.
|
114 |
+
*
|
115 |
+
* @since 5.1.0
|
116 |
+
* @internal
|
117 |
+
*/
|
118 |
+
public function ajax_save_payment_method() {
|
119 |
+
check_ajax_referer( 'wc_' . $this->get_plugin()->get_id() . '_save_payment_method', 'nonce' );
|
120 |
+
|
121 |
+
try {
|
122 |
+
|
123 |
+
$this->load_tokens();
|
124 |
+
|
125 |
+
$token_id = Framework\SV_WC_Helper::get_posted_value( 'token_id' );
|
126 |
+
|
127 |
+
if ( empty( $this->tokens[ $token_id ] ) || ! $this->tokens[ $token_id ] instanceof Framework\SV_WC_Payment_Gateway_Payment_Token ) {
|
128 |
+
throw new Framework\SV_WC_Payment_Gateway_Exception( 'Invalid token ID' );
|
129 |
+
}
|
130 |
+
|
131 |
+
$user_id = get_current_user_id();
|
132 |
+
$token = $this->tokens[ $token_id ];
|
133 |
+
$gateway = $this->get_plugin()->get_gateway_from_token( $user_id, $token );
|
134 |
+
|
135 |
+
// bail if the gateway or token couldn't be found for this user
|
136 |
+
if ( ! $gateway || ! $gateway->get_payment_tokens_handler()->user_has_token( $user_id, $token ) ) {
|
137 |
+
throw new Framework\SV_WC_Payment_Gateway_Exception( 'Invalid token' );
|
138 |
+
}
|
139 |
+
|
140 |
+
$data = array();
|
141 |
+
|
142 |
+
parse_str( Framework\SV_WC_Helper::get_posted_value( 'data' ), $data );
|
143 |
+
|
144 |
+
// set the data
|
145 |
+
$token = $this->save_token_data( $token, $data );
|
146 |
+
|
147 |
+
// persist the data
|
148 |
+
$gateway->get_payment_tokens_handler()->update_token( $user_id, $token );
|
149 |
+
|
150 |
+
wp_send_json_success( [
|
151 |
+
'title' => $this->get_payment_method_title_html( $token ),
|
152 |
+
'expires' => $this->get_payment_method_expires_html( $token ),
|
153 |
+
'nonce' => wp_create_nonce( 'wc_' . $this->get_plugin()->get_id() . '_save_payment_method' ),
|
154 |
+
] );
|
155 |
+
|
156 |
+
} catch ( Framework\SV_WC_Payment_Gateway_Exception $e ) {
|
157 |
+
|
158 |
+
wp_send_json_error( $e->getMessage() );
|
159 |
+
}
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* Saves data to a token.
|
164 |
+
* Overrides the method in the parent class to add support for editing expiration dates.
|
165 |
+
*
|
166 |
+
* @since 2.6.2
|
167 |
+
* @param Framework\SV_WC_Payment_Gateway_Payment_Token $token Token object.
|
168 |
+
* @param array $data New data to store for the token.
|
169 |
+
* @return Framework\SV_WC_Payment_Gateway_Payment_Token
|
170 |
+
*/
|
171 |
+
protected function save_token_data( Framework\SV_WC_Payment_Gateway_Payment_Token $token, array $data ) {
|
172 |
+
$token = parent::save_token_data( $token, $data );
|
173 |
+
$exp_date = $this->prepare_expiration_date( isset( $data['expires'] ) ? $data['expires'] : '' );
|
174 |
+
|
175 |
+
if ( ! $exp_date ) {
|
176 |
+
throw new Framework\SV_WC_Payment_Gateway_Exception( 'Invalid expiration date' );
|
177 |
+
}
|
178 |
+
|
179 |
+
if ( $token->get_exp_date() === $exp_date['month'] . '/' . $exp_date['year'] ) {
|
180 |
+
return $token;
|
181 |
+
}
|
182 |
+
|
183 |
+
$token->set_exp_month( $exp_date['month'] );
|
184 |
+
$token->set_exp_year( $exp_date['year'] );
|
185 |
+
|
186 |
+
$api = $this->plugin->get_gateway( $this->plugin::CREDIT_CARD_GATEWAY_ID )->get_api();
|
187 |
+
if ( ! $api instanceof WC_Braintree_API ) {
|
188 |
+
throw new Framework\SV_WC_Payment_Gateway_Exception( 'Invalid token gateway' );
|
189 |
+
}
|
190 |
+
|
191 |
+
$response = $api->update_cc_token_expiration_date( $token->get_id(), $token->get_exp_date() );
|
192 |
+
|
193 |
+
if ( ! $response->transaction_approved() ) {
|
194 |
+
throw new Framework\SV_WC_Payment_Gateway_Exception( 'Could not update token' );
|
195 |
+
}
|
196 |
+
|
197 |
+
return $token;
|
198 |
+
}
|
199 |
+
|
200 |
+
/**
|
201 |
+
* Validates and splits an expiration date in format MM/YY into month and year parts.
|
202 |
+
*
|
203 |
+
* @param string $expiration_date The expiration date in MM/YY format.
|
204 |
+
* @return array|null NULL if expiration date is invalid. Otherwise, array with keys 'month' and 'year'.
|
205 |
+
*/
|
206 |
+
protected function prepare_expiration_date( $expiration_date ) {
|
207 |
+
$expiration_date = trim( $expiration_date );
|
208 |
+
|
209 |
+
if ( false === strstr( $expiration_date, '/' ) || 5 !== strlen( $expiration_date ) ) {
|
210 |
+
return null;
|
211 |
+
}
|
212 |
+
|
213 |
+
list( $month, $year ) = array_map( 'strval', explode( '/', $expiration_date ) );
|
214 |
+
|
215 |
+
if ( (int) $month < 1 || (int) $month > 12 ) {
|
216 |
+
return null;
|
217 |
+
}
|
218 |
+
|
219 |
+
return compact( 'month', 'year' );
|
220 |
+
}
|
221 |
+
|
222 |
+
}
|
includes/class-wc-gateway-braintree-credit-card.php
CHANGED
@@ -131,7 +131,7 @@ class WC_Gateway_Braintree_Credit_Card extends WC_Gateway_Braintree {
|
|
131 |
if ( $this->is_advanced_fraud_tool_enabled() ) {
|
132 |
|
133 |
// enqueue braintree-data.js library
|
134 |
-
wp_enqueue_script( 'braintree-data', 'https://js.braintreegateway.com/
|
135 |
|
136 |
// adjust the script tag to add async attribute
|
137 |
add_filter( 'clean_url', array( $this, 'adjust_fraud_script_tag' ) );
|
131 |
if ( $this->is_advanced_fraud_tool_enabled() ) {
|
132 |
|
133 |
// enqueue braintree-data.js library
|
134 |
+
wp_enqueue_script( 'braintree-js-data-collector', 'https://js.braintreegateway.com/web/' . WC_Braintree::BRAINTREE_JS_SDK_VERSION . '/js/data-collector.min.js', array( 'braintree-js-client' ), WC_Braintree::VERSION, true );
|
135 |
|
136 |
// adjust the script tag to add async attribute
|
137 |
add_filter( 'clean_url', array( $this, 'adjust_fraud_script_tag' ) );
|
includes/class-wc-gateway-braintree-paypal.php
CHANGED
@@ -155,7 +155,7 @@ class WC_Gateway_Braintree_PayPal extends WC_Gateway_Braintree {
|
|
155 |
|
156 |
wp_enqueue_script( 'braintree-js-paypal-client', 'https://js.braintreegateway.com/web/' . WC_Braintree::BRAINTREE_JS_SDK_VERSION . '/js/client.min.js', [], WC_Braintree::VERSION, true );
|
157 |
wp_enqueue_script( 'braintree-js-paypal-checkout', 'https://js.braintreegateway.com/web/' . WC_Braintree::BRAINTREE_JS_SDK_VERSION . '/js/paypal-checkout.min.js', [], WC_Braintree::VERSION, true );
|
158 |
-
wp_enqueue_script( 'braintree-js-
|
159 |
}
|
160 |
}
|
161 |
|
@@ -386,6 +386,32 @@ class WC_Gateway_Braintree_PayPal extends WC_Gateway_Braintree {
|
|
386 |
'default' => 'yes',
|
387 |
);
|
388 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
389 |
return parent::add_authorization_charge_form_fields( $form_fields );
|
390 |
}
|
391 |
|
@@ -890,6 +916,23 @@ class WC_Gateway_Braintree_PayPal extends WC_Gateway_Braintree {
|
|
890 |
}
|
891 |
|
892 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
893 |
/**
|
894 |
* Determines whether PayPal Debit/Credit Card option should be offered to customers.
|
895 |
*
|
@@ -994,15 +1037,6 @@ class WC_Gateway_Braintree_PayPal extends WC_Gateway_Braintree {
|
|
994 |
|
995 |
$order = parent::get_order( $order );
|
996 |
|
997 |
-
// gets the PayPal specific device data
|
998 |
-
$device_data = Framework\SV_WC_Helper::get_posted_value( 'wc_' . wc_braintree()::PAYPAL_GATEWAY_ID . '_device_data' );
|
999 |
-
|
1000 |
-
if ( ! empty( $device_data ) ) {
|
1001 |
-
|
1002 |
-
// fraud tool data as a JSON string, unslashed as WP slashes $_POST data which breaks the JSON
|
1003 |
-
$order->payment->device_data = wp_unslash( $device_data );
|
1004 |
-
}
|
1005 |
-
|
1006 |
return $order;
|
1007 |
}
|
1008 |
|
155 |
|
156 |
wp_enqueue_script( 'braintree-js-paypal-client', 'https://js.braintreegateway.com/web/' . WC_Braintree::BRAINTREE_JS_SDK_VERSION . '/js/client.min.js', [], WC_Braintree::VERSION, true );
|
157 |
wp_enqueue_script( 'braintree-js-paypal-checkout', 'https://js.braintreegateway.com/web/' . WC_Braintree::BRAINTREE_JS_SDK_VERSION . '/js/paypal-checkout.min.js', [], WC_Braintree::VERSION, true );
|
158 |
+
wp_enqueue_script( 'braintree-js-data-collector', 'https://js.braintreegateway.com/web/' . WC_Braintree::BRAINTREE_JS_SDK_VERSION . '/js/data-collector.min.js', array( 'braintree-js-client' ), WC_Braintree::VERSION, true );
|
159 |
}
|
160 |
}
|
161 |
|
386 |
'default' => 'yes',
|
387 |
);
|
388 |
|
389 |
+
$form_fields['disable_funding'] = array(
|
390 |
+
'title' => __( 'Disable funding sources', 'woocommerce-gateway-paypal-powered-by-braintree' ),
|
391 |
+
'type' => 'multiselect',
|
392 |
+
'class' => 'wc-enhanced-select',
|
393 |
+
'default' => array(),
|
394 |
+
'desc_tip' => true,
|
395 |
+
'description' => __(
|
396 |
+
'By default all possible funding sources will be shown. You can disable some sources, if you wish.',
|
397 |
+
'woocommerce-paypal-payments'
|
398 |
+
),
|
399 |
+
'options' => array(
|
400 |
+
'card' => _x( 'Credit or debit cards', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
401 |
+
'blik' => _x( 'BLIK', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
402 |
+
'sepa' => _x( 'SEPA-Lastschrift', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
403 |
+
'bancontact' => _x( 'Bancontact', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
404 |
+
'eps' => _x( 'eps', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
405 |
+
'giropay' => _x( 'giropay', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
406 |
+
'ideal' => _x( 'iDEAL', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
407 |
+
'mercadopago'=> _x( 'Mercado Pago', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
408 |
+
'mybank' => _x( 'MyBank', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
409 |
+
'p24' => _x( 'Przelewy24', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
410 |
+
'sofort' => _x( 'Sofort', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
411 |
+
'venmo' => _x( 'Venmo', 'Name of payment method', 'woocommerce-paypal-payments' ),
|
412 |
+
)
|
413 |
+
);
|
414 |
+
|
415 |
return parent::add_authorization_charge_form_fields( $form_fields );
|
416 |
}
|
417 |
|
916 |
}
|
917 |
|
918 |
|
919 |
+
/**
|
920 |
+
* Gets disabled funding sources that should not be offer to customers
|
921 |
+
*
|
922 |
+
* @since 2.6.1
|
923 |
+
*
|
924 |
+
* @return array
|
925 |
+
*/
|
926 |
+
public function get_disabled_funding_sources() {
|
927 |
+
$disabled_funding = $this->get_option( 'disable_funding' );
|
928 |
+
|
929 |
+
if ( !$disabled_funding ) {
|
930 |
+
return array();
|
931 |
+
}
|
932 |
+
return $disabled_funding;
|
933 |
+
}
|
934 |
+
|
935 |
+
|
936 |
/**
|
937 |
* Determines whether PayPal Debit/Credit Card option should be offered to customers.
|
938 |
*
|
1037 |
|
1038 |
$order = parent::get_order( $order );
|
1039 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1040 |
return $order;
|
1041 |
}
|
1042 |
|
includes/class-wc-gateway-braintree.php
CHANGED
@@ -263,7 +263,7 @@ class WC_Gateway_Braintree extends Framework\SV_WC_Payment_Gateway_Direct {
|
|
263 |
}
|
264 |
|
265 |
// fraud tool data as a JSON string, unslashed as WP slashes $_POST data which breaks the JSON
|
266 |
-
$order->payment->device_data = wp_unslash( Framework\SV_WC_Helper::get_posted_value( '
|
267 |
|
268 |
// merchant account ID
|
269 |
if ( $merchant_account_id = $this->get_merchant_account_id( $order->get_currency() ) ) {
|
263 |
}
|
264 |
|
265 |
// fraud tool data as a JSON string, unslashed as WP slashes $_POST data which breaks the JSON
|
266 |
+
$order->payment->device_data = wp_unslash( Framework\SV_WC_Helper::get_posted_value( 'wc_braintree_device_data' ) );
|
267 |
|
268 |
// merchant account ID
|
269 |
if ( $merchant_account_id = $this->get_merchant_account_id( $order->get_currency() ) ) {
|
includes/payment-forms/abstract-wc-braintree-payment-form.php
CHANGED
@@ -119,20 +119,20 @@ abstract class WC_Braintree_Payment_Form extends Framework\SV_WC_Payment_Gateway
|
|
119 |
|
120 |
|
121 |
/**
|
122 |
-
* Render a hidden input for the payment nonce before the
|
123 |
-
* fields. This is populated by the payment form javascript
|
124 |
-
* a nonce from Braintree.
|
125 |
*
|
126 |
* @since 3.0.0
|
127 |
*/
|
128 |
public function render_payment_fields() {
|
129 |
|
130 |
?><input type="hidden" id="<?php echo esc_attr( 'wc_' . $this->get_gateway()->get_id() . '_payment_nonce' ); ?>" name="<?php echo esc_attr( 'wc_' . $this->get_gateway()->get_id() . '_payment_nonce' ); ?>" /><?php
|
|
|
131 |
|
132 |
parent::render_payment_fields();
|
133 |
}
|
134 |
|
135 |
-
|
136 |
/**
|
137 |
* Get gateway-specific JS params that are passed to the payment form handler script
|
138 |
*
|
119 |
|
120 |
|
121 |
/**
|
122 |
+
* Render a hidden input for the payment nonce and device_data before the
|
123 |
+
* credit card/PayPal fields. This is populated by the payment form javascript
|
124 |
+
* when it receives a nonce from Braintree.
|
125 |
*
|
126 |
* @since 3.0.0
|
127 |
*/
|
128 |
public function render_payment_fields() {
|
129 |
|
130 |
?><input type="hidden" id="<?php echo esc_attr( 'wc_' . $this->get_gateway()->get_id() . '_payment_nonce' ); ?>" name="<?php echo esc_attr( 'wc_' . $this->get_gateway()->get_id() . '_payment_nonce' ); ?>" /><?php
|
131 |
+
?><input type="hidden" id="<?php echo esc_attr( 'wc_braintree_device_data' ); ?>" name="<?php echo esc_attr( 'wc_braintree_device_data' ); ?>" /><?php
|
132 |
|
133 |
parent::render_payment_fields();
|
134 |
}
|
135 |
|
|
|
136 |
/**
|
137 |
* Get gateway-specific JS params that are passed to the payment form handler script
|
138 |
*
|
includes/payment-forms/class-wc-braintree-paypal-payment-form.php
CHANGED
@@ -163,8 +163,6 @@ class WC_Braintree_PayPal_Payment_Form extends WC_Braintree_Payment_Form {
|
|
163 |
if ( ! $this->is_checkout_confirmation() ) {
|
164 |
parent::render_payment_form_description();
|
165 |
}
|
166 |
-
|
167 |
-
?><input type="hidden" id="<?php echo esc_attr( 'wc_' . wc_braintree()::PAYPAL_GATEWAY_ID . '_device_data' ); ?>" name="<?php echo esc_attr( 'wc_' . wc_braintree()::PAYPAL_GATEWAY_ID . '_device_data' ); ?>" /><?php
|
168 |
}
|
169 |
|
170 |
|
@@ -285,7 +283,7 @@ class WC_Braintree_PayPal_Payment_Form extends WC_Braintree_Payment_Form {
|
|
285 |
* @param array $disabled_funding_options list of current disabled funding options
|
286 |
* @param \WC_Braintree_PayPal_Payment_Form $this payment form instance
|
287 |
*/
|
288 |
-
return apply_filters( 'wc_' . $this->get_gateway()->get_id() . '_disabled_funding_options',
|
289 |
}
|
290 |
|
291 |
|
163 |
if ( ! $this->is_checkout_confirmation() ) {
|
164 |
parent::render_payment_form_description();
|
165 |
}
|
|
|
|
|
166 |
}
|
167 |
|
168 |
|
283 |
* @param array $disabled_funding_options list of current disabled funding options
|
284 |
* @param \WC_Braintree_PayPal_Payment_Form $this payment form instance
|
285 |
*/
|
286 |
+
return apply_filters( 'wc_' . $this->get_gateway()->get_id() . '_disabled_funding_options', $this->get_gateway()->get_disabled_funding_sources(), $this );
|
287 |
}
|
288 |
|
289 |
|
lib/ssl/api_braintreegateway_com.ca.crt
CHANGED
File without changes
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Tags: ecommerce, e-commerce, commerce, woothemes, wordpress ecommerce, store, sa
|
|
4 |
Requires at least: 4.4
|
5 |
Tested up to: 5.7.2
|
6 |
Requires PHP: 5.4
|
7 |
-
Stable tag: 2.6.
|
8 |
License: GPLv3
|
9 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
@@ -107,248 +107,12 @@ If not, please get in touch with us through the [plugin forums](https://wordpres
|
|
107 |
|
108 |
== Changelog ==
|
109 |
|
110 |
-
=
|
111 |
-
*
|
|
|
|
|
112 |
|
113 |
-
|
114 |
-
* Tweak - Add a filter to allow customizing the disabled funding PayPal options
|
115 |
-
* Fix - Prevent a PHP notice triggered while trying to access the cart object too early in a request
|
116 |
-
|
117 |
-
= 2021.03.18 - version 2.5.0 =
|
118 |
-
* Feature - Upgrade to the latest Braintree JavaScript SDK and add support to show PayPal Pay Later offers to eligible buyers
|
119 |
-
* Tweak - Add Kount support for US based merchants who are using API keys to connect to Braintree
|
120 |
-
* Misc - Include device data for all customer-initiated PayPal transactions to increase the accuracy of the Advanced Fraud Management Tools in determining when a transaction is fraudulent
|
121 |
-
* Misc - Update the SkyVerge plugin framework to 5.10.5
|
122 |
-
|
123 |
-
= 2020.10.22 - version 2.4.3 =
|
124 |
-
* Fix - Fix a checkout error that removes the CSC field when a saved payment method is selected and the billing country is changed
|
125 |
-
|
126 |
-
= 2020.10.14 - version 2.4.2 =
|
127 |
-
* Fix - Address a possible race condition when loading Braintree device data scripts in front end
|
128 |
-
|
129 |
-
= 2020.09.28 - version 2.4.1 =
|
130 |
-
* Fix - Fix a fatal error in some server environments with no case sensitive file systems while WooCommerce Product Add-ons is active
|
131 |
-
|
132 |
-
= 2020.08.12 - version 2.4.0 =
|
133 |
-
* Fix - Halt plugin loading and display a notice if cURL is not available on the server
|
134 |
-
* Misc - The plugin name is updated to Braintree for WooCommerce
|
135 |
-
* Misc - Add support for WooCommerce 4.3
|
136 |
-
* Misc - Update the SkyVerge plugin framework to v5.7.1
|
137 |
-
* Misc - Require PHP 5.6+
|
138 |
-
* Dev - Classes in the WC_Braintree\Plugin_Framework namespace are now deprecated, use the namespace for the included version of the SkyVerge plugin framework (SkyVerge\WooCommerce\PluginFramework\v5_7_1)
|
139 |
-
|
140 |
-
= 2020.06.03 - version 2.3.11 =
|
141 |
-
* Tweak - New users and users who disconnect should use API keys to connect to Braintree - no changes required for users already connected via Braintree Auth
|
142 |
-
|
143 |
-
= 2020.05.04 - version 2.3.10 =
|
144 |
-
* Misc - Add support for WooCommerce 4.1
|
145 |
-
|
146 |
-
= 2020.04.20 - version 2.3.9 =
|
147 |
-
* Fix - Fix fatal error in PHP < 5.4
|
148 |
-
|
149 |
-
= 2020.03.10 - version 2.3.8 =
|
150 |
-
* Misc - Add support for WooCommerce 4.0
|
151 |
-
|
152 |
-
= 2020.02.05 - version 2.3.7 =
|
153 |
-
* Fix - Prevent error with payment fields shown in the Checkout page on WooCommerce 3.9 when the address fields are updated
|
154 |
-
|
155 |
-
= 2020.01.05 - version 2.3.6 =
|
156 |
-
* Misc - Add support for WooCommerce 3.9
|
157 |
-
|
158 |
-
= 2019.12.12 - version 2.3.5 =
|
159 |
-
* Fix - Fix redirect URL encoding when connecting via Braintree Auth
|
160 |
-
|
161 |
-
= 2019.12.10 - version 2.3.4 =
|
162 |
-
* Tweak - Display informative message when 3D Secure fails due to unsupported characters in the customer name
|
163 |
-
|
164 |
-
= 2019.11.28 - version 2.3.3 =
|
165 |
-
* Fix - Catch CardinalCommerce JS errors in unsupported browsers to prevent hung checkouts
|
166 |
-
|
167 |
-
= 2019.10.21 - version 2.3.2 =
|
168 |
-
* Misc - Add support for WooCommerce 3.8
|
169 |
-
|
170 |
-
= 2019.10.16 - version 2.3.1 =
|
171 |
-
* Fix - Prevent 3D Secure errors trying to purchase free trial subscriptions
|
172 |
-
* Fix - Fix a bug with regular expressions being used in PHP 7.3+
|
173 |
-
|
174 |
-
= 2019.10.03 - version 2.3.0 =
|
175 |
-
* Feature - PayPal buy-now buttons can now be added to product pages
|
176 |
-
* Tweak - Enable PayPal Credit by default on new installs
|
177 |
-
* Fix - Fix a styling issue with the merchant account ID field in settings
|
178 |
-
* Fix - Fix a bug with a regular expression being used in PHP 7.3+
|
179 |
-
|
180 |
-
= 2019.09.12 - version 2.2.7 =
|
181 |
-
* Fix - Fix JavaScript error blocking payments with 3D Secure from the Pay Order page
|
182 |
-
|
183 |
-
= 2019.08.07 - version 2.2.6 =
|
184 |
-
* Tweak - Add support for 3D Secure 2.0
|
185 |
-
* Misc - Add support for WooCommerce 3.7
|
186 |
-
|
187 |
-
= 2019.06.06 - version 2.2.5 =
|
188 |
-
* Fix - Regenerate client tokens on checkout refresh to use the customer's latest currency
|
189 |
-
* Fix - Ensure saved PayPal accounts display their associated email address if no nickname is set
|
190 |
-
|
191 |
-
= 2019.04.01 - version 2.2.4 =
|
192 |
-
* Fix - Prevent an error when completing pre-orders that were placed using the PayPal gateway
|
193 |
-
|
194 |
-
= 2019.03.20 - version 2.2.3 =
|
195 |
-
* Fix - Ensure Kount merchant ID is set in device data for stores using advanced fraud tools via Kount
|
196 |
-
|
197 |
-
= 2019.02.28 - version 2.2.2 =
|
198 |
-
* Fix - Prevent JS errors when reloading the payment form in IE and Edge
|
199 |
-
|
200 |
-
= 2019.02.06 - version 2.2.1 =
|
201 |
-
* Fix - Ensure updated order totals are used for validating 3D Secure when the checkout is refreshed
|
202 |
-
* Fix - Prevent 3D Secure errors when non-US region codes are used during validation
|
203 |
-
* Fix - Ensure payment forms are available for orders that start at $0 but require payment after shipping selection
|
204 |
-
* Fix - Update the recurring flag for new API requirements when processing subscription payments
|
205 |
-
* Misc - Reorder manual connection setting inputs to match documentation
|
206 |
-
|
207 |
-
= 2018.11.12 - version 2.2.0 =
|
208 |
-
* Feature - Add Apple Pay support for iOS users to quickly place orders from the product, cart, and checkout pages
|
209 |
-
* Feature - Allow the PayPal button to be customized from the plugin settings
|
210 |
-
* Feature - Add PayPal Credit support
|
211 |
-
* Feature - Add support for auto-capturing orders when changed to a paid status
|
212 |
-
* Feature - Customers can now label their saved payment methods for easier identification when choosing how to pay
|
213 |
-
* Tweak - Improve the My Account Payment Methods table on desktop and mobile
|
214 |
-
* Tweak - Automatically enable 3D Secure when enabled in the merchant account
|
215 |
-
* Tweak - Allow users to set the card types that should process 3D Secure
|
216 |
-
* Tweak - Allow users to set the 3D Secure level and block transactions where liability is not shifted
|
217 |
-
* Fix - Fix an issue where duplicate addresses were added when processing transactions with a previously saved payment method
|
218 |
-
* Fix - Ensure the payment forms are re-created after shipping method selection
|
219 |
-
* Misc - Remove support for WooCommerce 2.5
|
220 |
-
|
221 |
-
= 2018.10.17 - version 2.1.4 =
|
222 |
-
* Misc - Add support for WooCommerce 3.5
|
223 |
-
|
224 |
-
= 2018.08.01 - version 2.1.3 =
|
225 |
-
* Tweak - Generalize the PayPal link error to allow for different PayPal button colors
|
226 |
-
* Fix - Ensure PayPal charges can still be captured when the Credit Card gateway is disabled
|
227 |
-
* Fix - Prevent stalled checkout when PayPal is cancelled or closed
|
228 |
-
* Fix - Prevent duplicate PayPal buttons when checkout is refreshed
|
229 |
-
* Fix - Don't reset the "Create Account" form when the checkout is refreshed
|
230 |
-
|
231 |
-
= 2.1.2 =
|
232 |
-
* Tweak - Add payment details to the customer data export and remove it for erasure requests
|
233 |
-
* Tweak - Remove payment tokens for customer data erasure requests
|
234 |
-
* Misc - Add support for WooCommerce 3.4
|
235 |
-
|
236 |
-
= 2.1.1 =
|
237 |
-
* Fix - Fix the payment form JavaScript compatibility with IE 11
|
238 |
-
|
239 |
-
= 2.1.0 =
|
240 |
-
* Feature - Upgrade to the latest Braintree JavaScript SDK for improved customer experience, reliability, and error handling
|
241 |
-
* Tweak - Add placeholder text for credit card inputs
|
242 |
-
* Tweak - Add responsive sizing to the PayPal buttons and update to the recommended styling for the Cart and Checkout pages
|
243 |
-
* Tweak - Add setting and filter to disable PayPal on the cart page
|
244 |
-
* Tweak - Update all translatable strings to the same text domain
|
245 |
-
* Tweak - Hide Kount as a fraud tool option for US-based stores as it's not currently supported
|
246 |
-
* Tweak - Only load the Braintree scripts when required on payment pages
|
247 |
-
* Fix - Ensure that new customers have their billing address stored in the vault on their first transaction
|
248 |
-
* Fix - Prevent linked PayPal accounts from being cleared if there are address errors at checkout
|
249 |
-
* Fix - Fix some deprecated function notices
|
250 |
-
|
251 |
-
= 2.0.4 =
|
252 |
-
* Fix - Prevent a fatal error when completing pre-orders
|
253 |
-
* Fix - Prevent JavaScript errors when applying a 100%-off coupon at checkout
|
254 |
-
|
255 |
-
= 2.0.3 =
|
256 |
-
* Fix - Add a missing namespace that could cause JavaScript issues with some configurations
|
257 |
-
|
258 |
-
= 2.0.2 =
|
259 |
-
* Fix - Ensure refunds succeed for legacy orders that are missing the necessary meta data
|
260 |
-
* Fix - Add fallbacks for certain subscriptions upgrades after WooCommerce 3.0 compatibility issues
|
261 |
-
* Fix - Default set the Require CSC setting for legacy upgrades to avoid inaccurate error notices at checkout
|
262 |
-
* Fix - Prevent PayPal JavaScript errors in certain cases
|
263 |
-
* Fix - Ensure subscriptions are not affected if Change Payment fails due to declines or other problems
|
264 |
-
* Fix - Ensure old payment methods can be removed by the customer after changing subscription payment to a new method
|
265 |
-
|
266 |
-
= 2.0.1 =
|
267 |
-
* Fix - Purchasing a subscription with PayPal could lead to a blank order note being added
|
268 |
-
* Fix - Ensure all upgrade routines run for users who have used both the SkyVerge Braintree and PayPal Powered by Braintree v1 in the past
|
269 |
-
* Fix - Issue where existing subscriptions in some cases couldn't switch to using a new PayPal account
|
270 |
-
* Fix - Ensure "Place Order" button always remains visible for PayPal when accepting terms
|
271 |
-
|
272 |
-
= 2.0.0 =
|
273 |
-
* Feature - Now supports non-USA Braintree merchant accounts! Bonjour, hola, hallo, and g'day :)
|
274 |
-
* Feature - Supports WooCommerce Pre-Orders plugin
|
275 |
-
* Feature - Credit cards and PayPal gateways can be enabled individually
|
276 |
-
* Feature - Customers can opt to save cards or link a PayPal account at checkout for future use, or use saved methods during checkout
|
277 |
-
* Feature - Customers can manage or add new payment methods from the account area
|
278 |
-
* Feature - Uses an enhanced payment form with retina icons
|
279 |
-
* Feature - Add multiple merchant IDs to support multi-currency shops (requires a currency switcher)
|
280 |
-
* Feature - Supports Advanced Fraud tools and Kount Direct
|
281 |
-
* Feature - Supports 3D Secure for Visa / MasterCard transactions
|
282 |
-
* Feature - Add dynamic descriptors to be displayed for the transaction on customer's credit card statements
|
283 |
-
* Feature - Can show detailed decline messages at checkout to better inform customers of transaction decline reasons
|
284 |
-
* Feature - Allows bulk action to capture charges
|
285 |
-
* Feature - Orders with only virtual items can now force a charge instead of authorization
|
286 |
-
* Tweak - Capturing a charge now moves order status to "processing" automatically
|
287 |
-
* Tweak - Voided orders are now marked as "cancelled" instead of "refunded"
|
288 |
-
* Tweak - Admins can now manually update Subscription payment methods and view payment tokens
|
289 |
-
* Fix - Subscription orders will no longer force a charge and allow an authorization depending on settings
|
290 |
-
* Fix - Handle Subscriptions renewal failures by failing the order
|
291 |
-
* Fix - Customers can switch Subscriptions payment methods on their own from the account
|
292 |
-
* Fix - Stores sandbox and live customer tokens separately to avoid `Customer ID is invalid.` messages
|
293 |
-
* Fix - Ensures that payment can be made from the "My Account" page for pending orders
|
294 |
-
* Misc - Adds support for WooCommerce 3.0+
|
295 |
-
* Misc - Removes support for WooCommerce 2.4 and lower
|
296 |
-
* Misc - Added upgrade routine from SkyVerge Braintree plugin to allow for migrating existing tokens and subscriptions
|
297 |
-
* Misc - Refactor for improved performance and stability
|
298 |
-
* Misc - Other small fixes and improvements
|
299 |
-
|
300 |
-
= 1.2.7 =
|
301 |
-
* Fix - If you connected but did not save the settings, the enabled value would not be set and scripts would not enqueue
|
302 |
-
* Fix - Disable customer initiated payment method changes - PayPal Braintree does not support zero amount transactions
|
303 |
-
* Tweak - On new installs, debug messages are no longer sent to the WooCommerce System Status log by default
|
304 |
-
|
305 |
-
= 1.2.6 =
|
306 |
-
* Fix - Issue where buyer unable to change subscription payment method with free-trial (order total is 0).
|
307 |
-
|
308 |
-
= 1.2.5 =
|
309 |
-
* Fix - Prevent void on unsettled transaction when refunding partially.
|
310 |
-
* Tweak - Add filter wc_gateway_paypal_braintree_sale_args to filter arguments passed to sale call.
|
311 |
-
|
312 |
-
= 1.2.4 =
|
313 |
-
* Fix - Free subscription trails not allowed.
|
314 |
-
* Fix - Subscription recurring billing after free trial not working.
|
315 |
-
|
316 |
-
= 1.2.3 =
|
317 |
-
* Fix - Handle uncaught exceptions thrown by Braintree SDK. API calls from SDK may throws exception, thus it need to be handled properly in try/catch block.
|
318 |
-
* Fix - Issue where deactivating WooCommerce might throws an error
|
319 |
-
|
320 |
-
= 1.2.2 =
|
321 |
-
* Tweak - Updated FAQ that emphasizes this plugin only works in the U.S. currently
|
322 |
-
* Fix - Updated JS SDK to 2.24.1 which should fixes issue where credit card fields working intermittently
|
323 |
-
* Tweak - Add filter on credit card icons
|
324 |
-
* Tweak - Provide default title for cards and PayPal account methods
|
325 |
-
|
326 |
-
= 1.2.1 =
|
327 |
-
* Fix - Issue where Subscriptions with free trial was not processed
|
328 |
-
* Fix - Missing "Change Payment" button in "My Subscriptions" section
|
329 |
-
* Tweak - Make enabled option default to 'yes'
|
330 |
-
* Tweak - Add adnmin notice to setup / connect after plugin is activated
|
331 |
-
* Fix - Consider more statuses (settling, submitted_for_settlement, settlement_pending) to mark order as in-processing
|
332 |
-
* Fix - Issue where settings section rendered twice
|
333 |
-
|
334 |
-
= 1.2.0 =
|
335 |
-
* Replace array initialization code that causes a fatal error on PHP 5.2 or earlier. PHP 5.4+ is still required, but this code prevented the compatibility check from running and displaying the version requirements
|
336 |
-
* Update to the latest Braintree SDK (3.8.0)
|
337 |
-
* Add authorize/capture feature, allowing delayed settlement
|
338 |
-
* Pre-fill certain merchant and store details when connecting
|
339 |
-
* Fix missing gateway title and transaction URL when order in-hold
|
340 |
-
|
341 |
-
= 1.1.0 =
|
342 |
-
* Fixed a bug which would cause the gateway settings to report that the gateway was enabled when it actually was not fully enabled.
|
343 |
-
* Updated contributors list
|
344 |
-
|
345 |
-
= 1.0.1 =
|
346 |
-
* Remove duplicate SSL warnings
|
347 |
-
* Update environment check to also check after activation for environment problems
|
348 |
-
* Fix link in enabled-but-not-connected notice
|
349 |
-
|
350 |
-
= 1.0.0 =
|
351 |
-
* Initial release
|
352 |
|
353 |
== Upgrade Notice ==
|
354 |
|
4 |
Requires at least: 4.4
|
5 |
Tested up to: 5.7.2
|
6 |
Requires PHP: 5.4
|
7 |
+
Stable tag: 2.6.2
|
8 |
License: GPLv3
|
9 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
10 |
|
107 |
|
108 |
== Changelog ==
|
109 |
|
110 |
+
= 2.6.2 - 2021-11-16 =
|
111 |
+
* Feature - Add support for disabling funding methods
|
112 |
+
* Feature - Allow updating of expiration dates for credit cards in 'My Account'
|
113 |
+
* Tweak - Update 'device data' capture inner workings
|
114 |
|
115 |
+
[See changelog for all versions](https://plugins.svn.wordpress.org/woocommerce-gateway-paypal-powered-by-braintree/trunk/changelog.txt).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
|
117 |
== Upgrade Notice ==
|
118 |
|
vendor/autoload.php
CHANGED
@@ -4,4 +4,4 @@
|
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
-
return
|
4 |
|
5 |
require_once __DIR__ . '/composer/autoload_real.php';
|
6 |
|
7 |
+
return ComposerAutoloaderInit9b2474036b822a585558437604722fc9::getLoader();
|
vendor/composer/ClassLoader.php
CHANGED
@@ -37,26 +37,80 @@ namespace Composer\Autoload;
|
|
37 |
*
|
38 |
* @author Fabien Potencier <fabien@symfony.com>
|
39 |
* @author Jordi Boggiano <j.boggiano@seld.be>
|
40 |
-
* @see
|
41 |
-
* @see
|
42 |
*/
|
43 |
class ClassLoader
|
44 |
{
|
|
|
|
|
|
|
45 |
// PSR-4
|
|
|
|
|
|
|
|
|
46 |
private $prefixLengthsPsr4 = array();
|
|
|
|
|
|
|
|
|
47 |
private $prefixDirsPsr4 = array();
|
|
|
|
|
|
|
|
|
48 |
private $fallbackDirsPsr4 = array();
|
49 |
|
50 |
// PSR-0
|
|
|
|
|
|
|
|
|
51 |
private $prefixesPsr0 = array();
|
|
|
|
|
|
|
|
|
52 |
private $fallbackDirsPsr0 = array();
|
53 |
|
|
|
54 |
private $useIncludePath = false;
|
|
|
|
|
|
|
|
|
|
|
55 |
private $classMap = array();
|
|
|
|
|
56 |
private $classMapAuthoritative = false;
|
|
|
|
|
|
|
|
|
|
|
57 |
private $missingClasses = array();
|
|
|
|
|
58 |
private $apcuPrefix;
|
59 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
60 |
public function getPrefixes()
|
61 |
{
|
62 |
if (!empty($this->prefixesPsr0)) {
|
@@ -66,28 +120,47 @@ class ClassLoader
|
|
66 |
return array();
|
67 |
}
|
68 |
|
|
|
|
|
|
|
|
|
69 |
public function getPrefixesPsr4()
|
70 |
{
|
71 |
return $this->prefixDirsPsr4;
|
72 |
}
|
73 |
|
|
|
|
|
|
|
|
|
74 |
public function getFallbackDirs()
|
75 |
{
|
76 |
return $this->fallbackDirsPsr0;
|
77 |
}
|
78 |
|
|
|
|
|
|
|
|
|
79 |
public function getFallbackDirsPsr4()
|
80 |
{
|
81 |
return $this->fallbackDirsPsr4;
|
82 |
}
|
83 |
|
|
|
|
|
|
|
|
|
84 |
public function getClassMap()
|
85 |
{
|
86 |
return $this->classMap;
|
87 |
}
|
88 |
|
89 |
/**
|
90 |
-
* @param
|
|
|
|
|
|
|
91 |
*/
|
92 |
public function addClassMap(array $classMap)
|
93 |
{
|
@@ -102,9 +175,11 @@ class ClassLoader
|
|
102 |
* Registers a set of PSR-0 directories for a given prefix, either
|
103 |
* appending or prepending to the ones previously set for this prefix.
|
104 |
*
|
105 |
-
* @param string
|
106 |
-
* @param
|
107 |
-
* @param bool
|
|
|
|
|
108 |
*/
|
109 |
public function add($prefix, $paths, $prepend = false)
|
110 |
{
|
@@ -147,11 +222,13 @@ class ClassLoader
|
|
147 |
* Registers a set of PSR-4 directories for a given namespace, either
|
148 |
* appending or prepending to the ones previously set for this namespace.
|
149 |
*
|
150 |
-
* @param string
|
151 |
-
* @param
|
152 |
-
* @param bool
|
153 |
*
|
154 |
* @throws \InvalidArgumentException
|
|
|
|
|
155 |
*/
|
156 |
public function addPsr4($prefix, $paths, $prepend = false)
|
157 |
{
|
@@ -195,8 +272,10 @@ class ClassLoader
|
|
195 |
* Registers a set of PSR-0 directories for a given prefix,
|
196 |
* replacing any others previously set for this prefix.
|
197 |
*
|
198 |
-
* @param string
|
199 |
-
* @param
|
|
|
|
|
200 |
*/
|
201 |
public function set($prefix, $paths)
|
202 |
{
|
@@ -211,10 +290,12 @@ class ClassLoader
|
|
211 |
* Registers a set of PSR-4 directories for a given namespace,
|
212 |
* replacing any others previously set for this namespace.
|
213 |
*
|
214 |
-
* @param string
|
215 |
-
* @param
|
216 |
*
|
217 |
* @throws \InvalidArgumentException
|
|
|
|
|
218 |
*/
|
219 |
public function setPsr4($prefix, $paths)
|
220 |
{
|
@@ -234,6 +315,8 @@ class ClassLoader
|
|
234 |
* Turns on searching the include path for class files.
|
235 |
*
|
236 |
* @param bool $useIncludePath
|
|
|
|
|
237 |
*/
|
238 |
public function setUseIncludePath($useIncludePath)
|
239 |
{
|
@@ -256,6 +339,8 @@ class ClassLoader
|
|
256 |
* that have not been registered with the class map.
|
257 |
*
|
258 |
* @param bool $classMapAuthoritative
|
|
|
|
|
259 |
*/
|
260 |
public function setClassMapAuthoritative($classMapAuthoritative)
|
261 |
{
|
@@ -276,6 +361,8 @@ class ClassLoader
|
|
276 |
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
277 |
*
|
278 |
* @param string|null $apcuPrefix
|
|
|
|
|
279 |
*/
|
280 |
public function setApcuPrefix($apcuPrefix)
|
281 |
{
|
@@ -296,25 +383,44 @@ class ClassLoader
|
|
296 |
* Registers this instance as an autoloader.
|
297 |
*
|
298 |
* @param bool $prepend Whether to prepend the autoloader or not
|
|
|
|
|
299 |
*/
|
300 |
public function register($prepend = false)
|
301 |
{
|
302 |
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
303 |
}
|
304 |
|
305 |
/**
|
306 |
* Unregisters this instance as an autoloader.
|
|
|
|
|
307 |
*/
|
308 |
public function unregister()
|
309 |
{
|
310 |
spl_autoload_unregister(array($this, 'loadClass'));
|
|
|
|
|
|
|
|
|
311 |
}
|
312 |
|
313 |
/**
|
314 |
* Loads the given class or interface.
|
315 |
*
|
316 |
* @param string $class The name of the class
|
317 |
-
* @return
|
318 |
*/
|
319 |
public function loadClass($class)
|
320 |
{
|
@@ -323,6 +429,8 @@ class ClassLoader
|
|
323 |
|
324 |
return true;
|
325 |
}
|
|
|
|
|
326 |
}
|
327 |
|
328 |
/**
|
@@ -367,6 +475,21 @@ class ClassLoader
|
|
367 |
return $file;
|
368 |
}
|
369 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
370 |
private function findFileWithExtension($class, $ext)
|
371 |
{
|
372 |
// PSR-4 lookup
|
@@ -438,6 +561,10 @@ class ClassLoader
|
|
438 |
* Scope isolated include.
|
439 |
*
|
440 |
* Prevents access to $this/self from included files.
|
|
|
|
|
|
|
|
|
441 |
*/
|
442 |
function includeFile($file)
|
443 |
{
|
37 |
*
|
38 |
* @author Fabien Potencier <fabien@symfony.com>
|
39 |
* @author Jordi Boggiano <j.boggiano@seld.be>
|
40 |
+
* @see https://www.php-fig.org/psr/psr-0/
|
41 |
+
* @see https://www.php-fig.org/psr/psr-4/
|
42 |
*/
|
43 |
class ClassLoader
|
44 |
{
|
45 |
+
/** @var ?string */
|
46 |
+
private $vendorDir;
|
47 |
+
|
48 |
// PSR-4
|
49 |
+
/**
|
50 |
+
* @var array[]
|
51 |
+
* @psalm-var array<string, array<string, int>>
|
52 |
+
*/
|
53 |
private $prefixLengthsPsr4 = array();
|
54 |
+
/**
|
55 |
+
* @var array[]
|
56 |
+
* @psalm-var array<string, array<int, string>>
|
57 |
+
*/
|
58 |
private $prefixDirsPsr4 = array();
|
59 |
+
/**
|
60 |
+
* @var array[]
|
61 |
+
* @psalm-var array<string, string>
|
62 |
+
*/
|
63 |
private $fallbackDirsPsr4 = array();
|
64 |
|
65 |
// PSR-0
|
66 |
+
/**
|
67 |
+
* @var array[]
|
68 |
+
* @psalm-var array<string, array<string, string[]>>
|
69 |
+
*/
|
70 |
private $prefixesPsr0 = array();
|
71 |
+
/**
|
72 |
+
* @var array[]
|
73 |
+
* @psalm-var array<string, string>
|
74 |
+
*/
|
75 |
private $fallbackDirsPsr0 = array();
|
76 |
|
77 |
+
/** @var bool */
|
78 |
private $useIncludePath = false;
|
79 |
+
|
80 |
+
/**
|
81 |
+
* @var string[]
|
82 |
+
* @psalm-var array<string, string>
|
83 |
+
*/
|
84 |
private $classMap = array();
|
85 |
+
|
86 |
+
/** @var bool */
|
87 |
private $classMapAuthoritative = false;
|
88 |
+
|
89 |
+
/**
|
90 |
+
* @var bool[]
|
91 |
+
* @psalm-var array<string, bool>
|
92 |
+
*/
|
93 |
private $missingClasses = array();
|
94 |
+
|
95 |
+
/** @var ?string */
|
96 |
private $apcuPrefix;
|
97 |
|
98 |
+
/**
|
99 |
+
* @var self[]
|
100 |
+
*/
|
101 |
+
private static $registeredLoaders = array();
|
102 |
+
|
103 |
+
/**
|
104 |
+
* @param ?string $vendorDir
|
105 |
+
*/
|
106 |
+
public function __construct($vendorDir = null)
|
107 |
+
{
|
108 |
+
$this->vendorDir = $vendorDir;
|
109 |
+
}
|
110 |
+
|
111 |
+
/**
|
112 |
+
* @return string[]
|
113 |
+
*/
|
114 |
public function getPrefixes()
|
115 |
{
|
116 |
if (!empty($this->prefixesPsr0)) {
|
120 |
return array();
|
121 |
}
|
122 |
|
123 |
+
/**
|
124 |
+
* @return array[]
|
125 |
+
* @psalm-return array<string, array<int, string>>
|
126 |
+
*/
|
127 |
public function getPrefixesPsr4()
|
128 |
{
|
129 |
return $this->prefixDirsPsr4;
|
130 |
}
|
131 |
|
132 |
+
/**
|
133 |
+
* @return array[]
|
134 |
+
* @psalm-return array<string, string>
|
135 |
+
*/
|
136 |
public function getFallbackDirs()
|
137 |
{
|
138 |
return $this->fallbackDirsPsr0;
|
139 |
}
|
140 |
|
141 |
+
/**
|
142 |
+
* @return array[]
|
143 |
+
* @psalm-return array<string, string>
|
144 |
+
*/
|
145 |
public function getFallbackDirsPsr4()
|
146 |
{
|
147 |
return $this->fallbackDirsPsr4;
|
148 |
}
|
149 |
|
150 |
+
/**
|
151 |
+
* @return string[] Array of classname => path
|
152 |
+
* @psalm-var array<string, string>
|
153 |
+
*/
|
154 |
public function getClassMap()
|
155 |
{
|
156 |
return $this->classMap;
|
157 |
}
|
158 |
|
159 |
/**
|
160 |
+
* @param string[] $classMap Class to filename map
|
161 |
+
* @psalm-param array<string, string> $classMap
|
162 |
+
*
|
163 |
+
* @return void
|
164 |
*/
|
165 |
public function addClassMap(array $classMap)
|
166 |
{
|
175 |
* Registers a set of PSR-0 directories for a given prefix, either
|
176 |
* appending or prepending to the ones previously set for this prefix.
|
177 |
*
|
178 |
+
* @param string $prefix The prefix
|
179 |
+
* @param string[]|string $paths The PSR-0 root directories
|
180 |
+
* @param bool $prepend Whether to prepend the directories
|
181 |
+
*
|
182 |
+
* @return void
|
183 |
*/
|
184 |
public function add($prefix, $paths, $prepend = false)
|
185 |
{
|
222 |
* Registers a set of PSR-4 directories for a given namespace, either
|
223 |
* appending or prepending to the ones previously set for this namespace.
|
224 |
*
|
225 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
226 |
+
* @param string[]|string $paths The PSR-4 base directories
|
227 |
+
* @param bool $prepend Whether to prepend the directories
|
228 |
*
|
229 |
* @throws \InvalidArgumentException
|
230 |
+
*
|
231 |
+
* @return void
|
232 |
*/
|
233 |
public function addPsr4($prefix, $paths, $prepend = false)
|
234 |
{
|
272 |
* Registers a set of PSR-0 directories for a given prefix,
|
273 |
* replacing any others previously set for this prefix.
|
274 |
*
|
275 |
+
* @param string $prefix The prefix
|
276 |
+
* @param string[]|string $paths The PSR-0 base directories
|
277 |
+
*
|
278 |
+
* @return void
|
279 |
*/
|
280 |
public function set($prefix, $paths)
|
281 |
{
|
290 |
* Registers a set of PSR-4 directories for a given namespace,
|
291 |
* replacing any others previously set for this namespace.
|
292 |
*
|
293 |
+
* @param string $prefix The prefix/namespace, with trailing '\\'
|
294 |
+
* @param string[]|string $paths The PSR-4 base directories
|
295 |
*
|
296 |
* @throws \InvalidArgumentException
|
297 |
+
*
|
298 |
+
* @return void
|
299 |
*/
|
300 |
public function setPsr4($prefix, $paths)
|
301 |
{
|
315 |
* Turns on searching the include path for class files.
|
316 |
*
|
317 |
* @param bool $useIncludePath
|
318 |
+
*
|
319 |
+
* @return void
|
320 |
*/
|
321 |
public function setUseIncludePath($useIncludePath)
|
322 |
{
|
339 |
* that have not been registered with the class map.
|
340 |
*
|
341 |
* @param bool $classMapAuthoritative
|
342 |
+
*
|
343 |
+
* @return void
|
344 |
*/
|
345 |
public function setClassMapAuthoritative($classMapAuthoritative)
|
346 |
{
|
361 |
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
|
362 |
*
|
363 |
* @param string|null $apcuPrefix
|
364 |
+
*
|
365 |
+
* @return void
|
366 |
*/
|
367 |
public function setApcuPrefix($apcuPrefix)
|
368 |
{
|
383 |
* Registers this instance as an autoloader.
|
384 |
*
|
385 |
* @param bool $prepend Whether to prepend the autoloader or not
|
386 |
+
*
|
387 |
+
* @return void
|
388 |
*/
|
389 |
public function register($prepend = false)
|
390 |
{
|
391 |
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
|
392 |
+
|
393 |
+
if (null === $this->vendorDir) {
|
394 |
+
return;
|
395 |
+
}
|
396 |
+
|
397 |
+
if ($prepend) {
|
398 |
+
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
|
399 |
+
} else {
|
400 |
+
unset(self::$registeredLoaders[$this->vendorDir]);
|
401 |
+
self::$registeredLoaders[$this->vendorDir] = $this;
|
402 |
+
}
|
403 |
}
|
404 |
|
405 |
/**
|
406 |
* Unregisters this instance as an autoloader.
|
407 |
+
*
|
408 |
+
* @return void
|
409 |
*/
|
410 |
public function unregister()
|
411 |
{
|
412 |
spl_autoload_unregister(array($this, 'loadClass'));
|
413 |
+
|
414 |
+
if (null !== $this->vendorDir) {
|
415 |
+
unset(self::$registeredLoaders[$this->vendorDir]);
|
416 |
+
}
|
417 |
}
|
418 |
|
419 |
/**
|
420 |
* Loads the given class or interface.
|
421 |
*
|
422 |
* @param string $class The name of the class
|
423 |
+
* @return true|null True if loaded, null otherwise
|
424 |
*/
|
425 |
public function loadClass($class)
|
426 |
{
|
429 |
|
430 |
return true;
|
431 |
}
|
432 |
+
|
433 |
+
return null;
|
434 |
}
|
435 |
|
436 |
/**
|
475 |
return $file;
|
476 |
}
|
477 |
|
478 |
+
/**
|
479 |
+
* Returns the currently registered loaders indexed by their corresponding vendor directories.
|
480 |
+
*
|
481 |
+
* @return self[]
|
482 |
+
*/
|
483 |
+
public static function getRegisteredLoaders()
|
484 |
+
{
|
485 |
+
return self::$registeredLoaders;
|
486 |
+
}
|
487 |
+
|
488 |
+
/**
|
489 |
+
* @param string $class
|
490 |
+
* @param string $ext
|
491 |
+
* @return string|false
|
492 |
+
*/
|
493 |
private function findFileWithExtension($class, $ext)
|
494 |
{
|
495 |
// PSR-4 lookup
|
561 |
* Scope isolated include.
|
562 |
*
|
563 |
* Prevents access to $this/self from included files.
|
564 |
+
*
|
565 |
+
* @param string $file
|
566 |
+
* @return void
|
567 |
+
* @private
|
568 |
*/
|
569 |
function includeFile($file)
|
570 |
{
|
vendor/composer/InstalledVersions.php
CHANGED
@@ -1,237 +1,350 @@
|
|
1 |
<?php
|
2 |
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
|
12 |
|
13 |
namespace Composer;
|
14 |
|
|
|
15 |
use Composer\Semver\VersionParser;
|
16 |
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
|
|
|
|
22 |
class InstalledVersions
|
23 |
{
|
24 |
-
|
25 |
-
|
26 |
-
|
27 |
-
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
|
33 |
-
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
|
74 |
-
{
|
75 |
-
|
76 |
-
}
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
90 |
-
|
91 |
-
|
92 |
-
|
93 |
-
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
|
99 |
-
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
104 |
-
|
105 |
-
|
106 |
-
|
107 |
-
|
108 |
-
|
109 |
-
|
110 |
-
|
111 |
-
|
112 |
-
|
113 |
-
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
}
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
{
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
{
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
return
|
193 |
-
}
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
237 |
}
|
1 |
<?php
|
2 |
|
3 |
+
/*
|
4 |
+
* This file is part of Composer.
|
5 |
+
*
|
6 |
+
* (c) Nils Adermann <naderman@naderman.de>
|
7 |
+
* Jordi Boggiano <j.boggiano@seld.be>
|
8 |
+
*
|
9 |
+
* For the full copyright and license information, please view the LICENSE
|
10 |
+
* file that was distributed with this source code.
|
11 |
+
*/
|
12 |
|
13 |
namespace Composer;
|
14 |
|
15 |
+
use Composer\Autoload\ClassLoader;
|
16 |
use Composer\Semver\VersionParser;
|
17 |
|
18 |
+
/**
|
19 |
+
* This class is copied in every Composer installed project and available to all
|
20 |
+
*
|
21 |
+
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
|
22 |
+
*
|
23 |
+
* To require its presence, you can require `composer-runtime-api ^2.0`
|
24 |
+
*/
|
25 |
class InstalledVersions
|
26 |
{
|
27 |
+
/**
|
28 |
+
* @var mixed[]|null
|
29 |
+
* @psalm-var array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}|array{}|null
|
30 |
+
*/
|
31 |
+
private static $installed;
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @var bool|null
|
35 |
+
*/
|
36 |
+
private static $canGetVendors;
|
37 |
+
|
38 |
+
/**
|
39 |
+
* @var array[]
|
40 |
+
* @psalm-var array<string, array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
41 |
+
*/
|
42 |
+
private static $installedByVendor = array();
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Returns a list of all package names which are present, either by being installed, replaced or provided
|
46 |
+
*
|
47 |
+
* @return string[]
|
48 |
+
* @psalm-return list<string>
|
49 |
+
*/
|
50 |
+
public static function getInstalledPackages()
|
51 |
+
{
|
52 |
+
$packages = array();
|
53 |
+
foreach (self::getInstalled() as $installed) {
|
54 |
+
$packages[] = array_keys($installed['versions']);
|
55 |
+
}
|
56 |
+
|
57 |
+
if (1 === \count($packages)) {
|
58 |
+
return $packages[0];
|
59 |
+
}
|
60 |
+
|
61 |
+
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
|
62 |
+
}
|
63 |
+
|
64 |
+
/**
|
65 |
+
* Returns a list of all package names with a specific type e.g. 'library'
|
66 |
+
*
|
67 |
+
* @param string $type
|
68 |
+
* @return string[]
|
69 |
+
* @psalm-return list<string>
|
70 |
+
*/
|
71 |
+
public static function getInstalledPackagesByType($type)
|
72 |
+
{
|
73 |
+
$packagesByType = array();
|
74 |
+
|
75 |
+
foreach (self::getInstalled() as $installed) {
|
76 |
+
foreach ($installed['versions'] as $name => $package) {
|
77 |
+
if (isset($package['type']) && $package['type'] === $type) {
|
78 |
+
$packagesByType[] = $name;
|
79 |
+
}
|
80 |
+
}
|
81 |
+
}
|
82 |
+
|
83 |
+
return $packagesByType;
|
84 |
+
}
|
85 |
+
|
86 |
+
/**
|
87 |
+
* Checks whether the given package is installed
|
88 |
+
*
|
89 |
+
* This also returns true if the package name is provided or replaced by another package
|
90 |
+
*
|
91 |
+
* @param string $packageName
|
92 |
+
* @param bool $includeDevRequirements
|
93 |
+
* @return bool
|
94 |
+
*/
|
95 |
+
public static function isInstalled($packageName, $includeDevRequirements = true)
|
96 |
+
{
|
97 |
+
foreach (self::getInstalled() as $installed) {
|
98 |
+
if (isset($installed['versions'][$packageName])) {
|
99 |
+
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
|
100 |
+
}
|
101 |
+
}
|
102 |
+
|
103 |
+
return false;
|
104 |
+
}
|
105 |
+
|
106 |
+
/**
|
107 |
+
* Checks whether the given package satisfies a version constraint
|
108 |
+
*
|
109 |
+
* e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call:
|
110 |
+
*
|
111 |
+
* Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3')
|
112 |
+
*
|
113 |
+
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
|
114 |
+
* @param string $packageName
|
115 |
+
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
|
116 |
+
* @return bool
|
117 |
+
*/
|
118 |
+
public static function satisfies(VersionParser $parser, $packageName, $constraint)
|
119 |
+
{
|
120 |
+
$constraint = $parser->parseConstraints($constraint);
|
121 |
+
$provided = $parser->parseConstraints(self::getVersionRanges($packageName));
|
122 |
+
|
123 |
+
return $provided->matches($constraint);
|
124 |
+
}
|
125 |
+
|
126 |
+
/**
|
127 |
+
* Returns a version constraint representing all the range(s) which are installed for a given package
|
128 |
+
*
|
129 |
+
* It is easier to use this via isInstalled() with the $constraint argument if you need to check
|
130 |
+
* whether a given version of a package is installed, and not just whether it exists
|
131 |
+
*
|
132 |
+
* @param string $packageName
|
133 |
+
* @return string Version constraint usable with composer/semver
|
134 |
+
*/
|
135 |
+
public static function getVersionRanges($packageName)
|
136 |
+
{
|
137 |
+
foreach (self::getInstalled() as $installed) {
|
138 |
+
if (!isset($installed['versions'][$packageName])) {
|
139 |
+
continue;
|
140 |
+
}
|
141 |
+
|
142 |
+
$ranges = array();
|
143 |
+
if (isset($installed['versions'][$packageName]['pretty_version'])) {
|
144 |
+
$ranges[] = $installed['versions'][$packageName]['pretty_version'];
|
145 |
+
}
|
146 |
+
if (array_key_exists('aliases', $installed['versions'][$packageName])) {
|
147 |
+
$ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']);
|
148 |
+
}
|
149 |
+
if (array_key_exists('replaced', $installed['versions'][$packageName])) {
|
150 |
+
$ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']);
|
151 |
+
}
|
152 |
+
if (array_key_exists('provided', $installed['versions'][$packageName])) {
|
153 |
+
$ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']);
|
154 |
+
}
|
155 |
+
|
156 |
+
return implode(' || ', $ranges);
|
157 |
+
}
|
158 |
+
|
159 |
+
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
160 |
+
}
|
161 |
+
|
162 |
+
/**
|
163 |
+
* @param string $packageName
|
164 |
+
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
165 |
+
*/
|
166 |
+
public static function getVersion($packageName)
|
167 |
+
{
|
168 |
+
foreach (self::getInstalled() as $installed) {
|
169 |
+
if (!isset($installed['versions'][$packageName])) {
|
170 |
+
continue;
|
171 |
+
}
|
172 |
+
|
173 |
+
if (!isset($installed['versions'][$packageName]['version'])) {
|
174 |
+
return null;
|
175 |
+
}
|
176 |
+
|
177 |
+
return $installed['versions'][$packageName]['version'];
|
178 |
+
}
|
179 |
+
|
180 |
+
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* @param string $packageName
|
185 |
+
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present
|
186 |
+
*/
|
187 |
+
public static function getPrettyVersion($packageName)
|
188 |
+
{
|
189 |
+
foreach (self::getInstalled() as $installed) {
|
190 |
+
if (!isset($installed['versions'][$packageName])) {
|
191 |
+
continue;
|
192 |
+
}
|
193 |
+
|
194 |
+
if (!isset($installed['versions'][$packageName]['pretty_version'])) {
|
195 |
+
return null;
|
196 |
+
}
|
197 |
+
|
198 |
+
return $installed['versions'][$packageName]['pretty_version'];
|
199 |
+
}
|
200 |
+
|
201 |
+
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
202 |
+
}
|
203 |
+
|
204 |
+
/**
|
205 |
+
* @param string $packageName
|
206 |
+
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference
|
207 |
+
*/
|
208 |
+
public static function getReference($packageName)
|
209 |
+
{
|
210 |
+
foreach (self::getInstalled() as $installed) {
|
211 |
+
if (!isset($installed['versions'][$packageName])) {
|
212 |
+
continue;
|
213 |
+
}
|
214 |
+
|
215 |
+
if (!isset($installed['versions'][$packageName]['reference'])) {
|
216 |
+
return null;
|
217 |
+
}
|
218 |
+
|
219 |
+
return $installed['versions'][$packageName]['reference'];
|
220 |
+
}
|
221 |
+
|
222 |
+
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
223 |
+
}
|
224 |
+
|
225 |
+
/**
|
226 |
+
* @param string $packageName
|
227 |
+
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
|
228 |
+
*/
|
229 |
+
public static function getInstallPath($packageName)
|
230 |
+
{
|
231 |
+
foreach (self::getInstalled() as $installed) {
|
232 |
+
if (!isset($installed['versions'][$packageName])) {
|
233 |
+
continue;
|
234 |
+
}
|
235 |
+
|
236 |
+
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
|
237 |
+
}
|
238 |
+
|
239 |
+
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
|
240 |
+
}
|
241 |
+
|
242 |
+
/**
|
243 |
+
* @return array
|
244 |
+
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}
|
245 |
+
*/
|
246 |
+
public static function getRootPackage()
|
247 |
+
{
|
248 |
+
$installed = self::getInstalled();
|
249 |
+
|
250 |
+
return $installed[0]['root'];
|
251 |
+
}
|
252 |
+
|
253 |
+
/**
|
254 |
+
* Returns the raw installed.php data for custom implementations
|
255 |
+
*
|
256 |
+
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
|
257 |
+
* @return array[]
|
258 |
+
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}
|
259 |
+
*/
|
260 |
+
public static function getRawData()
|
261 |
+
{
|
262 |
+
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
|
263 |
+
|
264 |
+
if (null === self::$installed) {
|
265 |
+
// only require the installed.php file if this file is loaded from its dumped location,
|
266 |
+
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
267 |
+
if (substr(__DIR__, -8, 1) !== 'C') {
|
268 |
+
self::$installed = include __DIR__ . '/installed.php';
|
269 |
+
} else {
|
270 |
+
self::$installed = array();
|
271 |
+
}
|
272 |
+
}
|
273 |
+
|
274 |
+
return self::$installed;
|
275 |
+
}
|
276 |
+
|
277 |
+
/**
|
278 |
+
* Returns the raw data of all installed.php which are currently loaded for custom implementations
|
279 |
+
*
|
280 |
+
* @return array[]
|
281 |
+
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
282 |
+
*/
|
283 |
+
public static function getAllRawData()
|
284 |
+
{
|
285 |
+
return self::getInstalled();
|
286 |
+
}
|
287 |
+
|
288 |
+
/**
|
289 |
+
* Lets you reload the static array from another file
|
290 |
+
*
|
291 |
+
* This is only useful for complex integrations in which a project needs to use
|
292 |
+
* this class but then also needs to execute another project's autoloader in process,
|
293 |
+
* and wants to ensure both projects have access to their version of installed.php.
|
294 |
+
*
|
295 |
+
* A typical case would be PHPUnit, where it would need to make sure it reads all
|
296 |
+
* the data it needs from this class, then call reload() with
|
297 |
+
* `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure
|
298 |
+
* the project in which it runs can then also use this class safely, without
|
299 |
+
* interference between PHPUnit's dependencies and the project's dependencies.
|
300 |
+
*
|
301 |
+
* @param array[] $data A vendor/composer/installed.php data set
|
302 |
+
* @return void
|
303 |
+
*
|
304 |
+
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>} $data
|
305 |
+
*/
|
306 |
+
public static function reload($data)
|
307 |
+
{
|
308 |
+
self::$installed = $data;
|
309 |
+
self::$installedByVendor = array();
|
310 |
+
}
|
311 |
+
|
312 |
+
/**
|
313 |
+
* @return array[]
|
314 |
+
* @psalm-return list<array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[], dev: bool, install_path: string, type: string}, versions: array<string, array{dev_requirement: bool, pretty_version?: string, version?: string, aliases?: string[], reference?: string, replaced?: string[], provided?: string[], install_path?: string, type?: string}>}>
|
315 |
+
*/
|
316 |
+
private static function getInstalled()
|
317 |
+
{
|
318 |
+
if (null === self::$canGetVendors) {
|
319 |
+
self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders');
|
320 |
+
}
|
321 |
+
|
322 |
+
$installed = array();
|
323 |
+
|
324 |
+
if (self::$canGetVendors) {
|
325 |
+
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
|
326 |
+
if (isset(self::$installedByVendor[$vendorDir])) {
|
327 |
+
$installed[] = self::$installedByVendor[$vendorDir];
|
328 |
+
} elseif (is_file($vendorDir.'/composer/installed.php')) {
|
329 |
+
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
|
330 |
+
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
|
331 |
+
self::$installed = $installed[count($installed) - 1];
|
332 |
+
}
|
333 |
+
}
|
334 |
+
}
|
335 |
+
}
|
336 |
+
|
337 |
+
if (null === self::$installed) {
|
338 |
+
// only require the installed.php file if this file is loaded from its dumped location,
|
339 |
+
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
|
340 |
+
if (substr(__DIR__, -8, 1) !== 'C') {
|
341 |
+
self::$installed = require __DIR__ . '/installed.php';
|
342 |
+
} else {
|
343 |
+
self::$installed = array();
|
344 |
+
}
|
345 |
+
}
|
346 |
+
$installed[] = self::$installed;
|
347 |
+
|
348 |
+
return $installed;
|
349 |
+
}
|
350 |
}
|
vendor/composer/autoload_classmap.php
CHANGED
@@ -6,4 +6,5 @@ $vendorDir = dirname(dirname(__FILE__));
|
|
6 |
$baseDir = dirname($vendorDir);
|
7 |
|
8 |
return array(
|
|
|
9 |
);
|
6 |
$baseDir = dirname($vendorDir);
|
7 |
|
8 |
return array(
|
9 |
+
'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php',
|
10 |
);
|
vendor/composer/autoload_real.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
-
class
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
@@ -22,15 +22,17 @@ class ComposerAutoloaderInitf37bec5afd2a7aa6257c0f78fd20af7b
|
|
22 |
return self::$loader;
|
23 |
}
|
24 |
|
25 |
-
|
26 |
-
|
27 |
-
|
|
|
|
|
28 |
|
29 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
30 |
if ($useStaticLoader) {
|
31 |
-
|
32 |
|
33 |
-
call_user_func(\Composer\Autoload\
|
34 |
} else {
|
35 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
36 |
foreach ($map as $namespace => $path) {
|
2 |
|
3 |
// autoload_real.php @generated by Composer
|
4 |
|
5 |
+
class ComposerAutoloaderInit9b2474036b822a585558437604722fc9
|
6 |
{
|
7 |
private static $loader;
|
8 |
|
22 |
return self::$loader;
|
23 |
}
|
24 |
|
25 |
+
require __DIR__ . '/platform_check.php';
|
26 |
+
|
27 |
+
spl_autoload_register(array('ComposerAutoloaderInit9b2474036b822a585558437604722fc9', 'loadClassLoader'), true, true);
|
28 |
+
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
|
29 |
+
spl_autoload_unregister(array('ComposerAutoloaderInit9b2474036b822a585558437604722fc9', 'loadClassLoader'));
|
30 |
|
31 |
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
|
32 |
if ($useStaticLoader) {
|
33 |
+
require __DIR__ . '/autoload_static.php';
|
34 |
|
35 |
+
call_user_func(\Composer\Autoload\ComposerStaticInit9b2474036b822a585558437604722fc9::getInitializer($loader));
|
36 |
} else {
|
37 |
$map = require __DIR__ . '/autoload_namespaces.php';
|
38 |
foreach ($map as $namespace => $path) {
|
vendor/composer/autoload_static.php
CHANGED
@@ -4,7 +4,7 @@
|
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
-
class
|
8 |
{
|
9 |
public static $prefixLengthsPsr4 = array (
|
10 |
'B' =>
|
@@ -30,12 +30,17 @@ class ComposerStaticInitf37bec5afd2a7aa6257c0f78fd20af7b
|
|
30 |
),
|
31 |
);
|
32 |
|
|
|
|
|
|
|
|
|
33 |
public static function getInitializer(ClassLoader $loader)
|
34 |
{
|
35 |
return \Closure::bind(function () use ($loader) {
|
36 |
-
$loader->prefixLengthsPsr4 =
|
37 |
-
$loader->prefixDirsPsr4 =
|
38 |
-
$loader->prefixesPsr0 =
|
|
|
39 |
|
40 |
}, null, ClassLoader::class);
|
41 |
}
|
4 |
|
5 |
namespace Composer\Autoload;
|
6 |
|
7 |
+
class ComposerStaticInit9b2474036b822a585558437604722fc9
|
8 |
{
|
9 |
public static $prefixLengthsPsr4 = array (
|
10 |
'B' =>
|
30 |
),
|
31 |
);
|
32 |
|
33 |
+
public static $classMap = array (
|
34 |
+
'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php',
|
35 |
+
);
|
36 |
+
|
37 |
public static function getInitializer(ClassLoader $loader)
|
38 |
{
|
39 |
return \Closure::bind(function () use ($loader) {
|
40 |
+
$loader->prefixLengthsPsr4 = ComposerStaticInit9b2474036b822a585558437604722fc9::$prefixLengthsPsr4;
|
41 |
+
$loader->prefixDirsPsr4 = ComposerStaticInit9b2474036b822a585558437604722fc9::$prefixDirsPsr4;
|
42 |
+
$loader->prefixesPsr0 = ComposerStaticInit9b2474036b822a585558437604722fc9::$prefixesPsr0;
|
43 |
+
$loader->classMap = ComposerStaticInit9b2474036b822a585558437604722fc9::$classMap;
|
44 |
|
45 |
}, null, ClassLoader::class);
|
46 |
}
|
vendor/composer/installed.json
CHANGED
@@ -1,86 +1,92 @@
|
|
1 |
-
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
"
|
8 |
-
|
9 |
-
|
10 |
-
|
11 |
-
"dist": {
|
12 |
-
"type": "zip",
|
13 |
-
"url": "https://api.github.com/repos/braintree/braintree_php/zipball/fd55c466d0d0088c67705d7ba0b3876d9767bfda",
|
14 |
-
"reference": "fd55c466d0d0088c67705d7ba0b3876d9767bfda",
|
15 |
-
"shasum": ""
|
16 |
-
},
|
17 |
-
"require": {
|
18 |
-
"ext-curl": "*",
|
19 |
-
"ext-dom": "*",
|
20 |
-
"ext-hash": "*",
|
21 |
-
"ext-openssl": "*",
|
22 |
-
"ext-xmlwriter": "*",
|
23 |
-
"php": ">=5.4.0"
|
24 |
-
},
|
25 |
-
"require-dev": {
|
26 |
-
"phpunit/phpunit": "3.7.*"
|
27 |
-
},
|
28 |
-
"time": "2018-05-21T18:14:47+00:00",
|
29 |
-
"type": "library",
|
30 |
-
"installation-source": "dist",
|
31 |
-
"autoload": {
|
32 |
-
"psr-0": {
|
33 |
-
"Braintree": "lib/"
|
34 |
},
|
35 |
-
"
|
36 |
-
"
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
"
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
"
|
46 |
-
"
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
"
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
"
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
|
73 |
-
"
|
74 |
-
"
|
75 |
-
|
|
|
|
|
|
|
76 |
},
|
77 |
-
|
78 |
-
|
79 |
-
|
80 |
-
|
81 |
-
|
82 |
-
|
83 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
84 |
}
|
85 |
-
|
86 |
-
|
|
|
|
1 |
+
{
|
2 |
+
"packages": [
|
3 |
+
{
|
4 |
+
"name": "braintree/braintree_php",
|
5 |
+
"version": "3.34.0",
|
6 |
+
"version_normalized": "3.34.0.0",
|
7 |
+
"source": {
|
8 |
+
"type": "git",
|
9 |
+
"url": "https://github.com/braintree/braintree_php.git",
|
10 |
+
"reference": "fd55c466d0d0088c67705d7ba0b3876d9767bfda"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
},
|
12 |
+
"dist": {
|
13 |
+
"type": "zip",
|
14 |
+
"url": "https://api.github.com/repos/braintree/braintree_php/zipball/fd55c466d0d0088c67705d7ba0b3876d9767bfda",
|
15 |
+
"reference": "fd55c466d0d0088c67705d7ba0b3876d9767bfda",
|
16 |
+
"shasum": ""
|
17 |
+
},
|
18 |
+
"require": {
|
19 |
+
"ext-curl": "*",
|
20 |
+
"ext-dom": "*",
|
21 |
+
"ext-hash": "*",
|
22 |
+
"ext-openssl": "*",
|
23 |
+
"ext-xmlwriter": "*",
|
24 |
+
"php": ">=5.4.0"
|
25 |
+
},
|
26 |
+
"require-dev": {
|
27 |
+
"phpunit/phpunit": "3.7.*"
|
28 |
+
},
|
29 |
+
"time": "2018-05-21T18:14:47+00:00",
|
30 |
+
"type": "library",
|
31 |
+
"installation-source": "dist",
|
32 |
+
"autoload": {
|
33 |
+
"psr-0": {
|
34 |
+
"Braintree": "lib/"
|
35 |
+
},
|
36 |
+
"psr-4": {
|
37 |
+
"Braintree\\": "lib/Braintree"
|
38 |
+
}
|
39 |
+
},
|
40 |
+
"notification-url": "https://packagist.org/downloads/",
|
41 |
+
"license": [
|
42 |
+
"MIT"
|
43 |
+
],
|
44 |
+
"authors": [
|
45 |
+
{
|
46 |
+
"name": "Braintree",
|
47 |
+
"homepage": "https://www.braintreepayments.com"
|
48 |
+
}
|
49 |
+
],
|
50 |
+
"description": "Braintree PHP Client Library",
|
51 |
+
"support": {
|
52 |
+
"issues": "https://github.com/braintree/braintree_php/issues",
|
53 |
+
"source": "https://github.com/braintree/braintree_php/tree/3.34.0"
|
54 |
+
},
|
55 |
+
"install-path": "../braintree/braintree_php"
|
56 |
},
|
57 |
+
{
|
58 |
+
"name": "skyverge/wc-plugin-framework",
|
59 |
+
"version": "5.10.7",
|
60 |
+
"version_normalized": "5.10.7.0",
|
61 |
+
"source": {
|
62 |
+
"type": "git",
|
63 |
+
"url": "https://github.com/skyverge/wc-plugin-framework.git",
|
64 |
+
"reference": "3a2c8cb4af31bd2c5e1af38647c249c37575db2c"
|
65 |
+
},
|
66 |
+
"dist": {
|
67 |
+
"type": "zip",
|
68 |
+
"url": "https://api.github.com/repos/skyverge/wc-plugin-framework/zipball/3a2c8cb4af31bd2c5e1af38647c249c37575db2c",
|
69 |
+
"reference": "3a2c8cb4af31bd2c5e1af38647c249c37575db2c",
|
70 |
+
"shasum": ""
|
71 |
+
},
|
72 |
+
"require-dev": {
|
73 |
+
"codeception/module-asserts": "^1.3",
|
74 |
+
"codeception/module-db": "^1.0",
|
75 |
+
"codeception/module-phpbrowser": "^1.0",
|
76 |
+
"lucatume/wp-browser": "3.0.5",
|
77 |
+
"phpcompatibility/php-compatibility": "9.3.5"
|
78 |
+
},
|
79 |
+
"time": "2021-04-15T18:24:53+00:00",
|
80 |
+
"type": "library",
|
81 |
+
"installation-source": "dist",
|
82 |
+
"description": "The official SkyVerge WooCommerce plugin framework",
|
83 |
+
"support": {
|
84 |
+
"source": "https://github.com/skyverge/wc-plugin-framework/tree/5.10.7",
|
85 |
+
"issues": "https://github.com/skyverge/wc-plugin-framework/issues"
|
86 |
+
},
|
87 |
+
"install-path": "../skyverge/wc-plugin-framework"
|
88 |
}
|
89 |
+
],
|
90 |
+
"dev": false,
|
91 |
+
"dev-package-names": []
|
92 |
+
}
|
vendor/composer/installed.php
CHANGED
@@ -1,42 +1,41 @@
|
|
1 |
-
<?php return array
|
2 |
-
|
3 |
-
|
4 |
-
|
5 |
-
|
6 |
-
|
7 |
-
|
|
|
|
|
|
|
8 |
),
|
9 |
-
'
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
-
|
14 |
-
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
19 |
-
|
20 |
-
|
21 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
),
|
23 |
-
'braintree/braintree_php' =>
|
24 |
-
array (
|
25 |
-
'pretty_version' => '3.34.0',
|
26 |
-
'version' => '3.34.0.0',
|
27 |
-
'aliases' =>
|
28 |
-
array (
|
29 |
-
),
|
30 |
-
'reference' => 'fd55c466d0d0088c67705d7ba0b3876d9767bfda',
|
31 |
-
),
|
32 |
-
'skyverge/wc-plugin-framework' =>
|
33 |
-
array (
|
34 |
-
'pretty_version' => '5.10.4',
|
35 |
-
'version' => '5.10.4.0',
|
36 |
-
'aliases' =>
|
37 |
-
array (
|
38 |
-
),
|
39 |
-
'reference' => '70956c8f3fa621867af1af91f3cde0d17ae884fc',
|
40 |
-
),
|
41 |
-
),
|
42 |
);
|
1 |
+
<?php return array(
|
2 |
+
'root' => array(
|
3 |
+
'pretty_version' => 'dev-trunk',
|
4 |
+
'version' => 'dev-trunk',
|
5 |
+
'type' => 'library',
|
6 |
+
'install_path' => __DIR__ . '/../../',
|
7 |
+
'aliases' => array(),
|
8 |
+
'reference' => '0139998a60a7e682cbc751d55ea24bd227063b41',
|
9 |
+
'name' => '__root__',
|
10 |
+
'dev' => false,
|
11 |
),
|
12 |
+
'versions' => array(
|
13 |
+
'__root__' => array(
|
14 |
+
'pretty_version' => 'dev-trunk',
|
15 |
+
'version' => 'dev-trunk',
|
16 |
+
'type' => 'library',
|
17 |
+
'install_path' => __DIR__ . '/../../',
|
18 |
+
'aliases' => array(),
|
19 |
+
'reference' => '0139998a60a7e682cbc751d55ea24bd227063b41',
|
20 |
+
'dev_requirement' => false,
|
21 |
+
),
|
22 |
+
'braintree/braintree_php' => array(
|
23 |
+
'pretty_version' => '3.34.0',
|
24 |
+
'version' => '3.34.0.0',
|
25 |
+
'type' => 'library',
|
26 |
+
'install_path' => __DIR__ . '/../braintree/braintree_php',
|
27 |
+
'aliases' => array(),
|
28 |
+
'reference' => 'fd55c466d0d0088c67705d7ba0b3876d9767bfda',
|
29 |
+
'dev_requirement' => false,
|
30 |
+
),
|
31 |
+
'skyverge/wc-plugin-framework' => array(
|
32 |
+
'pretty_version' => '5.10.7',
|
33 |
+
'version' => '5.10.7.0',
|
34 |
+
'type' => 'library',
|
35 |
+
'install_path' => __DIR__ . '/../skyverge/wc-plugin-framework',
|
36 |
+
'aliases' => array(),
|
37 |
+
'reference' => '3a2c8cb4af31bd2c5e1af38647c249c37575db2c',
|
38 |
+
'dev_requirement' => false,
|
39 |
+
),
|
40 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
41 |
);
|
woocommerce-gateway-paypal-powered-by-braintree.php
CHANGED
@@ -6,7 +6,7 @@
|
|
6 |
* Description: Receive credit card or PayPal payments using Braintree for WooCommerce. A server with cURL, SSL support, and a valid SSL certificate is required (for security reasons) for this gateway to function. Requires PHP 5.4+
|
7 |
* Author: WooCommerce
|
8 |
* Author URI: http://woocommerce.com/
|
9 |
-
* Version: 2.6.
|
10 |
* Text Domain: woocommerce-gateway-paypal-powered-by-braintree
|
11 |
* Domain Path: /i18n/languages/
|
12 |
*
|
6 |
* Description: Receive credit card or PayPal payments using Braintree for WooCommerce. A server with cURL, SSL support, and a valid SSL certificate is required (for security reasons) for this gateway to function. Requires PHP 5.4+
|
7 |
* Author: WooCommerce
|
8 |
* Author URI: http://woocommerce.com/
|
9 |
+
* Version: 2.6.2
|
10 |
* Text Domain: woocommerce-gateway-paypal-powered-by-braintree
|
11 |
* Domain Path: /i18n/languages/
|
12 |
*
|