Version Description
- New - Apple Pay Support.
- New - Add Google Payment Request API.
Download this release
Release Info
| Developer | royho |
| Plugin | |
| Version | 3.1.0 |
| Comparing to | |
| See all releases | |
Code changes from version 3.0.7 to 3.1.0
- assets/css/stripe-apple-pay.css +1 -0
- assets/css/stripe-apple-pay.less +114 -0
- assets/js/payment-request.js +387 -0
- assets/js/payment-request.min.js +1 -0
- assets/js/stripe-admin.js +92 -0
- assets/js/stripe-admin.min.js +1 -0
- assets/js/stripe-apple-pay-single.js +207 -0
- assets/js/stripe-apple-pay-single.min.js +1 -0
- assets/js/stripe-apple-pay.js +172 -0
- assets/js/stripe-apple-pay.min.js +1 -0
- assets/js/{stripe_checkout.js → stripe-checkout.js} +0 -0
- assets/js/{stripe_checkout.min.js → stripe-checkout.min.js} +0 -0
- assets/js/stripe.js +4 -4
- assets/js/stripe.min.js +1 -1
- includes/class-wc-gateway-stripe-addons.php +34 -14
- includes/class-wc-gateway-stripe.php +268 -104
- includes/class-wc-stripe-api.php +21 -5
- includes/class-wc-stripe-apple-pay.php +884 -0
- includes/class-wc-stripe-customer.php +7 -3
- includes/class-wc-stripe-payment-request.php +359 -0
- includes/legacy/class-wc-gateway-stripe.php +1 -0
- includes/settings-stripe.php +44 -2
- languages/index.html +0 -0
- languages/woocommerce-gateway-stripe.pot +528 -139
- readme.txt +19 -8
- woocommerce-gateway-stripe.php +522 -377
assets/css/stripe-apple-pay.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
| 1 |
+
.apple-pay-button,.apple-pay-button-checkout-separator,.apple-pay-button-wrapper{display:none}@supports (-webkit-appearance:-apple-pay-button){.apple-pay-button-wrapper{display:block;margin-bottom:20px}.apple-pay-button{background-size:100% 100%;background-origin:content-box;background-repeat:no-repeat;width:100%;height:44px;padding:10px 0;border-radius:10px}.apple-pay-button-checkout-separator{text-transform:uppercase;text-align:center;font-size:1.2rem}.woocommerce-checkout .apple-pay-button-wrapper{text-align:center}.woocommerce-checkout .apple-pay-button{height:50px;margin:0 auto}.woocommerce-checkout .apple-pay-button-checkout-separator{border-bottom:1px solid #EBEBEB;padding-bottom:20px}.single-product div.product form.cart .apple-pay-button,.single-product div.product form.cart .quantity,.single-product div.product form.cart .quantity~.button{margin-bottom:10px}.single-product div.product form.cart .quantity{width:100%;margin-right:0}.single-product div.product form.cart .quantity input,.single-product div.product form.cart .quantity~.button{width:100%}.single-product div.product form.cart .apple-pay-button-wrapper{display:inline;margin-bottom:0}@media (min-width:768px){.woocommerce-checkout .apple-pay-button{width:30%}.single-product div.product form.cart .apple-pay-button,.single-product div.product form.cart .quantity,.single-product div.product form.cart .quantity~.button{margin-bottom:0}.single-product div.product form.cart .quantity{width:auto;margin-right:10px}.single-product div.product form.cart .quantity input{width:70px}.single-product div.product form.cart .quantity~.button{float:none;width:auto}.single-product div.product form.cart .apple-pay-button{float:left;max-width:20%;margin-right:10px}}}
|
assets/css/stripe-apple-pay.less
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.apple-pay-button-wrapper,
|
| 2 |
+
.apple-pay-button,
|
| 3 |
+
.apple-pay-button-checkout-separator {
|
| 4 |
+
display: none;
|
| 5 |
+
}
|
| 6 |
+
|
| 7 |
+
@supports (-webkit-appearance: -apple-pay-button) {
|
| 8 |
+
.apple-pay-button-wrapper {
|
| 9 |
+
display: block;
|
| 10 |
+
margin-bottom: 20px;
|
| 11 |
+
}
|
| 12 |
+
|
| 13 |
+
.apple-pay-button {
|
| 14 |
+
background-size: 100% 100%;
|
| 15 |
+
background-origin: content-box;
|
| 16 |
+
background-repeat: no-repeat;
|
| 17 |
+
width: 100%;
|
| 18 |
+
height: 44px;
|
| 19 |
+
padding: 10px 0;
|
| 20 |
+
border-radius: 10px;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
.apple-pay-button-checkout-separator {
|
| 24 |
+
text-transform: uppercase;
|
| 25 |
+
text-align: center;
|
| 26 |
+
font-size: 1.2rem;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
.woocommerce-checkout {
|
| 30 |
+
.apple-pay-button-wrapper {
|
| 31 |
+
text-align: center;
|
| 32 |
+
}
|
| 33 |
+
|
| 34 |
+
.apple-pay-button {
|
| 35 |
+
height: 50px;
|
| 36 |
+
margin: 0 auto;
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
.apple-pay-button-checkout-separator {
|
| 40 |
+
border-bottom: 1px solid #EBEBEB;
|
| 41 |
+
padding-bottom: 20px;
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
.single-product {
|
| 46 |
+
div.product {
|
| 47 |
+
form.cart {
|
| 48 |
+
.quantity,
|
| 49 |
+
.quantity ~ .button,
|
| 50 |
+
.apple-pay-button {
|
| 51 |
+
margin-bottom: 10px;
|
| 52 |
+
}
|
| 53 |
+
|
| 54 |
+
.quantity {
|
| 55 |
+
width: 100%;
|
| 56 |
+
margin-right: 0;
|
| 57 |
+
|
| 58 |
+
input {
|
| 59 |
+
width: 100%;
|
| 60 |
+
}
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
.quantity ~ .button {
|
| 64 |
+
width: 100%;
|
| 65 |
+
}
|
| 66 |
+
|
| 67 |
+
.apple-pay-button-wrapper {
|
| 68 |
+
display: inline;
|
| 69 |
+
margin-bottom: 0;
|
| 70 |
+
}
|
| 71 |
+
}
|
| 72 |
+
}
|
| 73 |
+
}
|
| 74 |
+
|
| 75 |
+
@media ( min-width: 768px ) {
|
| 76 |
+
.woocommerce-checkout {
|
| 77 |
+
.apple-pay-button {
|
| 78 |
+
width: 30%;
|
| 79 |
+
}
|
| 80 |
+
}
|
| 81 |
+
|
| 82 |
+
.single-product {
|
| 83 |
+
div.product {
|
| 84 |
+
form.cart {
|
| 85 |
+
.quantity,
|
| 86 |
+
.quantity ~ .button,
|
| 87 |
+
.apple-pay-button {
|
| 88 |
+
margin-bottom: 0;
|
| 89 |
+
}
|
| 90 |
+
|
| 91 |
+
.quantity {
|
| 92 |
+
width: auto;
|
| 93 |
+
margin-right: 10px;
|
| 94 |
+
|
| 95 |
+
input {
|
| 96 |
+
width: 70px;
|
| 97 |
+
}
|
| 98 |
+
}
|
| 99 |
+
|
| 100 |
+
.quantity ~ .button {
|
| 101 |
+
float: none;
|
| 102 |
+
width: auto;
|
| 103 |
+
}
|
| 104 |
+
|
| 105 |
+
.apple-pay-button {
|
| 106 |
+
float: left;
|
| 107 |
+
max-width: 20%;
|
| 108 |
+
margin-right: 10px;
|
| 109 |
+
}
|
| 110 |
+
}
|
| 111 |
+
}
|
| 112 |
+
}
|
| 113 |
+
}
|
| 114 |
+
}
|
assets/js/payment-request.js
ADDED
|
@@ -0,0 +1,387 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*global jQuery, wcStripePaymentRequestParams, PaymentRequest, Stripe, Promise */
|
| 2 |
+
/*jshint es3: false */
|
| 3 |
+
/*jshint devel: true */
|
| 4 |
+
(function( $ ) {
|
| 5 |
+
|
| 6 |
+
/**
|
| 7 |
+
* WooCommerce Stripe PaymentRequest class.
|
| 8 |
+
*
|
| 9 |
+
* @type {Object}
|
| 10 |
+
*/
|
| 11 |
+
var wcStripePaymentRequest = {
|
| 12 |
+
|
| 13 |
+
/**
|
| 14 |
+
* Initialize class events.
|
| 15 |
+
*/
|
| 16 |
+
init: function() {
|
| 17 |
+
var self = this;
|
| 18 |
+
|
| 19 |
+
if ( self.hasPaymentRequestSupport() ) {
|
| 20 |
+
$( document.body )
|
| 21 |
+
.on( 'click', '.cart_totals a.checkout-button', self.initPaymentRequest );
|
| 22 |
+
}
|
| 23 |
+
},
|
| 24 |
+
|
| 25 |
+
/**
|
| 26 |
+
* Check if browser support PaymentRequest class and if is under HTTPS.
|
| 27 |
+
*
|
| 28 |
+
* @return {Bool}
|
| 29 |
+
*/
|
| 30 |
+
hasPaymentRequestSupport: function() {
|
| 31 |
+
return window.PaymentRequest && 'https:' === window.location.protocol;
|
| 32 |
+
},
|
| 33 |
+
|
| 34 |
+
/**
|
| 35 |
+
* Get Stripe supported methods.
|
| 36 |
+
*
|
| 37 |
+
* @return {Array}
|
| 38 |
+
*/
|
| 39 |
+
getSupportedMethods: function() {
|
| 40 |
+
return [
|
| 41 |
+
'amex',
|
| 42 |
+
'diners',
|
| 43 |
+
'discover',
|
| 44 |
+
'jcb',
|
| 45 |
+
'mastercard',
|
| 46 |
+
'visa'
|
| 47 |
+
];
|
| 48 |
+
},
|
| 49 |
+
|
| 50 |
+
/**
|
| 51 |
+
* Get WC AJAX endpoint URL.
|
| 52 |
+
*
|
| 53 |
+
* @param {String} endpoint Endpoint.
|
| 54 |
+
* @return {String}
|
| 55 |
+
*/
|
| 56 |
+
getAjaxURL: function( endpoint ) {
|
| 57 |
+
return wcStripePaymentRequestParams.ajax_url
|
| 58 |
+
.toString()
|
| 59 |
+
.replace( '%%endpoint%%', 'wc_stripe_' + endpoint );
|
| 60 |
+
},
|
| 61 |
+
|
| 62 |
+
/**
|
| 63 |
+
* Initialize the PaymentRequest.
|
| 64 |
+
*
|
| 65 |
+
* @param {Object} evt DOM events.
|
| 66 |
+
*/
|
| 67 |
+
initPaymentRequest: function( evt ) {
|
| 68 |
+
evt.preventDefault();
|
| 69 |
+
var self = wcStripePaymentRequest;
|
| 70 |
+
var data = {
|
| 71 |
+
security: wcStripePaymentRequestParams.nonce.payment
|
| 72 |
+
};
|
| 73 |
+
|
| 74 |
+
$.ajax({
|
| 75 |
+
type: 'POST',
|
| 76 |
+
data: data,
|
| 77 |
+
url: self.getAjaxURL( 'get_cart_details' ),
|
| 78 |
+
success: function( response ) {
|
| 79 |
+
self.openPaymentRequest( response );
|
| 80 |
+
}
|
| 81 |
+
});
|
| 82 |
+
},
|
| 83 |
+
|
| 84 |
+
/**
|
| 85 |
+
* Open Payment Request modal.
|
| 86 |
+
*
|
| 87 |
+
* @param {Object} details Payment request details.
|
| 88 |
+
*/
|
| 89 |
+
openPaymentRequest: function( details ) {
|
| 90 |
+
var self = this;
|
| 91 |
+
|
| 92 |
+
// PaymentRequest options.
|
| 93 |
+
var supportedInstruments = [{
|
| 94 |
+
supportedMethods: self.getSupportedMethods()
|
| 95 |
+
}];
|
| 96 |
+
var options = {
|
| 97 |
+
requestPayerPhone: true,
|
| 98 |
+
requestPayerEmail: true
|
| 99 |
+
};
|
| 100 |
+
if ( details.shipping_required ) {
|
| 101 |
+
options.requestShipping = true;
|
| 102 |
+
}
|
| 103 |
+
var paymentDetails = details.order_data;
|
| 104 |
+
|
| 105 |
+
// Init PaymentRequest.
|
| 106 |
+
var request = new PaymentRequest( supportedInstruments, paymentDetails, options );
|
| 107 |
+
|
| 108 |
+
// Set up shipping.
|
| 109 |
+
request.addEventListener( 'shippingaddresschange', function( evt ) {
|
| 110 |
+
evt.updateWith( new Promise( function( resolve, reject ) {
|
| 111 |
+
self.updateShippingOptions( paymentDetails, request.shippingAddress, resolve, reject );
|
| 112 |
+
}));
|
| 113 |
+
});
|
| 114 |
+
request.addEventListener( 'shippingoptionchange', function( evt ) {
|
| 115 |
+
evt.updateWith( new Promise( function( resolve, reject ) {
|
| 116 |
+
self.updateShippingDetails( paymentDetails, request.shippingOption, resolve, reject );
|
| 117 |
+
}));
|
| 118 |
+
});
|
| 119 |
+
|
| 120 |
+
// Open Payment Request UI.
|
| 121 |
+
request.show().then( function( payment ) {
|
| 122 |
+
self.processPayment( payment );
|
| 123 |
+
})
|
| 124 |
+
.catch( function( err ) {
|
| 125 |
+
console.error( err );
|
| 126 |
+
});
|
| 127 |
+
},
|
| 128 |
+
|
| 129 |
+
/**
|
| 130 |
+
* Update shipping options.
|
| 131 |
+
*
|
| 132 |
+
* @param {Object} details Payment details.
|
| 133 |
+
* @param {PaymentAddress} address Shipping address.
|
| 134 |
+
* @param {Function} resolve The callback to invoke with updated line items and shipping options.
|
| 135 |
+
* @param {Function} reject The callback to invoke in case of failure.
|
| 136 |
+
*/
|
| 137 |
+
updateShippingOptions: function( details, address, resolve, reject ) {
|
| 138 |
+
var self = this;
|
| 139 |
+
var data = {
|
| 140 |
+
security: wcStripePaymentRequestParams.nonce.shipping,
|
| 141 |
+
country: address.country,
|
| 142 |
+
state: address.region,
|
| 143 |
+
postcode: address.postalCode,
|
| 144 |
+
city: address.city,
|
| 145 |
+
address: typeof address.addressLine[0] === 'undefined' ? '' : address.addressLine[0],
|
| 146 |
+
address_2: typeof address.addressLine[1] === 'undefined' ? '' : address.addressLine[1]
|
| 147 |
+
};
|
| 148 |
+
|
| 149 |
+
$.ajax({
|
| 150 |
+
type: 'POST',
|
| 151 |
+
data: data,
|
| 152 |
+
url: self.getAjaxURL( 'get_shipping_options' ),
|
| 153 |
+
success: function( response ) {
|
| 154 |
+
details.shippingOptions = response;
|
| 155 |
+
if ( details.shippingOptions.length == 1 ) {
|
| 156 |
+
// The sole shipping option was auto-selected. Update the details
|
| 157 |
+
// (including the total).
|
| 158 |
+
self.updateShippingDetails(
|
| 159 |
+
details, details.shippingOptions[0].id, resolve, reject );
|
| 160 |
+
} else {
|
| 161 |
+
resolve( details );
|
| 162 |
+
}
|
| 163 |
+
}
|
| 164 |
+
});
|
| 165 |
+
},
|
| 166 |
+
|
| 167 |
+
/**
|
| 168 |
+
* Updates the shipping price and the total based on the shipping option.
|
| 169 |
+
*
|
| 170 |
+
* @param {Object} details The line items and shipping options.
|
| 171 |
+
* @param {String} shippingOption User's preferred shipping option to use for shipping price calculations.
|
| 172 |
+
* @param {Function} resolve The callback to invoke with updated line items and shipping options.
|
| 173 |
+
* @param {Function} reject The callback to invoke in case of failure.
|
| 174 |
+
*/
|
| 175 |
+
updateShippingDetails: function( details, shippingOption, resolve, reject ) {
|
| 176 |
+
var self = this;
|
| 177 |
+
var selected = null;
|
| 178 |
+
var data = {
|
| 179 |
+
security: wcStripePaymentRequestParams.nonce.update_shipping,
|
| 180 |
+
shipping_method: [
|
| 181 |
+
shippingOption
|
| 182 |
+
]
|
| 183 |
+
};
|
| 184 |
+
|
| 185 |
+
$.ajax({
|
| 186 |
+
type: 'POST',
|
| 187 |
+
data: data,
|
| 188 |
+
url: self.getAjaxURL( 'update_shipping_method' ),
|
| 189 |
+
success: function( response ) {
|
| 190 |
+
details.shippingOptions.forEach( function( value, index ) {
|
| 191 |
+
if ( value.id === shippingOption ) {
|
| 192 |
+
selected = index;
|
| 193 |
+
value.selected = true;
|
| 194 |
+
details.total.amount.value = parseFloat( response.total );
|
| 195 |
+
|
| 196 |
+
if ( response.items ) {
|
| 197 |
+
details.displayItems = response.items;
|
| 198 |
+
}
|
| 199 |
+
} else {
|
| 200 |
+
value.selected = false;
|
| 201 |
+
}
|
| 202 |
+
});
|
| 203 |
+
|
| 204 |
+
if ( null === selected ) {
|
| 205 |
+
reject( wcStripePaymentRequestParams.i18n.unknown_shipping.toString().replace( '[option]', shippingOption ) );
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
resolve( details );
|
| 209 |
+
}
|
| 210 |
+
});
|
| 211 |
+
},
|
| 212 |
+
|
| 213 |
+
/**
|
| 214 |
+
* Get order data.
|
| 215 |
+
*
|
| 216 |
+
* @param {PaymentResponse} payment Payment Response instance.
|
| 217 |
+
*
|
| 218 |
+
* @return {Object}
|
| 219 |
+
*/
|
| 220 |
+
getOrderData: function( payment ) {
|
| 221 |
+
var billing = payment.details.billingAddress;
|
| 222 |
+
var shipping = payment.shippingAddress;
|
| 223 |
+
var data = {
|
| 224 |
+
_wpnonce: wcStripePaymentRequestParams.nonce.checkout,
|
| 225 |
+
billing_first_name: billing.recipient.split( ' ' ).slice( 0, 1 ).join( ' ' ),
|
| 226 |
+
billing_last_name: billing.recipient.split( ' ' ).slice( 1 ).join( ' ' ),
|
| 227 |
+
billing_company: billing.organization,
|
| 228 |
+
billing_email: payment.payerEmail,
|
| 229 |
+
billing_phone: payment.payerPhone,
|
| 230 |
+
billing_country: billing.country,
|
| 231 |
+
billing_address_1: typeof billing.addressLine[0] === 'undefined' ? '' : billing.addressLine[0],
|
| 232 |
+
billing_address_2: typeof billing.addressLine[1] === 'undefined' ? '' : billing.addressLine[1],
|
| 233 |
+
billing_city: billing.city,
|
| 234 |
+
billing_state: billing.region,
|
| 235 |
+
billing_postcode: billing.postalCode,
|
| 236 |
+
shipping_first_name: '',
|
| 237 |
+
shipping_last_name: '',
|
| 238 |
+
shipping_company: '',
|
| 239 |
+
shipping_country: '',
|
| 240 |
+
shipping_address_1: '',
|
| 241 |
+
shipping_address_2: '',
|
| 242 |
+
shipping_city: '',
|
| 243 |
+
shipping_state: '',
|
| 244 |
+
shipping_postcode: '',
|
| 245 |
+
shipping_method: [ payment.shippingOption ],
|
| 246 |
+
order_comments: '',
|
| 247 |
+
payment_method: 'stripe',
|
| 248 |
+
// 'wc-stripe-payment-token': 'new',
|
| 249 |
+
stripe_token: '',
|
| 250 |
+
};
|
| 251 |
+
|
| 252 |
+
if ( shipping ) {
|
| 253 |
+
data.shipping_first_name = shipping.recipient.split( ' ' ).slice( 0, 1 ).join( ' ' );
|
| 254 |
+
data.shipping_last_name = shipping.recipient.split( ' ' ).slice( 1 ).join( ' ' );
|
| 255 |
+
data.shipping_company = shipping.organization;
|
| 256 |
+
data.shipping_country = shipping.country;
|
| 257 |
+
data.shipping_address_1 = typeof shipping.addressLine[0] === 'undefined' ? '' : shipping.addressLine[0];
|
| 258 |
+
data.shipping_address_2 = typeof shipping.addressLine[1] === 'undefined' ? '' : shipping.addressLine[1];
|
| 259 |
+
data.shipping_city = shipping.city;
|
| 260 |
+
data.shipping_state = shipping.region;
|
| 261 |
+
data.shipping_postcode = shipping.postalCode;
|
| 262 |
+
}
|
| 263 |
+
|
| 264 |
+
return data;
|
| 265 |
+
},
|
| 266 |
+
|
| 267 |
+
/**
|
| 268 |
+
* Get credit card data.
|
| 269 |
+
*
|
| 270 |
+
* @param {PaymentResponse} payment Payment Response instance.
|
| 271 |
+
*
|
| 272 |
+
* @return {Object}
|
| 273 |
+
*/
|
| 274 |
+
getCardData: function( payment ) {
|
| 275 |
+
var billing = payment.details.billingAddress;
|
| 276 |
+
var data = {
|
| 277 |
+
number: payment.details.cardNumber,
|
| 278 |
+
cvc: payment.details.cardSecurityCode,
|
| 279 |
+
exp_month: parseInt( payment.details.expiryMonth, 10 ) || 0,
|
| 280 |
+
exp_year: parseInt( payment.details.expiryYear, 10 ) || 0,
|
| 281 |
+
name: billing.recipient,
|
| 282 |
+
address_line1: typeof billing.addressLine[0] === 'undefined' ? '' : billing.addressLine[0],
|
| 283 |
+
address_line2: typeof billing.addressLine[1] === 'undefined' ? '' : billing.addressLine[1],
|
| 284 |
+
address_state: billing.region,
|
| 285 |
+
address_city: billing.city,
|
| 286 |
+
address_zip: billing.postalCode,
|
| 287 |
+
address_country: billing.country
|
| 288 |
+
};
|
| 289 |
+
|
| 290 |
+
return data;
|
| 291 |
+
},
|
| 292 |
+
|
| 293 |
+
/**
|
| 294 |
+
* Generate error message HTML.
|
| 295 |
+
*
|
| 296 |
+
* @param {String} message Error message.
|
| 297 |
+
* @return {Object}
|
| 298 |
+
*/
|
| 299 |
+
getErrorMessageHTML: function( message ) {
|
| 300 |
+
return $( '<div class="woocommerce-error" />' ).text( message );
|
| 301 |
+
},
|
| 302 |
+
|
| 303 |
+
/**
|
| 304 |
+
* Abort payment and display error messages.
|
| 305 |
+
*
|
| 306 |
+
* @param {PaymentResponse} payment Payment response instance.
|
| 307 |
+
* @param {String} message Error message to display.
|
| 308 |
+
*/
|
| 309 |
+
abortPayment: function( payment, message ) {
|
| 310 |
+
payment.complete( 'fail' ).then( function() {
|
| 311 |
+
var $form = $( '.shop_table.cart' ).closest( 'form' );
|
| 312 |
+
$( '.woocommerce-error' ).remove();
|
| 313 |
+
$form.before( message );
|
| 314 |
+
$( 'html, body' ).animate({
|
| 315 |
+
scrollTop: $form.prev( '.woocommerce-error' ).offset().top
|
| 316 |
+
}, 600 );
|
| 317 |
+
})
|
| 318 |
+
.catch( function( err ) {
|
| 319 |
+
console.error( err );
|
| 320 |
+
});
|
| 321 |
+
},
|
| 322 |
+
|
| 323 |
+
/**
|
| 324 |
+
* Complete payment.
|
| 325 |
+
*
|
| 326 |
+
* @param {PaymentResponse} payment Payment response instance.
|
| 327 |
+
* @param {String} url Order thank you page URL.
|
| 328 |
+
*/
|
| 329 |
+
completePayment: function( payment, url ) {
|
| 330 |
+
payment.complete( 'success' ).then( function() {
|
| 331 |
+
// Success, then redirect to the Thank You page.
|
| 332 |
+
window.location = url;
|
| 333 |
+
})
|
| 334 |
+
.catch( function( err ) {
|
| 335 |
+
console.error( err );
|
| 336 |
+
});
|
| 337 |
+
},
|
| 338 |
+
|
| 339 |
+
/**
|
| 340 |
+
* Process payment.
|
| 341 |
+
*
|
| 342 |
+
* @param {PaymentResponse} payment Payment response instance.
|
| 343 |
+
*/
|
| 344 |
+
processPayment: function( payment ) {
|
| 345 |
+
var self = this;
|
| 346 |
+
var orderData = self.getOrderData( payment );
|
| 347 |
+
var cardData = self.getCardData( payment );
|
| 348 |
+
|
| 349 |
+
Stripe.setPublishableKey( wcStripePaymentRequestParams.stripe.key );
|
| 350 |
+
Stripe.createToken( cardData, function( status, response ) {
|
| 351 |
+
if ( response.error ) {
|
| 352 |
+
self.abortPayment( payment, self.getErrorMessageHTML( response.error.message ) );
|
| 353 |
+
} else {
|
| 354 |
+
// Check if we allow prepaid cards.
|
| 355 |
+
if ( 'no' === wcStripePaymentRequestParams.stripe.allow_prepaid_card && 'prepaid' === response.card.funding ) {
|
| 356 |
+
self.abortPayment( payment, self.getErrorMessageHTML( wcStripePaymentRequestParams.i18n.no_prepaid_card ) );
|
| 357 |
+
} else {
|
| 358 |
+
// Token contains id, last4, and card type.
|
| 359 |
+
orderData.stripe_token = response.id;
|
| 360 |
+
|
| 361 |
+
$.ajax({
|
| 362 |
+
type: 'POST',
|
| 363 |
+
data: orderData,
|
| 364 |
+
dataType: 'json',
|
| 365 |
+
url: self.getAjaxURL( 'create_order' ),
|
| 366 |
+
success: function( response ) {
|
| 367 |
+
if ( 'success' === response.result ) {
|
| 368 |
+
self.completePayment( payment, response.redirect );
|
| 369 |
+
} else {
|
| 370 |
+
self.abortPayment( payment, response.messages );
|
| 371 |
+
}
|
| 372 |
+
},
|
| 373 |
+
complete: function( jqXHR, textStatus ) {
|
| 374 |
+
if ( 'success' !== textStatus ) {
|
| 375 |
+
console.error( jqXHR );
|
| 376 |
+
}
|
| 377 |
+
}
|
| 378 |
+
});
|
| 379 |
+
}
|
| 380 |
+
}
|
| 381 |
+
});
|
| 382 |
+
}
|
| 383 |
+
};
|
| 384 |
+
|
| 385 |
+
wcStripePaymentRequest.init();
|
| 386 |
+
|
| 387 |
+
})( jQuery );
|
assets/js/payment-request.min.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
| 1 |
+
!function(a){var b={init:function(){var b=this;b.hasPaymentRequestSupport()&&a(document.body).on("click",".cart_totals a.checkout-button",b.initPaymentRequest)},hasPaymentRequestSupport:function(){return window.PaymentRequest&&"https:"===window.location.protocol},getSupportedMethods:function(){return["amex","diners","discover","jcb","mastercard","visa"]},getAjaxURL:function(a){return wcStripePaymentRequestParams.ajax_url.toString().replace("%%endpoint%%","wc_stripe_"+a)},initPaymentRequest:function(c){c.preventDefault();var d=b,e={security:wcStripePaymentRequestParams.nonce.payment};a.ajax({type:"POST",data:e,url:d.getAjaxURL("get_cart_details"),success:function(a){d.openPaymentRequest(a)}})},openPaymentRequest:function(a){var b=this,c=[{supportedMethods:b.getSupportedMethods()}],d={requestPayerPhone:!0,requestPayerEmail:!0};a.shipping_required&&(d.requestShipping=!0);var e=a.order_data,f=new PaymentRequest(c,e,d);f.addEventListener("shippingaddresschange",function(a){a.updateWith(new Promise(function(a,c){b.updateShippingOptions(e,f.shippingAddress,a,c)}))}),f.addEventListener("shippingoptionchange",function(a){a.updateWith(new Promise(function(a,c){b.updateShippingDetails(e,f.shippingOption,a,c)}))}),f.show().then(function(a){b.processPayment(a)})["catch"](function(a){console.error(a)})},updateShippingOptions:function(b,c,d,e){var f=this,g={security:wcStripePaymentRequestParams.nonce.shipping,country:c.country,state:c.region,postcode:c.postalCode,city:c.city,address:"undefined"==typeof c.addressLine[0]?"":c.addressLine[0],address_2:"undefined"==typeof c.addressLine[1]?"":c.addressLine[1]};a.ajax({type:"POST",data:g,url:f.getAjaxURL("get_shipping_options"),success:function(a){b.shippingOptions=a,1==b.shippingOptions.length?f.updateShippingDetails(b,b.shippingOptions[0].id,d,e):d(b)}})},updateShippingDetails:function(b,c,d,e){var f=this,g=null,h={security:wcStripePaymentRequestParams.nonce.update_shipping,shipping_method:[c]};a.ajax({type:"POST",data:h,url:f.getAjaxURL("update_shipping_method"),success:function(a){b.shippingOptions.forEach(function(d,e){d.id===c?(g=e,d.selected=!0,b.total.amount.value=parseFloat(a.total),a.items&&(b.displayItems=a.items)):d.selected=!1}),null===g&&e(wcStripePaymentRequestParams.i18n.unknown_shipping.toString().replace("[option]",c)),d(b)}})},getOrderData:function(a){var b=a.details.billingAddress,c=a.shippingAddress,d={_wpnonce:wcStripePaymentRequestParams.nonce.checkout,billing_first_name:b.recipient.split(" ").slice(0,1).join(" "),billing_last_name:b.recipient.split(" ").slice(1).join(" "),billing_company:b.organization,billing_email:a.payerEmail,billing_phone:a.payerPhone,billing_country:b.country,billing_address_1:"undefined"==typeof b.addressLine[0]?"":b.addressLine[0],billing_address_2:"undefined"==typeof b.addressLine[1]?"":b.addressLine[1],billing_city:b.city,billing_state:b.region,billing_postcode:b.postalCode,shipping_first_name:"",shipping_last_name:"",shipping_company:"",shipping_country:"",shipping_address_1:"",shipping_address_2:"",shipping_city:"",shipping_state:"",shipping_postcode:"",shipping_method:[a.shippingOption],order_comments:"",payment_method:"stripe",stripe_token:""};return c&&(d.shipping_first_name=c.recipient.split(" ").slice(0,1).join(" "),d.shipping_last_name=c.recipient.split(" ").slice(1).join(" "),d.shipping_company=c.organization,d.shipping_country=c.country,d.shipping_address_1="undefined"==typeof c.addressLine[0]?"":c.addressLine[0],d.shipping_address_2="undefined"==typeof c.addressLine[1]?"":c.addressLine[1],d.shipping_city=c.city,d.shipping_state=c.region,d.shipping_postcode=c.postalCode),d},getCardData:function(a){var b=a.details.billingAddress,c={number:a.details.cardNumber,cvc:a.details.cardSecurityCode,exp_month:parseInt(a.details.expiryMonth,10)||0,exp_year:parseInt(a.details.expiryYear,10)||0,name:b.recipient,address_line1:"undefined"==typeof b.addressLine[0]?"":b.addressLine[0],address_line2:"undefined"==typeof b.addressLine[1]?"":b.addressLine[1],address_state:b.region,address_city:b.city,address_zip:b.postalCode,address_country:b.country};return c},getErrorMessageHTML:function(b){return a('<div class="woocommerce-error" />').text(b)},abortPayment:function(b,c){b.complete("fail").then(function(){var b=a(".shop_table.cart").closest("form");a(".woocommerce-error").remove(),b.before(c),a("html, body").animate({scrollTop:b.prev(".woocommerce-error").offset().top},600)})["catch"](function(a){console.error(a)})},completePayment:function(a,b){a.complete("success").then(function(){window.location=b})["catch"](function(a){console.error(a)})},processPayment:function(b){var c=this,d=c.getOrderData(b),e=c.getCardData(b);Stripe.setPublishableKey(wcStripePaymentRequestParams.stripe.key),Stripe.createToken(e,function(e,f){f.error?c.abortPayment(b,c.getErrorMessageHTML(f.error.message)):"no"===wcStripePaymentRequestParams.stripe.allow_prepaid_card&&"prepaid"===f.card.funding?c.abortPayment(b,c.getErrorMessageHTML(wcStripePaymentRequestParams.i18n.no_prepaid_card)):(d.stripe_token=f.id,a.ajax({type:"POST",data:d,dataType:"json",url:c.getAjaxURL("create_order"),success:function(a){"success"===a.result?c.completePayment(b,a.redirect):c.abortPayment(b,a.messages)},complete:function(a,b){"success"!==b&&console.error(a)}}))})}};b.init()}(jQuery);
|
assets/js/stripe-admin.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
jQuery( function( $ ) {
|
| 2 |
+
'use strict';
|
| 3 |
+
|
| 4 |
+
/**
|
| 5 |
+
* Object to handle Stripe admin functions.
|
| 6 |
+
*/
|
| 7 |
+
var wc_stripe_admin = {
|
| 8 |
+
isTestMode: function() {
|
| 9 |
+
return $( '#woocommerce_stripe_testmode' ).is( ':checked' );
|
| 10 |
+
},
|
| 11 |
+
|
| 12 |
+
getSecretKey: function() {
|
| 13 |
+
if ( wc_stripe_admin.isTestMode() ) {
|
| 14 |
+
return $( '#woocommerce_stripe_test_secret_key' ).val();
|
| 15 |
+
} else {
|
| 16 |
+
return $( '#woocommerce_stripe_secret_key' ).val();
|
| 17 |
+
}
|
| 18 |
+
},
|
| 19 |
+
|
| 20 |
+
/**
|
| 21 |
+
* Initialize.
|
| 22 |
+
*/
|
| 23 |
+
init: function() {
|
| 24 |
+
$( document.body ).on( 'change', '#woocommerce_stripe_testmode', function() {
|
| 25 |
+
var test_secret_key = $( '#woocommerce_stripe_test_secret_key' ).parents( 'tr' ).eq( 0 ),
|
| 26 |
+
test_publishable_key = $( '#woocommerce_stripe_test_publishable_key' ).parents( 'tr' ).eq( 0 ),
|
| 27 |
+
live_secret_key = $( '#woocommerce_stripe_secret_key' ).parents( 'tr' ).eq( 0 ),
|
| 28 |
+
live_publishable_key = $( '#woocommerce_stripe_publishable_key' ).parents( 'tr' ).eq( 0 );
|
| 29 |
+
|
| 30 |
+
if ( $( this ).is( ':checked' ) ) {
|
| 31 |
+
test_secret_key.show();
|
| 32 |
+
test_publishable_key.show();
|
| 33 |
+
live_secret_key.hide();
|
| 34 |
+
live_publishable_key.hide();
|
| 35 |
+
} else {
|
| 36 |
+
test_secret_key.hide();
|
| 37 |
+
test_publishable_key.hide();
|
| 38 |
+
live_secret_key.show();
|
| 39 |
+
live_publishable_key.show();
|
| 40 |
+
}
|
| 41 |
+
} );
|
| 42 |
+
|
| 43 |
+
$( '#woocommerce_stripe_testmode' ).change();
|
| 44 |
+
|
| 45 |
+
// Toggle Stripe Checkout settings.
|
| 46 |
+
$( '#woocommerce_stripe_stripe_checkout' ).change( function() {
|
| 47 |
+
if ( $( this ).is( ':checked' ) ) {
|
| 48 |
+
$( '#woocommerce_stripe_stripe_checkout_locale, #woocommerce_stripe_stripe_bitcoin, #woocommerce_stripe_stripe_checkout_image, #woocommerce_stripe_allow_remember_me' ).closest( 'tr' ).show();
|
| 49 |
+
$( '#woocommerce_stripe_request_payment_api' ).closest( 'tr' ).hide();
|
| 50 |
+
} else {
|
| 51 |
+
$( '#woocommerce_stripe_stripe_checkout_locale, #woocommerce_stripe_stripe_bitcoin, #woocommerce_stripe_stripe_checkout_image, #woocommerce_stripe_allow_remember_me' ).closest( 'tr' ).hide();
|
| 52 |
+
$( '#woocommerce_stripe_request_payment_api' ).closest( 'tr' ).show();
|
| 53 |
+
}
|
| 54 |
+
}).change();
|
| 55 |
+
|
| 56 |
+
// Toggle Apple Pay settings.
|
| 57 |
+
$( '#woocommerce_stripe_apple_pay' ).change( function() {
|
| 58 |
+
if ( $( this ).is( ':checked' ) ) {
|
| 59 |
+
$( '#woocommerce_stripe_apple_pay_button, #woocommerce_stripe_apple_pay_button_lang' ).closest( 'tr' ).show();
|
| 60 |
+
} else {
|
| 61 |
+
$( '#woocommerce_stripe_apple_pay_button, #woocommerce_stripe_apple_pay_button_lang' ).closest( 'tr' ).hide();
|
| 62 |
+
}
|
| 63 |
+
}).change();
|
| 64 |
+
|
| 65 |
+
// Validate the keys to make sure it is matching test with test field.
|
| 66 |
+
$( '#woocommerce_stripe_secret_key, #woocommerce_stripe_publishable_key' ).on( 'input', function() {
|
| 67 |
+
var value = $( this ).val();
|
| 68 |
+
|
| 69 |
+
if ( value.indexOf( '_test_' ) >= 0 ) {
|
| 70 |
+
$( this ).css( 'border-color', 'red' ).after( '<span class="description stripe-error-description" style="color:red; display:block;">' + wc_stripe_admin_params.localized_messages.not_valid_live_key_msg + '</span>' );
|
| 71 |
+
} else {
|
| 72 |
+
$( this ).css( 'border-color', '' );
|
| 73 |
+
$( '.stripe-error-description', $( this ).parent() ).remove();
|
| 74 |
+
}
|
| 75 |
+
}).trigger( 'input' );
|
| 76 |
+
|
| 77 |
+
// Validate the keys to make sure it is matching live with live field.
|
| 78 |
+
$( '#woocommerce_stripe_test_secret_key, #woocommerce_stripe_test_publishable_key' ).on( 'input', function() {
|
| 79 |
+
var value = $( this ).val();
|
| 80 |
+
|
| 81 |
+
if ( value.indexOf( '_live_' ) >= 0 ) {
|
| 82 |
+
$( this ).css( 'border-color', 'red' ).after( '<span class="description stripe-error-description" style="color:red; display:block;">' + wc_stripe_admin_params.localized_messages.not_valid_test_key_msg + '</span>' );
|
| 83 |
+
} else {
|
| 84 |
+
$( this ).css( 'border-color', '' );
|
| 85 |
+
$( '.stripe-error-description', $( this ).parent() ).remove();
|
| 86 |
+
}
|
| 87 |
+
}).trigger( 'input' );
|
| 88 |
+
}
|
| 89 |
+
};
|
| 90 |
+
|
| 91 |
+
wc_stripe_admin.init();
|
| 92 |
+
});
|
assets/js/stripe-admin.min.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
| 1 |
+
jQuery(function(a){"use strict";var b={isTestMode:function(){return a("#woocommerce_stripe_testmode").is(":checked")},getSecretKey:function(){return b.isTestMode()?a("#woocommerce_stripe_test_secret_key").val():a("#woocommerce_stripe_secret_key").val()},init:function(){a(document.body).on("change","#woocommerce_stripe_testmode",function(){var b=a("#woocommerce_stripe_test_secret_key").parents("tr").eq(0),c=a("#woocommerce_stripe_test_publishable_key").parents("tr").eq(0),d=a("#woocommerce_stripe_secret_key").parents("tr").eq(0),e=a("#woocommerce_stripe_publishable_key").parents("tr").eq(0);a(this).is(":checked")?(b.show(),c.show(),d.hide(),e.hide()):(b.hide(),c.hide(),d.show(),e.show())}),a("#woocommerce_stripe_testmode").change(),a("#woocommerce_stripe_stripe_checkout").change(function(){a(this).is(":checked")?(a("#woocommerce_stripe_stripe_checkout_locale, #woocommerce_stripe_stripe_bitcoin, #woocommerce_stripe_stripe_checkout_image, #woocommerce_stripe_allow_remember_me").closest("tr").show(),a("#woocommerce_stripe_request_payment_api").closest("tr").hide()):(a("#woocommerce_stripe_stripe_checkout_locale, #woocommerce_stripe_stripe_bitcoin, #woocommerce_stripe_stripe_checkout_image, #woocommerce_stripe_allow_remember_me").closest("tr").hide(),a("#woocommerce_stripe_request_payment_api").closest("tr").show())}).change(),a("#woocommerce_stripe_apple_pay").change(function(){a(this).is(":checked")?a("#woocommerce_stripe_apple_pay_button, #woocommerce_stripe_apple_pay_button_lang").closest("tr").show():a("#woocommerce_stripe_apple_pay_button, #woocommerce_stripe_apple_pay_button_lang").closest("tr").hide()}).change(),a("#woocommerce_stripe_secret_key, #woocommerce_stripe_publishable_key").on("input",function(){var b=a(this).val();b.indexOf("_test_")>=0?a(this).css("border-color","red").after('<span class="description stripe-error-description" style="color:red; display:block;">'+wc_stripe_admin_params.localized_messages.not_valid_live_key_msg+"</span>"):(a(this).css("border-color",""),a(".stripe-error-description",a(this).parent()).remove())}).trigger("input"),a("#woocommerce_stripe_test_secret_key, #woocommerce_stripe_test_publishable_key").on("input",function(){var b=a(this).val();b.indexOf("_live_")>=0?a(this).css("border-color","red").after('<span class="description stripe-error-description" style="color:red; display:block;">'+wc_stripe_admin_params.localized_messages.not_valid_test_key_msg+"</span>"):(a(this).css("border-color",""),a(".stripe-error-description",a(this).parent()).remove())}).trigger("input")}};b.init()});
|
assets/js/stripe-apple-pay-single.js
ADDED
|
@@ -0,0 +1,207 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* global wc_stripe_apple_pay_single_params, Stripe */
|
| 2 |
+
Stripe.setPublishableKey( wc_stripe_apple_pay_single_params.key );
|
| 3 |
+
|
| 4 |
+
jQuery( function( $ ) {
|
| 5 |
+
'use strict';
|
| 6 |
+
|
| 7 |
+
/**
|
| 8 |
+
* Object to handle Stripe payment forms.
|
| 9 |
+
*/
|
| 10 |
+
var wc_stripe_apple_pay_single = {
|
| 11 |
+
/**
|
| 12 |
+
* Get WC AJAX endpoint URL.
|
| 13 |
+
*
|
| 14 |
+
* @param {String} endpoint Endpoint.
|
| 15 |
+
* @return {String}
|
| 16 |
+
*/
|
| 17 |
+
getAjaxURL: function( endpoint ) {
|
| 18 |
+
return wc_stripe_apple_pay_single_params.ajaxurl
|
| 19 |
+
.toString()
|
| 20 |
+
.replace( '%%endpoint%%', 'wc_stripe_' + endpoint );
|
| 21 |
+
},
|
| 22 |
+
|
| 23 |
+
/**
|
| 24 |
+
* Initialize event handlers and UI state.
|
| 25 |
+
*/
|
| 26 |
+
init: function() {
|
| 27 |
+
Stripe.applePay.checkAvailability( function( available ) {
|
| 28 |
+
if ( available ) {
|
| 29 |
+
$( document.body ).on( 'woocommerce_variation_has_changed', function() {
|
| 30 |
+
wc_stripe_apple_pay_single.generate_cart();
|
| 31 |
+
})
|
| 32 |
+
|
| 33 |
+
.on( 'change', '.quantity .qty', function() {
|
| 34 |
+
wc_stripe_apple_pay_single.generate_cart();
|
| 35 |
+
});
|
| 36 |
+
|
| 37 |
+
wc_stripe_apple_pay_single.generate_cart();
|
| 38 |
+
|
| 39 |
+
$( '.apple-pay-button' ).show();
|
| 40 |
+
}
|
| 41 |
+
});
|
| 42 |
+
|
| 43 |
+
$( document.body ).on( 'click', '.apple-pay-button', function( e ) {
|
| 44 |
+
e.preventDefault();
|
| 45 |
+
|
| 46 |
+
var addToCartButton = $( '.single_add_to_cart_button' );
|
| 47 |
+
|
| 48 |
+
// First check if product can be added to cart.
|
| 49 |
+
if ( addToCartButton.is( '.disabled' ) ) {
|
| 50 |
+
if ( addToCartButton.is( '.wc-variation-is-unavailable' ) ) {
|
| 51 |
+
window.alert( wc_add_to_cart_variation_params.i18n_unavailable_text );
|
| 52 |
+
} else if ( addToCartButton.is( '.wc-variation-selection-needed' ) ) {
|
| 53 |
+
window.alert( wc_add_to_cart_variation_params.i18n_make_a_selection_text );
|
| 54 |
+
}
|
| 55 |
+
|
| 56 |
+
return;
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
var paymentRequest = {
|
| 60 |
+
countryCode: wc_stripe_apple_pay_single_params.country_code,
|
| 61 |
+
currencyCode: wc_stripe_apple_pay_single_params.currency_code,
|
| 62 |
+
total: {
|
| 63 |
+
label: wc_stripe_apple_pay_single_params.label,
|
| 64 |
+
amount: wc_stripe_apple_pay_single_params.total
|
| 65 |
+
},
|
| 66 |
+
lineItems: wc_stripe_apple_pay_single_params.line_items,
|
| 67 |
+
requiredBillingContactFields: ['postalAddress'],
|
| 68 |
+
requiredShippingContactFields: 'yes' === wc_stripe_apple_pay_single_params.needs_shipping ? ['postalAddress', 'phone', 'email', 'name'] : ['phone', 'email', 'name']
|
| 69 |
+
};
|
| 70 |
+
|
| 71 |
+
var applePaySession = Stripe.applePay.buildSession( paymentRequest, function( result, completion ) {
|
| 72 |
+
var data = {
|
| 73 |
+
'nonce': wc_stripe_apple_pay_single_params.stripe_apple_pay_nonce,
|
| 74 |
+
'result': result
|
| 75 |
+
};
|
| 76 |
+
|
| 77 |
+
$.ajax({
|
| 78 |
+
type: 'POST',
|
| 79 |
+
data: data,
|
| 80 |
+
url: wc_stripe_apple_pay_single.getAjaxURL( 'apple_pay' ),
|
| 81 |
+
success: function( response ) {
|
| 82 |
+
if ( 'true' === response.success ) {
|
| 83 |
+
completion( ApplePaySession.STATUS_SUCCESS );
|
| 84 |
+
window.location.href = response.redirect;
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
if ( 'false' === response.success ) {
|
| 88 |
+
completion( ApplePaySession.STATUS_FAILURE );
|
| 89 |
+
|
| 90 |
+
$( '.apple-pay-button' ).before( '<p class="woocommerce-error wc-stripe-apple-pay-error">' + response.msg + '</p>' );
|
| 91 |
+
|
| 92 |
+
// Scroll to error so user can see it.
|
| 93 |
+
$( document.body ).animate({ scrollTop: $( '.wc-stripe-apple-pay-error' ).offset().top }, 500 );
|
| 94 |
+
}
|
| 95 |
+
}
|
| 96 |
+
});
|
| 97 |
+
});
|
| 98 |
+
|
| 99 |
+
// If shipping is needed -- get shipping methods.
|
| 100 |
+
if ( 'yes' === wc_stripe_apple_pay_single_params.needs_shipping ) {
|
| 101 |
+
// After the shipping contact/address has been selected
|
| 102 |
+
applePaySession.onshippingcontactselected = function( shipping ) {
|
| 103 |
+
var data = {
|
| 104 |
+
'nonce': wc_stripe_apple_pay_single_params.stripe_apple_pay_get_shipping_methods_nonce,
|
| 105 |
+
'address': shipping.shippingContact
|
| 106 |
+
};
|
| 107 |
+
|
| 108 |
+
$.ajax({
|
| 109 |
+
type: 'POST',
|
| 110 |
+
data: data,
|
| 111 |
+
url: wc_stripe_apple_pay_single.getAjaxURL( 'apple_pay_get_shipping_methods' ),
|
| 112 |
+
success: function( response ) {
|
| 113 |
+
var total = {
|
| 114 |
+
'label': wc_stripe_apple_pay_single_params.label,
|
| 115 |
+
'amount': response.total
|
| 116 |
+
};
|
| 117 |
+
|
| 118 |
+
if ( 'true' === response.success ) {
|
| 119 |
+
applePaySession.completeShippingContactSelection( ApplePaySession.STATUS_SUCCESS, response.shipping_methods, total, response.line_items );
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
if ( 'false' === response.success ) {
|
| 123 |
+
applePaySession.completeShippingContactSelection( ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS, response.shipping_methods, total, response.line_items );
|
| 124 |
+
}
|
| 125 |
+
}
|
| 126 |
+
});
|
| 127 |
+
};
|
| 128 |
+
|
| 129 |
+
// After the shipping method has been selected
|
| 130 |
+
applePaySession.onshippingmethodselected = function( event ) {
|
| 131 |
+
var data = {
|
| 132 |
+
'nonce': wc_stripe_apple_pay_single_params.stripe_apple_pay_update_shipping_method_nonce,
|
| 133 |
+
'selected_shipping_method': event.shippingMethod
|
| 134 |
+
};
|
| 135 |
+
|
| 136 |
+
$.ajax({
|
| 137 |
+
type: 'POST',
|
| 138 |
+
data: data,
|
| 139 |
+
url: wc_stripe_apple_pay_single.getAjaxURL( 'apple_pay_update_shipping_method' ),
|
| 140 |
+
success: function( response ) {
|
| 141 |
+
var newTotal = {
|
| 142 |
+
'label': wc_stripe_apple_pay_single_params.label,
|
| 143 |
+
'amount': parseFloat( response.total ).toFixed(2)
|
| 144 |
+
};
|
| 145 |
+
|
| 146 |
+
if ( 'true' === response.success ) {
|
| 147 |
+
applePaySession.completeShippingMethodSelection( ApplePaySession.STATUS_SUCCESS, newTotal, response.line_items );
|
| 148 |
+
}
|
| 149 |
+
|
| 150 |
+
if ( 'false' === response.success ) {
|
| 151 |
+
applePaySession.completeShippingMethodSelection( ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS, newTotal, response.line_items );
|
| 152 |
+
}
|
| 153 |
+
}
|
| 154 |
+
});
|
| 155 |
+
};
|
| 156 |
+
}
|
| 157 |
+
|
| 158 |
+
applePaySession.begin();
|
| 159 |
+
});
|
| 160 |
+
},
|
| 161 |
+
|
| 162 |
+
get_attributes: function() {
|
| 163 |
+
var select = $( '.variations_form' ).find( '.variations select' ),
|
| 164 |
+
data = {},
|
| 165 |
+
count = 0,
|
| 166 |
+
chosen = 0;
|
| 167 |
+
|
| 168 |
+
select.each( function() {
|
| 169 |
+
var attribute_name = $( this ).data( 'attribute_name' ) || $( this ).attr( 'name' );
|
| 170 |
+
var value = $( this ).val() || '';
|
| 171 |
+
|
| 172 |
+
if ( value.length > 0 ) {
|
| 173 |
+
chosen ++;
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
count ++;
|
| 177 |
+
data[ attribute_name ] = value;
|
| 178 |
+
});
|
| 179 |
+
|
| 180 |
+
return {
|
| 181 |
+
'count' : count,
|
| 182 |
+
'chosenCount': chosen,
|
| 183 |
+
'data' : data
|
| 184 |
+
};
|
| 185 |
+
},
|
| 186 |
+
|
| 187 |
+
generate_cart: function() {
|
| 188 |
+
var data = {
|
| 189 |
+
'nonce': wc_stripe_apple_pay_single_params.stripe_apple_pay_cart_nonce,
|
| 190 |
+
'qty': $( '.quantity .qty' ).val(),
|
| 191 |
+
'attributes': $( '.variations_form' ).length ? wc_stripe_apple_pay_single.get_attributes().data : []
|
| 192 |
+
};
|
| 193 |
+
|
| 194 |
+
return $.ajax({
|
| 195 |
+
type: 'POST',
|
| 196 |
+
data: data,
|
| 197 |
+
url: wc_stripe_apple_pay_single.getAjaxURL( 'generate_apple_pay_single' ),
|
| 198 |
+
success: function( response ) {
|
| 199 |
+
wc_stripe_apple_pay_single_params.total = response.total;
|
| 200 |
+
wc_stripe_apple_pay_single_params.line_items = response.line_items;
|
| 201 |
+
}
|
| 202 |
+
});
|
| 203 |
+
}
|
| 204 |
+
};
|
| 205 |
+
|
| 206 |
+
wc_stripe_apple_pay_single.init();
|
| 207 |
+
});
|
assets/js/stripe-apple-pay-single.min.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
| 1 |
+
Stripe.setPublishableKey(wc_stripe_apple_pay_single_params.key),jQuery(function(a){"use strict";var b={getAjaxURL:function(a){return wc_stripe_apple_pay_single_params.ajaxurl.toString().replace("%%endpoint%%","wc_stripe_"+a)},init:function(){Stripe.applePay.checkAvailability(function(c){c&&(a(document.body).on("woocommerce_variation_has_changed",function(){b.generate_cart()}).on("change",".quantity .qty",function(){b.generate_cart()}),b.generate_cart(),a(".apple-pay-button").show())}),a(document.body).on("click",".apple-pay-button",function(c){c.preventDefault();var d=a(".single_add_to_cart_button");if(d.is(".disabled"))return void(d.is(".wc-variation-is-unavailable")?window.alert(wc_add_to_cart_variation_params.i18n_unavailable_text):d.is(".wc-variation-selection-needed")&&window.alert(wc_add_to_cart_variation_params.i18n_make_a_selection_text));var e={countryCode:wc_stripe_apple_pay_single_params.country_code,currencyCode:wc_stripe_apple_pay_single_params.currency_code,total:{label:wc_stripe_apple_pay_single_params.label,amount:wc_stripe_apple_pay_single_params.total},lineItems:wc_stripe_apple_pay_single_params.line_items,requiredBillingContactFields:["postalAddress"],requiredShippingContactFields:"yes"===wc_stripe_apple_pay_single_params.needs_shipping?["postalAddress","phone","email","name"]:["phone","email","name"]},f=Stripe.applePay.buildSession(e,function(c,d){var e={nonce:wc_stripe_apple_pay_single_params.stripe_apple_pay_nonce,result:c};a.ajax({type:"POST",data:e,url:b.getAjaxURL("apple_pay"),success:function(b){"true"===b.success&&(d(ApplePaySession.STATUS_SUCCESS),window.location.href=b.redirect),"false"===b.success&&(d(ApplePaySession.STATUS_FAILURE),a(".apple-pay-button").before('<p class="woocommerce-error wc-stripe-apple-pay-error">'+b.msg+"</p>"),a(document.body).animate({scrollTop:a(".wc-stripe-apple-pay-error").offset().top},500))}})});"yes"===wc_stripe_apple_pay_single_params.needs_shipping&&(f.onshippingcontactselected=function(c){var d={nonce:wc_stripe_apple_pay_single_params.stripe_apple_pay_get_shipping_methods_nonce,address:c.shippingContact};a.ajax({type:"POST",data:d,url:b.getAjaxURL("apple_pay_get_shipping_methods"),success:function(a){var b={label:wc_stripe_apple_pay_single_params.label,amount:a.total};"true"===a.success&&f.completeShippingContactSelection(ApplePaySession.STATUS_SUCCESS,a.shipping_methods,b,a.line_items),"false"===a.success&&f.completeShippingContactSelection(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,a.shipping_methods,b,a.line_items)}})},f.onshippingmethodselected=function(c){var d={nonce:wc_stripe_apple_pay_single_params.stripe_apple_pay_update_shipping_method_nonce,selected_shipping_method:c.shippingMethod};a.ajax({type:"POST",data:d,url:b.getAjaxURL("apple_pay_update_shipping_method"),success:function(a){var b={label:wc_stripe_apple_pay_single_params.label,amount:parseFloat(a.total).toFixed(2)};"true"===a.success&&f.completeShippingMethodSelection(ApplePaySession.STATUS_SUCCESS,b,a.line_items),"false"===a.success&&f.completeShippingMethodSelection(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,b,a.line_items)}})}),f.begin()})},get_attributes:function(){var b=a(".variations_form").find(".variations select"),c={},d=0,e=0;return b.each(function(){var b=a(this).data("attribute_name")||a(this).attr("name"),f=a(this).val()||"";f.length>0&&e++,d++,c[b]=f}),{count:d,chosenCount:e,data:c}},generate_cart:function(){var c={nonce:wc_stripe_apple_pay_single_params.stripe_apple_pay_cart_nonce,qty:a(".quantity .qty").val(),attributes:a(".variations_form").length?b.get_attributes().data:[]};return a.ajax({type:"POST",data:c,url:b.getAjaxURL("generate_apple_pay_single"),success:function(a){wc_stripe_apple_pay_single_params.total=a.total,wc_stripe_apple_pay_single_params.line_items=a.line_items}})}};b.init()});
|
assets/js/stripe-apple-pay.js
ADDED
|
@@ -0,0 +1,172 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/* global wc_stripe_apple_pay_params, Stripe */
|
| 2 |
+
Stripe.setPublishableKey( wc_stripe_apple_pay_params.key );
|
| 3 |
+
|
| 4 |
+
jQuery( function( $ ) {
|
| 5 |
+
'use strict';
|
| 6 |
+
|
| 7 |
+
/**
|
| 8 |
+
* Object to handle Stripe payment forms.
|
| 9 |
+
*/
|
| 10 |
+
var wc_stripe_apple_pay = {
|
| 11 |
+
/**
|
| 12 |
+
* Get WC AJAX endpoint URL.
|
| 13 |
+
*
|
| 14 |
+
* @param {String} endpoint Endpoint.
|
| 15 |
+
* @return {String}
|
| 16 |
+
*/
|
| 17 |
+
getAjaxURL: function( endpoint ) {
|
| 18 |
+
return wc_stripe_apple_pay_params.ajaxurl
|
| 19 |
+
.toString()
|
| 20 |
+
.replace( '%%endpoint%%', 'wc_stripe_' + endpoint );
|
| 21 |
+
},
|
| 22 |
+
|
| 23 |
+
/**
|
| 24 |
+
* Initialize event handlers and UI state.
|
| 25 |
+
*/
|
| 26 |
+
init: function() {
|
| 27 |
+
Stripe.applePay.checkAvailability( function( available ) {
|
| 28 |
+
if ( available ) {
|
| 29 |
+
$( '.apple-pay-button' ).show();
|
| 30 |
+
// This is so it is centered on the checkout page.
|
| 31 |
+
$( '.woocommerce-checkout .apple-pay-button' ).css( 'visibility', 'visible' );
|
| 32 |
+
$( '.apple-pay-button-checkout-separator' ).show();
|
| 33 |
+
|
| 34 |
+
wc_stripe_apple_pay.generate_cart();
|
| 35 |
+
}
|
| 36 |
+
});
|
| 37 |
+
|
| 38 |
+
$( document.body ).on( 'click', '.apple-pay-button', function( e ) {
|
| 39 |
+
e.preventDefault();
|
| 40 |
+
|
| 41 |
+
var paymentRequest = {
|
| 42 |
+
countryCode: wc_stripe_apple_pay_params.country_code,
|
| 43 |
+
currencyCode: wc_stripe_apple_pay_params.currency_code,
|
| 44 |
+
total: {
|
| 45 |
+
label: wc_stripe_apple_pay_params.label,
|
| 46 |
+
amount: wc_stripe_apple_pay_params.total
|
| 47 |
+
},
|
| 48 |
+
lineItems: wc_stripe_apple_pay_params.line_items,
|
| 49 |
+
requiredBillingContactFields: ['postalAddress'],
|
| 50 |
+
requiredShippingContactFields: 'yes' === wc_stripe_apple_pay_params.needs_shipping ? ['postalAddress', 'phone', 'email', 'name'] : ['phone', 'email', 'name']
|
| 51 |
+
};
|
| 52 |
+
|
| 53 |
+
var applePaySession = Stripe.applePay.buildSession( paymentRequest, function( result, completion ) {
|
| 54 |
+
var data = {
|
| 55 |
+
'nonce': wc_stripe_apple_pay_params.stripe_apple_pay_nonce,
|
| 56 |
+
'result': result
|
| 57 |
+
};
|
| 58 |
+
|
| 59 |
+
$.ajax({
|
| 60 |
+
type: 'POST',
|
| 61 |
+
data: data,
|
| 62 |
+
url: wc_stripe_apple_pay.getAjaxURL( 'apple_pay' ),
|
| 63 |
+
success: function( response ) {
|
| 64 |
+
if ( 'true' === response.success ) {
|
| 65 |
+
completion( ApplePaySession.STATUS_SUCCESS );
|
| 66 |
+
window.location.href = response.redirect;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
if ( 'false' === response.success ) {
|
| 70 |
+
completion( ApplePaySession.STATUS_FAILURE );
|
| 71 |
+
|
| 72 |
+
$( '.apple-pay-button' ).before( '<p class="woocommerce-error wc-stripe-apple-pay-error">' + response.msg + '</p>' );
|
| 73 |
+
|
| 74 |
+
// Scroll to error so user can see it.
|
| 75 |
+
$( document.body ).animate({ scrollTop: $( '.wc-stripe-apple-pay-error' ).offset().top }, 500 );
|
| 76 |
+
}
|
| 77 |
+
}
|
| 78 |
+
});
|
| 79 |
+
});
|
| 80 |
+
|
| 81 |
+
// If shipping is needed -- get shipping methods.
|
| 82 |
+
if ( 'yes' === wc_stripe_apple_pay_params.needs_shipping ) {
|
| 83 |
+
// After the shipping contact/address has been selected
|
| 84 |
+
applePaySession.onshippingcontactselected = function( shipping ) {
|
| 85 |
+
var data = {
|
| 86 |
+
'nonce': wc_stripe_apple_pay_params.stripe_apple_pay_get_shipping_methods_nonce,
|
| 87 |
+
'address': shipping.shippingContact
|
| 88 |
+
};
|
| 89 |
+
|
| 90 |
+
$.ajax({
|
| 91 |
+
type: 'POST',
|
| 92 |
+
data: data,
|
| 93 |
+
url: wc_stripe_apple_pay.getAjaxURL( 'apple_pay_get_shipping_methods' ),
|
| 94 |
+
success: function( response ) {
|
| 95 |
+
var total = {
|
| 96 |
+
'label': wc_stripe_apple_pay_params.label,
|
| 97 |
+
'amount': response.total
|
| 98 |
+
};
|
| 99 |
+
|
| 100 |
+
if ( 'true' === response.success ) {
|
| 101 |
+
applePaySession.completeShippingContactSelection( ApplePaySession.STATUS_SUCCESS, response.shipping_methods, total, response.line_items );
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
if ( 'false' === response.success ) {
|
| 105 |
+
applePaySession.completeShippingContactSelection( ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS, response.shipping_methods, total, response.line_items );
|
| 106 |
+
}
|
| 107 |
+
}
|
| 108 |
+
});
|
| 109 |
+
};
|
| 110 |
+
|
| 111 |
+
// After the shipping method has been selected
|
| 112 |
+
applePaySession.onshippingmethodselected = function( event ) {
|
| 113 |
+
var data = {
|
| 114 |
+
'nonce': wc_stripe_apple_pay_params.stripe_apple_pay_update_shipping_method_nonce,
|
| 115 |
+
'selected_shipping_method': event.shippingMethod
|
| 116 |
+
};
|
| 117 |
+
|
| 118 |
+
$.ajax({
|
| 119 |
+
type: 'POST',
|
| 120 |
+
data: data,
|
| 121 |
+
url: wc_stripe_apple_pay.getAjaxURL( 'apple_pay_update_shipping_method' ),
|
| 122 |
+
success: function( response ) {
|
| 123 |
+
var newTotal = {
|
| 124 |
+
'label': wc_stripe_apple_pay_params.label,
|
| 125 |
+
'amount': parseFloat( response.total ).toFixed(2)
|
| 126 |
+
};
|
| 127 |
+
|
| 128 |
+
if ( 'true' === response.success ) {
|
| 129 |
+
applePaySession.completeShippingMethodSelection( ApplePaySession.STATUS_SUCCESS, newTotal, response.line_items );
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
if ( 'false' === response.success ) {
|
| 133 |
+
applePaySession.completeShippingMethodSelection( ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS, newTotal, response.line_items );
|
| 134 |
+
}
|
| 135 |
+
}
|
| 136 |
+
});
|
| 137 |
+
};
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
applePaySession.begin();
|
| 141 |
+
});
|
| 142 |
+
},
|
| 143 |
+
|
| 144 |
+
generate_cart: function() {
|
| 145 |
+
var data = {
|
| 146 |
+
'nonce': wc_stripe_apple_pay_params.stripe_apple_pay_cart_nonce
|
| 147 |
+
};
|
| 148 |
+
|
| 149 |
+
$.ajax({
|
| 150 |
+
type: 'POST',
|
| 151 |
+
data: data,
|
| 152 |
+
url: wc_stripe_apple_pay.getAjaxURL( 'generate_apple_pay_cart' ),
|
| 153 |
+
success: function( response ) {
|
| 154 |
+
wc_stripe_apple_pay_params.total = response.total;
|
| 155 |
+
wc_stripe_apple_pay_params.line_items = response.line_items;
|
| 156 |
+
}
|
| 157 |
+
});
|
| 158 |
+
}
|
| 159 |
+
};
|
| 160 |
+
|
| 161 |
+
wc_stripe_apple_pay.init();
|
| 162 |
+
|
| 163 |
+
// We need to refresh Apple Pay data when total is updated.
|
| 164 |
+
$( document.body ).on( 'updated_cart_totals', function() {
|
| 165 |
+
wc_stripe_apple_pay.init();
|
| 166 |
+
});
|
| 167 |
+
|
| 168 |
+
// We need to refresh Apple Pay data when total is updated.
|
| 169 |
+
$( document.body ).on( 'updated_checkout', function() {
|
| 170 |
+
wc_stripe_apple_pay.init();
|
| 171 |
+
});
|
| 172 |
+
});
|
assets/js/stripe-apple-pay.min.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
| 1 |
+
Stripe.setPublishableKey(wc_stripe_apple_pay_params.key),jQuery(function(a){"use strict";var b={getAjaxURL:function(a){return wc_stripe_apple_pay_params.ajaxurl.toString().replace("%%endpoint%%","wc_stripe_"+a)},init:function(){Stripe.applePay.checkAvailability(function(c){c&&(a(".apple-pay-button").show(),a(".woocommerce-checkout .apple-pay-button").css("visibility","visible"),a(".apple-pay-button-checkout-separator").show(),b.generate_cart())}),a(document.body).on("click",".apple-pay-button",function(c){c.preventDefault();var d={countryCode:wc_stripe_apple_pay_params.country_code,currencyCode:wc_stripe_apple_pay_params.currency_code,total:{label:wc_stripe_apple_pay_params.label,amount:wc_stripe_apple_pay_params.total},lineItems:wc_stripe_apple_pay_params.line_items,requiredBillingContactFields:["postalAddress"],requiredShippingContactFields:"yes"===wc_stripe_apple_pay_params.needs_shipping?["postalAddress","phone","email","name"]:["phone","email","name"]},e=Stripe.applePay.buildSession(d,function(c,d){var e={nonce:wc_stripe_apple_pay_params.stripe_apple_pay_nonce,result:c};a.ajax({type:"POST",data:e,url:b.getAjaxURL("apple_pay"),success:function(b){"true"===b.success&&(d(ApplePaySession.STATUS_SUCCESS),window.location.href=b.redirect),"false"===b.success&&(d(ApplePaySession.STATUS_FAILURE),a(".apple-pay-button").before('<p class="woocommerce-error wc-stripe-apple-pay-error">'+b.msg+"</p>"),a(document.body).animate({scrollTop:a(".wc-stripe-apple-pay-error").offset().top},500))}})});"yes"===wc_stripe_apple_pay_params.needs_shipping&&(e.onshippingcontactselected=function(c){var d={nonce:wc_stripe_apple_pay_params.stripe_apple_pay_get_shipping_methods_nonce,address:c.shippingContact};a.ajax({type:"POST",data:d,url:b.getAjaxURL("apple_pay_get_shipping_methods"),success:function(a){var b={label:wc_stripe_apple_pay_params.label,amount:a.total};"true"===a.success&&e.completeShippingContactSelection(ApplePaySession.STATUS_SUCCESS,a.shipping_methods,b,a.line_items),"false"===a.success&&e.completeShippingContactSelection(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,a.shipping_methods,b,a.line_items)}})},e.onshippingmethodselected=function(c){var d={nonce:wc_stripe_apple_pay_params.stripe_apple_pay_update_shipping_method_nonce,selected_shipping_method:c.shippingMethod};a.ajax({type:"POST",data:d,url:b.getAjaxURL("apple_pay_update_shipping_method"),success:function(a){var b={label:wc_stripe_apple_pay_params.label,amount:parseFloat(a.total).toFixed(2)};"true"===a.success&&e.completeShippingMethodSelection(ApplePaySession.STATUS_SUCCESS,b,a.line_items),"false"===a.success&&e.completeShippingMethodSelection(ApplePaySession.STATUS_INVALID_SHIPPING_POSTAL_ADDRESS,b,a.line_items)}})}),e.begin()})},generate_cart:function(){var c={nonce:wc_stripe_apple_pay_params.stripe_apple_pay_cart_nonce};a.ajax({type:"POST",data:c,url:b.getAjaxURL("generate_apple_pay_cart"),success:function(a){wc_stripe_apple_pay_params.total=a.total,wc_stripe_apple_pay_params.line_items=a.line_items}})}};b.init(),a(document.body).on("updated_cart_totals",function(){b.init()}),a(document.body).on("updated_checkout",function(){b.init()})});
|
assets/js/{stripe_checkout.js → stripe-checkout.js}
RENAMED
|
File without changes
|
assets/js/{stripe_checkout.min.js → stripe-checkout.min.js}
RENAMED
|
File without changes
|
assets/js/stripe.js
CHANGED
|
@@ -3,7 +3,7 @@ Stripe.setPublishableKey( wc_stripe_params.key );
|
|
| 3 |
|
| 4 |
jQuery( function( $ ) {
|
| 5 |
'use strict';
|
| 6 |
-
|
| 7 |
/* Open and close for legacy class */
|
| 8 |
$( 'form.checkout, form#order_review' ).on( 'change', 'input[name="wc-stripe-payment-token"]', function() {
|
| 9 |
if ( 'new' === $( '.stripe-legacy-payment-fields input[name="wc-stripe-payment-token"]:checked' ).val() ) {
|
|
@@ -112,8 +112,8 @@ jQuery( function( $ ) {
|
|
| 112 |
message = wc_stripe_params[ responseObject.response.error.code ];
|
| 113 |
}
|
| 114 |
|
| 115 |
-
$( '.
|
| 116 |
-
$( '#stripe-card-number' ).closest( 'p' ).before( '<ul class="woocommerce_error woocommerce-error"><li>' + message + '</li></ul>' );
|
| 117 |
wc_stripe_form.unblock();
|
| 118 |
},
|
| 119 |
|
|
@@ -162,7 +162,7 @@ jQuery( function( $ ) {
|
|
| 162 |
},
|
| 163 |
|
| 164 |
onCCFormChange: function() {
|
| 165 |
-
$( '.
|
| 166 |
},
|
| 167 |
|
| 168 |
onStripeResponse: function( status, response ) {
|
| 3 |
|
| 4 |
jQuery( function( $ ) {
|
| 5 |
'use strict';
|
| 6 |
+
|
| 7 |
/* Open and close for legacy class */
|
| 8 |
$( 'form.checkout, form#order_review' ).on( 'change', 'input[name="wc-stripe-payment-token"]', function() {
|
| 9 |
if ( 'new' === $( '.stripe-legacy-payment-fields input[name="wc-stripe-payment-token"]:checked' ).val() ) {
|
| 112 |
message = wc_stripe_params[ responseObject.response.error.code ];
|
| 113 |
}
|
| 114 |
|
| 115 |
+
$( '.wc-stripe-error, .stripe_token' ).remove();
|
| 116 |
+
$( '#stripe-card-number' ).closest( 'p' ).before( '<ul class="woocommerce_error woocommerce-error wc-stripe-error"><li>' + message + '</li></ul>' );
|
| 117 |
wc_stripe_form.unblock();
|
| 118 |
},
|
| 119 |
|
| 162 |
},
|
| 163 |
|
| 164 |
onCCFormChange: function() {
|
| 165 |
+
$( '.wc-stripe-error, .stripe_token' ).remove();
|
| 166 |
},
|
| 167 |
|
| 168 |
onStripeResponse: function( status, response ) {
|
assets/js/stripe.min.js
CHANGED
|
@@ -1 +1 @@
|
|
| 1 |
-
Stripe.setPublishableKey(wc_stripe_params.key),jQuery(function(a){"use strict";a("form.checkout, form#order_review").on("change",'input[name="wc-stripe-payment-token"]',function(){"new"===a('.stripe-legacy-payment-fields input[name="wc-stripe-payment-token"]:checked').val()?a(".stripe-legacy-payment-fields #stripe-payment-data").slideDown(200):a(".stripe-legacy-payment-fields #stripe-payment-data").slideUp(200)});var b={init:function(){a("form.woocommerce-checkout").length&&(this.form=a("form.woocommerce-checkout")),a("form.woocommerce-checkout").on("checkout_place_order_stripe",this.onSubmit),a("form#order_review").length&&(this.form=a("form#order_review")),a("form#order_review").on("submit",this.onSubmit),a("form#add_payment_method").length&&(this.form=a("form#add_payment_method")),a("form#add_payment_method").on("submit",this.onSubmit),a(document).on("change","#wc-stripe-cc-form :input",this.onCCFormChange).on("stripeError",this.onError).on("checkout_error",this.clearToken)},isStripeChosen:function(){return a("#payment_method_stripe").is(":checked")&&(!a('input[name="wc-stripe-payment-token"]:checked').length||"new"===a('input[name="wc-stripe-payment-token"]:checked').val())},hasToken:function(){return 0<a("input.stripe_token").length},block:function(){b.form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){b.form.unblock()},onError:function(c,d){var e=d.response.error.message;("invalid_request_error"===d.response.error.type||"api_connection_error"===d.response.error.type||"api_error"===d.response.error.type||"authentication_error"===d.response.error.type||"rate_limit_error"===d.response.error.type)&&(e=wc_stripe_params.invalid_request_error),"card_error"===d.response.error.type&&wc_stripe_params.hasOwnProperty(d.response.error.code)&&(e=wc_stripe_params[d.response.error.code]),a(".
|
| 1 |
+
Stripe.setPublishableKey(wc_stripe_params.key),jQuery(function(a){"use strict";a("form.checkout, form#order_review").on("change",'input[name="wc-stripe-payment-token"]',function(){"new"===a('.stripe-legacy-payment-fields input[name="wc-stripe-payment-token"]:checked').val()?a(".stripe-legacy-payment-fields #stripe-payment-data").slideDown(200):a(".stripe-legacy-payment-fields #stripe-payment-data").slideUp(200)});var b={init:function(){a("form.woocommerce-checkout").length&&(this.form=a("form.woocommerce-checkout")),a("form.woocommerce-checkout").on("checkout_place_order_stripe",this.onSubmit),a("form#order_review").length&&(this.form=a("form#order_review")),a("form#order_review").on("submit",this.onSubmit),a("form#add_payment_method").length&&(this.form=a("form#add_payment_method")),a("form#add_payment_method").on("submit",this.onSubmit),a(document).on("change","#wc-stripe-cc-form :input",this.onCCFormChange).on("stripeError",this.onError).on("checkout_error",this.clearToken)},isStripeChosen:function(){return a("#payment_method_stripe").is(":checked")&&(!a('input[name="wc-stripe-payment-token"]:checked').length||"new"===a('input[name="wc-stripe-payment-token"]:checked').val())},hasToken:function(){return 0<a("input.stripe_token").length},block:function(){b.form.block({message:null,overlayCSS:{background:"#fff",opacity:.6}})},unblock:function(){b.form.unblock()},onError:function(c,d){var e=d.response.error.message;("invalid_request_error"===d.response.error.type||"api_connection_error"===d.response.error.type||"api_error"===d.response.error.type||"authentication_error"===d.response.error.type||"rate_limit_error"===d.response.error.type)&&(e=wc_stripe_params.invalid_request_error),"card_error"===d.response.error.type&&wc_stripe_params.hasOwnProperty(d.response.error.code)&&(e=wc_stripe_params[d.response.error.code]),a(".wc-stripe-error, .stripe_token").remove(),a("#stripe-card-number").closest("p").before('<ul class="woocommerce_error woocommerce-error wc-stripe-error"><li>'+e+"</li></ul>"),b.unblock()},onSubmit:function(c){if(b.isStripeChosen()&&!b.hasToken()){c.preventDefault(),b.block();var d=a("#stripe-card-number").val(),e=a("#stripe-card-cvc").val(),f=a("#stripe-card-expiry").payment("cardExpiryVal"),g=a("#billing_first_name").length?a("#billing_first_name").val():wc_stripe_params.billing_first_name,h=a("#billing_last_name").length?a("#billing_last_name").val():wc_stripe_params.billing_last_name,i={number:d,cvc:e,exp_month:parseInt(f.month,10)||0,exp_year:parseInt(f.year,10)||0};return g&&h&&(i.name=g+" "+h),a("#billing_address_1").length>0?(i.address_line1=a("#billing_address_1").val(),i.address_line2=a("#billing_address_2").val(),i.address_state=a("#billing_state").val(),i.address_city=a("#billing_city").val(),i.address_zip=a("#billing_postcode").val(),i.address_country=a("#billing_country").val()):wc_stripe_params.billing_address_1&&(i.address_line1=wc_stripe_params.billing_address_1,i.address_line2=wc_stripe_params.billing_address_2,i.address_state=wc_stripe_params.billing_state,i.address_city=wc_stripe_params.billing_city,i.address_zip=wc_stripe_params.billing_postcode,i.address_country=wc_stripe_params.billing_country),Stripe.createToken(i,b.onStripeResponse),!1}},onCCFormChange:function(){a(".wc-stripe-error, .stripe_token").remove()},onStripeResponse:function(c,d){if(d.error)a(document).trigger("stripeError",{response:d});else{if("no"===wc_stripe_params.allow_prepaid_card&&"prepaid"===d.card.funding)return d.error={message:wc_stripe_params.no_prepaid_card_msg},a(document).trigger("stripeError",{response:d}),!1;var e=d.id;b.form.append("<input type='hidden' class='stripe_token' name='stripe_token' value='"+e+"'/>"),b.form.submit()}},clearToken:function(){a(".stripe_token").remove()}};b.init()});
|
includes/class-wc-gateway-stripe-addons.php
CHANGED
|
@@ -77,16 +77,18 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 77 |
protected function save_source( $order, $source ) {
|
| 78 |
parent::save_source( $order, $source );
|
| 79 |
|
|
|
|
|
|
|
| 80 |
// Also store it on the subscriptions being purchased or paid for in the order
|
| 81 |
-
if ( function_exists( 'wcs_order_contains_subscription' ) && wcs_order_contains_subscription( $
|
| 82 |
-
$subscriptions = wcs_get_subscriptions_for_order( $
|
| 83 |
-
} elseif ( function_exists( 'wcs_order_contains_renewal' ) && wcs_order_contains_renewal( $
|
| 84 |
-
$subscriptions = wcs_get_subscriptions_for_renewal_order( $
|
| 85 |
} else {
|
| 86 |
$subscriptions = array();
|
| 87 |
}
|
| 88 |
|
| 89 |
-
foreach( $subscriptions as $subscription ) {
|
| 90 |
update_post_meta( $subscription->id, '_stripe_customer_id', $source->customer );
|
| 91 |
update_post_meta( $subscription->id, '_stripe_card_id', $source->source );
|
| 92 |
}
|
|
@@ -99,7 +101,7 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 99 |
* @param string $stripe_token (default: '')
|
| 100 |
* @param bool initial_payment
|
| 101 |
*/
|
| 102 |
-
public function process_subscription_payment( $order = '', $amount = 0 ) {
|
| 103 |
if ( $amount * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 104 |
return new WP_Error( 'stripe_error', sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 105 |
}
|
|
@@ -117,14 +119,15 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 117 |
return new WP_Error( 'stripe_error', __( 'Customer not found', 'woocommerce-gateway-stripe' ) );
|
| 118 |
}
|
| 119 |
|
| 120 |
-
|
|
|
|
| 121 |
|
| 122 |
// Make the request
|
| 123 |
$request = $this->generate_payment_request( $order, $source );
|
| 124 |
$request['capture'] = 'true';
|
| 125 |
$request['amount'] = $this->get_stripe_amount( $amount, $request['currency'] );
|
| 126 |
$request['metadata'] = array(
|
| 127 |
-
'payment_type' => 'recurring'
|
| 128 |
);
|
| 129 |
$response = WC_Stripe_API::request( $request );
|
| 130 |
|
|
@@ -169,7 +172,7 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 169 |
// Return thank you page redirect
|
| 170 |
return array(
|
| 171 |
'result' => 'success',
|
| 172 |
-
'redirect' => $this->get_return_url( $order )
|
| 173 |
);
|
| 174 |
} catch ( Exception $e ) {
|
| 175 |
wc_add_notice( $e->getMessage(), 'error' );
|
|
@@ -210,7 +213,6 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 210 |
break;
|
| 211 |
}
|
| 212 |
}
|
| 213 |
-
|
| 214 |
} catch ( Exception $e ) {
|
| 215 |
$order_note = sprintf( __( 'Stripe Transaction Failed (%s)', 'woocommerce-gateway-stripe' ), $e->getMessage() );
|
| 216 |
|
|
@@ -264,7 +266,8 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 264 |
* @param object $order
|
| 265 |
*/
|
| 266 |
public function remove_order_source_before_retry( $order ) {
|
| 267 |
-
|
|
|
|
| 268 |
}
|
| 269 |
|
| 270 |
/**
|
|
@@ -272,7 +275,8 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 272 |
* @param object $order
|
| 273 |
*/
|
| 274 |
public function remove_order_customer_before_retry( $order ) {
|
| 275 |
-
|
|
|
|
| 276 |
}
|
| 277 |
|
| 278 |
/**
|
|
@@ -377,15 +381,31 @@ class WC_Gateway_Stripe_Addons extends WC_Gateway_Stripe {
|
|
| 377 |
foreach ( $cards as $card ) {
|
| 378 |
if ( $card->id === $stripe_card_id ) {
|
| 379 |
$found_card = true;
|
| 380 |
-
$payment_method_to_display = sprintf( __( 'Via %s card ending in %s', 'woocommerce-gateway-stripe' ), ( isset( $card->type ) ? $card->type : $card->brand ), $card->last4 );
|
| 381 |
break;
|
| 382 |
}
|
| 383 |
}
|
| 384 |
if ( ! $found_card ) {
|
| 385 |
-
$payment_method_to_display = sprintf( __( 'Via %s card ending in %s', 'woocommerce-gateway-stripe' ), ( isset( $cards[0]->type ) ? $cards[0]->type : $cards[0]->brand ), $cards[0]->last4 );
|
| 386 |
}
|
| 387 |
}
|
| 388 |
|
| 389 |
return $payment_method_to_display;
|
| 390 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 391 |
}
|
| 77 |
protected function save_source( $order, $source ) {
|
| 78 |
parent::save_source( $order, $source );
|
| 79 |
|
| 80 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 81 |
+
|
| 82 |
// Also store it on the subscriptions being purchased or paid for in the order
|
| 83 |
+
if ( function_exists( 'wcs_order_contains_subscription' ) && wcs_order_contains_subscription( $order_id ) ) {
|
| 84 |
+
$subscriptions = wcs_get_subscriptions_for_order( $order_id );
|
| 85 |
+
} elseif ( function_exists( 'wcs_order_contains_renewal' ) && wcs_order_contains_renewal( $order_id ) ) {
|
| 86 |
+
$subscriptions = wcs_get_subscriptions_for_renewal_order( $order_id );
|
| 87 |
} else {
|
| 88 |
$subscriptions = array();
|
| 89 |
}
|
| 90 |
|
| 91 |
+
foreach ( $subscriptions as $subscription ) {
|
| 92 |
update_post_meta( $subscription->id, '_stripe_customer_id', $source->customer );
|
| 93 |
update_post_meta( $subscription->id, '_stripe_card_id', $source->source );
|
| 94 |
}
|
| 101 |
* @param string $stripe_token (default: '')
|
| 102 |
* @param bool initial_payment
|
| 103 |
*/
|
| 104 |
+
public function process_subscription_payment( $order = '', $amount = 0 ) {
|
| 105 |
if ( $amount * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 106 |
return new WP_Error( 'stripe_error', sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 107 |
}
|
| 119 |
return new WP_Error( 'stripe_error', __( 'Customer not found', 'woocommerce-gateway-stripe' ) );
|
| 120 |
}
|
| 121 |
|
| 122 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 123 |
+
$this->log( "Info: Begin processing subscription payment for order {$order_id} for the amount of {$amount}" );
|
| 124 |
|
| 125 |
// Make the request
|
| 126 |
$request = $this->generate_payment_request( $order, $source );
|
| 127 |
$request['capture'] = 'true';
|
| 128 |
$request['amount'] = $this->get_stripe_amount( $amount, $request['currency'] );
|
| 129 |
$request['metadata'] = array(
|
| 130 |
+
'payment_type' => 'recurring',
|
| 131 |
);
|
| 132 |
$response = WC_Stripe_API::request( $request );
|
| 133 |
|
| 172 |
// Return thank you page redirect
|
| 173 |
return array(
|
| 174 |
'result' => 'success',
|
| 175 |
+
'redirect' => $this->get_return_url( $order ),
|
| 176 |
);
|
| 177 |
} catch ( Exception $e ) {
|
| 178 |
wc_add_notice( $e->getMessage(), 'error' );
|
| 213 |
break;
|
| 214 |
}
|
| 215 |
}
|
|
|
|
| 216 |
} catch ( Exception $e ) {
|
| 217 |
$order_note = sprintf( __( 'Stripe Transaction Failed (%s)', 'woocommerce-gateway-stripe' ), $e->getMessage() );
|
| 218 |
|
| 266 |
* @param object $order
|
| 267 |
*/
|
| 268 |
public function remove_order_source_before_retry( $order ) {
|
| 269 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 270 |
+
delete_post_meta( $order_id, '_stripe_card_id' );
|
| 271 |
}
|
| 272 |
|
| 273 |
/**
|
| 275 |
* @param object $order
|
| 276 |
*/
|
| 277 |
public function remove_order_customer_before_retry( $order ) {
|
| 278 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 279 |
+
delete_post_meta( $order_id, '_stripe_customer_id' );
|
| 280 |
}
|
| 281 |
|
| 282 |
/**
|
| 381 |
foreach ( $cards as $card ) {
|
| 382 |
if ( $card->id === $stripe_card_id ) {
|
| 383 |
$found_card = true;
|
| 384 |
+
$payment_method_to_display = sprintf( __( 'Via %1$s card ending in %2$s', 'woocommerce-gateway-stripe' ), ( isset( $card->type ) ? $card->type : $card->brand ), $card->last4 );
|
| 385 |
break;
|
| 386 |
}
|
| 387 |
}
|
| 388 |
if ( ! $found_card ) {
|
| 389 |
+
$payment_method_to_display = sprintf( __( 'Via %1$s card ending in %2$s', 'woocommerce-gateway-stripe' ), ( isset( $cards[0]->type ) ? $cards[0]->type : $cards[0]->brand ), $cards[0]->last4 );
|
| 390 |
}
|
| 391 |
}
|
| 392 |
|
| 393 |
return $payment_method_to_display;
|
| 394 |
}
|
| 395 |
+
|
| 396 |
+
/**
|
| 397 |
+
* Logs
|
| 398 |
+
*
|
| 399 |
+
* @since 3.1.0
|
| 400 |
+
* @version 3.1.0
|
| 401 |
+
*
|
| 402 |
+
* @param string $message
|
| 403 |
+
*/
|
| 404 |
+
public function log( $message ) {
|
| 405 |
+
$options = get_option( 'woocommerce_stripe_settings' );
|
| 406 |
+
|
| 407 |
+
if ( 'yes' === $options['logging'] ) {
|
| 408 |
+
WC_Stripe::log( $message );
|
| 409 |
+
}
|
| 410 |
+
}
|
| 411 |
}
|
includes/class-wc-gateway-stripe.php
CHANGED
|
@@ -17,6 +17,13 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 17 |
*/
|
| 18 |
public $capture;
|
| 19 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
/**
|
| 21 |
* Checkout enabled
|
| 22 |
*
|
|
@@ -73,6 +80,27 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 73 |
*/
|
| 74 |
public $allow_remember_me;
|
| 75 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
/**
|
| 77 |
* Is test mode active?
|
| 78 |
*
|
|
@@ -111,7 +139,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 111 |
'multiple_subscriptions',
|
| 112 |
'pre-orders',
|
| 113 |
'tokenization',
|
| 114 |
-
'add_payment_method'
|
| 115 |
);
|
| 116 |
|
| 117 |
// Load the form fields.
|
|
@@ -126,6 +154,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 126 |
$this->enabled = $this->get_option( 'enabled' );
|
| 127 |
$this->testmode = 'yes' === $this->get_option( 'testmode' );
|
| 128 |
$this->capture = 'yes' === $this->get_option( 'capture', 'yes' );
|
|
|
|
| 129 |
$this->stripe_checkout = 'yes' === $this->get_option( 'stripe_checkout' );
|
| 130 |
$this->stripe_checkout_locale = $this->get_option( 'stripe_checkout_locale' );
|
| 131 |
$this->stripe_checkout_image = $this->get_option( 'stripe_checkout_image', '' );
|
|
@@ -133,6 +162,9 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 133 |
$this->secret_key = $this->testmode ? $this->get_option( 'test_secret_key' ) : $this->get_option( 'secret_key' );
|
| 134 |
$this->publishable_key = $this->testmode ? $this->get_option( 'test_publishable_key' ) : $this->get_option( 'publishable_key' );
|
| 135 |
$this->bitcoin = 'USD' === strtoupper( get_woocommerce_currency() ) && 'yes' === $this->get_option( 'stripe_bitcoin' );
|
|
|
|
|
|
|
|
|
|
| 136 |
$this->logging = 'yes' === $this->get_option( 'logging' );
|
| 137 |
$this->allow_remember_me = 'yes' === $this->get_option( 'allow_remember_me', 'no' );
|
| 138 |
|
|
@@ -147,8 +179,11 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 147 |
|
| 148 |
WC_Stripe_API::set_secret_key( $this->secret_key );
|
| 149 |
|
|
|
|
|
|
|
| 150 |
// Hooks.
|
| 151 |
add_action( 'wp_enqueue_scripts', array( $this, 'payment_scripts' ) );
|
|
|
|
| 152 |
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
| 153 |
add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
|
| 154 |
}
|
|
@@ -218,6 +253,108 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 218 |
return $total;
|
| 219 |
}
|
| 220 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 221 |
/**
|
| 222 |
* Check if SSL is enabled and notify the user
|
| 223 |
*/
|
|
@@ -226,6 +363,15 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 226 |
return;
|
| 227 |
}
|
| 228 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
// Show message if enabled and FORCE SSL is disabled and WordpressHTTPS plugin is not detected.
|
| 230 |
if ( ( function_exists( 'wc_site_is_https' ) && ! wc_site_is_https() ) && ( 'no' === get_option( 'woocommerce_force_ssl_checkout' ) && ! class_exists( 'WordPressHTTPS' ) ) ) {
|
| 231 |
echo '<div class="error stripe-ssl-message"><p>' . sprintf( __( 'Stripe is enabled, but the <a href="%s">force SSL option</a> is disabled; your checkout may not be secure! Please enable SSL and ensure your server has a valid SSL certificate - Stripe will only work in test mode.', 'woocommerce-gateway-stripe' ), admin_url( 'admin.php?page=wc-settings&tab=checkout' ) ) . '</p></div>';
|
|
@@ -253,61 +399,6 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 253 |
*/
|
| 254 |
public function init_form_fields() {
|
| 255 |
$this->form_fields = include( 'settings-stripe.php' );
|
| 256 |
-
|
| 257 |
-
wc_enqueue_js( "
|
| 258 |
-
jQuery( function( $ ) {
|
| 259 |
-
$( document.body ).on( 'change', '#woocommerce_stripe_testmode', function() {
|
| 260 |
-
var test_secret_key = $( '#woocommerce_stripe_test_secret_key' ).parents( 'tr' ).eq( 0 ),
|
| 261 |
-
test_publishable_key = $( '#woocommerce_stripe_test_publishable_key' ).parents( 'tr' ).eq( 0 ),
|
| 262 |
-
live_secret_key = $( '#woocommerce_stripe_secret_key' ).parents( 'tr' ).eq( 0 ),
|
| 263 |
-
live_publishable_key = $( '#woocommerce_stripe_publishable_key' ).parents( 'tr' ).eq( 0 );
|
| 264 |
-
|
| 265 |
-
if ( $( this ).is( ':checked' ) ) {
|
| 266 |
-
test_secret_key.show();
|
| 267 |
-
test_publishable_key.show();
|
| 268 |
-
live_secret_key.hide();
|
| 269 |
-
live_publishable_key.hide();
|
| 270 |
-
} else {
|
| 271 |
-
test_secret_key.hide();
|
| 272 |
-
test_publishable_key.hide();
|
| 273 |
-
live_secret_key.show();
|
| 274 |
-
live_publishable_key.show();
|
| 275 |
-
}
|
| 276 |
-
} );
|
| 277 |
-
|
| 278 |
-
$( '#woocommerce_stripe_testmode' ).change();
|
| 279 |
-
|
| 280 |
-
$( '#woocommerce_stripe_stripe_checkout' ).change( function() {
|
| 281 |
-
if ( $( this ).is( ':checked' ) ) {
|
| 282 |
-
$( '#woocommerce_stripe_stripe_checkout_locale, #woocommerce_stripe_stripe_bitcoin, #woocommerce_stripe_stripe_checkout_image, #woocommerce_stripe_allow_remember_me' ).closest( 'tr' ).show();
|
| 283 |
-
} else {
|
| 284 |
-
$( '#woocommerce_stripe_stripe_checkout_locale, #woocommerce_stripe_stripe_bitcoin, #woocommerce_stripe_stripe_checkout_image, #woocommerce_stripe_allow_remember_me' ).closest( 'tr' ).hide();
|
| 285 |
-
}
|
| 286 |
-
}).change();
|
| 287 |
-
|
| 288 |
-
$( '#woocommerce_stripe_secret_key, #woocommerce_stripe_publishable_key' ).change(function(){
|
| 289 |
-
var value = $( this ).val();
|
| 290 |
-
|
| 291 |
-
if ( value.indexOf( '_test_' ) >= 0 ) {
|
| 292 |
-
$( this ).css( 'border-color', 'red' ).after( '<span class=\"description stripe-error-description\" style=\"color:red; display:block;\">" . __( 'This is not a valid live key. Live keys start with "sk_live_" and "pk_live_".', 'woocommerce-gateway-stripe' ) . "</span>' );
|
| 293 |
-
} else {
|
| 294 |
-
$( this ).css( 'border-color', '' );
|
| 295 |
-
$( '.stripe-error-description', $( this ).parent() ).remove();
|
| 296 |
-
}
|
| 297 |
-
}).change();
|
| 298 |
-
|
| 299 |
-
$( '#woocommerce_stripe_test_secret_key, #woocommerce_stripe_test_publishable_key' ).change(function(){
|
| 300 |
-
var value = $( this ).val();
|
| 301 |
-
|
| 302 |
-
if ( value.indexOf( '_live_' ) >= 0 ) {
|
| 303 |
-
$( this ).css( 'border-color', 'red' ).after( '<span class=\"description stripe-error-description\" style=\"color:red; display:block;\">" . __( 'This is not a valid test key. Test keys start with "sk_test_" and "pk_test_".', 'woocommerce-gateway-stripe' ) . "</span>' );
|
| 304 |
-
} else {
|
| 305 |
-
$( this ).css( 'border-color', '' );
|
| 306 |
-
$( '.stripe-error-description', $( this ).parent() ).remove();
|
| 307 |
-
}
|
| 308 |
-
}).change();
|
| 309 |
-
});
|
| 310 |
-
" );
|
| 311 |
}
|
| 312 |
|
| 313 |
/**
|
|
@@ -343,7 +434,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 343 |
data-description=""
|
| 344 |
data-email="' . esc_attr( $user_email ) . '"
|
| 345 |
data-amount="' . esc_attr( $this->get_stripe_amount( $total ) ) . '"
|
| 346 |
-
data-name="' . esc_attr(
|
| 347 |
data-currency="' . esc_attr( strtolower( get_woocommerce_currency() ) ) . '"
|
| 348 |
data-image="' . esc_attr( $this->stripe_checkout_image ) . '"
|
| 349 |
data-bitcoin="' . esc_attr( $this->bitcoin ? 'true' : 'false' ) . '"
|
|
@@ -361,7 +452,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 361 |
|
| 362 |
if ( ! $this->stripe_checkout ) {
|
| 363 |
$this->form();
|
| 364 |
-
|
| 365 |
if ( $display_tokenization ) {
|
| 366 |
$this->save_payment_method_checkbox();
|
| 367 |
}
|
|
@@ -391,7 +482,38 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 391 |
'missing' => __( 'There is no card on a customer that is being charged.', 'woocommerce-gateway-stripe' ),
|
| 392 |
'processing_error' => __( 'An error occurred while processing the card.', 'woocommerce-gateway-stripe' ),
|
| 393 |
'invalid_request_error' => __( 'Could not find payment information.', 'woocommerce-gateway-stripe' ),
|
| 394 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 395 |
}
|
| 396 |
|
| 397 |
/**
|
|
@@ -402,11 +524,15 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 402 |
* @access public
|
| 403 |
*/
|
| 404 |
public function payment_scripts() {
|
|
|
|
|
|
|
|
|
|
|
|
|
| 405 |
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
| 406 |
-
|
| 407 |
if ( $this->stripe_checkout ) {
|
| 408 |
-
wp_enqueue_script( '
|
| 409 |
-
wp_enqueue_script( 'woocommerce_stripe', plugins_url( 'assets/js/
|
| 410 |
} else {
|
| 411 |
wp_enqueue_script( 'stripe', 'https://js.stripe.com/v2/', '', '1.0', true );
|
| 412 |
wp_enqueue_script( 'woocommerce_stripe', plugins_url( 'assets/js/stripe' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array( 'jquery-payment', 'stripe' ), WC_STRIPE_VERSION, true );
|
|
@@ -423,14 +549,14 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 423 |
$order_id = wc_get_order_id_by_order_key( urldecode( $_GET['key'] ) );
|
| 424 |
$order = wc_get_order( $order_id );
|
| 425 |
|
| 426 |
-
$stripe_params['billing_first_name'] = $order->billing_first_name;
|
| 427 |
-
$stripe_params['billing_last_name'] = $order->billing_last_name;
|
| 428 |
-
$stripe_params['billing_address_1'] = $order->billing_address_1;
|
| 429 |
-
$stripe_params['billing_address_2'] = $order->billing_address_2;
|
| 430 |
-
$stripe_params['billing_state'] = $order->billing_state;
|
| 431 |
-
$stripe_params['billing_city'] = $order->billing_city;
|
| 432 |
-
$stripe_params['billing_postcode'] = $order->billing_postcode;
|
| 433 |
-
$stripe_params['billing_country'] = $order->billing_country;
|
| 434 |
}
|
| 435 |
|
| 436 |
$stripe_params['no_prepaid_card_msg'] = __( 'Sorry, we\'re not accepting prepaid cards at this time.', 'woocommerce-gateway-stripe' );
|
|
@@ -451,17 +577,28 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 451 |
*/
|
| 452 |
protected function generate_payment_request( $order, $source ) {
|
| 453 |
$post_data = array();
|
| 454 |
-
$post_data['currency'] = strtolower(
|
| 455 |
$post_data['amount'] = $this->get_stripe_amount( $order->get_total(), $post_data['currency'] );
|
| 456 |
-
$post_data['description'] = sprintf( __( '%s - Order %s', 'woocommerce-gateway-stripe' ),
|
| 457 |
$post_data['capture'] = $this->capture ? 'true' : 'false';
|
| 458 |
|
| 459 |
-
|
| 460 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 461 |
}
|
| 462 |
|
| 463 |
$post_data['expand[]'] = 'balance_transaction';
|
| 464 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 465 |
if ( $source->customer ) {
|
| 466 |
$post_data['customer'] = $source->customer;
|
| 467 |
}
|
|
@@ -469,7 +606,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 469 |
if ( $source->source ) {
|
| 470 |
$post_data['source'] = $source->source;
|
| 471 |
}
|
| 472 |
-
|
| 473 |
/**
|
| 474 |
* Filter the return value of the WC_Payment_Gateway_CC::generate_payment_request.
|
| 475 |
*
|
|
@@ -507,16 +644,14 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 507 |
if ( is_wp_error( $stripe_source ) ) {
|
| 508 |
throw new Exception( $stripe_source->get_error_message() );
|
| 509 |
}
|
| 510 |
-
|
| 511 |
} else {
|
| 512 |
// Not saving token, so don't define customer either.
|
| 513 |
$stripe_source = $stripe_token;
|
| 514 |
$stripe_customer = false;
|
| 515 |
}
|
| 516 |
-
}
|
|
|
|
| 517 |
|
| 518 |
-
// Use an existing token, and then process the payment
|
| 519 |
-
elseif ( isset( $_POST['wc-stripe-payment-token'] ) && 'new' !== $_POST['wc-stripe-payment-token'] ) {
|
| 520 |
$token_id = wc_clean( $_POST['wc-stripe-payment-token'] );
|
| 521 |
$token = WC_Payment_Tokens::get( $token_id );
|
| 522 |
|
|
@@ -552,10 +687,13 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 552 |
$token_id = false;
|
| 553 |
|
| 554 |
if ( $order ) {
|
| 555 |
-
|
|
|
|
|
|
|
| 556 |
$stripe_customer->set_id( $meta_value );
|
| 557 |
}
|
| 558 |
-
|
|
|
|
| 559 |
$stripe_source = $meta_value;
|
| 560 |
}
|
| 561 |
}
|
|
@@ -594,11 +732,12 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 594 |
|
| 595 |
// Handle payment.
|
| 596 |
if ( $order->get_total() > 0 ) {
|
|
|
|
| 597 |
if ( $order->get_total() * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 598 |
throw new Exception( sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 599 |
}
|
| 600 |
|
| 601 |
-
|
| 602 |
|
| 603 |
// Make the request.
|
| 604 |
$response = WC_Stripe_API::request( $this->generate_payment_request( $order, $source ) );
|
|
@@ -612,11 +751,18 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 612 |
} elseif ( 'source' === $response->get_error_code() && $source->token_id ) {
|
| 613 |
$token = WC_Payment_Tokens::get( $source->token_id );
|
| 614 |
$token->delete();
|
| 615 |
-
|
|
|
|
|
|
|
| 616 |
}
|
|
|
|
| 617 |
$localized_messages = $this->get_localized_messages();
|
| 618 |
|
| 619 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 620 |
}
|
| 621 |
|
| 622 |
// Process valid response.
|
|
@@ -633,12 +779,12 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 633 |
// Return thank you page redirect.
|
| 634 |
return array(
|
| 635 |
'result' => 'success',
|
| 636 |
-
'redirect' => $this->get_return_url( $order )
|
| 637 |
);
|
| 638 |
|
| 639 |
} catch ( Exception $e ) {
|
| 640 |
wc_add_notice( $e->getMessage(), 'error' );
|
| 641 |
-
|
| 642 |
|
| 643 |
if ( $order->has_status( array( 'pending', 'failed' ) ) ) {
|
| 644 |
$this->send_failed_order_email( $order_id );
|
|
@@ -648,7 +794,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 648 |
|
| 649 |
return array(
|
| 650 |
'result' => 'fail',
|
| 651 |
-
'redirect' => ''
|
| 652 |
);
|
| 653 |
}
|
| 654 |
}
|
|
@@ -660,12 +806,14 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 660 |
* @param stdClass $source Source information.
|
| 661 |
*/
|
| 662 |
protected function save_source( $order, $source ) {
|
|
|
|
|
|
|
| 663 |
// Store source in the order.
|
| 664 |
if ( $source->customer ) {
|
| 665 |
-
update_post_meta( $
|
| 666 |
}
|
| 667 |
if ( $source->source ) {
|
| 668 |
-
update_post_meta( $
|
| 669 |
}
|
| 670 |
}
|
| 671 |
|
|
@@ -673,20 +821,22 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 673 |
* Store extra meta data for an order from a Stripe Response.
|
| 674 |
*/
|
| 675 |
public function process_response( $response, $order ) {
|
| 676 |
-
|
|
|
|
|
|
|
| 677 |
|
| 678 |
// Store charge data
|
| 679 |
-
update_post_meta( $
|
| 680 |
-
update_post_meta( $
|
| 681 |
|
| 682 |
// Store other data such as fees
|
| 683 |
if ( isset( $response->balance_transaction ) && isset( $response->balance_transaction->fee ) ) {
|
| 684 |
// Fees and Net needs to both come from Stripe to be accurate as the returned
|
| 685 |
// values are in the local currency of the Stripe account, not from WC.
|
| 686 |
-
$fee = ! empty( $response->balance_transaction->fee ) ?
|
| 687 |
-
$net = ! empty( $response->balance_transaction->net ) ?
|
| 688 |
-
update_post_meta( $
|
| 689 |
-
update_post_meta( $
|
| 690 |
}
|
| 691 |
|
| 692 |
if ( $response->captured ) {
|
|
@@ -694,17 +844,17 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 694 |
|
| 695 |
$message = sprintf( __( 'Stripe charge complete (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $response->id );
|
| 696 |
$order->add_order_note( $message );
|
| 697 |
-
|
| 698 |
|
| 699 |
} else {
|
| 700 |
-
add_post_meta( $
|
| 701 |
|
| 702 |
if ( $order->has_status( array( 'pending', 'failed' ) ) ) {
|
| 703 |
-
$order->reduce_order_stock();
|
| 704 |
}
|
| 705 |
|
| 706 |
$order->update_status( 'on-hold', sprintf( __( 'Stripe charge authorized (Charge ID: %s). Process order to take payment, or cancel to remove the pre-authorization.', 'woocommerce-gateway-stripe' ), $response->id ) );
|
| 707 |
-
|
| 708 |
}
|
| 709 |
|
| 710 |
return $response;
|
|
@@ -770,17 +920,17 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 770 |
);
|
| 771 |
}
|
| 772 |
|
| 773 |
-
|
| 774 |
|
| 775 |
$response = WC_Stripe_API::request( $body, 'charges/' . $order->get_transaction_id() . '/refunds' );
|
| 776 |
|
| 777 |
if ( is_wp_error( $response ) ) {
|
| 778 |
-
|
| 779 |
return $response;
|
| 780 |
} elseif ( ! empty( $response->id ) ) {
|
| 781 |
-
$refund_message = sprintf( __( 'Refunded %s - Refund ID: %s - Reason: %s', 'woocommerce-gateway-stripe' ), wc_price( $response->amount / 100 ), $response->id, $reason );
|
| 782 |
$order->add_order_note( $refund_message );
|
| 783 |
-
|
| 784 |
return true;
|
| 785 |
}
|
| 786 |
}
|
|
@@ -799,4 +949,18 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway_CC {
|
|
| 799 |
$emails['WC_Email_Failed_Order']->trigger( $order_id );
|
| 800 |
}
|
| 801 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 802 |
}
|
| 17 |
*/
|
| 18 |
public $capture;
|
| 19 |
|
| 20 |
+
/**
|
| 21 |
+
* Alternate credit card statement name
|
| 22 |
+
*
|
| 23 |
+
* @var bool
|
| 24 |
+
*/
|
| 25 |
+
public $statement_descriptor;
|
| 26 |
+
|
| 27 |
/**
|
| 28 |
* Checkout enabled
|
| 29 |
*
|
| 80 |
*/
|
| 81 |
public $allow_remember_me;
|
| 82 |
|
| 83 |
+
/**
|
| 84 |
+
* Do we accept Apple Pay?
|
| 85 |
+
*
|
| 86 |
+
* @var bool
|
| 87 |
+
*/
|
| 88 |
+
public $apple_pay;
|
| 89 |
+
|
| 90 |
+
/**
|
| 91 |
+
* Apple Pay Domain Set.
|
| 92 |
+
*
|
| 93 |
+
* @var bool
|
| 94 |
+
*/
|
| 95 |
+
public $apple_pay_domain_set;
|
| 96 |
+
|
| 97 |
+
/**
|
| 98 |
+
* Apple Pay button style.
|
| 99 |
+
*
|
| 100 |
+
* @var bool
|
| 101 |
+
*/
|
| 102 |
+
public $apple_pay_button;
|
| 103 |
+
|
| 104 |
/**
|
| 105 |
* Is test mode active?
|
| 106 |
*
|
| 139 |
'multiple_subscriptions',
|
| 140 |
'pre-orders',
|
| 141 |
'tokenization',
|
| 142 |
+
'add_payment_method',
|
| 143 |
);
|
| 144 |
|
| 145 |
// Load the form fields.
|
| 154 |
$this->enabled = $this->get_option( 'enabled' );
|
| 155 |
$this->testmode = 'yes' === $this->get_option( 'testmode' );
|
| 156 |
$this->capture = 'yes' === $this->get_option( 'capture', 'yes' );
|
| 157 |
+
$this->statement_descriptor = $this->get_option( 'statement_descriptor', wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES ) );
|
| 158 |
$this->stripe_checkout = 'yes' === $this->get_option( 'stripe_checkout' );
|
| 159 |
$this->stripe_checkout_locale = $this->get_option( 'stripe_checkout_locale' );
|
| 160 |
$this->stripe_checkout_image = $this->get_option( 'stripe_checkout_image', '' );
|
| 162 |
$this->secret_key = $this->testmode ? $this->get_option( 'test_secret_key' ) : $this->get_option( 'secret_key' );
|
| 163 |
$this->publishable_key = $this->testmode ? $this->get_option( 'test_publishable_key' ) : $this->get_option( 'publishable_key' );
|
| 164 |
$this->bitcoin = 'USD' === strtoupper( get_woocommerce_currency() ) && 'yes' === $this->get_option( 'stripe_bitcoin' );
|
| 165 |
+
$this->apple_pay = 'yes' === $this->get_option( 'apple_pay', 'yes' );
|
| 166 |
+
$this->apple_pay_domain_set = 'yes' === $this->get_option( 'apple_pay_domain_set', 'no' );
|
| 167 |
+
$this->apple_pay_button = $this->get_option( 'apple_pay_button', 'black' );
|
| 168 |
$this->logging = 'yes' === $this->get_option( 'logging' );
|
| 169 |
$this->allow_remember_me = 'yes' === $this->get_option( 'allow_remember_me', 'no' );
|
| 170 |
|
| 179 |
|
| 180 |
WC_Stripe_API::set_secret_key( $this->secret_key );
|
| 181 |
|
| 182 |
+
$this->init_apple_pay();
|
| 183 |
+
|
| 184 |
// Hooks.
|
| 185 |
add_action( 'wp_enqueue_scripts', array( $this, 'payment_scripts' ) );
|
| 186 |
+
add_action( 'admin_enqueue_scripts', array( $this, 'admin_scripts' ) );
|
| 187 |
add_action( 'admin_notices', array( $this, 'admin_notices' ) );
|
| 188 |
add_action( 'woocommerce_update_options_payment_gateways_' . $this->id, array( $this, 'process_admin_options' ) );
|
| 189 |
}
|
| 253 |
return $total;
|
| 254 |
}
|
| 255 |
|
| 256 |
+
/**
|
| 257 |
+
* Initializes Apple Pay process on settings page.
|
| 258 |
+
*
|
| 259 |
+
* @since 3.1.0
|
| 260 |
+
* @version 3.1.0
|
| 261 |
+
*/
|
| 262 |
+
public function init_apple_pay() {
|
| 263 |
+
if (
|
| 264 |
+
is_admin() &&
|
| 265 |
+
isset( $_GET['page'] ) && 'wc-settings' === $_GET['page'] &&
|
| 266 |
+
isset( $_GET['tab'] ) && 'checkout' === $_GET['tab'] &&
|
| 267 |
+
isset( $_GET['section'] ) && 'stripe' === $_GET['section']
|
| 268 |
+
) {
|
| 269 |
+
$this->process_apple_pay_verification();
|
| 270 |
+
}
|
| 271 |
+
}
|
| 272 |
+
|
| 273 |
+
/**
|
| 274 |
+
* Registers the domain with Stripe/Apple Pay
|
| 275 |
+
*
|
| 276 |
+
* @since 3.1.0
|
| 277 |
+
* @version 3.1.0
|
| 278 |
+
* @param string $secret_key
|
| 279 |
+
*/
|
| 280 |
+
private function _register_apple_pay_domain( $secret_key = '' ) {
|
| 281 |
+
if ( empty( $secret_key ) ) {
|
| 282 |
+
throw new Exception( __( 'Unable to verify domain - missing secret key.', 'woocommerce-gateway-stripe' ) );
|
| 283 |
+
}
|
| 284 |
+
|
| 285 |
+
$endpoint = 'https://api.stripe.com/v1/apple_pay/domains';
|
| 286 |
+
|
| 287 |
+
$data = array(
|
| 288 |
+
'domain_name' => $_SERVER['HTTP_HOST'],
|
| 289 |
+
);
|
| 290 |
+
|
| 291 |
+
$headers = array(
|
| 292 |
+
'User-Agent' => 'WooCommerce Stripe Apple Pay',
|
| 293 |
+
'Authorization' => 'Bearer ' . $secret_key,
|
| 294 |
+
);
|
| 295 |
+
|
| 296 |
+
$response = wp_remote_post( $endpoint, array(
|
| 297 |
+
'headers' => $headers,
|
| 298 |
+
'body' => http_build_query( $data ),
|
| 299 |
+
) );
|
| 300 |
+
|
| 301 |
+
if ( 200 !== $response['response']['code'] ) {
|
| 302 |
+
throw new Exception( sprintf( __( 'Unable to verify domain - %s', 'woocommerce-gateway-stripe' ), $response['response']['message'] ) );
|
| 303 |
+
}
|
| 304 |
+
}
|
| 305 |
+
|
| 306 |
+
/**
|
| 307 |
+
* Processes the Apple Pay domain verification.
|
| 308 |
+
*
|
| 309 |
+
* @since 3.1.0
|
| 310 |
+
* @version 3.1.0
|
| 311 |
+
*/
|
| 312 |
+
public function process_apple_pay_verification() {
|
| 313 |
+
$gateway_settings = get_option( 'woocommerce_stripe_settings', '' );
|
| 314 |
+
|
| 315 |
+
try {
|
| 316 |
+
$path = untrailingslashit( preg_replace( "!${_SERVER['SCRIPT_NAME']}$!", '', $_SERVER['SCRIPT_FILENAME'] ) );
|
| 317 |
+
$dir = '.well-known';
|
| 318 |
+
$file = 'apple-developer-merchantid-domain-association';
|
| 319 |
+
$fullpath = $path . '/' . $dir . '/' . $file;
|
| 320 |
+
|
| 321 |
+
if ( 'yes' === $gateway_settings['apple_pay_domain_set'] && file_exists( $fullpath ) ) {
|
| 322 |
+
return;
|
| 323 |
+
}
|
| 324 |
+
|
| 325 |
+
if ( ! file_exists( $path . '/' . $dir ) || ! file_exists( $fullpath ) ) {
|
| 326 |
+
if ( ! mkdir( $path . '/' . $dir, 0755 ) ) {
|
| 327 |
+
throw new Exception( __( 'Unable to create domain association folder to domain root.', 'woocommerce-gateway-stripe' ) );
|
| 328 |
+
}
|
| 329 |
+
|
| 330 |
+
if ( ! file_exists( $path . '/' . $dir . '/' . 'apple-developer-merchantid-domain-association' ) ) {
|
| 331 |
+
if ( ! copy( WC_STRIPE_PLUGIN_PATH . '/' . $file, $fullpath ) ) {
|
| 332 |
+
throw new Exception( __( 'Unable to copy domain association file to domain root.', 'woocommerce-gateway-stripe' ) );
|
| 333 |
+
}
|
| 334 |
+
}
|
| 335 |
+
}
|
| 336 |
+
|
| 337 |
+
// At this point then the domain association folder and file should be available.
|
| 338 |
+
// Proceed to verify/and or verify again.
|
| 339 |
+
$this->_register_apple_pay_domain( $this->secret_key );
|
| 340 |
+
|
| 341 |
+
// No errors to this point, verification success!
|
| 342 |
+
$gateway_settings['apple_pay_domain_set'] = 'yes';
|
| 343 |
+
$this->apple_pay_domain_set = true;
|
| 344 |
+
|
| 345 |
+
update_option( 'woocommerce_stripe_settings', $gateway_settings );
|
| 346 |
+
|
| 347 |
+
$this->log( __( 'Your domain has been verified with Apple Pay!', 'woocommerce-gateway-stripe' ) );
|
| 348 |
+
|
| 349 |
+
} catch ( Exception $e ) {
|
| 350 |
+
$gateway_settings['apple_pay_domain_set'] = 'no';
|
| 351 |
+
|
| 352 |
+
update_option( 'woocommerce_stripe_settings', $gateway_settings );
|
| 353 |
+
|
| 354 |
+
$this->log( sprintf( __( 'Error: %s', 'woocommerce-gateway-stripe' ), $e->getMessage() ) );
|
| 355 |
+
}
|
| 356 |
+
}
|
| 357 |
+
|
| 358 |
/**
|
| 359 |
* Check if SSL is enabled and notify the user
|
| 360 |
*/
|
| 363 |
return;
|
| 364 |
}
|
| 365 |
|
| 366 |
+
/**
|
| 367 |
+
* Apple pay is enabled by default and domain verification initializes
|
| 368 |
+
* when setting screen is displayed. So if domain verification is not set,
|
| 369 |
+
* something went wrong so lets notify user.
|
| 370 |
+
*/
|
| 371 |
+
if ( ! empty( $this->secret_key ) && $this->apple_pay && ! $this->apple_pay_domain_set ) {
|
| 372 |
+
echo '<div class="error stripe-apple-pay-message"><p>' . sprintf( __( 'Apple Pay domain verification failed. Please check the %1$slog%2$s to see the issue.', 'woocommerce-gateway-stripe' ), '<a href="' . admin_url( 'page=wc-status&tab=logs' ) . '">', '</a>' ) . '</p></div>';
|
| 373 |
+
}
|
| 374 |
+
|
| 375 |
// Show message if enabled and FORCE SSL is disabled and WordpressHTTPS plugin is not detected.
|
| 376 |
if ( ( function_exists( 'wc_site_is_https' ) && ! wc_site_is_https() ) && ( 'no' === get_option( 'woocommerce_force_ssl_checkout' ) && ! class_exists( 'WordPressHTTPS' ) ) ) {
|
| 377 |
echo '<div class="error stripe-ssl-message"><p>' . sprintf( __( 'Stripe is enabled, but the <a href="%s">force SSL option</a> is disabled; your checkout may not be secure! Please enable SSL and ensure your server has a valid SSL certificate - Stripe will only work in test mode.', 'woocommerce-gateway-stripe' ), admin_url( 'admin.php?page=wc-settings&tab=checkout' ) ) . '</p></div>';
|
| 399 |
*/
|
| 400 |
public function init_form_fields() {
|
| 401 |
$this->form_fields = include( 'settings-stripe.php' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 402 |
}
|
| 403 |
|
| 404 |
/**
|
| 434 |
data-description=""
|
| 435 |
data-email="' . esc_attr( $user_email ) . '"
|
| 436 |
data-amount="' . esc_attr( $this->get_stripe_amount( $total ) ) . '"
|
| 437 |
+
data-name="' . esc_attr( $this->statement_descriptor ) . '"
|
| 438 |
data-currency="' . esc_attr( strtolower( get_woocommerce_currency() ) ) . '"
|
| 439 |
data-image="' . esc_attr( $this->stripe_checkout_image ) . '"
|
| 440 |
data-bitcoin="' . esc_attr( $this->bitcoin ? 'true' : 'false' ) . '"
|
| 452 |
|
| 453 |
if ( ! $this->stripe_checkout ) {
|
| 454 |
$this->form();
|
| 455 |
+
|
| 456 |
if ( $display_tokenization ) {
|
| 457 |
$this->save_payment_method_checkbox();
|
| 458 |
}
|
| 482 |
'missing' => __( 'There is no card on a customer that is being charged.', 'woocommerce-gateway-stripe' ),
|
| 483 |
'processing_error' => __( 'An error occurred while processing the card.', 'woocommerce-gateway-stripe' ),
|
| 484 |
'invalid_request_error' => __( 'Could not find payment information.', 'woocommerce-gateway-stripe' ),
|
| 485 |
+
) );
|
| 486 |
+
}
|
| 487 |
+
|
| 488 |
+
/**
|
| 489 |
+
* Load admin scripts.
|
| 490 |
+
*
|
| 491 |
+
* @since 3.1.0
|
| 492 |
+
* @version 3.1.0
|
| 493 |
+
*/
|
| 494 |
+
public function admin_scripts() {
|
| 495 |
+
if ( 'woocommerce_page_wc-settings' !== get_current_screen()->id ) {
|
| 496 |
+
return;
|
| 497 |
+
}
|
| 498 |
+
|
| 499 |
+
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
| 500 |
+
|
| 501 |
+
wp_enqueue_script( 'woocommerce_stripe_admin', plugins_url( 'assets/js/stripe-admin' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array(), WC_STRIPE_VERSION, true );
|
| 502 |
+
|
| 503 |
+
$stripe_admin_params = array(
|
| 504 |
+
'localized_messages' => array(
|
| 505 |
+
'not_valid_live_key_msg' => __( 'This is not a valid live key. Live keys start with "sk_live_" and "pk_live_".', 'woocommerce-gateway-stripe' ),
|
| 506 |
+
'not_valid_test_key_msg' => __( 'This is not a valid test key. Test keys start with "sk_test_" and "pk_test_".', 'woocommerce-gateway-stripe' ),
|
| 507 |
+
're_verify_button_text' => __( 'Re-verify Domain', 'woocommerce-gateway-stripe' ),
|
| 508 |
+
'missing_secret_key' => __( 'Missing Secret Key. Please set the secret key field above and re-try.', 'woocommerce-gateway-stripe' ),
|
| 509 |
+
),
|
| 510 |
+
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
| 511 |
+
'nonce' => array(
|
| 512 |
+
'apple_pay_domain_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_domain_nonce' ),
|
| 513 |
+
),
|
| 514 |
+
);
|
| 515 |
+
|
| 516 |
+
wp_localize_script( 'woocommerce_stripe_admin', 'wc_stripe_admin_params', apply_filters( 'wc_stripe_admin_params', $stripe_admin_params ) );
|
| 517 |
}
|
| 518 |
|
| 519 |
/**
|
| 524 |
* @access public
|
| 525 |
*/
|
| 526 |
public function payment_scripts() {
|
| 527 |
+
if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) ) {
|
| 528 |
+
return;
|
| 529 |
+
}
|
| 530 |
+
|
| 531 |
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
| 532 |
+
|
| 533 |
if ( $this->stripe_checkout ) {
|
| 534 |
+
wp_enqueue_script( 'stripe_checkout', 'https://checkout.stripe.com/v2/checkout.js', '', '2.0', true );
|
| 535 |
+
wp_enqueue_script( 'woocommerce_stripe', plugins_url( 'assets/js/stripe-checkout' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array( 'stripe' ), WC_STRIPE_VERSION, true );
|
| 536 |
} else {
|
| 537 |
wp_enqueue_script( 'stripe', 'https://js.stripe.com/v2/', '', '1.0', true );
|
| 538 |
wp_enqueue_script( 'woocommerce_stripe', plugins_url( 'assets/js/stripe' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array( 'jquery-payment', 'stripe' ), WC_STRIPE_VERSION, true );
|
| 549 |
$order_id = wc_get_order_id_by_order_key( urldecode( $_GET['key'] ) );
|
| 550 |
$order = wc_get_order( $order_id );
|
| 551 |
|
| 552 |
+
$stripe_params['billing_first_name'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_first_name : $order->get_billing_first_name();
|
| 553 |
+
$stripe_params['billing_last_name'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_last_name : $order->get_billing_last_name();
|
| 554 |
+
$stripe_params['billing_address_1'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_address_1 : $order->get_billing_address_1();
|
| 555 |
+
$stripe_params['billing_address_2'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_address_2 : $order->get_billing_address_2();
|
| 556 |
+
$stripe_params['billing_state'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_state : $order->get_billing_state();
|
| 557 |
+
$stripe_params['billing_city'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_city : $order->get_billing_city();
|
| 558 |
+
$stripe_params['billing_postcode'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_postcode : $order->get_billing_postcode();
|
| 559 |
+
$stripe_params['billing_country'] = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_country : $order->get_billing_country();
|
| 560 |
}
|
| 561 |
|
| 562 |
$stripe_params['no_prepaid_card_msg'] = __( 'Sorry, we\'re not accepting prepaid cards at this time.', 'woocommerce-gateway-stripe' );
|
| 577 |
*/
|
| 578 |
protected function generate_payment_request( $order, $source ) {
|
| 579 |
$post_data = array();
|
| 580 |
+
$post_data['currency'] = strtolower( version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->get_order_currency() : $order->get_currency() );
|
| 581 |
$post_data['amount'] = $this->get_stripe_amount( $order->get_total(), $post_data['currency'] );
|
| 582 |
+
$post_data['description'] = sprintf( __( '%1$s - Order %2$s', 'woocommerce-gateway-stripe' ), $this->statement_descriptor, $order->get_order_number() );
|
| 583 |
$post_data['capture'] = $this->capture ? 'true' : 'false';
|
| 584 |
|
| 585 |
+
$billing_email = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_email : $order->get_billing_email();
|
| 586 |
+
$billing_first_name = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_first_name : $order->get_billing_first_name();
|
| 587 |
+
$billing_last_name = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_last_name : $order->get_billing_last_name();
|
| 588 |
+
|
| 589 |
+
if ( ! empty( $billing_email ) && apply_filters( 'wc_stripe_send_stripe_receipt', false ) ) {
|
| 590 |
+
$post_data['receipt_email'] = $billing_email;
|
| 591 |
}
|
| 592 |
|
| 593 |
$post_data['expand[]'] = 'balance_transaction';
|
| 594 |
|
| 595 |
+
$metadata = array(
|
| 596 |
+
__( 'Customer Name', 'woocommerce-gateway-stripe' ) => sanitize_text_field( $billing_first_name ) . ' ' . sanitize_text_field( $billing_last_name ),
|
| 597 |
+
__( 'Customer Email', 'woocommerce-gateway-stripe' ) => sanitize_email( $billing_email ),
|
| 598 |
+
);
|
| 599 |
+
|
| 600 |
+
$post_data['metadata'] = apply_filters( 'wc_stripe_payment_metadata', $metadata, $order, $source );
|
| 601 |
+
|
| 602 |
if ( $source->customer ) {
|
| 603 |
$post_data['customer'] = $source->customer;
|
| 604 |
}
|
| 606 |
if ( $source->source ) {
|
| 607 |
$post_data['source'] = $source->source;
|
| 608 |
}
|
| 609 |
+
|
| 610 |
/**
|
| 611 |
* Filter the return value of the WC_Payment_Gateway_CC::generate_payment_request.
|
| 612 |
*
|
| 644 |
if ( is_wp_error( $stripe_source ) ) {
|
| 645 |
throw new Exception( $stripe_source->get_error_message() );
|
| 646 |
}
|
|
|
|
| 647 |
} else {
|
| 648 |
// Not saving token, so don't define customer either.
|
| 649 |
$stripe_source = $stripe_token;
|
| 650 |
$stripe_customer = false;
|
| 651 |
}
|
| 652 |
+
} elseif ( isset( $_POST['wc-stripe-payment-token'] ) && 'new' !== $_POST['wc-stripe-payment-token'] ) {
|
| 653 |
+
// Use an existing token, and then process the payment
|
| 654 |
|
|
|
|
|
|
|
| 655 |
$token_id = wc_clean( $_POST['wc-stripe-payment-token'] );
|
| 656 |
$token = WC_Payment_Tokens::get( $token_id );
|
| 657 |
|
| 687 |
$token_id = false;
|
| 688 |
|
| 689 |
if ( $order ) {
|
| 690 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 691 |
+
|
| 692 |
+
if ( $meta_value = get_post_meta( $order_id, '_stripe_customer_id', true ) ) {
|
| 693 |
$stripe_customer->set_id( $meta_value );
|
| 694 |
}
|
| 695 |
+
|
| 696 |
+
if ( $meta_value = get_post_meta( $order_id, '_stripe_card_id', true ) ) {
|
| 697 |
$stripe_source = $meta_value;
|
| 698 |
}
|
| 699 |
}
|
| 732 |
|
| 733 |
// Handle payment.
|
| 734 |
if ( $order->get_total() > 0 ) {
|
| 735 |
+
|
| 736 |
if ( $order->get_total() * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 737 |
throw new Exception( sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 738 |
}
|
| 739 |
|
| 740 |
+
$this->log( "Info: Begin processing payment for order $order_id for the amount of {$order->get_total()}" );
|
| 741 |
|
| 742 |
// Make the request.
|
| 743 |
$response = WC_Stripe_API::request( $this->generate_payment_request( $order, $source ) );
|
| 751 |
} elseif ( 'source' === $response->get_error_code() && $source->token_id ) {
|
| 752 |
$token = WC_Payment_Tokens::get( $source->token_id );
|
| 753 |
$token->delete();
|
| 754 |
+
$message = __( 'This card is no longer available and has been removed.', 'woocommerce-gateway-stripe' );
|
| 755 |
+
$order->add_order_note( $message );
|
| 756 |
+
throw new Exception( $message );
|
| 757 |
}
|
| 758 |
+
|
| 759 |
$localized_messages = $this->get_localized_messages();
|
| 760 |
|
| 761 |
+
$message = isset( $localized_messages[ $response->get_error_code() ] ) ? $localized_messages[ $response->get_error_code() ] : $response->get_error_message();
|
| 762 |
+
|
| 763 |
+
$order->add_order_note( $message );
|
| 764 |
+
|
| 765 |
+
throw new Exception( $message );
|
| 766 |
}
|
| 767 |
|
| 768 |
// Process valid response.
|
| 779 |
// Return thank you page redirect.
|
| 780 |
return array(
|
| 781 |
'result' => 'success',
|
| 782 |
+
'redirect' => $this->get_return_url( $order ),
|
| 783 |
);
|
| 784 |
|
| 785 |
} catch ( Exception $e ) {
|
| 786 |
wc_add_notice( $e->getMessage(), 'error' );
|
| 787 |
+
$this->log( sprintf( __( 'Error: %s', 'woocommerce-gateway-stripe' ), $e->getMessage() ) );
|
| 788 |
|
| 789 |
if ( $order->has_status( array( 'pending', 'failed' ) ) ) {
|
| 790 |
$this->send_failed_order_email( $order_id );
|
| 794 |
|
| 795 |
return array(
|
| 796 |
'result' => 'fail',
|
| 797 |
+
'redirect' => '',
|
| 798 |
);
|
| 799 |
}
|
| 800 |
}
|
| 806 |
* @param stdClass $source Source information.
|
| 807 |
*/
|
| 808 |
protected function save_source( $order, $source ) {
|
| 809 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 810 |
+
|
| 811 |
// Store source in the order.
|
| 812 |
if ( $source->customer ) {
|
| 813 |
+
update_post_meta( $order_id, '_stripe_customer_id', $source->customer );
|
| 814 |
}
|
| 815 |
if ( $source->source ) {
|
| 816 |
+
update_post_meta( $order_id, '_stripe_card_id', $source->source );
|
| 817 |
}
|
| 818 |
}
|
| 819 |
|
| 821 |
* Store extra meta data for an order from a Stripe Response.
|
| 822 |
*/
|
| 823 |
public function process_response( $response, $order ) {
|
| 824 |
+
$this->log( 'Processing response: ' . print_r( $response, true ) );
|
| 825 |
+
|
| 826 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 827 |
|
| 828 |
// Store charge data
|
| 829 |
+
update_post_meta( $order_id, '_stripe_charge_id', $response->id );
|
| 830 |
+
update_post_meta( $order_id, '_stripe_charge_captured', $response->captured ? 'yes' : 'no' );
|
| 831 |
|
| 832 |
// Store other data such as fees
|
| 833 |
if ( isset( $response->balance_transaction ) && isset( $response->balance_transaction->fee ) ) {
|
| 834 |
// Fees and Net needs to both come from Stripe to be accurate as the returned
|
| 835 |
// values are in the local currency of the Stripe account, not from WC.
|
| 836 |
+
$fee = ! empty( $response->balance_transaction->fee ) ? WC_Stripe::format_number( $response->balance_transaction, 'fee' ) : 0;
|
| 837 |
+
$net = ! empty( $response->balance_transaction->net ) ? WC_Stripe::format_number( $response->balance_transaction, 'net' ) : 0;
|
| 838 |
+
update_post_meta( $order_id, 'Stripe Fee', $fee );
|
| 839 |
+
update_post_meta( $order_id, 'Net Revenue From Stripe', $net );
|
| 840 |
}
|
| 841 |
|
| 842 |
if ( $response->captured ) {
|
| 844 |
|
| 845 |
$message = sprintf( __( 'Stripe charge complete (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $response->id );
|
| 846 |
$order->add_order_note( $message );
|
| 847 |
+
$this->log( 'Success: ' . $message );
|
| 848 |
|
| 849 |
} else {
|
| 850 |
+
add_post_meta( $order_id, '_transaction_id', $response->id, true );
|
| 851 |
|
| 852 |
if ( $order->has_status( array( 'pending', 'failed' ) ) ) {
|
| 853 |
+
version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->reduce_order_stock() : wc_reduce_stock_levels( $order_id );
|
| 854 |
}
|
| 855 |
|
| 856 |
$order->update_status( 'on-hold', sprintf( __( 'Stripe charge authorized (Charge ID: %s). Process order to take payment, or cancel to remove the pre-authorization.', 'woocommerce-gateway-stripe' ), $response->id ) );
|
| 857 |
+
$this->log( "Successful auth: $response->id" );
|
| 858 |
}
|
| 859 |
|
| 860 |
return $response;
|
| 920 |
);
|
| 921 |
}
|
| 922 |
|
| 923 |
+
$this->log( "Info: Beginning refund for order $order_id for the amount of {$amount}" );
|
| 924 |
|
| 925 |
$response = WC_Stripe_API::request( $body, 'charges/' . $order->get_transaction_id() . '/refunds' );
|
| 926 |
|
| 927 |
if ( is_wp_error( $response ) ) {
|
| 928 |
+
$this->log( 'Error: ' . $response->get_error_message() );
|
| 929 |
return $response;
|
| 930 |
} elseif ( ! empty( $response->id ) ) {
|
| 931 |
+
$refund_message = sprintf( __( 'Refunded %1$s - Refund ID: %2$s - Reason: %3$s', 'woocommerce-gateway-stripe' ), wc_price( $response->amount / 100 ), $response->id, $reason );
|
| 932 |
$order->add_order_note( $refund_message );
|
| 933 |
+
$this->log( 'Success: ' . html_entity_decode( strip_tags( $refund_message ) ) );
|
| 934 |
return true;
|
| 935 |
}
|
| 936 |
}
|
| 949 |
$emails['WC_Email_Failed_Order']->trigger( $order_id );
|
| 950 |
}
|
| 951 |
}
|
| 952 |
+
|
| 953 |
+
/**
|
| 954 |
+
* Logs
|
| 955 |
+
*
|
| 956 |
+
* @since 3.1.0
|
| 957 |
+
* @version 3.1.0
|
| 958 |
+
*
|
| 959 |
+
* @param string $message
|
| 960 |
+
*/
|
| 961 |
+
public function log( $message ) {
|
| 962 |
+
if ( $this->logging ) {
|
| 963 |
+
WC_Stripe::log( $message );
|
| 964 |
+
}
|
| 965 |
+
}
|
| 966 |
}
|
includes/class-wc-stripe-api.php
CHANGED
|
@@ -52,24 +52,24 @@ class WC_Stripe_API {
|
|
| 52 |
* @return array|WP_Error
|
| 53 |
*/
|
| 54 |
public static function request( $request, $api = 'charges', $method = 'POST' ) {
|
| 55 |
-
|
| 56 |
|
| 57 |
$response = wp_safe_remote_post(
|
| 58 |
self::ENDPOINT . $api,
|
| 59 |
array(
|
| 60 |
'method' => $method,
|
| 61 |
'headers' => array(
|
| 62 |
-
'Authorization' => 'Basic ' . base64_encode( self::get_secret_key(). ':' ),
|
| 63 |
-
'Stripe-Version' => '2016-03-07'
|
| 64 |
),
|
| 65 |
'body' => apply_filters( 'woocommerce_stripe_request_body', $request, $api ),
|
| 66 |
'timeout' => 70,
|
| 67 |
-
'user-agent' => 'WooCommerce ' . WC()->version
|
| 68 |
)
|
| 69 |
);
|
| 70 |
|
| 71 |
if ( is_wp_error( $response ) || empty( $response['body'] ) ) {
|
| 72 |
-
|
| 73 |
return new WP_Error( 'stripe_error', __( 'There was a problem connecting to the payment gateway.', 'woocommerce-gateway-stripe' ) );
|
| 74 |
}
|
| 75 |
|
|
@@ -88,4 +88,20 @@ class WC_Stripe_API {
|
|
| 88 |
return $parsed_response;
|
| 89 |
}
|
| 90 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
}
|
| 52 |
* @return array|WP_Error
|
| 53 |
*/
|
| 54 |
public static function request( $request, $api = 'charges', $method = 'POST' ) {
|
| 55 |
+
self::log( "{$api} request: " . print_r( $request, true ) );
|
| 56 |
|
| 57 |
$response = wp_safe_remote_post(
|
| 58 |
self::ENDPOINT . $api,
|
| 59 |
array(
|
| 60 |
'method' => $method,
|
| 61 |
'headers' => array(
|
| 62 |
+
'Authorization' => 'Basic ' . base64_encode( self::get_secret_key() . ':' ),
|
| 63 |
+
'Stripe-Version' => '2016-03-07',
|
| 64 |
),
|
| 65 |
'body' => apply_filters( 'woocommerce_stripe_request_body', $request, $api ),
|
| 66 |
'timeout' => 70,
|
| 67 |
+
'user-agent' => 'WooCommerce ' . WC()->version,
|
| 68 |
)
|
| 69 |
);
|
| 70 |
|
| 71 |
if ( is_wp_error( $response ) || empty( $response['body'] ) ) {
|
| 72 |
+
self::log( 'Error Response: ' . print_r( $response, true ) );
|
| 73 |
return new WP_Error( 'stripe_error', __( 'There was a problem connecting to the payment gateway.', 'woocommerce-gateway-stripe' ) );
|
| 74 |
}
|
| 75 |
|
| 88 |
return $parsed_response;
|
| 89 |
}
|
| 90 |
}
|
| 91 |
+
|
| 92 |
+
/**
|
| 93 |
+
* Logs
|
| 94 |
+
*
|
| 95 |
+
* @since 3.1.0
|
| 96 |
+
* @version 3.1.0
|
| 97 |
+
*
|
| 98 |
+
* @param string $message
|
| 99 |
+
*/
|
| 100 |
+
public static function log( $message ) {
|
| 101 |
+
$options = get_option( 'woocommerce_stripe_settings' );
|
| 102 |
+
|
| 103 |
+
if ( 'yes' === $options['logging'] ) {
|
| 104 |
+
WC_Stripe::log( $message );
|
| 105 |
+
}
|
| 106 |
+
}
|
| 107 |
}
|
includes/class-wc-stripe-apple-pay.php
ADDED
|
@@ -0,0 +1,884 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 3 |
+
exit;
|
| 4 |
+
}
|
| 5 |
+
|
| 6 |
+
/**
|
| 7 |
+
* WC_Stripe_Apple_Pay class.
|
| 8 |
+
*
|
| 9 |
+
* @extends WC_Gateway_Stripe
|
| 10 |
+
*/
|
| 11 |
+
class WC_Stripe_Apple_Pay extends WC_Gateway_Stripe {
|
| 12 |
+
/**
|
| 13 |
+
* This Instance.
|
| 14 |
+
*
|
| 15 |
+
* @var
|
| 16 |
+
*/
|
| 17 |
+
private static $_this;
|
| 18 |
+
|
| 19 |
+
/**
|
| 20 |
+
* Gateway.
|
| 21 |
+
*
|
| 22 |
+
* @var
|
| 23 |
+
*/
|
| 24 |
+
private $_gateway;
|
| 25 |
+
|
| 26 |
+
/**
|
| 27 |
+
* Statement Description
|
| 28 |
+
*
|
| 29 |
+
* @var
|
| 30 |
+
*/
|
| 31 |
+
public $statement_descriptor;
|
| 32 |
+
|
| 33 |
+
/**
|
| 34 |
+
* Gateway settings.
|
| 35 |
+
*
|
| 36 |
+
* @var
|
| 37 |
+
*/
|
| 38 |
+
private $_gateway_settings;
|
| 39 |
+
|
| 40 |
+
/**
|
| 41 |
+
* Constructor.
|
| 42 |
+
*
|
| 43 |
+
* @access public
|
| 44 |
+
* @since 3.1.0
|
| 45 |
+
* @version 3.1.0
|
| 46 |
+
*/
|
| 47 |
+
public function __construct() {
|
| 48 |
+
self::$_this = $this;
|
| 49 |
+
|
| 50 |
+
$this->_gateway_settings = get_option( 'woocommerce_stripe_settings', '' );
|
| 51 |
+
|
| 52 |
+
$this->statement_descriptor = ! empty( $this->_gateway_settings['statement_descriptor'] ) ? $this->_gateway_settings['statement_descriptor'] : wp_specialchars_decode( get_bloginfo( 'name' ), ENT_QUOTES );
|
| 53 |
+
|
| 54 |
+
$this->init();
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
public function instance() {
|
| 58 |
+
return self::$_this;
|
| 59 |
+
}
|
| 60 |
+
|
| 61 |
+
/**
|
| 62 |
+
* Initialize.
|
| 63 |
+
*
|
| 64 |
+
* @access public
|
| 65 |
+
* @since 3.1.0
|
| 66 |
+
* @version 3.1.0
|
| 67 |
+
*/
|
| 68 |
+
public function init() {
|
| 69 |
+
add_action( 'wp_enqueue_scripts', array( $this, 'cart_scripts' ) );
|
| 70 |
+
add_action( 'wp_enqueue_scripts', array( $this, 'single_scripts' ) );
|
| 71 |
+
|
| 72 |
+
/**
|
| 73 |
+
* In order to display the Apple Pay button in the correct position,
|
| 74 |
+
* a new hook was added to WooCommerce 2.7. In older versions of WooCommerce,
|
| 75 |
+
* CSS is used to position the button.
|
| 76 |
+
*/
|
| 77 |
+
if ( version_compare( WC_VERSION, '3.0.0', '<' ) ) {
|
| 78 |
+
add_action( 'woocommerce_after_add_to_cart_button', array( $this, 'display_apple_pay_button' ), 1 );
|
| 79 |
+
add_filter( 'body_class', array( $this, 'body_class' ) );
|
| 80 |
+
} else {
|
| 81 |
+
add_action( 'woocommerce_after_add_to_cart_quantity', array( $this, 'display_apple_pay_button' ), 1 );
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
add_action( 'woocommerce_proceed_to_checkout', array( $this, 'display_apple_pay_button' ), 1 );
|
| 85 |
+
add_action( 'woocommerce_proceed_to_checkout', array( $this, 'display_apple_pay_separator_html' ), 2 );
|
| 86 |
+
add_action( 'woocommerce_checkout_before_customer_details', array( $this, 'display_apple_pay_button' ), 1 );
|
| 87 |
+
add_action( 'woocommerce_checkout_before_customer_details', array( $this, 'display_apple_pay_separator_html' ), 2 );
|
| 88 |
+
add_action( 'wc_ajax_wc_stripe_apple_pay', array( $this, 'process_apple_pay' ) );
|
| 89 |
+
add_action( 'wc_ajax_wc_stripe_generate_apple_pay_cart', array( $this, 'generate_apple_pay_cart' ) );
|
| 90 |
+
add_action( 'wc_ajax_wc_stripe_generate_apple_pay_single', array( $this, 'generate_apple_pay_single' ) );
|
| 91 |
+
add_action( 'wc_ajax_wc_stripe_apple_pay_get_shipping_methods', array( $this, 'get_shipping_methods' ) );
|
| 92 |
+
add_action( 'wc_ajax_wc_stripe_apple_pay_update_shipping_method', array( $this, 'update_shipping_method' ) );
|
| 93 |
+
add_filter( 'woocommerce_gateway_title', array( $this, 'filter_gateway_title' ), 10, 2 );
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
/**
|
| 97 |
+
* Filters the gateway title to reflect Apple Pay.
|
| 98 |
+
*
|
| 99 |
+
*/
|
| 100 |
+
public function filter_gateway_title( $title, $id ) {
|
| 101 |
+
global $post;
|
| 102 |
+
|
| 103 |
+
if ( ! is_object( $post ) ) {
|
| 104 |
+
return $title;
|
| 105 |
+
}
|
| 106 |
+
|
| 107 |
+
$method_title = get_post_meta( $post->ID, '_payment_method_title', true );
|
| 108 |
+
|
| 109 |
+
if ( 'stripe' === $id && ! empty( $method_title ) ) {
|
| 110 |
+
return $method_title;
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
return $title;
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
/**
|
| 117 |
+
* Enqueue JS scripts and styles for single product page.
|
| 118 |
+
*
|
| 119 |
+
* @since 3.1.0
|
| 120 |
+
* @version 3.1.0
|
| 121 |
+
*/
|
| 122 |
+
public function single_scripts() {
|
| 123 |
+
if ( ! is_single() ) {
|
| 124 |
+
return;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
global $post;
|
| 128 |
+
|
| 129 |
+
$product = wc_get_product( $post->ID );
|
| 130 |
+
|
| 131 |
+
if ( ! in_array( ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->product_type : $product->get_type() ), $this->supported_product_types() ) ) {
|
| 132 |
+
return;
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
| 136 |
+
|
| 137 |
+
wp_enqueue_style( 'stripe_apple_pay', plugins_url( 'assets/css/stripe-apple-pay.css', WC_STRIPE_MAIN_FILE ), array(), WC_STRIPE_VERSION );
|
| 138 |
+
|
| 139 |
+
wp_enqueue_script( 'stripe', 'https://js.stripe.com/v2/', '', '1.0', true );
|
| 140 |
+
wp_enqueue_script( 'woocommerce_stripe_apple_pay_single', plugins_url( 'assets/js/stripe-apple-pay-single' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array( 'stripe' ), WC_STRIPE_VERSION, true );
|
| 141 |
+
|
| 142 |
+
$publishable_key = 'yes' === $this->_gateway_settings['testmode'] ? $this->_gateway_settings['test_publishable_key'] : $this->_gateway_settings['publishable_key'];
|
| 143 |
+
|
| 144 |
+
$stripe_params = array(
|
| 145 |
+
'key' => $publishable_key,
|
| 146 |
+
'currency_code' => get_woocommerce_currency(),
|
| 147 |
+
'country_code' => substr( get_option( 'woocommerce_default_country' ), 0, 2 ),
|
| 148 |
+
'label' => $this->statement_descriptor,
|
| 149 |
+
'ajaxurl' => WC_AJAX::get_endpoint( '%%endpoint%%' ),
|
| 150 |
+
'stripe_apple_pay_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_nonce' ),
|
| 151 |
+
'stripe_apple_pay_cart_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_cart_nonce' ),
|
| 152 |
+
'stripe_apple_pay_get_shipping_methods_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_get_shipping_methods_nonce' ),
|
| 153 |
+
'stripe_apple_pay_update_shipping_method_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_update_shipping_method_nonce' ),
|
| 154 |
+
'needs_shipping' => WC()->cart->needs_shipping() ? 'yes' : 'no',
|
| 155 |
+
);
|
| 156 |
+
|
| 157 |
+
wp_localize_script( 'woocommerce_stripe_apple_pay_single', 'wc_stripe_apple_pay_single_params', apply_filters( 'wc_stripe_apple_pay_single_params', $stripe_params ) );
|
| 158 |
+
}
|
| 159 |
+
|
| 160 |
+
/**
|
| 161 |
+
* Enqueue JS scripts and styles for the cart/checkout.
|
| 162 |
+
*
|
| 163 |
+
* @since 3.1.0
|
| 164 |
+
* @version 3.1.0
|
| 165 |
+
*/
|
| 166 |
+
public function cart_scripts() {
|
| 167 |
+
if ( ! is_cart() && ! is_checkout() && ! isset( $_GET['pay_for_order'] ) ) {
|
| 168 |
+
return;
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
| 172 |
+
|
| 173 |
+
wp_enqueue_style( 'stripe_apple_pay', plugins_url( 'assets/css/stripe-apple-pay.css', WC_STRIPE_MAIN_FILE ), array(), WC_STRIPE_VERSION );
|
| 174 |
+
|
| 175 |
+
wp_enqueue_script( 'stripe', 'https://js.stripe.com/v2/', '', '1.0', true );
|
| 176 |
+
wp_enqueue_script( 'woocommerce_stripe_apple_pay', plugins_url( 'assets/js/stripe-apple-pay' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array( 'stripe' ), WC_STRIPE_VERSION, true );
|
| 177 |
+
|
| 178 |
+
$publishable_key = 'yes' === $this->_gateway_settings['testmode'] ? $this->_gateway_settings['test_publishable_key'] : $this->_gateway_settings['publishable_key'];
|
| 179 |
+
|
| 180 |
+
$stripe_params = array(
|
| 181 |
+
'key' => $publishable_key,
|
| 182 |
+
'currency_code' => get_woocommerce_currency(),
|
| 183 |
+
'country_code' => substr( get_option( 'woocommerce_default_country' ), 0, 2 ),
|
| 184 |
+
'label' => $this->statement_descriptor,
|
| 185 |
+
'ajaxurl' => WC_AJAX::get_endpoint( '%%endpoint%%' ),
|
| 186 |
+
'stripe_apple_pay_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_nonce' ),
|
| 187 |
+
'stripe_apple_pay_cart_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_cart_nonce' ),
|
| 188 |
+
'stripe_apple_pay_get_shipping_methods_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_get_shipping_methods_nonce' ),
|
| 189 |
+
'stripe_apple_pay_update_shipping_method_nonce' => wp_create_nonce( '_wc_stripe_apple_pay_update_shipping_method_nonce' ),
|
| 190 |
+
'needs_shipping' => WC()->cart->needs_shipping() ? 'yes' : 'no',
|
| 191 |
+
'is_cart_page' => is_cart() ? 'yes' : 'no',
|
| 192 |
+
);
|
| 193 |
+
|
| 194 |
+
wp_localize_script( 'woocommerce_stripe_apple_pay', 'wc_stripe_apple_pay_params', apply_filters( 'wc_stripe_apple_pay_params', $stripe_params ) );
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
/**
|
| 198 |
+
* Checks to make sure product type is supported by Apple Pay.
|
| 199 |
+
*
|
| 200 |
+
*/
|
| 201 |
+
public function supported_product_types() {
|
| 202 |
+
return array(
|
| 203 |
+
'simple',
|
| 204 |
+
'variable',
|
| 205 |
+
);
|
| 206 |
+
}
|
| 207 |
+
|
| 208 |
+
/**
|
| 209 |
+
* Display Apple Pay button on the cart page
|
| 210 |
+
*
|
| 211 |
+
* @since 3.1.0
|
| 212 |
+
* @version 3.1.0
|
| 213 |
+
*/
|
| 214 |
+
public function display_apple_pay_button() {
|
| 215 |
+
$gateways = WC()->payment_gateways->get_available_payment_gateways();
|
| 216 |
+
|
| 217 |
+
/**
|
| 218 |
+
* In order for the Apple Pay button to show on cart page,
|
| 219 |
+
* Apple Pay must be enabled and Stripe gateway must be enabled.
|
| 220 |
+
*/
|
| 221 |
+
if (
|
| 222 |
+
'yes' !== $this->_gateway_settings['apple_pay']
|
| 223 |
+
|| ! isset( $gateways['stripe'] )
|
| 224 |
+
) {
|
| 225 |
+
return;
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
if ( is_single() ) {
|
| 229 |
+
global $post;
|
| 230 |
+
|
| 231 |
+
$product = wc_get_product( $post->ID );
|
| 232 |
+
|
| 233 |
+
if ( ! in_array( ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->product_type : $product->get_type() ), $this->supported_product_types() ) ) {
|
| 234 |
+
return;
|
| 235 |
+
}
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
$apple_pay_button = ! empty( $this->_gateway_settings['apple_pay_button'] ) ? $this->_gateway_settings['apple_pay_button'] : 'black';
|
| 239 |
+
$button_lang = ! empty( $this->_gateway_settings['apple_pay_button_lang'] ) ? strtolower( $this->_gateway_settings['apple_pay_button_lang'] ) : 'en';
|
| 240 |
+
?>
|
| 241 |
+
<div class="apple-pay-button-wrapper">
|
| 242 |
+
<button class="apple-pay-button" lang="<?php echo esc_attr( $button_lang ); ?>" style="-webkit-appearance: -apple-pay-button; -apple-pay-button-type: buy; -apple-pay-button-style: <?php echo esc_attr( $apple_pay_button ); ?>;"></button>
|
| 243 |
+
</div>
|
| 244 |
+
<?php
|
| 245 |
+
}
|
| 246 |
+
|
| 247 |
+
/**
|
| 248 |
+
* Display Apple Pay button on the cart page
|
| 249 |
+
*
|
| 250 |
+
* @since 3.1.0
|
| 251 |
+
* @version 3.1.0
|
| 252 |
+
*/
|
| 253 |
+
public function display_apple_pay_separator_html() {
|
| 254 |
+
$gateways = WC()->payment_gateways->get_available_payment_gateways();
|
| 255 |
+
|
| 256 |
+
/**
|
| 257 |
+
* In order for the Apple Pay button to show on cart page,
|
| 258 |
+
* Apple Pay must be enabled and Stripe gateway must be enabled.
|
| 259 |
+
*/
|
| 260 |
+
if (
|
| 261 |
+
'yes' !== $this->_gateway_settings['apple_pay']
|
| 262 |
+
|| ! isset( $gateways['stripe'] )
|
| 263 |
+
) {
|
| 264 |
+
return;
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
if ( is_single() ) {
|
| 268 |
+
global $post;
|
| 269 |
+
|
| 270 |
+
$product = wc_get_product( $post->ID );
|
| 271 |
+
|
| 272 |
+
if ( ! in_array( ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->product_type : $product->get_type() ), $this->supported_product_types() ) ) {
|
| 273 |
+
return;
|
| 274 |
+
}
|
| 275 |
+
}
|
| 276 |
+
?>
|
| 277 |
+
<p class="apple-pay-button-checkout-separator">- <?php esc_html_e( 'Or', 'woocommerce-gateway-stripe' ); ?> -</p>
|
| 278 |
+
<?php
|
| 279 |
+
}
|
| 280 |
+
|
| 281 |
+
/**
|
| 282 |
+
* Add legacy WooCommerce body class.
|
| 283 |
+
*
|
| 284 |
+
* @since 3.1.0
|
| 285 |
+
* @version 3.1.0
|
| 286 |
+
* @param array $classes
|
| 287 |
+
* @return array $classes
|
| 288 |
+
*/
|
| 289 |
+
public function body_class( $classes ) {
|
| 290 |
+
if ( 'yes' === $this->_gateway_settings['apple_pay'] && isset( $gateways['stripe'] ) ) {
|
| 291 |
+
$classes[] = 'wc-stripe-legacy';
|
| 292 |
+
}
|
| 293 |
+
return $classes;
|
| 294 |
+
}
|
| 295 |
+
|
| 296 |
+
/**
|
| 297 |
+
* Generates the Apple Pay single cart.
|
| 298 |
+
*
|
| 299 |
+
* @since 3.1.0
|
| 300 |
+
* @version 3.1.0
|
| 301 |
+
*/
|
| 302 |
+
public function generate_apple_pay_single() {
|
| 303 |
+
if ( ! wp_verify_nonce( $_POST['nonce'], '_wc_stripe_apple_pay_cart_nonce' ) ) {
|
| 304 |
+
wp_die( __( 'Cheatin’ huh?', 'woocommerce-gateway-stripe' ) );
|
| 305 |
+
}
|
| 306 |
+
|
| 307 |
+
if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
|
| 308 |
+
define( 'WOOCOMMERCE_CART', true );
|
| 309 |
+
}
|
| 310 |
+
|
| 311 |
+
WC()->shipping->reset_shipping();
|
| 312 |
+
|
| 313 |
+
global $post;
|
| 314 |
+
|
| 315 |
+
$product = wc_get_product( $post->ID );
|
| 316 |
+
$qty = absint( $_POST['qty'] );
|
| 317 |
+
|
| 318 |
+
/**
|
| 319 |
+
* If this page is single product page, we need to simulate
|
| 320 |
+
* adding the product to the cart taken account if it is a
|
| 321 |
+
* simple or variable product.
|
| 322 |
+
*/
|
| 323 |
+
if ( is_single() ) {
|
| 324 |
+
// First empty the cart to prevent wrong calculation.
|
| 325 |
+
WC()->cart->empty_cart();
|
| 326 |
+
|
| 327 |
+
if ( 'variable' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->product_type : $product->get_type() ) && isset( $_POST['attributes'] ) ) {
|
| 328 |
+
$attributes = array_map( 'wc_clean', $_POST['attributes'] );
|
| 329 |
+
|
| 330 |
+
$variation_id = $product->get_matching_variation( $attributes );
|
| 331 |
+
|
| 332 |
+
WC()->cart->add_to_cart( $product->get_id(), $qty, $variation_id, $attributes );
|
| 333 |
+
}
|
| 334 |
+
|
| 335 |
+
if ( 'simple' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $product->product_type : $product->get_type() ) ) {
|
| 336 |
+
WC()->cart->add_to_cart( $product->get_id(), $qty );
|
| 337 |
+
}
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
WC()->cart->calculate_totals();
|
| 341 |
+
|
| 342 |
+
wp_send_json( array( 'line_items' => $this->build_line_items(), 'total' => WC()->cart->total ) );
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
/**
|
| 346 |
+
* Generates the Apple Pay cart.
|
| 347 |
+
*
|
| 348 |
+
* @since 3.1.0
|
| 349 |
+
* @version 3.1.0
|
| 350 |
+
*/
|
| 351 |
+
public function generate_apple_pay_cart() {
|
| 352 |
+
if ( ! wp_verify_nonce( $_POST['nonce'], '_wc_stripe_apple_pay_cart_nonce' ) ) {
|
| 353 |
+
wp_die( __( 'Cheatin’ huh?', 'woocommerce-gateway-stripe' ) );
|
| 354 |
+
}
|
| 355 |
+
|
| 356 |
+
wp_send_json( array( 'line_items' => $this->build_line_items(), 'total' => WC()->cart->total ) );
|
| 357 |
+
}
|
| 358 |
+
|
| 359 |
+
/**
|
| 360 |
+
* Calculate and set shipping method.
|
| 361 |
+
*
|
| 362 |
+
* @since 3.1.0
|
| 363 |
+
* @version 3.1.0
|
| 364 |
+
* @param array $address
|
| 365 |
+
*/
|
| 366 |
+
public function calculate_shipping( $address = array() ) {
|
| 367 |
+
$country = strtoupper( $address['countryCode'] );
|
| 368 |
+
$state = strtoupper( $address['administrativeArea'] );
|
| 369 |
+
$postcode = $address['postalCode'];
|
| 370 |
+
$city = $address['locality'];
|
| 371 |
+
|
| 372 |
+
WC()->shipping->reset_shipping();
|
| 373 |
+
|
| 374 |
+
if ( $postcode && ! WC_Validation::is_postcode( $postcode, $country ) ) {
|
| 375 |
+
throw new Exception( __( 'Please enter a valid postcode/ZIP.', 'woocommerce-gateway-stripe' ) );
|
| 376 |
+
} elseif ( $postcode ) {
|
| 377 |
+
$postcode = wc_format_postcode( $postcode, $country );
|
| 378 |
+
}
|
| 379 |
+
|
| 380 |
+
if ( $country ) {
|
| 381 |
+
WC()->customer->set_location( $country, $state, $postcode, $city );
|
| 382 |
+
WC()->customer->set_shipping_location( $country, $state, $postcode, $city );
|
| 383 |
+
} else {
|
| 384 |
+
WC()->customer->set_to_base();
|
| 385 |
+
WC()->customer->set_shipping_to_base();
|
| 386 |
+
}
|
| 387 |
+
|
| 388 |
+
WC()->customer->calculated_shipping( true );
|
| 389 |
+
|
| 390 |
+
/**
|
| 391 |
+
* Set the shipping package.
|
| 392 |
+
*
|
| 393 |
+
* Note that address lines are not provided at this point
|
| 394 |
+
* because Apple Pay does not supply that until after
|
| 395 |
+
* authentication via passcode or Touch ID. We will need to
|
| 396 |
+
* capture this information when we process the payment.
|
| 397 |
+
*/
|
| 398 |
+
|
| 399 |
+
$packages = array();
|
| 400 |
+
|
| 401 |
+
$packages[0]['contents'] = WC()->cart->get_cart();
|
| 402 |
+
$packages[0]['contents_cost'] = 0;
|
| 403 |
+
$packages[0]['applied_coupons'] = WC()->cart->applied_coupons;
|
| 404 |
+
$packages[0]['user']['ID'] = get_current_user_id();
|
| 405 |
+
$packages[0]['destination']['country'] = $country;
|
| 406 |
+
$packages[0]['destination']['state'] = $state;
|
| 407 |
+
$packages[0]['destination']['postcode'] = $postcode;
|
| 408 |
+
$packages[0]['destination']['city'] = $city;
|
| 409 |
+
|
| 410 |
+
foreach ( WC()->cart->get_cart() as $item ) {
|
| 411 |
+
if ( $item['data']->needs_shipping() ) {
|
| 412 |
+
if ( isset( $item['line_total'] ) ) {
|
| 413 |
+
$packages[0]['contents_cost'] += $item['line_total'];
|
| 414 |
+
}
|
| 415 |
+
}
|
| 416 |
+
}
|
| 417 |
+
|
| 418 |
+
$packages = apply_filters( 'woocommerce_cart_shipping_packages', $packages );
|
| 419 |
+
|
| 420 |
+
WC()->shipping->calculate_shipping( $packages );
|
| 421 |
+
}
|
| 422 |
+
|
| 423 |
+
/**
|
| 424 |
+
* Gets shipping for Apple Pay Payment sheet.
|
| 425 |
+
*
|
| 426 |
+
* @since 3.1.0
|
| 427 |
+
* @version 3.1.0
|
| 428 |
+
*/
|
| 429 |
+
public function get_shipping_methods() {
|
| 430 |
+
if ( ! wp_verify_nonce( $_POST['nonce'], '_wc_stripe_apple_pay_get_shipping_methods_nonce' ) ) {
|
| 431 |
+
wp_die( __( 'Cheatin’ huh?', 'woocommerce-gateway-stripe' ) );
|
| 432 |
+
}
|
| 433 |
+
|
| 434 |
+
if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
|
| 435 |
+
define( 'WOOCOMMERCE_CART', true );
|
| 436 |
+
}
|
| 437 |
+
|
| 438 |
+
try {
|
| 439 |
+
$address = array_map( 'wc_clean', $_POST['address'] );
|
| 440 |
+
|
| 441 |
+
$this->calculate_shipping( $address );
|
| 442 |
+
|
| 443 |
+
// Set the shipping options.
|
| 444 |
+
$currency = get_woocommerce_currency();
|
| 445 |
+
$data = array();
|
| 446 |
+
|
| 447 |
+
$packages = WC()->shipping->get_packages();
|
| 448 |
+
|
| 449 |
+
if ( ! empty( $packages ) && WC()->customer->has_calculated_shipping() ) {
|
| 450 |
+
foreach ( $packages as $package_key => $package ) {
|
| 451 |
+
if ( empty( $package['rates'] ) ) {
|
| 452 |
+
throw new Exception( __( 'Unable to find shipping method for address.', 'woocommerce-gateway-stripe' ) );
|
| 453 |
+
}
|
| 454 |
+
|
| 455 |
+
foreach ( $package['rates'] as $key => $rate ) {
|
| 456 |
+
$data[] = array(
|
| 457 |
+
'id' => $rate->id,
|
| 458 |
+
'label' => $rate->label,
|
| 459 |
+
'amount' => array(
|
| 460 |
+
'currency' => $currency,
|
| 461 |
+
'value' => $rate->cost,
|
| 462 |
+
),
|
| 463 |
+
'selected' => false,
|
| 464 |
+
);
|
| 465 |
+
}
|
| 466 |
+
}
|
| 467 |
+
|
| 468 |
+
// Auto select the first shipping method.
|
| 469 |
+
WC()->session->set( 'chosen_shipping_methods', array( $data[0]['id'] ) );
|
| 470 |
+
|
| 471 |
+
WC()->cart->calculate_totals();
|
| 472 |
+
|
| 473 |
+
wp_send_json( array( 'success' => 'true', 'shipping_methods' => $this->build_shipping_methods( $data ), 'line_items' => $this->build_line_items(), 'total' => WC()->cart->total ) );
|
| 474 |
+
} else {
|
| 475 |
+
throw new Exception( __( 'Unable to find shipping method for address.', 'woocommerce-gateway-stripe' ) );
|
| 476 |
+
}
|
| 477 |
+
} catch ( Exception $e ) {
|
| 478 |
+
wp_send_json( array( 'success' => 'false', 'shipping_methods' => array(), 'line_items' => $this->build_line_items(), 'total' => WC()->cart->total ) );
|
| 479 |
+
}
|
| 480 |
+
}
|
| 481 |
+
|
| 482 |
+
/**
|
| 483 |
+
* Updates shipping method on cart session.
|
| 484 |
+
*
|
| 485 |
+
* @since 3.1.0
|
| 486 |
+
* @version 3.1.0
|
| 487 |
+
*/
|
| 488 |
+
public function update_shipping_method() {
|
| 489 |
+
if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
|
| 490 |
+
define( 'WOOCOMMERCE_CART', true );
|
| 491 |
+
}
|
| 492 |
+
|
| 493 |
+
if ( ! wp_verify_nonce( $_POST['nonce'], '_wc_stripe_apple_pay_update_shipping_method_nonce' ) ) {
|
| 494 |
+
wp_die( __( 'Cheatin’ huh?', 'woocommerce-gateway-stripe' ) );
|
| 495 |
+
}
|
| 496 |
+
|
| 497 |
+
$selected_shipping_method = array_map( 'wc_clean', $_POST['selected_shipping_method'] );
|
| 498 |
+
|
| 499 |
+
WC()->session->set( 'chosen_shipping_methods', array( $selected_shipping_method['identifier'] ) );
|
| 500 |
+
|
| 501 |
+
WC()->cart->calculate_totals();
|
| 502 |
+
|
| 503 |
+
// Send back the new cart total.
|
| 504 |
+
$currency = get_woocommerce_currency();
|
| 505 |
+
$tax_total = max( 0, round( WC()->cart->tax_total + WC()->cart->shipping_tax_total, WC()->cart->dp ) );
|
| 506 |
+
$data = array(
|
| 507 |
+
'total' => WC()->cart->total,
|
| 508 |
+
);
|
| 509 |
+
|
| 510 |
+
// Include fees and taxes as displayItems.
|
| 511 |
+
foreach ( WC()->cart->fees as $key => $fee ) {
|
| 512 |
+
$data['items'][] = array(
|
| 513 |
+
'label' => $fee->name,
|
| 514 |
+
'amount' => array(
|
| 515 |
+
'currency' => $currency,
|
| 516 |
+
'value' => $fee->amount,
|
| 517 |
+
),
|
| 518 |
+
);
|
| 519 |
+
}
|
| 520 |
+
if ( 0 < $tax_total ) {
|
| 521 |
+
$data['items'][] = array(
|
| 522 |
+
'label' => __( 'Tax', 'woocommerce-gateway-stripe' ),
|
| 523 |
+
'amount' => array(
|
| 524 |
+
'currency' => $currency,
|
| 525 |
+
'value' => $tax_total,
|
| 526 |
+
),
|
| 527 |
+
);
|
| 528 |
+
}
|
| 529 |
+
|
| 530 |
+
wp_send_json( array( 'success' => 'true', 'line_items' => $this->build_line_items(), 'total' => WC()->cart->total ) );
|
| 531 |
+
}
|
| 532 |
+
|
| 533 |
+
/**
|
| 534 |
+
* Handles the Apple Pay processing via AJAX
|
| 535 |
+
*
|
| 536 |
+
* @access public
|
| 537 |
+
* @since 3.1.0
|
| 538 |
+
* @version 3.1.0
|
| 539 |
+
*/
|
| 540 |
+
public function process_apple_pay() {
|
| 541 |
+
if ( ! wp_verify_nonce( $_POST['nonce'], '_wc_stripe_apple_pay_nonce' ) ) {
|
| 542 |
+
wp_die( __( 'Cheatin’ huh?', 'woocommerce-gateway-stripe' ) );
|
| 543 |
+
}
|
| 544 |
+
|
| 545 |
+
try {
|
| 546 |
+
$result = array_map( 'wc_clean', $_POST['result'] );
|
| 547 |
+
|
| 548 |
+
$order = $this->create_order( $result );
|
| 549 |
+
|
| 550 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 551 |
+
|
| 552 |
+
// Handle payment.
|
| 553 |
+
if ( $order->get_total() > 0 ) {
|
| 554 |
+
|
| 555 |
+
if ( $order->get_total() * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 556 |
+
return new WP_Error( 'stripe_error', sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 557 |
+
}
|
| 558 |
+
|
| 559 |
+
WC_Stripe::log( "Info: Begin processing payment for order {$order_id} for the amount of {$order->get_total()}" );
|
| 560 |
+
|
| 561 |
+
// Make the request.
|
| 562 |
+
$response = WC_Stripe_API::request( $this->generate_payment_request( $order, $result['token']['id'] ) );
|
| 563 |
+
|
| 564 |
+
if ( is_wp_error( $response ) ) {
|
| 565 |
+
$localized_messages = $this->get_localized_messages();
|
| 566 |
+
|
| 567 |
+
throw new Exception( ( isset( $localized_messages[ $response->get_error_code() ] ) ? $localized_messages[ $response->get_error_code() ] : $response->get_error_message() ) );
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
// Process valid response.
|
| 571 |
+
$this->process_response( $response, $order );
|
| 572 |
+
} else {
|
| 573 |
+
$order->payment_complete();
|
| 574 |
+
}
|
| 575 |
+
|
| 576 |
+
// Remove cart.
|
| 577 |
+
WC()->cart->empty_cart();
|
| 578 |
+
|
| 579 |
+
update_post_meta( $order_id, '_customer_user', get_current_user_id() );
|
| 580 |
+
update_post_meta( $order_id, '_payment_method_title', __( 'Apple Pay (Stripe)', 'woocommerce-gateway-stripe' ) );
|
| 581 |
+
|
| 582 |
+
// Return thank you page redirect.
|
| 583 |
+
wp_send_json( array(
|
| 584 |
+
'success' => 'true',
|
| 585 |
+
'redirect' => $this->get_return_url( $order ),
|
| 586 |
+
) );
|
| 587 |
+
|
| 588 |
+
} catch ( Exception $e ) {
|
| 589 |
+
WC()->session->set( 'refresh_totals', true );
|
| 590 |
+
WC_Stripe::log( sprintf( __( 'Error: %s', 'woocommerce-gateway-stripe' ), $e->getMessage() ) );
|
| 591 |
+
|
| 592 |
+
if ( is_object( $order ) && isset( $order_id ) && $order->has_status( array( 'pending', 'failed' ) ) ) {
|
| 593 |
+
$this->send_failed_order_email( $order_id );
|
| 594 |
+
}
|
| 595 |
+
|
| 596 |
+
wp_send_json( array( 'success' => 'false', 'msg' => $e->getMessage() ) );
|
| 597 |
+
}
|
| 598 |
+
}
|
| 599 |
+
|
| 600 |
+
/**
|
| 601 |
+
* Generate the request for the payment.
|
| 602 |
+
* @param WC_Order $order
|
| 603 |
+
* @param string $source token
|
| 604 |
+
* @return array()
|
| 605 |
+
*/
|
| 606 |
+
protected function generate_payment_request( $order, $source ) {
|
| 607 |
+
$post_data = array();
|
| 608 |
+
$post_data['currency'] = strtolower( version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->get_order_currency() : $order->get_currency() );
|
| 609 |
+
$post_data['amount'] = $this->get_stripe_amount( $order->get_total(), $post_data['currency'] );
|
| 610 |
+
$post_data['description'] = sprintf( __( '%1$s - Order %2$s', 'woocommerce-gateway-stripe' ), $this->statement_descriptor, $order->get_order_number() );
|
| 611 |
+
$post_data['capture'] = 'yes' === $this->_gateway_settings['capture'] ? 'true' : 'false';
|
| 612 |
+
|
| 613 |
+
$billing_email = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->billing_email : $order->get_billing_email();
|
| 614 |
+
|
| 615 |
+
if ( ! empty( $billing_email ) && apply_filters( 'wc_stripe_send_stripe_receipt', false ) ) {
|
| 616 |
+
$post_data['receipt_email'] = $billing_email;
|
| 617 |
+
}
|
| 618 |
+
|
| 619 |
+
$post_data['expand[]'] = 'balance_transaction';
|
| 620 |
+
$post_data['source'] = $source;
|
| 621 |
+
|
| 622 |
+
/**
|
| 623 |
+
* Filter the return value of the WC_Payment_Gateway_CC::generate_payment_request.
|
| 624 |
+
*
|
| 625 |
+
* @since 3.1.0
|
| 626 |
+
* @param array $post_data
|
| 627 |
+
* @param WC_Order $order
|
| 628 |
+
* @param object $source
|
| 629 |
+
*/
|
| 630 |
+
return apply_filters( 'wc_stripe_generate_payment_request', $post_data, $order );
|
| 631 |
+
}
|
| 632 |
+
|
| 633 |
+
/**
|
| 634 |
+
* Builds the shippings methods to pass to Apple Pay.
|
| 635 |
+
*
|
| 636 |
+
* @since 3.1.0
|
| 637 |
+
* @version 3.1.0
|
| 638 |
+
*/
|
| 639 |
+
public function build_shipping_methods( $shipping_methods ) {
|
| 640 |
+
if ( empty( $shipping_methods ) ) {
|
| 641 |
+
return array();
|
| 642 |
+
}
|
| 643 |
+
|
| 644 |
+
$shipping = array();
|
| 645 |
+
|
| 646 |
+
foreach ( $shipping_methods as $method ) {
|
| 647 |
+
$shipping[] = array(
|
| 648 |
+
'label' => $method['label'],
|
| 649 |
+
'detail' => '',
|
| 650 |
+
'amount' => $method['amount']['value'],
|
| 651 |
+
'identifier' => $method['id'],
|
| 652 |
+
);
|
| 653 |
+
}
|
| 654 |
+
|
| 655 |
+
return $shipping;
|
| 656 |
+
}
|
| 657 |
+
|
| 658 |
+
/**
|
| 659 |
+
* Builds the line items to pass to Apple Pay.
|
| 660 |
+
*
|
| 661 |
+
* @since 3.1.0
|
| 662 |
+
* @version 3.1.0
|
| 663 |
+
*/
|
| 664 |
+
public function build_line_items() {
|
| 665 |
+
if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
|
| 666 |
+
define( 'WOOCOMMERCE_CART', true );
|
| 667 |
+
}
|
| 668 |
+
|
| 669 |
+
$decimals = apply_filters( 'wc_stripe_apple_pay_decimals', 2 );
|
| 670 |
+
|
| 671 |
+
$items = array();
|
| 672 |
+
$subtotal = 0;
|
| 673 |
+
|
| 674 |
+
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
|
| 675 |
+
$amount = wc_format_decimal( $values['line_subtotal'], $decimals );
|
| 676 |
+
$subtotal += $values['line_subtotal'];
|
| 677 |
+
$quantity_label = 1 < $values['quantity'] ? ' (x' . $values['quantity'] . ')' : '';
|
| 678 |
+
|
| 679 |
+
$item = array(
|
| 680 |
+
'type' => 'final',
|
| 681 |
+
'label' => $values['data']->post->post_title . $quantity_label,
|
| 682 |
+
'amount' => wc_format_decimal( $amount, $decimals ),
|
| 683 |
+
);
|
| 684 |
+
|
| 685 |
+
$items[] = $item;
|
| 686 |
+
}
|
| 687 |
+
|
| 688 |
+
// Default show only subtotal instead of itemization.
|
| 689 |
+
if ( apply_filters( 'wc_stripe_apple_pay_disable_itemization', true ) ) {
|
| 690 |
+
$items = array();
|
| 691 |
+
$items[] = array(
|
| 692 |
+
'type' => 'final',
|
| 693 |
+
'label' => __( 'Sub-Total', 'woocommerce-gateway-stripe' ),
|
| 694 |
+
'amount' => wc_format_decimal( $subtotal, $decimals ),
|
| 695 |
+
);
|
| 696 |
+
}
|
| 697 |
+
|
| 698 |
+
$discounts = wc_format_decimal( WC()->cart->get_cart_discount_total(), $decimals );
|
| 699 |
+
$tax = wc_format_decimal( WC()->cart->tax_total + WC()->cart->shipping_tax_total, $decimals );
|
| 700 |
+
$shipping = wc_format_decimal( WC()->cart->shipping_total, $decimals );
|
| 701 |
+
$item_total = wc_format_decimal( WC()->cart->cart_contents_total, $decimals ) + $discounts;
|
| 702 |
+
$order_total = wc_format_decimal( $item_total + $tax + $shipping, $decimals );
|
| 703 |
+
|
| 704 |
+
if ( wc_tax_enabled() ) {
|
| 705 |
+
$items[] = array(
|
| 706 |
+
'type' => 'final',
|
| 707 |
+
'label' => __( 'Tax', 'woocommerce-gateway-stripe' ),
|
| 708 |
+
'amount' => $tax,
|
| 709 |
+
);
|
| 710 |
+
}
|
| 711 |
+
|
| 712 |
+
if ( WC()->cart->needs_shipping() ) {
|
| 713 |
+
$items[] = array(
|
| 714 |
+
'type' => 'final',
|
| 715 |
+
'label' => __( 'Shipping', 'woocommerce-gateway-stripe' ),
|
| 716 |
+
'amount' => $shipping,
|
| 717 |
+
);
|
| 718 |
+
}
|
| 719 |
+
|
| 720 |
+
if ( WC()->cart->has_discount() ) {
|
| 721 |
+
$items[] = array(
|
| 722 |
+
'type' => 'final',
|
| 723 |
+
'label' => __( 'Discount', 'woocommerce-gateway-stripe' ),
|
| 724 |
+
'amount' => '-' . $discounts,
|
| 725 |
+
);
|
| 726 |
+
}
|
| 727 |
+
|
| 728 |
+
return $items;
|
| 729 |
+
}
|
| 730 |
+
|
| 731 |
+
/**
|
| 732 |
+
* Create order programatically.
|
| 733 |
+
*
|
| 734 |
+
* @since 3.1.0
|
| 735 |
+
* @version 3.1.0
|
| 736 |
+
* @param array $data
|
| 737 |
+
* @return object $order
|
| 738 |
+
*/
|
| 739 |
+
public function create_order( $data = array() ) {
|
| 740 |
+
if ( empty( $data ) ) {
|
| 741 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 520 ) );
|
| 742 |
+
}
|
| 743 |
+
|
| 744 |
+
$order = wc_create_order();
|
| 745 |
+
$order_id = version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->id : $order->get_id();
|
| 746 |
+
|
| 747 |
+
if ( is_wp_error( $order ) ) {
|
| 748 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 520 ) );
|
| 749 |
+
} elseif ( false === $order ) {
|
| 750 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 521 ) );
|
| 751 |
+
} else {
|
| 752 |
+
do_action( 'woocommerce_new_order', $order_id );
|
| 753 |
+
}
|
| 754 |
+
|
| 755 |
+
// Store the line items to the new/resumed order
|
| 756 |
+
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
|
| 757 |
+
$item_id = $order->add_product(
|
| 758 |
+
$values['data'],
|
| 759 |
+
$values['quantity'],
|
| 760 |
+
array(
|
| 761 |
+
'variation' => $values['variation'],
|
| 762 |
+
'totals' => array(
|
| 763 |
+
'subtotal' => $values['line_subtotal'],
|
| 764 |
+
'subtotal_tax' => $values['line_subtotal_tax'],
|
| 765 |
+
'total' => $values['line_total'],
|
| 766 |
+
'tax' => $values['line_tax'],
|
| 767 |
+
'tax_data' => $values['line_tax_data'], // Since 2.2
|
| 768 |
+
),
|
| 769 |
+
)
|
| 770 |
+
);
|
| 771 |
+
|
| 772 |
+
if ( ! $item_id ) {
|
| 773 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 525 ) );
|
| 774 |
+
}
|
| 775 |
+
|
| 776 |
+
// Allow plugins to add order item meta
|
| 777 |
+
do_action( 'woocommerce_add_order_item_meta', $item_id, $values, $cart_item_key );
|
| 778 |
+
}
|
| 779 |
+
|
| 780 |
+
// Store fees
|
| 781 |
+
foreach ( WC()->cart->get_fees() as $fee_key => $fee ) {
|
| 782 |
+
$item_id = $order->add_fee( $fee );
|
| 783 |
+
|
| 784 |
+
if ( ! $item_id ) {
|
| 785 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 526 ) );
|
| 786 |
+
}
|
| 787 |
+
|
| 788 |
+
// Allow plugins to add order item meta to fees
|
| 789 |
+
do_action( 'woocommerce_add_order_fee_meta', $order_id, $item_id, $fee, $fee_key );
|
| 790 |
+
}
|
| 791 |
+
|
| 792 |
+
// Store tax rows
|
| 793 |
+
foreach ( array_keys( WC()->cart->taxes + WC()->cart->shipping_taxes ) as $tax_rate_id ) {
|
| 794 |
+
if ( $tax_rate_id && ! $order->add_tax( $tax_rate_id, WC()->cart->get_tax_amount( $tax_rate_id ), WC()->cart->get_shipping_tax_amount( $tax_rate_id ) ) && apply_filters( 'woocommerce_cart_remove_taxes_zero_rate_id', 'zero-rated' ) !== $tax_rate_id ) {
|
| 795 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 528 ) );
|
| 796 |
+
}
|
| 797 |
+
}
|
| 798 |
+
|
| 799 |
+
// Store coupons
|
| 800 |
+
foreach ( WC()->cart->get_coupons() as $code => $coupon ) {
|
| 801 |
+
if ( ! $order->add_coupon( $code, WC()->cart->get_coupon_discount_amount( $code ), WC()->cart->get_coupon_discount_tax_amount( $code ) ) ) {
|
| 802 |
+
throw new Exception( sprintf( __( 'Error %d: Unable to create order. Please try again.', 'woocommerce-gateway-stripe' ), 529 ) );
|
| 803 |
+
}
|
| 804 |
+
}
|
| 805 |
+
|
| 806 |
+
// Billing address
|
| 807 |
+
$billing_address = array();
|
| 808 |
+
if ( ! empty( $data['token']['card'] ) ) {
|
| 809 |
+
// Name from Stripe is a full name string.
|
| 810 |
+
$name = explode( ' ', $data['token']['card']['name'] );
|
| 811 |
+
$lastname = array_pop( $name );
|
| 812 |
+
$firstname = implode( ' ', $name );
|
| 813 |
+
$billing_address['first_name'] = $firstname;
|
| 814 |
+
$billing_address['last_name'] = $lastname;
|
| 815 |
+
$billing_address['email'] = $data['shippingContact']['emailAddress'];
|
| 816 |
+
$billing_address['phone'] = $data['shippingContact']['phoneNumber'];
|
| 817 |
+
$billing_address['country'] = $data['token']['card']['country'];
|
| 818 |
+
$billing_address['address_1'] = $data['token']['card']['address_line1'];
|
| 819 |
+
$billing_address['address_2'] = $data['token']['card']['address_line2'];
|
| 820 |
+
$billing_address['city'] = $data['token']['card']['address_city'];
|
| 821 |
+
$billing_address['state'] = $data['token']['card']['address_state'];
|
| 822 |
+
$billing_address['postcode'] = $data['token']['card']['address_zip'];
|
| 823 |
+
}
|
| 824 |
+
|
| 825 |
+
// Shipping address.
|
| 826 |
+
$shipping_address = array();
|
| 827 |
+
if ( WC()->cart->needs_shipping() && ! empty( $data['shippingContact'] ) ) {
|
| 828 |
+
$shipping_address['first_name'] = $data['shippingContact']['givenName'];
|
| 829 |
+
$shipping_address['last_name'] = $data['shippingContact']['familyName'];
|
| 830 |
+
$shipping_address['email'] = $data['shippingContact']['emailAddress'];
|
| 831 |
+
$shipping_address['phone'] = $data['shippingContact']['phoneNumber'];
|
| 832 |
+
$shipping_address['country'] = $data['shippingContact']['countryCode'];
|
| 833 |
+
$shipping_address['address_1'] = $data['shippingContact']['addressLines'][0];
|
| 834 |
+
$shipping_address['address_2'] = $data['shippingContact']['addressLines'][1];
|
| 835 |
+
$shipping_address['city'] = $data['shippingContact']['locality'];
|
| 836 |
+
$shipping_address['state'] = $data['shippingContact']['administrativeArea'];
|
| 837 |
+
$shipping_address['postcode'] = $data['shippingContact']['postalCode'];
|
| 838 |
+
} elseif ( ! empty( $data['shippingContact'] ) ) {
|
| 839 |
+
$shipping_address['first_name'] = $firstname;
|
| 840 |
+
$shipping_address['last_name'] = $lastname;
|
| 841 |
+
$shipping_address['email'] = $data['shippingContact']['emailAddress'];
|
| 842 |
+
$shipping_address['phone'] = $data['shippingContact']['phoneNumber'];
|
| 843 |
+
$shipping_address['country'] = $data['token']['card']['country'];
|
| 844 |
+
$shipping_address['address_1'] = $data['token']['card']['address_line1'];
|
| 845 |
+
$shipping_address['address_2'] = $data['token']['card']['address_line2'];
|
| 846 |
+
$shipping_address['city'] = $data['token']['card']['address_city'];
|
| 847 |
+
$shipping_address['state'] = $data['token']['card']['address_state'];
|
| 848 |
+
$shipping_address['postcode'] = $data['token']['card']['address_zip'];
|
| 849 |
+
}
|
| 850 |
+
|
| 851 |
+
$order->set_address( $billing_address, 'billing' );
|
| 852 |
+
$order->set_address( $shipping_address, 'shipping' );
|
| 853 |
+
|
| 854 |
+
WC()->shipping->calculate_shipping( WC()->cart->get_shipping_packages() );
|
| 855 |
+
|
| 856 |
+
// Get the rate object selected by user.
|
| 857 |
+
foreach ( WC()->shipping->get_packages() as $package_key => $package ) {
|
| 858 |
+
foreach ( $package['rates'] as $key => $rate ) {
|
| 859 |
+
// Loop through user chosen shipping methods.
|
| 860 |
+
foreach ( WC()->session->get( 'chosen_shipping_methods' ) as $method ) {
|
| 861 |
+
if ( $method === $key ) {
|
| 862 |
+
$order->add_shipping( $rate );
|
| 863 |
+
}
|
| 864 |
+
}
|
| 865 |
+
}
|
| 866 |
+
}
|
| 867 |
+
|
| 868 |
+
$available_gateways = WC()->payment_gateways->get_available_payment_gateways();
|
| 869 |
+
$order->set_payment_method( $available_gateways['stripe'] );
|
| 870 |
+
$order->set_total( WC()->cart->shipping_total, 'shipping' );
|
| 871 |
+
$order->set_total( WC()->cart->get_cart_discount_total(), 'cart_discount' );
|
| 872 |
+
$order->set_total( WC()->cart->get_cart_discount_tax_total(), 'cart_discount_tax' );
|
| 873 |
+
$order->set_total( WC()->cart->tax_total, 'tax' );
|
| 874 |
+
$order->set_total( WC()->cart->shipping_tax_total, 'shipping_tax' );
|
| 875 |
+
$order->set_total( WC()->cart->total );
|
| 876 |
+
|
| 877 |
+
// If we got here, the order was created without problems!
|
| 878 |
+
wc_transaction_query( 'commit' );
|
| 879 |
+
|
| 880 |
+
return $order;
|
| 881 |
+
}
|
| 882 |
+
}
|
| 883 |
+
|
| 884 |
+
new WC_Stripe_Apple_Pay();
|
includes/class-wc-stripe-customer.php
CHANGED
|
@@ -137,6 +137,10 @@ class WC_Stripe_Customer {
|
|
| 137 |
);
|
| 138 |
}
|
| 139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 140 |
$args = wp_parse_args( $args, $defaults );
|
| 141 |
$response = WC_Stripe_API::request( $args, 'customers' );
|
| 142 |
|
|
@@ -173,7 +177,7 @@ class WC_Stripe_Customer {
|
|
| 173 |
}
|
| 174 |
|
| 175 |
$response = WC_Stripe_API::request( array(
|
| 176 |
-
'source' => $token
|
| 177 |
), 'customers/' . $this->get_id() . '/sources' );
|
| 178 |
|
| 179 |
if ( is_wp_error( $response ) ) {
|
|
@@ -194,7 +198,7 @@ class WC_Stripe_Customer {
|
|
| 194 |
$token->set_gateway_id( 'stripe' );
|
| 195 |
$token->set_card_type( strtolower( $response->brand ) );
|
| 196 |
$token->set_last4( $response->last4 );
|
| 197 |
-
$token->set_expiry_month( $response->exp_month
|
| 198 |
$token->set_expiry_year( $response->exp_year );
|
| 199 |
$token->set_user_id( $this->get_user_id() );
|
| 200 |
$token->save();
|
|
@@ -218,7 +222,7 @@ class WC_Stripe_Customer {
|
|
| 218 |
|
| 219 |
if ( $this->get_id() && false === ( $cards = get_transient( 'stripe_cards_' . $this->get_id() ) ) ) {
|
| 220 |
$response = WC_Stripe_API::request( array(
|
| 221 |
-
'limit' => 100
|
| 222 |
), 'customers/' . $this->get_id() . '/sources', 'GET' );
|
| 223 |
|
| 224 |
if ( is_wp_error( $response ) ) {
|
| 137 |
);
|
| 138 |
}
|
| 139 |
|
| 140 |
+
$metadata = array();
|
| 141 |
+
|
| 142 |
+
$defaults['metadata'] = apply_filters( 'wc_stripe_customer_metadata', $metadata, $user );
|
| 143 |
+
|
| 144 |
$args = wp_parse_args( $args, $defaults );
|
| 145 |
$response = WC_Stripe_API::request( $args, 'customers' );
|
| 146 |
|
| 177 |
}
|
| 178 |
|
| 179 |
$response = WC_Stripe_API::request( array(
|
| 180 |
+
'source' => $token,
|
| 181 |
), 'customers/' . $this->get_id() . '/sources' );
|
| 182 |
|
| 183 |
if ( is_wp_error( $response ) ) {
|
| 198 |
$token->set_gateway_id( 'stripe' );
|
| 199 |
$token->set_card_type( strtolower( $response->brand ) );
|
| 200 |
$token->set_last4( $response->last4 );
|
| 201 |
+
$token->set_expiry_month( $response->exp_month );
|
| 202 |
$token->set_expiry_year( $response->exp_year );
|
| 203 |
$token->set_user_id( $this->get_user_id() );
|
| 204 |
$token->save();
|
| 222 |
|
| 223 |
if ( $this->get_id() && false === ( $cards = get_transient( 'stripe_cards_' . $this->get_id() ) ) ) {
|
| 224 |
$response = WC_Stripe_API::request( array(
|
| 225 |
+
'limit' => 100,
|
| 226 |
), 'customers/' . $this->get_id() . '/sources', 'GET' );
|
| 227 |
|
| 228 |
if ( is_wp_error( $response ) ) {
|
includes/class-wc-stripe-payment-request.php
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Stripe Payment Request API
|
| 4 |
+
*
|
| 5 |
+
* @package WooCommerce_Stripe/Classes/Payment_Request
|
| 6 |
+
* @since 3.1.0
|
| 7 |
+
* @version 3.1.0
|
| 8 |
+
*/
|
| 9 |
+
|
| 10 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
| 11 |
+
exit;
|
| 12 |
+
}
|
| 13 |
+
|
| 14 |
+
/**
|
| 15 |
+
* WC_Stripe_Payment_Request class.
|
| 16 |
+
*/
|
| 17 |
+
class WC_Stripe_Payment_Request {
|
| 18 |
+
|
| 19 |
+
/**
|
| 20 |
+
* Initialize class actions.
|
| 21 |
+
*/
|
| 22 |
+
public function __construct() {
|
| 23 |
+
add_action( 'wp_enqueue_scripts', array( $this, 'scripts' ) );
|
| 24 |
+
|
| 25 |
+
add_action( 'wc_ajax_wc_stripe_get_cart_details', array( $this, 'ajax_get_cart_details' ) );
|
| 26 |
+
add_action( 'wc_ajax_wc_stripe_get_shipping_options', array( $this, 'ajax_get_shipping_options' ) );
|
| 27 |
+
add_action( 'wc_ajax_wc_stripe_update_shipping_method', array( $this, 'ajax_update_shipping_method' ) );
|
| 28 |
+
add_action( 'wc_ajax_wc_stripe_create_order', array( $this, 'ajax_create_order' ) );
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
/**
|
| 32 |
+
* Check if Stripe gateway is enabled.
|
| 33 |
+
*
|
| 34 |
+
* @return bool
|
| 35 |
+
*/
|
| 36 |
+
protected function is_activated() {
|
| 37 |
+
$options = get_option( 'woocommerce_stripe_settings', array() );
|
| 38 |
+
$enabled = isset( $options['enabled'] ) && 'yes' === $options['enabled'];
|
| 39 |
+
$stripe_checkout = isset( $options['stripe_checkout'] ) && 'yes' !== $options['stripe_checkout'];
|
| 40 |
+
$request_payment_api = isset( $options['request_payment_api'] ) && 'yes' === $options['request_payment_api'];
|
| 41 |
+
|
| 42 |
+
return $enabled && $stripe_checkout && $request_payment_api && is_ssl();
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
/**
|
| 46 |
+
* Get publishable key.
|
| 47 |
+
*
|
| 48 |
+
* @return string
|
| 49 |
+
*/
|
| 50 |
+
protected function get_publishable_key() {
|
| 51 |
+
$options = get_option( 'woocommerce_stripe_settings', array() );
|
| 52 |
+
|
| 53 |
+
if ( empty( $options ) ) {
|
| 54 |
+
return '';
|
| 55 |
+
}
|
| 56 |
+
|
| 57 |
+
return 'yes' === $options['testmode'] ? $options['test_publishable_key'] : $options['publishable_key'];
|
| 58 |
+
}
|
| 59 |
+
|
| 60 |
+
/**
|
| 61 |
+
* Load public scripts.
|
| 62 |
+
*/
|
| 63 |
+
public function scripts() {
|
| 64 |
+
// Load PaymentRequest only on cart for now.
|
| 65 |
+
if ( ! is_cart() ) {
|
| 66 |
+
return;
|
| 67 |
+
}
|
| 68 |
+
|
| 69 |
+
if ( ! $this->is_activated() ) {
|
| 70 |
+
return;
|
| 71 |
+
}
|
| 72 |
+
|
| 73 |
+
$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
|
| 74 |
+
|
| 75 |
+
wp_enqueue_script( 'stripe', 'https://js.stripe.com/v2/', '', '1.0', true );
|
| 76 |
+
wp_enqueue_script( 'google-payment-request-shim', 'https://storage.googleapis.com/prshim/v1/payment-shim.js', '', '1.0', false );
|
| 77 |
+
wp_enqueue_script( 'wc-stripe-payment-request', plugins_url( 'assets/js/payment-request' . $suffix . '.js', WC_STRIPE_MAIN_FILE ), array( 'jquery', 'stripe' ), WC_STRIPE_VERSION, true );
|
| 78 |
+
|
| 79 |
+
wp_localize_script(
|
| 80 |
+
'wc-stripe-payment-request',
|
| 81 |
+
'wcStripePaymentRequestParams',
|
| 82 |
+
array(
|
| 83 |
+
'ajax_url' => WC_AJAX::get_endpoint( '%%endpoint%%' ),
|
| 84 |
+
'stripe' => array(
|
| 85 |
+
'key' => $this->get_publishable_key(),
|
| 86 |
+
'allow_prepaid_card' => apply_filters( 'wc_stripe_allow_prepaid_card', true ) ? 'yes' : 'no',
|
| 87 |
+
),
|
| 88 |
+
'nonce' => array(
|
| 89 |
+
'payment' => wp_create_nonce( 'wc-stripe-payment-request' ),
|
| 90 |
+
'shipping' => wp_create_nonce( 'wc-stripe-payment-request-shipping' ),
|
| 91 |
+
'update_shipping' => wp_create_nonce( 'wc-stripe-update-shipping-method' ),
|
| 92 |
+
'checkout' => wp_create_nonce( 'woocommerce-process_checkout' ),
|
| 93 |
+
),
|
| 94 |
+
'i18n' => array(
|
| 95 |
+
'no_prepaid_card' => __( 'Sorry, we\'re not accepting prepaid cards at this time.', 'woocommerce-gateway-stripe' ),
|
| 96 |
+
/* translators: Do not translate the [option] placeholder */
|
| 97 |
+
'unknown_shipping' => __( 'Unknown shipping option "[option]".', 'woocommerce-gateway-stripe' ),
|
| 98 |
+
),
|
| 99 |
+
)
|
| 100 |
+
);
|
| 101 |
+
}
|
| 102 |
+
|
| 103 |
+
/**
|
| 104 |
+
* Get cart details.
|
| 105 |
+
*/
|
| 106 |
+
public function ajax_get_cart_details() {
|
| 107 |
+
check_ajax_referer( 'wc-stripe-payment-request', 'security' );
|
| 108 |
+
|
| 109 |
+
if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
|
| 110 |
+
define( 'WOOCOMMERCE_CART', true );
|
| 111 |
+
}
|
| 112 |
+
|
| 113 |
+
WC()->cart->calculate_totals();
|
| 114 |
+
|
| 115 |
+
$currency = get_woocommerce_currency();
|
| 116 |
+
|
| 117 |
+
// Set mandatory payment details.
|
| 118 |
+
$data = array(
|
| 119 |
+
'shipping_required' => WC()->cart->needs_shipping(),
|
| 120 |
+
'order_data' => array(
|
| 121 |
+
'total' => array(
|
| 122 |
+
'label' => __( 'Total', 'woocommerce-gateway-stripe' ),
|
| 123 |
+
'amount' => array(
|
| 124 |
+
'value' => max( 0, apply_filters( 'woocommerce_calculated_total', round( WC()->cart->cart_contents_total + WC()->cart->fee_total + WC()->cart->tax_total, WC()->cart->dp ), WC()->cart ) ),
|
| 125 |
+
'currency' => $currency,
|
| 126 |
+
),
|
| 127 |
+
),
|
| 128 |
+
// Include line items such as subtotal, fees and taxes. No shipping option is provided here because it is not chosen yet.
|
| 129 |
+
'displayItems' => $this->compute_display_items( null ),
|
| 130 |
+
),
|
| 131 |
+
);
|
| 132 |
+
|
| 133 |
+
wp_send_json( $data );
|
| 134 |
+
}
|
| 135 |
+
|
| 136 |
+
/**
|
| 137 |
+
* Calculate and set shipping method.
|
| 138 |
+
*
|
| 139 |
+
* @since 3.1.0
|
| 140 |
+
* @version 3.1.0
|
| 141 |
+
* @param array $address
|
| 142 |
+
*/
|
| 143 |
+
public function calculate_shipping( $address = array() ) {
|
| 144 |
+
$country = $address['country'];
|
| 145 |
+
$state = $address['state'];
|
| 146 |
+
$postcode = $address['postcode'];
|
| 147 |
+
$city = $address['city'];
|
| 148 |
+
$address_1 = $address['address'];
|
| 149 |
+
$address_2 = $address['address_2'];
|
| 150 |
+
|
| 151 |
+
WC()->shipping->reset_shipping();
|
| 152 |
+
|
| 153 |
+
if ( $postcode && WC_Validation::is_postcode( $postcode, $country ) ) {
|
| 154 |
+
$postcode = wc_format_postcode( $postcode, $country );
|
| 155 |
+
}
|
| 156 |
+
|
| 157 |
+
if ( $country ) {
|
| 158 |
+
WC()->customer->set_location( $country, $state, $postcode, $city );
|
| 159 |
+
WC()->customer->set_shipping_location( $country, $state, $postcode, $city );
|
| 160 |
+
} else {
|
| 161 |
+
WC()->customer->set_to_base();
|
| 162 |
+
WC()->customer->set_shipping_to_base();
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
WC()->customer->calculated_shipping( true );
|
| 166 |
+
|
| 167 |
+
$packages = array();
|
| 168 |
+
|
| 169 |
+
$packages[0]['contents'] = WC()->cart->get_cart();
|
| 170 |
+
$packages[0]['contents_cost'] = 0;
|
| 171 |
+
$packages[0]['applied_coupons'] = WC()->cart->applied_coupons;
|
| 172 |
+
$packages[0]['user']['ID'] = get_current_user_id();
|
| 173 |
+
$packages[0]['destination']['country'] = $country;
|
| 174 |
+
$packages[0]['destination']['state'] = $state;
|
| 175 |
+
$packages[0]['destination']['postcode'] = $postcode;
|
| 176 |
+
$packages[0]['destination']['city'] = $city;
|
| 177 |
+
$packages[0]['destination']['address'] = $address_1;
|
| 178 |
+
$packages[0]['destination']['address_2'] = $address_2;
|
| 179 |
+
|
| 180 |
+
foreach ( WC()->cart->get_cart() as $item ) {
|
| 181 |
+
if ( $item['data']->needs_shipping() ) {
|
| 182 |
+
if ( isset( $item['line_total'] ) ) {
|
| 183 |
+
$packages[0]['contents_cost'] += $item['line_total'];
|
| 184 |
+
}
|
| 185 |
+
}
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
$packages = apply_filters( 'woocommerce_cart_shipping_packages', $packages );
|
| 189 |
+
|
| 190 |
+
WC()->shipping->calculate_shipping( $packages );
|
| 191 |
+
}
|
| 192 |
+
|
| 193 |
+
/**
|
| 194 |
+
* Get shipping options.
|
| 195 |
+
*
|
| 196 |
+
* @see WC_Cart::get_shipping_packages().
|
| 197 |
+
* @see WC_Shipping::calculate_shipping().
|
| 198 |
+
* @see WC_Shipping::get_packages().
|
| 199 |
+
*/
|
| 200 |
+
public function ajax_get_shipping_options() {
|
| 201 |
+
check_ajax_referer( 'wc-stripe-payment-request-shipping', 'security' );
|
| 202 |
+
|
| 203 |
+
// Set the shipping package.
|
| 204 |
+
$posted = filter_input_array( INPUT_POST, array(
|
| 205 |
+
'country' => FILTER_SANITIZE_STRING,
|
| 206 |
+
'state' => FILTER_SANITIZE_STRING,
|
| 207 |
+
'postcode' => FILTER_SANITIZE_STRING,
|
| 208 |
+
'city' => FILTER_SANITIZE_STRING,
|
| 209 |
+
'address' => FILTER_SANITIZE_STRING,
|
| 210 |
+
'address_2' => FILTER_SANITIZE_STRING,
|
| 211 |
+
) );
|
| 212 |
+
|
| 213 |
+
$this->calculate_shipping( $posted );
|
| 214 |
+
|
| 215 |
+
// Set the shipping options.
|
| 216 |
+
$currency = get_woocommerce_currency();
|
| 217 |
+
$data = array();
|
| 218 |
+
|
| 219 |
+
$packages = WC()->shipping->get_packages();
|
| 220 |
+
|
| 221 |
+
if ( ! empty( $packages ) && WC()->customer->has_calculated_shipping() ) {
|
| 222 |
+
foreach ( $packages as $package_key => $package ) {
|
| 223 |
+
if ( empty( $package['rates'] ) ) {
|
| 224 |
+
break;
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
foreach ( $package['rates'] as $key => $rate ) {
|
| 228 |
+
$data[] = array(
|
| 229 |
+
'id' => $rate->id,
|
| 230 |
+
'label' => $rate->label,
|
| 231 |
+
'amount' => array(
|
| 232 |
+
'currency' => $currency,
|
| 233 |
+
'value' => $rate->cost,
|
| 234 |
+
),
|
| 235 |
+
'selected' => false,
|
| 236 |
+
);
|
| 237 |
+
}
|
| 238 |
+
}
|
| 239 |
+
}
|
| 240 |
+
|
| 241 |
+
// Auto select when have only one shipping method available.
|
| 242 |
+
if ( 1 === count( $data ) ) {
|
| 243 |
+
$data[0]['selected'] = true;
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
wp_send_json( $data );
|
| 247 |
+
}
|
| 248 |
+
|
| 249 |
+
/**
|
| 250 |
+
* Update shipping method.
|
| 251 |
+
*/
|
| 252 |
+
public function ajax_update_shipping_method() {
|
| 253 |
+
check_ajax_referer( 'wc-stripe-update-shipping-method', 'security' );
|
| 254 |
+
|
| 255 |
+
if ( ! defined( 'WOOCOMMERCE_CART' ) ) {
|
| 256 |
+
define( 'WOOCOMMERCE_CART', true );
|
| 257 |
+
}
|
| 258 |
+
|
| 259 |
+
$chosen_shipping_methods = WC()->session->get( 'chosen_shipping_methods' );
|
| 260 |
+
$shipping_method = filter_input( INPUT_POST, 'shipping_method', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY );
|
| 261 |
+
|
| 262 |
+
if ( is_array( $shipping_method ) ) {
|
| 263 |
+
foreach ( $shipping_method as $i => $value ) {
|
| 264 |
+
$chosen_shipping_methods[ $i ] = wc_clean( $value );
|
| 265 |
+
}
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
WC()->session->set( 'chosen_shipping_methods', $chosen_shipping_methods );
|
| 269 |
+
|
| 270 |
+
WC()->cart->calculate_totals();
|
| 271 |
+
|
| 272 |
+
// Send back the new cart total and line items to be displayed, such as subtotal, shipping rate(s), fees and taxes.
|
| 273 |
+
$data = array(
|
| 274 |
+
'total' => WC()->cart->total,
|
| 275 |
+
'items' => $this->compute_display_items( $shipping_method[0] ),
|
| 276 |
+
);
|
| 277 |
+
|
| 278 |
+
wp_send_json( $data );
|
| 279 |
+
}
|
| 280 |
+
|
| 281 |
+
/**
|
| 282 |
+
* Create order.
|
| 283 |
+
*/
|
| 284 |
+
public function ajax_create_order() {
|
| 285 |
+
if ( WC()->cart->is_empty() ) {
|
| 286 |
+
wp_send_json_error( __( 'Empty cart', 'woocommerce-gateway-stripe' ) );
|
| 287 |
+
}
|
| 288 |
+
|
| 289 |
+
if ( ! defined( 'WOOCOMMERCE_CHECKOUT' ) ) {
|
| 290 |
+
define( 'WOOCOMMERCE_CHECKOUT', true );
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
WC()->checkout()->process_checkout();
|
| 294 |
+
|
| 295 |
+
die( 0 );
|
| 296 |
+
}
|
| 297 |
+
|
| 298 |
+
/**
|
| 299 |
+
* Compute display items to be included in the 'displayItems' key of the PaymentDetails.
|
| 300 |
+
*
|
| 301 |
+
* @param string shipping_method_id If shipping method ID is provided, will include display items about shipping.
|
| 302 |
+
*/
|
| 303 |
+
protected function compute_display_items( $shipping_method_id ) {
|
| 304 |
+
$currency = get_woocommerce_currency();
|
| 305 |
+
$items = array(
|
| 306 |
+
// Subtotal excluding tax, because taxes is a separate item, below.
|
| 307 |
+
array(
|
| 308 |
+
'label' => __( 'Subtotal', 'woocommerce-gateway-stripe' ),
|
| 309 |
+
'amount' => array(
|
| 310 |
+
'value' => max( 0, round( WC()->cart->subtotal_ex_tax, WC()->cart->dp ) ),
|
| 311 |
+
'currency' => $currency,
|
| 312 |
+
),
|
| 313 |
+
),
|
| 314 |
+
);
|
| 315 |
+
// If a chosen shipping option was provided, add line item(s) for it and include the shipping tax.
|
| 316 |
+
$tax_total = max( 0, round( WC()->cart->tax_total, WC()->cart->dp ) );
|
| 317 |
+
if ( $shipping_method_id ) {
|
| 318 |
+
$tax_total = max( 0, round( WC()->cart->tax_total + WC()->cart->shipping_tax_total, WC()->cart->dp ) );
|
| 319 |
+
// Look through the package rates for $shipping_method_id, and when found, add a line item.
|
| 320 |
+
foreach ( WC()->shipping->get_packages() as $package_key => $package ) {
|
| 321 |
+
foreach ( $package['rates'] as $key => $rate ) {
|
| 322 |
+
if ( $rate->id == $shipping_method_id ) {
|
| 323 |
+
$items[] = array(
|
| 324 |
+
'label' => $rate->label,
|
| 325 |
+
'amount' => array(
|
| 326 |
+
'value' => $rate->cost,
|
| 327 |
+
'currency' => $currency,
|
| 328 |
+
),
|
| 329 |
+
);
|
| 330 |
+
break;
|
| 331 |
+
}
|
| 332 |
+
}
|
| 333 |
+
}
|
| 334 |
+
}
|
| 335 |
+
// Include fees and taxes as display items.
|
| 336 |
+
foreach ( WC()->cart->fees as $key => $fee ) {
|
| 337 |
+
$items[] = array(
|
| 338 |
+
'label' => $fee->name,
|
| 339 |
+
'amount' => array(
|
| 340 |
+
'currency' => $currency,
|
| 341 |
+
'value' => $fee->amount,
|
| 342 |
+
),
|
| 343 |
+
);
|
| 344 |
+
}
|
| 345 |
+
// The tax total may include the shipping taxes if a shipping option is provided.
|
| 346 |
+
if ( 0 < $tax_total ) {
|
| 347 |
+
$items[] = array(
|
| 348 |
+
'label' => __( 'Tax', 'woocommerce-gateway-stripe' ),
|
| 349 |
+
'amount' => array(
|
| 350 |
+
'currency' => $currency,
|
| 351 |
+
'value' => $tax_total,
|
| 352 |
+
),
|
| 353 |
+
);
|
| 354 |
+
}
|
| 355 |
+
return $items;
|
| 356 |
+
}
|
| 357 |
+
}
|
| 358 |
+
|
| 359 |
+
new WC_Stripe_Payment_Request();
|
includes/legacy/class-wc-gateway-stripe.php
CHANGED
|
@@ -441,6 +441,7 @@ class WC_Gateway_Stripe extends WC_Payment_Gateway {
|
|
| 441 |
|
| 442 |
// Handle payment
|
| 443 |
if ( $order->get_total() > 0 ) {
|
|
|
|
| 444 |
if ( $order->get_total() * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 445 |
throw new Exception( sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 446 |
}
|
| 441 |
|
| 442 |
// Handle payment
|
| 443 |
if ( $order->get_total() > 0 ) {
|
| 444 |
+
|
| 445 |
if ( $order->get_total() * 100 < WC_Stripe::get_minimum_amount() ) {
|
| 446 |
throw new Exception( sprintf( __( 'Sorry, the minimum allowed order total is %1$s to use this payment method.', 'woocommerce-gateway-stripe' ), wc_price( WC_Stripe::get_minimum_amount() / 100 ) ) );
|
| 447 |
}
|
includes/settings-stripe.php
CHANGED
|
@@ -10,7 +10,7 @@ return apply_filters( 'wc_stripe_settings',
|
|
| 10 |
'label' => __( 'Enable Stripe', 'woocommerce-gateway-stripe' ),
|
| 11 |
'type' => 'checkbox',
|
| 12 |
'description' => '',
|
| 13 |
-
'default' => 'no'
|
| 14 |
),
|
| 15 |
'title' => array(
|
| 16 |
'title' => __( 'Title', 'woocommerce-gateway-stripe' ),
|
|
@@ -23,7 +23,7 @@ return apply_filters( 'wc_stripe_settings',
|
|
| 23 |
'title' => __( 'Description', 'woocommerce-gateway-stripe' ),
|
| 24 |
'type' => 'text',
|
| 25 |
'description' => __( 'This controls the description which the user sees during checkout.', 'woocommerce-gateway-stripe' ),
|
| 26 |
-
'default' => __( 'Pay with your credit card via Stripe.', 'woocommerce-gateway-stripe'),
|
| 27 |
'desc_tip' => true,
|
| 28 |
),
|
| 29 |
'testmode' => array(
|
|
@@ -62,6 +62,13 @@ return apply_filters( 'wc_stripe_settings',
|
|
| 62 |
'default' => '',
|
| 63 |
'desc_tip' => true,
|
| 64 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
'capture' => array(
|
| 66 |
'title' => __( 'Capture', 'woocommerce-gateway-stripe' ),
|
| 67 |
'label' => __( 'Capture charge immediately', 'woocommerce-gateway-stripe' ),
|
|
@@ -124,6 +131,41 @@ return apply_filters( 'wc_stripe_settings',
|
|
| 124 |
'default' => '',
|
| 125 |
'desc_tip' => true,
|
| 126 |
),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 127 |
'saved_cards' => array(
|
| 128 |
'title' => __( 'Saved Cards', 'woocommerce-gateway-stripe' ),
|
| 129 |
'label' => __( 'Enable Payment via Saved Cards', 'woocommerce-gateway-stripe' ),
|
| 10 |
'label' => __( 'Enable Stripe', 'woocommerce-gateway-stripe' ),
|
| 11 |
'type' => 'checkbox',
|
| 12 |
'description' => '',
|
| 13 |
+
'default' => 'no',
|
| 14 |
),
|
| 15 |
'title' => array(
|
| 16 |
'title' => __( 'Title', 'woocommerce-gateway-stripe' ),
|
| 23 |
'title' => __( 'Description', 'woocommerce-gateway-stripe' ),
|
| 24 |
'type' => 'text',
|
| 25 |
'description' => __( 'This controls the description which the user sees during checkout.', 'woocommerce-gateway-stripe' ),
|
| 26 |
+
'default' => __( 'Pay with your credit card via Stripe.', 'woocommerce-gateway-stripe' ),
|
| 27 |
'desc_tip' => true,
|
| 28 |
),
|
| 29 |
'testmode' => array(
|
| 62 |
'default' => '',
|
| 63 |
'desc_tip' => true,
|
| 64 |
),
|
| 65 |
+
'statement_descriptor' => array(
|
| 66 |
+
'title' => __( 'Statement Descriptor', 'woocommerce-gateway-stripe' ),
|
| 67 |
+
'type' => 'text',
|
| 68 |
+
'description' => __( 'Extra information about a charge. This will appear on your customer’s credit card statement.', 'woocommerce-gateway-stripe' ),
|
| 69 |
+
'default' => '',
|
| 70 |
+
'desc_tip' => true,
|
| 71 |
+
),
|
| 72 |
'capture' => array(
|
| 73 |
'title' => __( 'Capture', 'woocommerce-gateway-stripe' ),
|
| 74 |
'label' => __( 'Capture charge immediately', 'woocommerce-gateway-stripe' ),
|
| 131 |
'default' => '',
|
| 132 |
'desc_tip' => true,
|
| 133 |
),
|
| 134 |
+
'request_payment_api' => array(
|
| 135 |
+
'title' => __( 'Payment Request API', 'woocommerce-gateway-stripe' ),
|
| 136 |
+
'label' => __( 'Enable Payment Request API', 'woocommerce-gateway-stripe' ),
|
| 137 |
+
'type' => 'checkbox',
|
| 138 |
+
'description' => __( 'If enabled, users will be able to pay using the Payment Request API if supported by the browser.', 'woocommerce-gateway-stripe' ),
|
| 139 |
+
'default' => 'no',
|
| 140 |
+
'desc_tip' => true,
|
| 141 |
+
),
|
| 142 |
+
'apple_pay' => array(
|
| 143 |
+
'title' => __( 'Apple Pay', 'woocommerce-gateway-stripe' ),
|
| 144 |
+
'label' => sprintf( __( 'Enable Apple Pay. %1$sBy using Apple Pay, you agree to %2$s and %3$s\'s terms of service.', 'woocommerce-gateway-stripe' ), '<br />', '<a href="https://stripe.com/apple-pay/legal" target="_blank">Stripe</a>', '<a href="https://developer.apple.com/apple-pay/acceptable-use-guidelines-for-websites/" target="_blank">Apple</a>' ),
|
| 145 |
+
'type' => 'checkbox',
|
| 146 |
+
'description' => __( 'If enabled, users will be able to pay with Apple Pay.', 'woocommerce-gateway-stripe' ),
|
| 147 |
+
'default' => 'yes',
|
| 148 |
+
'desc_tip' => true,
|
| 149 |
+
),
|
| 150 |
+
'apple_pay_button' => array(
|
| 151 |
+
'title' => __( 'Apple Pay Button Style', 'woocommerce-gateway-stripe' ),
|
| 152 |
+
'label' => __( 'Button Style', 'woocommerce-gateway-stripe' ),
|
| 153 |
+
'type' => 'select',
|
| 154 |
+
'description' => __( 'Select the button style you would like to show.', 'woocommerce-gateway-stripe' ),
|
| 155 |
+
'default' => 'black',
|
| 156 |
+
'desc_tip' => true,
|
| 157 |
+
'options' => array(
|
| 158 |
+
'black' => __( 'Black', 'woocommerce-gateway-stripe' ),
|
| 159 |
+
'white' => __( 'White', 'woocommerce-gateway-stripe' ),
|
| 160 |
+
),
|
| 161 |
+
),
|
| 162 |
+
'apple_pay_button_lang' => array(
|
| 163 |
+
'title' => __( 'Apple Pay Button Language', 'woocommerce-gateway-stripe' ),
|
| 164 |
+
'description' => __( 'Enter the 2 letter ISO code for the language you would like your Apple Pay Button to display in. Reference available ISO codes here <code>http://www.w3schools.com/tags/ref_language_codes.asp</code>', 'woocommerce-gateway-stripe' ),
|
| 165 |
+
'type' => 'text',
|
| 166 |
+
'default' => 'en',
|
| 167 |
+
'desc_tip' => false,
|
| 168 |
+
),
|
| 169 |
'saved_cards' => array(
|
| 170 |
'title' => __( 'Saved Cards', 'woocommerce-gateway-stripe' ),
|
| 171 |
'label' => __( 'Enable Payment via Saved Cards', 'woocommerce-gateway-stripe' ),
|
languages/index.html
DELETED
|
File without changes
|
languages/woocommerce-gateway-stripe.pot
CHANGED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
msgid ""
|
| 2 |
msgstr ""
|
| 3 |
"Project-Id-Version: WooCommerce Stripe Gateway\n"
|
| 4 |
-
"POT-Creation-Date:
|
| 5 |
-
"PO-Revision-Date:
|
| 6 |
"Last-Translator: \n"
|
| 7 |
"Language-Team: \n"
|
| 8 |
"Language: en_US\n"
|
|
@@ -19,52 +19,54 @@ msgstr ""
|
|
| 19 |
"X-Poedit-SearchPath-0: .\n"
|
| 20 |
"X-Poedit-SearchPathExcluded-0: *.js\n"
|
| 21 |
|
| 22 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 23 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 24 |
-
#: includes/class-wc-gateway-stripe.php:
|
|
|
|
| 25 |
#: includes/legacy/class-wc-gateway-stripe.php:446
|
|
|
|
| 26 |
msgid ""
|
| 27 |
-
"Sorry, the minimum allowed order total is
|
| 28 |
msgstr ""
|
| 29 |
|
| 30 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 31 |
msgid "Customer not found"
|
| 32 |
msgstr ""
|
| 33 |
|
| 34 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 35 |
msgid "Unable to store payment details. Please try again."
|
| 36 |
msgstr ""
|
| 37 |
|
| 38 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 39 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 40 |
#, php-format
|
| 41 |
msgid "Stripe Transaction Failed (%s)"
|
| 42 |
msgstr ""
|
| 43 |
|
| 44 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 45 |
-
#: includes/class-wc-gateway-stripe-addons.php:
|
| 46 |
#, php-format
|
| 47 |
-
msgid "Via %s card ending in %s"
|
| 48 |
msgstr ""
|
| 49 |
|
| 50 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 51 |
#: includes/legacy/class-wc-gateway-stripe.php:18
|
| 52 |
msgid "Stripe"
|
| 53 |
msgstr ""
|
| 54 |
|
| 55 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 56 |
#: includes/legacy/class-wc-gateway-stripe.php:19
|
| 57 |
msgid ""
|
| 58 |
"Stripe works by adding credit card fields on the checkout and then sending "
|
| 59 |
"the details to Stripe for verification."
|
| 60 |
msgstr ""
|
| 61 |
|
| 62 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 63 |
#: includes/legacy/class-wc-gateway-stripe.php:60
|
| 64 |
msgid "Continue to payment"
|
| 65 |
msgstr ""
|
| 66 |
|
| 67 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 68 |
#: includes/legacy/class-wc-gateway-stripe.php:64
|
| 69 |
#, php-format
|
| 70 |
msgid ""
|
|
@@ -73,137 +75,178 @@ msgid ""
|
|
| 73 |
"documentation \"<a href=\"%s\">Testing Stripe</a>\" for more card numbers."
|
| 74 |
msgstr ""
|
| 75 |
|
| 76 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 77 |
-
|
|
|
|
|
|
|
|
|
|
| 78 |
#, php-format
|
| 79 |
-
msgid ""
|
| 80 |
-
"Stripe is enabled, but the <a href=\"%s\">force SSL option</a> is disabled; "
|
| 81 |
-
"your checkout may not be secure! Please enable SSL and ensure your server "
|
| 82 |
-
"has a valid SSL certificate - Stripe will only work in test mode."
|
| 83 |
msgstr ""
|
| 84 |
|
| 85 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 86 |
-
msgid ""
|
| 87 |
-
"This is not a valid live key. Live keys start with \"sk_live_\" and "
|
| 88 |
-
"\"pk_live_\"."
|
| 89 |
msgstr ""
|
| 90 |
|
| 91 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 92 |
-
msgid ""
|
| 93 |
-
"This is not a valid test key. Test keys start with \"sk_test_\" and "
|
| 94 |
-
"\"pk_test_\"."
|
| 95 |
msgstr ""
|
| 96 |
|
| 97 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 98 |
-
msgid "
|
| 99 |
msgstr ""
|
| 100 |
|
| 101 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 102 |
-
#: includes/
|
|
|
|
|
|
|
| 103 |
#, php-format
|
| 104 |
-
msgid "%s"
|
| 105 |
msgstr ""
|
| 106 |
|
| 107 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 108 |
-
|
| 109 |
-
msgid "
|
|
|
|
|
|
|
| 110 |
msgstr ""
|
| 111 |
|
| 112 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 113 |
-
#: includes/legacy/class-wc-gateway-stripe.php:
|
| 114 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 115 |
msgstr ""
|
| 116 |
|
| 117 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 118 |
-
msgid "
|
| 119 |
msgstr ""
|
| 120 |
|
| 121 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 122 |
msgid "The card number is not a valid credit card number."
|
| 123 |
msgstr ""
|
| 124 |
|
| 125 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 126 |
msgid "The card's expiration month is invalid."
|
| 127 |
msgstr ""
|
| 128 |
|
| 129 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 130 |
msgid "The card's expiration year is invalid."
|
| 131 |
msgstr ""
|
| 132 |
|
| 133 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 134 |
msgid "The card's security code is invalid."
|
| 135 |
msgstr ""
|
| 136 |
|
| 137 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 138 |
msgid "The card number is incorrect."
|
| 139 |
msgstr ""
|
| 140 |
|
| 141 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 142 |
msgid "The card has expired."
|
| 143 |
msgstr ""
|
| 144 |
|
| 145 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 146 |
msgid "The card's security code is incorrect."
|
| 147 |
msgstr ""
|
| 148 |
|
| 149 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 150 |
msgid "The card's zip code failed validation."
|
| 151 |
msgstr ""
|
| 152 |
|
| 153 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 154 |
msgid "The card was declined."
|
| 155 |
msgstr ""
|
| 156 |
|
| 157 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 158 |
msgid "There is no card on a customer that is being charged."
|
| 159 |
msgstr ""
|
| 160 |
|
| 161 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 162 |
msgid "An error occurred while processing the card."
|
| 163 |
msgstr ""
|
| 164 |
|
| 165 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 166 |
msgid "Could not find payment information."
|
| 167 |
msgstr ""
|
| 168 |
|
| 169 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 170 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 171 |
#, php-format
|
| 172 |
-
msgid "%s - Order %s"
|
| 173 |
msgstr ""
|
| 174 |
|
| 175 |
-
#: includes/class-wc-gateway-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 176 |
msgid "Invalid payment method. Please input a new card number."
|
| 177 |
msgstr ""
|
| 178 |
|
| 179 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 180 |
#: includes/legacy/class-wc-gateway-stripe.php:434
|
| 181 |
msgid "Please enter your card details to make a payment."
|
| 182 |
msgstr ""
|
| 183 |
|
| 184 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 185 |
#: includes/legacy/class-wc-gateway-stripe.php:435
|
| 186 |
msgid ""
|
| 187 |
"Developers: Please make sure that you are including jQuery and there are no "
|
| 188 |
"JavaScript errors on the page."
|
| 189 |
msgstr ""
|
| 190 |
|
| 191 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 192 |
msgid "This card is no longer available and has been removed."
|
| 193 |
msgstr ""
|
| 194 |
|
| 195 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 196 |
-
#: includes/legacy/class-wc-gateway-stripe.php:481
|
| 197 |
-
#, php-format
|
| 198 |
-
msgid "Error: %s"
|
| 199 |
-
msgstr ""
|
| 200 |
-
|
| 201 |
-
#: includes/class-wc-gateway-stripe.php:634 woocommerce-gateway-stripe.php:345
|
| 202 |
#, php-format
|
| 203 |
msgid "Stripe charge complete (Charge ID: %s)"
|
| 204 |
msgstr ""
|
| 205 |
|
| 206 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 207 |
#: includes/legacy/class-wc-gateway-stripe.php:526
|
| 208 |
#, php-format
|
| 209 |
msgid ""
|
|
@@ -211,29 +254,100 @@ msgid ""
|
|
| 211 |
"cancel to remove the pre-authorization."
|
| 212 |
msgstr ""
|
| 213 |
|
| 214 |
-
#: includes/class-wc-gateway-stripe.php:
|
|
|
|
| 215 |
#: includes/legacy/class-wc-gateway-stripe.php:540
|
| 216 |
msgid "There was a problem adding the card."
|
| 217 |
msgstr ""
|
| 218 |
|
| 219 |
-
#: includes/class-wc-gateway-stripe.php:
|
| 220 |
-
#: includes/legacy/class-wc-gateway-stripe.php:590
|
| 221 |
#, php-format
|
| 222 |
-
msgid "Refunded %s - Refund ID: %s - Reason: %s"
|
| 223 |
msgstr ""
|
| 224 |
|
| 225 |
#: includes/class-wc-stripe-api.php:73
|
| 226 |
msgid "There was a problem connecting to the payment gateway."
|
| 227 |
msgstr ""
|
| 228 |
|
| 229 |
-
#: includes/class-wc-stripe-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 230 |
msgid "Could not create Stripe customer."
|
| 231 |
msgstr ""
|
| 232 |
|
| 233 |
-
#: includes/class-wc-stripe-customer.php:
|
| 234 |
msgid "Unable to add card"
|
| 235 |
msgstr ""
|
| 236 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 237 |
#: includes/legacy/class-wc-gateway-stripe-saved-cards.php:50
|
| 238 |
#: includes/legacy/class-wc-gateway-stripe-saved-cards.php:73
|
| 239 |
msgid "Unable to make default card, please try again"
|
|
@@ -284,6 +398,16 @@ msgstr ""
|
|
| 284 |
msgid "Use a new credit card"
|
| 285 |
msgstr ""
|
| 286 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 287 |
#: includes/legacy/templates/saved-cards.php:1
|
| 288 |
msgid "Saved cards"
|
| 289 |
msgstr ""
|
|
@@ -363,7 +487,7 @@ msgid "Place the payment gateway in test mode using test API keys."
|
|
| 363 |
msgstr ""
|
| 364 |
|
| 365 |
#: includes/settings-stripe.php:38
|
| 366 |
-
msgid "
|
| 367 |
msgstr ""
|
| 368 |
|
| 369 |
#: includes/settings-stripe.php:40 includes/settings-stripe.php:47
|
|
@@ -372,213 +496,478 @@ msgid "Get your API keys from your stripe account."
|
|
| 372 |
msgstr ""
|
| 373 |
|
| 374 |
#: includes/settings-stripe.php:45
|
| 375 |
-
msgid "
|
| 376 |
msgstr ""
|
| 377 |
|
| 378 |
#: includes/settings-stripe.php:52
|
| 379 |
-
msgid "
|
| 380 |
msgstr ""
|
| 381 |
|
| 382 |
#: includes/settings-stripe.php:59
|
| 383 |
-
msgid "
|
| 384 |
msgstr ""
|
| 385 |
|
| 386 |
#: includes/settings-stripe.php:66
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 387 |
msgid "Capture"
|
| 388 |
msgstr ""
|
| 389 |
|
| 390 |
-
#: includes/settings-stripe.php:
|
| 391 |
msgid "Capture charge immediately"
|
| 392 |
msgstr ""
|
| 393 |
|
| 394 |
-
#: includes/settings-stripe.php:
|
| 395 |
msgid ""
|
| 396 |
"Whether or not to immediately capture the charge. When unchecked, the charge "
|
| 397 |
"issues an authorization and will need to be captured later. Uncaptured "
|
| 398 |
"charges expire in 7 days."
|
| 399 |
msgstr ""
|
| 400 |
|
| 401 |
-
#: includes/settings-stripe.php:
|
| 402 |
msgid "Stripe Checkout"
|
| 403 |
msgstr ""
|
| 404 |
|
| 405 |
-
#: includes/settings-stripe.php:
|
| 406 |
msgid "Enable Stripe Checkout"
|
| 407 |
msgstr ""
|
| 408 |
|
| 409 |
-
#: includes/settings-stripe.php:
|
| 410 |
msgid ""
|
| 411 |
"If enabled, this option shows a \"pay\" button and modal credit card form on "
|
| 412 |
"the checkout, instead of credit card fields directly on the page."
|
| 413 |
msgstr ""
|
| 414 |
|
| 415 |
-
#: includes/settings-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 416 |
msgid "Stripe Checkout locale"
|
| 417 |
msgstr ""
|
| 418 |
|
| 419 |
-
#: includes/settings-stripe.php:
|
| 420 |
msgid ""
|
| 421 |
"Language to display in Stripe Checkout modal. Specify Auto to display "
|
| 422 |
"Checkout in the user's preferred language, if available. English will be "
|
| 423 |
"used by default."
|
| 424 |
msgstr ""
|
| 425 |
|
| 426 |
-
#: includes/settings-stripe.php:
|
| 427 |
msgid "Auto"
|
| 428 |
msgstr ""
|
| 429 |
|
| 430 |
-
#: includes/settings-stripe.php:
|
| 431 |
msgid "Simplified Chinese"
|
| 432 |
msgstr ""
|
| 433 |
|
| 434 |
-
#: includes/settings-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 435 |
msgid "Dutch"
|
| 436 |
msgstr ""
|
| 437 |
|
| 438 |
-
#: includes/settings-stripe.php:
|
| 439 |
msgid "English"
|
| 440 |
msgstr ""
|
| 441 |
|
| 442 |
-
#: includes/settings-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 443 |
msgid "French"
|
| 444 |
msgstr ""
|
| 445 |
|
| 446 |
-
#: includes/settings-stripe.php:
|
| 447 |
msgid "German"
|
| 448 |
msgstr ""
|
| 449 |
|
| 450 |
-
#: includes/settings-stripe.php:
|
| 451 |
msgid "Italian"
|
| 452 |
msgstr ""
|
| 453 |
|
| 454 |
-
#: includes/settings-stripe.php:
|
| 455 |
msgid "Japanese"
|
| 456 |
msgstr ""
|
| 457 |
|
| 458 |
-
#: includes/settings-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 459 |
msgid "Spanish"
|
| 460 |
msgstr ""
|
| 461 |
|
| 462 |
-
#: includes/settings-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 463 |
msgid "Bitcoin Currency"
|
| 464 |
msgstr ""
|
| 465 |
|
| 466 |
-
#: includes/settings-stripe.php:
|
| 467 |
msgid "Enable Bitcoin Currency"
|
| 468 |
msgstr ""
|
| 469 |
|
| 470 |
-
#: includes/settings-stripe.php:
|
| 471 |
msgid ""
|
| 472 |
"If enabled, an option to accept bitcoin will show on the checkout modal. "
|
| 473 |
"Note: Stripe Checkout needs to be enabled and store currency must be set to "
|
| 474 |
"USD."
|
| 475 |
msgstr ""
|
| 476 |
|
| 477 |
-
#: includes/settings-stripe.php:
|
| 478 |
msgid "Stripe Checkout Image"
|
| 479 |
msgstr ""
|
| 480 |
|
| 481 |
-
#: includes/settings-stripe.php:
|
| 482 |
msgid ""
|
| 483 |
"Optionally enter the URL to a 128x128px image of your brand or product. e.g. "
|
| 484 |
"<code>https://yoursite.com/wp-content/uploads/2013/09/yourimage.jpg</code>"
|
| 485 |
msgstr ""
|
| 486 |
|
| 487 |
-
#: includes/settings-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 488 |
msgid "Saved Cards"
|
| 489 |
msgstr ""
|
| 490 |
|
| 491 |
-
#: includes/settings-stripe.php:
|
| 492 |
msgid "Enable Payment via Saved Cards"
|
| 493 |
msgstr ""
|
| 494 |
|
| 495 |
-
#: includes/settings-stripe.php:
|
| 496 |
msgid ""
|
| 497 |
"If enabled, users will be able to pay with a saved card during checkout. "
|
| 498 |
"Card details are saved on Stripe servers, not on your store."
|
| 499 |
msgstr ""
|
| 500 |
|
| 501 |
-
#: includes/settings-stripe.php:
|
| 502 |
msgid "Logging"
|
| 503 |
msgstr ""
|
| 504 |
|
| 505 |
-
#: includes/settings-stripe.php:
|
| 506 |
msgid "Log debug messages"
|
| 507 |
msgstr ""
|
| 508 |
|
| 509 |
-
#: includes/settings-stripe.php:
|
| 510 |
msgid "Save debug messages to the WooCommerce System Status log."
|
| 511 |
msgstr ""
|
| 512 |
|
| 513 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 514 |
#, php-format
|
| 515 |
-
msgid ""
|
| 516 |
-
|
| 517 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 518 |
msgstr ""
|
| 519 |
|
| 520 |
-
#:
|
| 521 |
-
|
| 522 |
-
msgid ""
|
| 523 |
-
"The plugin could not be activated. The minimum PHP version required for this "
|
| 524 |
-
"plugin is %1$s. You are running %2$s."
|
| 525 |
msgstr ""
|
| 526 |
|
| 527 |
-
#:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 528 |
#, php-format
|
| 529 |
-
msgid ""
|
| 530 |
-
"
|
| 531 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 532 |
msgstr ""
|
| 533 |
|
| 534 |
-
|
| 535 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 536 |
msgstr ""
|
| 537 |
|
| 538 |
-
#: woocommerce-gateway-stripe.php:
|
| 539 |
#, php-format
|
| 540 |
msgid ""
|
| 541 |
-
"
|
| 542 |
-
"
|
| 543 |
msgstr ""
|
| 544 |
|
| 545 |
-
#: woocommerce-gateway-stripe.php:
|
| 546 |
#, php-format
|
| 547 |
msgid ""
|
| 548 |
-
"
|
| 549 |
-
"
|
| 550 |
msgstr ""
|
| 551 |
|
| 552 |
-
#: woocommerce-gateway-stripe.php:
|
| 553 |
-
msgid "
|
| 554 |
msgstr ""
|
| 555 |
|
| 556 |
-
#: woocommerce-gateway-stripe.php:
|
|
|
|
| 557 |
msgid ""
|
| 558 |
-
"
|
|
|
|
| 559 |
msgstr ""
|
| 560 |
|
| 561 |
-
#: woocommerce-gateway-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
| 562 |
msgid "Settings"
|
| 563 |
msgstr ""
|
| 564 |
|
| 565 |
-
#: woocommerce-gateway-stripe.php:
|
| 566 |
msgid "Docs"
|
| 567 |
msgstr ""
|
| 568 |
|
| 569 |
-
#: woocommerce-gateway-stripe.php:
|
| 570 |
msgid "Support"
|
| 571 |
msgstr ""
|
| 572 |
|
| 573 |
-
#: woocommerce-gateway-stripe.php:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 574 |
msgid "Unable to capture charge!"
|
| 575 |
msgstr ""
|
| 576 |
|
| 577 |
-
#: woocommerce-gateway-stripe.php:
|
| 578 |
msgid "Unable to refund charge!"
|
| 579 |
msgstr ""
|
| 580 |
|
| 581 |
-
#: woocommerce-gateway-stripe.php:
|
| 582 |
#, php-format
|
| 583 |
msgid "Stripe charge refunded (Charge ID: %s)"
|
| 584 |
msgstr ""
|
| 1 |
msgid ""
|
| 2 |
msgstr ""
|
| 3 |
"Project-Id-Version: WooCommerce Stripe Gateway\n"
|
| 4 |
+
"POT-Creation-Date: 2017-03-13 07:42-0800\n"
|
| 5 |
+
"PO-Revision-Date: 2017-03-13 07:42-0800\n"
|
| 6 |
"Last-Translator: \n"
|
| 7 |
"Language-Team: \n"
|
| 8 |
"Language: en_US\n"
|
| 19 |
"X-Poedit-SearchPath-0: .\n"
|
| 20 |
"X-Poedit-SearchPathExcluded-0: *.js\n"
|
| 21 |
|
| 22 |
+
#: includes/class-wc-gateway-stripe-addons.php:106
|
| 23 |
+
#: includes/class-wc-gateway-stripe-addons.php:153
|
| 24 |
+
#: includes/class-wc-gateway-stripe.php:737
|
| 25 |
+
#: includes/class-wc-stripe-apple-pay.php:556
|
| 26 |
#: includes/legacy/class-wc-gateway-stripe.php:446
|
| 27 |
+
#, php-format
|
| 28 |
msgid ""
|
| 29 |
+
"Sorry, the minimum allowed order total is %1$s to use this payment method."
|
| 30 |
msgstr ""
|
| 31 |
|
| 32 |
+
#: includes/class-wc-gateway-stripe-addons.php:119
|
| 33 |
msgid "Customer not found"
|
| 34 |
msgstr ""
|
| 35 |
|
| 36 |
+
#: includes/class-wc-gateway-stripe-addons.php:160
|
| 37 |
msgid "Unable to store payment details. Please try again."
|
| 38 |
msgstr ""
|
| 39 |
|
| 40 |
+
#: includes/class-wc-gateway-stripe-addons.php:217
|
| 41 |
+
#: includes/class-wc-gateway-stripe-addons.php:260
|
| 42 |
#, php-format
|
| 43 |
msgid "Stripe Transaction Failed (%s)"
|
| 44 |
msgstr ""
|
| 45 |
|
| 46 |
+
#: includes/class-wc-gateway-stripe-addons.php:384
|
| 47 |
+
#: includes/class-wc-gateway-stripe-addons.php:389
|
| 48 |
#, php-format
|
| 49 |
+
msgid "Via %1$s card ending in %2$s"
|
| 50 |
msgstr ""
|
| 51 |
|
| 52 |
+
#: includes/class-wc-gateway-stripe.php:123
|
| 53 |
#: includes/legacy/class-wc-gateway-stripe.php:18
|
| 54 |
msgid "Stripe"
|
| 55 |
msgstr ""
|
| 56 |
|
| 57 |
+
#: includes/class-wc-gateway-stripe.php:124
|
| 58 |
#: includes/legacy/class-wc-gateway-stripe.php:19
|
| 59 |
msgid ""
|
| 60 |
"Stripe works by adding credit card fields on the checkout and then sending "
|
| 61 |
"the details to Stripe for verification."
|
| 62 |
msgstr ""
|
| 63 |
|
| 64 |
+
#: includes/class-wc-gateway-stripe.php:172
|
| 65 |
#: includes/legacy/class-wc-gateway-stripe.php:60
|
| 66 |
msgid "Continue to payment"
|
| 67 |
msgstr ""
|
| 68 |
|
| 69 |
+
#: includes/class-wc-gateway-stripe.php:176
|
| 70 |
#: includes/legacy/class-wc-gateway-stripe.php:64
|
| 71 |
#, php-format
|
| 72 |
msgid ""
|
| 75 |
"documentation \"<a href=\"%s\">Testing Stripe</a>\" for more card numbers."
|
| 76 |
msgstr ""
|
| 77 |
|
| 78 |
+
#: includes/class-wc-gateway-stripe.php:282
|
| 79 |
+
msgid "Unable to verify domain - missing secret key."
|
| 80 |
+
msgstr ""
|
| 81 |
+
|
| 82 |
+
#: includes/class-wc-gateway-stripe.php:302
|
| 83 |
#, php-format
|
| 84 |
+
msgid "Unable to verify domain - %s"
|
|
|
|
|
|
|
|
|
|
| 85 |
msgstr ""
|
| 86 |
|
| 87 |
+
#: includes/class-wc-gateway-stripe.php:327
|
| 88 |
+
msgid "Unable to create domain association folder to domain root."
|
|
|
|
|
|
|
| 89 |
msgstr ""
|
| 90 |
|
| 91 |
+
#: includes/class-wc-gateway-stripe.php:332
|
| 92 |
+
msgid "Unable to copy domain association file to domain root."
|
|
|
|
|
|
|
| 93 |
msgstr ""
|
| 94 |
|
| 95 |
+
#: includes/class-wc-gateway-stripe.php:347
|
| 96 |
+
msgid "Your domain has been verified with Apple Pay!"
|
| 97 |
msgstr ""
|
| 98 |
|
| 99 |
+
#: includes/class-wc-gateway-stripe.php:354
|
| 100 |
+
#: includes/class-wc-gateway-stripe.php:787
|
| 101 |
+
#: includes/class-wc-stripe-apple-pay.php:590
|
| 102 |
+
#: includes/legacy/class-wc-gateway-stripe.php:481
|
| 103 |
#, php-format
|
| 104 |
+
msgid "Error: %s"
|
| 105 |
msgstr ""
|
| 106 |
|
| 107 |
+
#: includes/class-wc-gateway-stripe.php:372
|
| 108 |
+
#, php-format
|
| 109 |
+
msgid ""
|
| 110 |
+
"Apple Pay domain verification failed. Please check the %1$slog%2$s to see "
|
| 111 |
+
"the issue."
|
| 112 |
msgstr ""
|
| 113 |
|
| 114 |
+
#: includes/class-wc-gateway-stripe.php:377
|
| 115 |
+
#: includes/legacy/class-wc-gateway-stripe.php:165
|
| 116 |
+
#, php-format
|
| 117 |
+
msgid ""
|
| 118 |
+
"Stripe is enabled, but the <a href=\"%s\">force SSL option</a> is disabled; "
|
| 119 |
+
"your checkout may not be secure! Please enable SSL and ensure your server "
|
| 120 |
+
"has a valid SSL certificate - Stripe will only work in test mode."
|
| 121 |
msgstr ""
|
| 122 |
|
| 123 |
+
#: includes/class-wc-gateway-stripe.php:426
|
| 124 |
+
msgid "Add Card"
|
| 125 |
msgstr ""
|
| 126 |
|
| 127 |
+
#: includes/class-wc-gateway-stripe.php:473
|
| 128 |
msgid "The card number is not a valid credit card number."
|
| 129 |
msgstr ""
|
| 130 |
|
| 131 |
+
#: includes/class-wc-gateway-stripe.php:474
|
| 132 |
msgid "The card's expiration month is invalid."
|
| 133 |
msgstr ""
|
| 134 |
|
| 135 |
+
#: includes/class-wc-gateway-stripe.php:475
|
| 136 |
msgid "The card's expiration year is invalid."
|
| 137 |
msgstr ""
|
| 138 |
|
| 139 |
+
#: includes/class-wc-gateway-stripe.php:476
|
| 140 |
msgid "The card's security code is invalid."
|
| 141 |
msgstr ""
|
| 142 |
|
| 143 |
+
#: includes/class-wc-gateway-stripe.php:477
|
| 144 |
msgid "The card number is incorrect."
|
| 145 |
msgstr ""
|
| 146 |
|
| 147 |
+
#: includes/class-wc-gateway-stripe.php:478
|
| 148 |
msgid "The card has expired."
|
| 149 |
msgstr ""
|
| 150 |
|
| 151 |
+
#: includes/class-wc-gateway-stripe.php:479
|
| 152 |
msgid "The card's security code is incorrect."
|
| 153 |
msgstr ""
|
| 154 |
|
| 155 |
+
#: includes/class-wc-gateway-stripe.php:480
|
| 156 |
msgid "The card's zip code failed validation."
|
| 157 |
msgstr ""
|
| 158 |
|
| 159 |
+
#: includes/class-wc-gateway-stripe.php:481
|
| 160 |
msgid "The card was declined."
|
| 161 |
msgstr ""
|
| 162 |
|
| 163 |
+
#: includes/class-wc-gateway-stripe.php:482
|
| 164 |
msgid "There is no card on a customer that is being charged."
|
| 165 |
msgstr ""
|
| 166 |
|
| 167 |
+
#: includes/class-wc-gateway-stripe.php:483
|
| 168 |
msgid "An error occurred while processing the card."
|
| 169 |
msgstr ""
|
| 170 |
|
| 171 |
+
#: includes/class-wc-gateway-stripe.php:484
|
| 172 |
msgid "Could not find payment information."
|
| 173 |
msgstr ""
|
| 174 |
|
| 175 |
+
#: includes/class-wc-gateway-stripe.php:505
|
| 176 |
+
msgid ""
|
| 177 |
+
"This is not a valid live key. Live keys start with \"sk_live_\" and "
|
| 178 |
+
"\"pk_live_\"."
|
| 179 |
+
msgstr ""
|
| 180 |
+
|
| 181 |
+
#: includes/class-wc-gateway-stripe.php:506
|
| 182 |
+
msgid ""
|
| 183 |
+
"This is not a valid test key. Test keys start with \"sk_test_\" and "
|
| 184 |
+
"\"pk_test_\"."
|
| 185 |
+
msgstr ""
|
| 186 |
+
|
| 187 |
+
#: includes/class-wc-gateway-stripe.php:507
|
| 188 |
+
msgid "Re-verify Domain"
|
| 189 |
+
msgstr ""
|
| 190 |
+
|
| 191 |
+
#: includes/class-wc-gateway-stripe.php:508
|
| 192 |
+
msgid "Missing Secret Key. Please set the secret key field above and re-try."
|
| 193 |
+
msgstr ""
|
| 194 |
+
|
| 195 |
+
#: includes/class-wc-gateway-stripe.php:543
|
| 196 |
+
#: includes/legacy/class-wc-gateway-stripe.php:296
|
| 197 |
+
msgid "Please accept the terms and conditions first"
|
| 198 |
+
msgstr ""
|
| 199 |
+
|
| 200 |
+
#: includes/class-wc-gateway-stripe.php:544
|
| 201 |
+
#: includes/legacy/class-wc-gateway-stripe.php:297
|
| 202 |
+
msgid "Please fill in required checkout fields first"
|
| 203 |
+
msgstr ""
|
| 204 |
+
|
| 205 |
+
#: includes/class-wc-gateway-stripe.php:562
|
| 206 |
+
#: includes/class-wc-stripe-payment-request.php:95
|
| 207 |
+
msgid "Sorry, we're not accepting prepaid cards at this time."
|
| 208 |
+
msgstr ""
|
| 209 |
+
|
| 210 |
+
#: includes/class-wc-gateway-stripe.php:582
|
| 211 |
+
#: includes/class-wc-stripe-apple-pay.php:610
|
| 212 |
#, php-format
|
| 213 |
+
msgid "%1$s - Order %2$s"
|
| 214 |
msgstr ""
|
| 215 |
|
| 216 |
+
#: includes/class-wc-gateway-stripe.php:596
|
| 217 |
+
msgid "Customer Name"
|
| 218 |
+
msgstr ""
|
| 219 |
+
|
| 220 |
+
#: includes/class-wc-gateway-stripe.php:597
|
| 221 |
+
msgid "Customer Email"
|
| 222 |
+
msgstr ""
|
| 223 |
+
|
| 224 |
+
#: includes/class-wc-gateway-stripe.php:660
|
| 225 |
msgid "Invalid payment method. Please input a new card number."
|
| 226 |
msgstr ""
|
| 227 |
|
| 228 |
+
#: includes/class-wc-gateway-stripe.php:725
|
| 229 |
#: includes/legacy/class-wc-gateway-stripe.php:434
|
| 230 |
msgid "Please enter your card details to make a payment."
|
| 231 |
msgstr ""
|
| 232 |
|
| 233 |
+
#: includes/class-wc-gateway-stripe.php:726
|
| 234 |
#: includes/legacy/class-wc-gateway-stripe.php:435
|
| 235 |
msgid ""
|
| 236 |
"Developers: Please make sure that you are including jQuery and there are no "
|
| 237 |
"JavaScript errors on the page."
|
| 238 |
msgstr ""
|
| 239 |
|
| 240 |
+
#: includes/class-wc-gateway-stripe.php:754
|
| 241 |
msgid "This card is no longer available and has been removed."
|
| 242 |
msgstr ""
|
| 243 |
|
| 244 |
+
#: includes/class-wc-gateway-stripe.php:845 woocommerce-gateway-stripe.php:470
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 245 |
#, php-format
|
| 246 |
msgid "Stripe charge complete (Charge ID: %s)"
|
| 247 |
msgstr ""
|
| 248 |
|
| 249 |
+
#: includes/class-wc-gateway-stripe.php:856
|
| 250 |
#: includes/legacy/class-wc-gateway-stripe.php:526
|
| 251 |
#, php-format
|
| 252 |
msgid ""
|
| 254 |
"cancel to remove the pre-authorization."
|
| 255 |
msgstr ""
|
| 256 |
|
| 257 |
+
#: includes/class-wc-gateway-stripe.php:870
|
| 258 |
+
#: includes/class-wc-gateway-stripe.php:879
|
| 259 |
#: includes/legacy/class-wc-gateway-stripe.php:540
|
| 260 |
msgid "There was a problem adding the card."
|
| 261 |
msgstr ""
|
| 262 |
|
| 263 |
+
#: includes/class-wc-gateway-stripe.php:931
|
|
|
|
| 264 |
#, php-format
|
| 265 |
+
msgid "Refunded %1$s - Refund ID: %2$s - Reason: %3$s"
|
| 266 |
msgstr ""
|
| 267 |
|
| 268 |
#: includes/class-wc-stripe-api.php:73
|
| 269 |
msgid "There was a problem connecting to the payment gateway."
|
| 270 |
msgstr ""
|
| 271 |
|
| 272 |
+
#: includes/class-wc-stripe-apple-pay.php:277
|
| 273 |
+
msgid "Or"
|
| 274 |
+
msgstr ""
|
| 275 |
+
|
| 276 |
+
#: includes/class-wc-stripe-apple-pay.php:304
|
| 277 |
+
#: includes/class-wc-stripe-apple-pay.php:353
|
| 278 |
+
#: includes/class-wc-stripe-apple-pay.php:431
|
| 279 |
+
#: includes/class-wc-stripe-apple-pay.php:494
|
| 280 |
+
#: includes/class-wc-stripe-apple-pay.php:542
|
| 281 |
+
msgid "Cheatin’ huh?"
|
| 282 |
+
msgstr ""
|
| 283 |
+
|
| 284 |
+
#: includes/class-wc-stripe-apple-pay.php:375
|
| 285 |
+
msgid "Please enter a valid postcode/ZIP."
|
| 286 |
+
msgstr ""
|
| 287 |
+
|
| 288 |
+
#: includes/class-wc-stripe-apple-pay.php:452
|
| 289 |
+
#: includes/class-wc-stripe-apple-pay.php:475
|
| 290 |
+
msgid "Unable to find shipping method for address."
|
| 291 |
+
msgstr ""
|
| 292 |
+
|
| 293 |
+
#: includes/class-wc-stripe-apple-pay.php:522
|
| 294 |
+
#: includes/class-wc-stripe-apple-pay.php:707
|
| 295 |
+
#: includes/class-wc-stripe-payment-request.php:348
|
| 296 |
+
msgid "Tax"
|
| 297 |
+
msgstr ""
|
| 298 |
+
|
| 299 |
+
#: includes/class-wc-stripe-apple-pay.php:580
|
| 300 |
+
msgid "Apple Pay (Stripe)"
|
| 301 |
+
msgstr ""
|
| 302 |
+
|
| 303 |
+
#: includes/class-wc-stripe-apple-pay.php:693
|
| 304 |
+
msgid "Sub-Total"
|
| 305 |
+
msgstr ""
|
| 306 |
+
|
| 307 |
+
#: includes/class-wc-stripe-apple-pay.php:715
|
| 308 |
+
msgid "Shipping"
|
| 309 |
+
msgstr ""
|
| 310 |
+
|
| 311 |
+
#: includes/class-wc-stripe-apple-pay.php:723
|
| 312 |
+
msgid "Discount"
|
| 313 |
+
msgstr ""
|
| 314 |
+
|
| 315 |
+
#: includes/class-wc-stripe-apple-pay.php:741
|
| 316 |
+
#: includes/class-wc-stripe-apple-pay.php:748
|
| 317 |
+
#: includes/class-wc-stripe-apple-pay.php:750
|
| 318 |
+
#: includes/class-wc-stripe-apple-pay.php:773
|
| 319 |
+
#: includes/class-wc-stripe-apple-pay.php:785
|
| 320 |
+
#: includes/class-wc-stripe-apple-pay.php:795
|
| 321 |
+
#: includes/class-wc-stripe-apple-pay.php:802
|
| 322 |
+
#, php-format
|
| 323 |
+
msgid "Error %d: Unable to create order. Please try again."
|
| 324 |
+
msgstr ""
|
| 325 |
+
|
| 326 |
+
#: includes/class-wc-stripe-customer.php:150
|
| 327 |
msgid "Could not create Stripe customer."
|
| 328 |
msgstr ""
|
| 329 |
|
| 330 |
+
#: includes/class-wc-stripe-customer.php:191
|
| 331 |
msgid "Unable to add card"
|
| 332 |
msgstr ""
|
| 333 |
|
| 334 |
+
#. translators: Do not translate the [option] placeholder
|
| 335 |
+
#: includes/class-wc-stripe-payment-request.php:97
|
| 336 |
+
msgid "Unknown shipping option \"[option]\"."
|
| 337 |
+
msgstr ""
|
| 338 |
+
|
| 339 |
+
#: includes/class-wc-stripe-payment-request.php:122
|
| 340 |
+
msgid "Total"
|
| 341 |
+
msgstr ""
|
| 342 |
+
|
| 343 |
+
#: includes/class-wc-stripe-payment-request.php:286
|
| 344 |
+
msgid "Empty cart"
|
| 345 |
+
msgstr ""
|
| 346 |
+
|
| 347 |
+
#: includes/class-wc-stripe-payment-request.php:308
|
| 348 |
+
msgid "Subtotal"
|
| 349 |
+
msgstr ""
|
| 350 |
+
|
| 351 |
#: includes/legacy/class-wc-gateway-stripe-saved-cards.php:50
|
| 352 |
#: includes/legacy/class-wc-gateway-stripe-saved-cards.php:73
|
| 353 |
msgid "Unable to make default card, please try again"
|
| 398 |
msgid "Use a new credit card"
|
| 399 |
msgstr ""
|
| 400 |
|
| 401 |
+
#: includes/legacy/class-wc-gateway-stripe.php:331
|
| 402 |
+
#, php-format
|
| 403 |
+
msgid "%s - Order %s"
|
| 404 |
+
msgstr ""
|
| 405 |
+
|
| 406 |
+
#: includes/legacy/class-wc-gateway-stripe.php:590
|
| 407 |
+
#, php-format
|
| 408 |
+
msgid "Refunded %s - Refund ID: %s - Reason: %s"
|
| 409 |
+
msgstr ""
|
| 410 |
+
|
| 411 |
#: includes/legacy/templates/saved-cards.php:1
|
| 412 |
msgid "Saved cards"
|
| 413 |
msgstr ""
|
| 487 |
msgstr ""
|
| 488 |
|
| 489 |
#: includes/settings-stripe.php:38
|
| 490 |
+
msgid "Test Secret Key"
|
| 491 |
msgstr ""
|
| 492 |
|
| 493 |
#: includes/settings-stripe.php:40 includes/settings-stripe.php:47
|
| 496 |
msgstr ""
|
| 497 |
|
| 498 |
#: includes/settings-stripe.php:45
|
| 499 |
+
msgid "Test Publishable Key"
|
| 500 |
msgstr ""
|
| 501 |
|
| 502 |
#: includes/settings-stripe.php:52
|
| 503 |
+
msgid "Live Secret Key"
|
| 504 |
msgstr ""
|
| 505 |
|
| 506 |
#: includes/settings-stripe.php:59
|
| 507 |
+
msgid "Live Publishable Key"
|
| 508 |
msgstr ""
|
| 509 |
|
| 510 |
#: includes/settings-stripe.php:66
|
| 511 |
+
msgid "Statement Descriptor"
|
| 512 |
+
msgstr ""
|
| 513 |
+
|
| 514 |
+
#: includes/settings-stripe.php:68
|
| 515 |
+
msgid ""
|
| 516 |
+
"Extra information about a charge. This will appear on your customer’s credit "
|
| 517 |
+
"card statement."
|
| 518 |
+
msgstr ""
|
| 519 |
+
|
| 520 |
+
#: includes/settings-stripe.php:73
|
| 521 |
msgid "Capture"
|
| 522 |
msgstr ""
|
| 523 |
|
| 524 |
+
#: includes/settings-stripe.php:74
|
| 525 |
msgid "Capture charge immediately"
|
| 526 |
msgstr ""
|
| 527 |
|
| 528 |
+
#: includes/settings-stripe.php:76
|
| 529 |
msgid ""
|
| 530 |
"Whether or not to immediately capture the charge. When unchecked, the charge "
|
| 531 |
"issues an authorization and will need to be captured later. Uncaptured "
|
| 532 |
"charges expire in 7 days."
|
| 533 |
msgstr ""
|
| 534 |
|
| 535 |
+
#: includes/settings-stripe.php:81
|
| 536 |
msgid "Stripe Checkout"
|
| 537 |
msgstr ""
|
| 538 |
|
| 539 |
+
#: includes/settings-stripe.php:82
|
| 540 |
msgid "Enable Stripe Checkout"
|
| 541 |
msgstr ""
|
| 542 |
|
| 543 |
+
#: includes/settings-stripe.php:84
|
| 544 |
msgid ""
|
| 545 |
"If enabled, this option shows a \"pay\" button and modal credit card form on "
|
| 546 |
"the checkout, instead of credit card fields directly on the page."
|
| 547 |
msgstr ""
|
| 548 |
|
| 549 |
+
#: includes/settings-stripe.php:89
|
| 550 |
+
msgid "Allow Remember Me"
|
| 551 |
+
msgstr ""
|
| 552 |
+
|
| 553 |
+
#: includes/settings-stripe.php:90
|
| 554 |
+
msgid "Enable Remember Me"
|
| 555 |
+
msgstr ""
|
| 556 |
+
|
| 557 |
+
#: includes/settings-stripe.php:92
|
| 558 |
+
msgid ""
|
| 559 |
+
"If enabled, this option shows a \"Remember Me\" checkbox which when checked "
|
| 560 |
+
"by the customer will persist their details."
|
| 561 |
+
msgstr ""
|
| 562 |
+
|
| 563 |
+
#: includes/settings-stripe.php:97
|
| 564 |
msgid "Stripe Checkout locale"
|
| 565 |
msgstr ""
|
| 566 |
|
| 567 |
+
#: includes/settings-stripe.php:100
|
| 568 |
msgid ""
|
| 569 |
"Language to display in Stripe Checkout modal. Specify Auto to display "
|
| 570 |
"Checkout in the user's preferred language, if available. English will be "
|
| 571 |
"used by default."
|
| 572 |
msgstr ""
|
| 573 |
|
| 574 |
+
#: includes/settings-stripe.php:104
|
| 575 |
msgid "Auto"
|
| 576 |
msgstr ""
|
| 577 |
|
| 578 |
+
#: includes/settings-stripe.php:105
|
| 579 |
msgid "Simplified Chinese"
|
| 580 |
msgstr ""
|
| 581 |
|
| 582 |
+
#: includes/settings-stripe.php:106
|
| 583 |
+
msgid "Danish"
|
| 584 |
+
msgstr ""
|
| 585 |
+
|
| 586 |
+
#: includes/settings-stripe.php:107
|
| 587 |
msgid "Dutch"
|
| 588 |
msgstr ""
|
| 589 |
|
| 590 |
+
#: includes/settings-stripe.php:108
|
| 591 |
msgid "English"
|
| 592 |
msgstr ""
|
| 593 |
|
| 594 |
+
#: includes/settings-stripe.php:109
|
| 595 |
+
msgid "Finnish"
|
| 596 |
+
msgstr ""
|
| 597 |
+
|
| 598 |
+
#: includes/settings-stripe.php:110
|
| 599 |
msgid "French"
|
| 600 |
msgstr ""
|
| 601 |
|
| 602 |
+
#: includes/settings-stripe.php:111
|
| 603 |
msgid "German"
|
| 604 |
msgstr ""
|
| 605 |
|
| 606 |
+
#: includes/settings-stripe.php:112
|
| 607 |
msgid "Italian"
|
| 608 |
msgstr ""
|
| 609 |
|
| 610 |
+
#: includes/settings-stripe.php:113
|
| 611 |
msgid "Japanese"
|
| 612 |
msgstr ""
|
| 613 |
|
| 614 |
+
#: includes/settings-stripe.php:114
|
| 615 |
+
msgid "Norwegian"
|
| 616 |
+
msgstr ""
|
| 617 |
+
|
| 618 |
+
#: includes/settings-stripe.php:115
|
| 619 |
msgid "Spanish"
|
| 620 |
msgstr ""
|
| 621 |
|
| 622 |
+
#: includes/settings-stripe.php:116
|
| 623 |
+
msgid "Swedish"
|
| 624 |
+
msgstr ""
|
| 625 |
+
|
| 626 |
+
#: includes/settings-stripe.php:120
|
| 627 |
msgid "Bitcoin Currency"
|
| 628 |
msgstr ""
|
| 629 |
|
| 630 |
+
#: includes/settings-stripe.php:121
|
| 631 |
msgid "Enable Bitcoin Currency"
|
| 632 |
msgstr ""
|
| 633 |
|
| 634 |
+
#: includes/settings-stripe.php:123
|
| 635 |
msgid ""
|
| 636 |
"If enabled, an option to accept bitcoin will show on the checkout modal. "
|
| 637 |
"Note: Stripe Checkout needs to be enabled and store currency must be set to "
|
| 638 |
"USD."
|
| 639 |
msgstr ""
|
| 640 |
|
| 641 |
+
#: includes/settings-stripe.php:128
|
| 642 |
msgid "Stripe Checkout Image"
|
| 643 |
msgstr ""
|
| 644 |
|
| 645 |
+
#: includes/settings-stripe.php:129
|
| 646 |
msgid ""
|
| 647 |
"Optionally enter the URL to a 128x128px image of your brand or product. e.g. "
|
| 648 |
"<code>https://yoursite.com/wp-content/uploads/2013/09/yourimage.jpg</code>"
|
| 649 |
msgstr ""
|
| 650 |
|
| 651 |
+
#: includes/settings-stripe.php:135
|
| 652 |
+
msgid "Payment Request API"
|
| 653 |
+
msgstr ""
|
| 654 |
+
|
| 655 |
+
#: includes/settings-stripe.php:136
|
| 656 |
+
msgid "Enable Payment Request API"
|
| 657 |
+
msgstr ""
|
| 658 |
+
|
| 659 |
+
#: includes/settings-stripe.php:138
|
| 660 |
+
msgid ""
|
| 661 |
+
"If enabled, users will be able to pay using the Payment Request API if "
|
| 662 |
+
"supported by the browser."
|
| 663 |
+
msgstr ""
|
| 664 |
+
|
| 665 |
+
#: includes/settings-stripe.php:143
|
| 666 |
+
msgid "Apple Pay"
|
| 667 |
+
msgstr ""
|
| 668 |
+
|
| 669 |
+
#: includes/settings-stripe.php:144
|
| 670 |
+
#, php-format
|
| 671 |
+
msgid ""
|
| 672 |
+
"Enable Apple Pay. %1$sBy using Apple Pay, you agree to %2$s and %3$s's terms "
|
| 673 |
+
"of service."
|
| 674 |
+
msgstr ""
|
| 675 |
+
|
| 676 |
+
#: includes/settings-stripe.php:146
|
| 677 |
+
msgid "If enabled, users will be able to pay with Apple Pay."
|
| 678 |
+
msgstr ""
|
| 679 |
+
|
| 680 |
+
#: includes/settings-stripe.php:151
|
| 681 |
+
msgid "Apple Pay Button Style"
|
| 682 |
+
msgstr ""
|
| 683 |
+
|
| 684 |
+
#: includes/settings-stripe.php:152
|
| 685 |
+
msgid "Button Style"
|
| 686 |
+
msgstr ""
|
| 687 |
+
|
| 688 |
+
#: includes/settings-stripe.php:154
|
| 689 |
+
msgid "Select the button style you would like to show."
|
| 690 |
+
msgstr ""
|
| 691 |
+
|
| 692 |
+
#: includes/settings-stripe.php:158
|
| 693 |
+
msgid "Black"
|
| 694 |
+
msgstr ""
|
| 695 |
+
|
| 696 |
+
#: includes/settings-stripe.php:159
|
| 697 |
+
msgid "White"
|
| 698 |
+
msgstr ""
|
| 699 |
+
|
| 700 |
+
#: includes/settings-stripe.php:163
|
| 701 |
+
msgid "Apple Pay Button Language"
|
| 702 |
+
msgstr ""
|
| 703 |
+
|
| 704 |
+
#: includes/settings-stripe.php:164
|
| 705 |
+
msgid ""
|
| 706 |
+
"Enter the 2 letter ISO code for the language you would like your Apple Pay "
|
| 707 |
+
"Button to display in. Reference available ISO codes here <code>http://www."
|
| 708 |
+
"w3schools.com/tags/ref_language_codes.asp</code>"
|
| 709 |
+
msgstr ""
|
| 710 |
+
|
| 711 |
+
#: includes/settings-stripe.php:170
|
| 712 |
msgid "Saved Cards"
|
| 713 |
msgstr ""
|
| 714 |
|
| 715 |
+
#: includes/settings-stripe.php:171
|
| 716 |
msgid "Enable Payment via Saved Cards"
|
| 717 |
msgstr ""
|
| 718 |
|
| 719 |
+
#: includes/settings-stripe.php:173
|
| 720 |
msgid ""
|
| 721 |
"If enabled, users will be able to pay with a saved card during checkout. "
|
| 722 |
"Card details are saved on Stripe servers, not on your store."
|
| 723 |
msgstr ""
|
| 724 |
|
| 725 |
+
#: includes/settings-stripe.php:178
|
| 726 |
msgid "Logging"
|
| 727 |
msgstr ""
|
| 728 |
|
| 729 |
+
#: includes/settings-stripe.php:179
|
| 730 |
msgid "Log debug messages"
|
| 731 |
msgstr ""
|
| 732 |
|
| 733 |
+
#: includes/settings-stripe.php:181
|
| 734 |
msgid "Save debug messages to the WooCommerce System Status log."
|
| 735 |
msgstr ""
|
| 736 |
|
| 737 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:3
|
| 738 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:5
|
| 739 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:9
|
| 740 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:10
|
| 741 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:14
|
| 742 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:15
|
| 743 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:4
|
| 744 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:6
|
| 745 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:10
|
| 746 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:11
|
| 747 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:15
|
| 748 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:16
|
| 749 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:3
|
| 750 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:5
|
| 751 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:9
|
| 752 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:10
|
| 753 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:14
|
| 754 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:15
|
| 755 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:3
|
| 756 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:5
|
| 757 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:9
|
| 758 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:10
|
| 759 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:14
|
| 760 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:15
|
| 761 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:3
|
| 762 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:5
|
| 763 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:9
|
| 764 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:10
|
| 765 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:14
|
| 766 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:15
|
| 767 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:3
|
| 768 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:5
|
| 769 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:9
|
| 770 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:10
|
| 771 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:14
|
| 772 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:15
|
| 773 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:4
|
| 774 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:6
|
| 775 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:10
|
| 776 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:11
|
| 777 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:15
|
| 778 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:16
|
| 779 |
+
msgid "Hello World"
|
| 780 |
+
msgstr ""
|
| 781 |
+
|
| 782 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:4
|
| 783 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:6
|
| 784 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:11
|
| 785 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:16
|
| 786 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:5
|
| 787 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:7
|
| 788 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:12
|
| 789 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:17
|
| 790 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:4
|
| 791 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:6
|
| 792 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:11
|
| 793 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:16
|
| 794 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:4
|
| 795 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:6
|
| 796 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:11
|
| 797 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:16
|
| 798 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:4
|
| 799 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:6
|
| 800 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:11
|
| 801 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:16
|
| 802 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:4
|
| 803 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:6
|
| 804 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:11
|
| 805 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:16
|
| 806 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:5
|
| 807 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:7
|
| 808 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:12
|
| 809 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:17
|
| 810 |
+
msgctxt "verb"
|
| 811 |
+
msgid "Post"
|
| 812 |
+
msgstr ""
|
| 813 |
+
|
| 814 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:20
|
| 815 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:24
|
| 816 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:21
|
| 817 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:25
|
| 818 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:20
|
| 819 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:24
|
| 820 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:20
|
| 821 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:24
|
| 822 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:20
|
| 823 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:24
|
| 824 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:20
|
| 825 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:24
|
| 826 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/plurals.php:3
|
| 827 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/plurals.php:8
|
| 828 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/plurals.php:15
|
| 829 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:21
|
| 830 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:25
|
| 831 |
#, php-format
|
| 832 |
+
msgid "%d apple"
|
| 833 |
+
msgid_plural "%d apples"
|
| 834 |
+
msgstr[0] ""
|
| 835 |
+
msgstr[1] ""
|
| 836 |
+
|
| 837 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:21
|
| 838 |
+
#: node_modules/grunt-checktextdomain/test/expected/incorrect-domain-autocorrect.php:25
|
| 839 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:22
|
| 840 |
+
#: node_modules/grunt-checktextdomain/test/expected/variable-domain-autocorrect.php:26
|
| 841 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:21
|
| 842 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/correct-domain.php:25
|
| 843 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:21
|
| 844 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain-autocorrect.php:25
|
| 845 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:21
|
| 846 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/incorrect-domain.php:25
|
| 847 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/missing-domain.php:25
|
| 848 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/plurals.php:4
|
| 849 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/plurals.php:9
|
| 850 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/plurals.php:16
|
| 851 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:22
|
| 852 |
+
#: node_modules/grunt-checktextdomain/test/fixtures/variable-domain-autocorrect.php:26
|
| 853 |
+
#, php-format
|
| 854 |
+
msgctxt "noun, job positions"
|
| 855 |
+
msgid "%d post"
|
| 856 |
+
msgid_plural "%d posts"
|
| 857 |
+
msgstr[0] ""
|
| 858 |
+
msgstr[1] ""
|
| 859 |
+
|
| 860 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/basic-theme/exclude/file.php:3
|
| 861 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/plugin-include/plugin-include.php:6
|
| 862 |
+
msgid "Exclude"
|
| 863 |
msgstr ""
|
| 864 |
|
| 865 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/plugin-include/include/file.php:2
|
| 866 |
+
msgid "Include"
|
|
|
|
|
|
|
|
|
|
| 867 |
msgstr ""
|
| 868 |
|
| 869 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/add-domain.php:2
|
| 870 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:2
|
| 871 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:3
|
| 872 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:4
|
| 873 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-domains.php:2
|
| 874 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-domains.php:3
|
| 875 |
+
msgid "String"
|
| 876 |
+
msgstr ""
|
| 877 |
+
|
| 878 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:6
|
| 879 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:7
|
| 880 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:8
|
| 881 |
+
msgctxt "a string"
|
| 882 |
+
msgid "String"
|
| 883 |
+
msgstr ""
|
| 884 |
+
|
| 885 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:9
|
| 886 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:10
|
| 887 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/text-domains/update-all-domains.php:11
|
| 888 |
#, php-format
|
| 889 |
+
msgid "1 Star"
|
| 890 |
+
msgid_plural "%s Stars"
|
| 891 |
+
msgstr[0] ""
|
| 892 |
+
msgstr[1] ""
|
| 893 |
+
|
| 894 |
+
#. translators: A single line translators comment.
|
| 895 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/translator-comments/translator-comments.php:7
|
| 896 |
+
msgid "A"
|
| 897 |
msgstr ""
|
| 898 |
|
| 899 |
+
#. translators: A
|
| 900 |
+
#. multiline
|
| 901 |
+
#. translators
|
| 902 |
+
#. comment.
|
| 903 |
+
#.
|
| 904 |
+
#: node_modules/grunt-wp-i18n/test/fixtures/translator-comments/translator-comments.php:15
|
| 905 |
+
msgid "B"
|
| 906 |
msgstr ""
|
| 907 |
|
| 908 |
+
#: woocommerce-gateway-stripe.php:182
|
| 909 |
#, php-format
|
| 910 |
msgid ""
|
| 911 |
+
"Stripe is almost ready. To get started, <a href=\"%s\">set your Stripe "
|
| 912 |
+
"account keys</a>."
|
| 913 |
msgstr ""
|
| 914 |
|
| 915 |
+
#: woocommerce-gateway-stripe.php:240
|
| 916 |
#, php-format
|
| 917 |
msgid ""
|
| 918 |
+
"WooCommerce Stripe - The minimum PHP version required for this plugin is "
|
| 919 |
+
"%1$s. You are running %2$s."
|
| 920 |
msgstr ""
|
| 921 |
|
| 922 |
+
#: woocommerce-gateway-stripe.php:246
|
| 923 |
+
msgid "WooCommerce Stripe requires WooCommerce to be activated to work."
|
| 924 |
msgstr ""
|
| 925 |
|
| 926 |
+
#: woocommerce-gateway-stripe.php:250
|
| 927 |
+
#, php-format
|
| 928 |
msgid ""
|
| 929 |
+
"WooCommerce Stripe - The minimum WooCommerce version required for this "
|
| 930 |
+
"plugin is %1$s. You are running %2$s."
|
| 931 |
msgstr ""
|
| 932 |
|
| 933 |
+
#: woocommerce-gateway-stripe.php:256
|
| 934 |
+
msgid "WooCommerce Stripe - cURL is not installed."
|
| 935 |
+
msgstr ""
|
| 936 |
+
|
| 937 |
+
#: woocommerce-gateway-stripe.php:271
|
| 938 |
msgid "Settings"
|
| 939 |
msgstr ""
|
| 940 |
|
| 941 |
+
#: woocommerce-gateway-stripe.php:272
|
| 942 |
msgid "Docs"
|
| 943 |
msgstr ""
|
| 944 |
|
| 945 |
+
#: woocommerce-gateway-stripe.php:273
|
| 946 |
msgid "Support"
|
| 947 |
msgstr ""
|
| 948 |
|
| 949 |
+
#: woocommerce-gateway-stripe.php:303
|
| 950 |
+
msgid ""
|
| 951 |
+
"New Feature! Stripe now supports Apple Pay. Your customers can now purchase "
|
| 952 |
+
"your products even faster. Apple Pay has been enabled by default."
|
| 953 |
+
msgstr ""
|
| 954 |
+
|
| 955 |
+
#: woocommerce-gateway-stripe.php:321
|
| 956 |
+
msgid ""
|
| 957 |
+
"New Feature! Stripe now supports Google Payment Request. Your customers can "
|
| 958 |
+
"now use mobile phones with supported browsers such as Chrome to make "
|
| 959 |
+
"purchases easier and faster."
|
| 960 |
+
msgstr ""
|
| 961 |
+
|
| 962 |
+
#: woocommerce-gateway-stripe.php:468
|
| 963 |
msgid "Unable to capture charge!"
|
| 964 |
msgstr ""
|
| 965 |
|
| 966 |
+
#: woocommerce-gateway-stripe.php:506
|
| 967 |
msgid "Unable to refund charge!"
|
| 968 |
msgstr ""
|
| 969 |
|
| 970 |
+
#: woocommerce-gateway-stripe.php:508
|
| 971 |
#, php-format
|
| 972 |
msgid "Stripe charge refunded (Charge ID: %s)"
|
| 973 |
msgstr ""
|
readme.txt
CHANGED
|
@@ -1,9 +1,9 @@
|
|
| 1 |
=== WooCommerce Stripe Payment Gateway ===
|
| 2 |
-
Contributors: automattic, woothemes, mikejolley, akeda, royho, slash1andy, woosteve, spraveenitpro, mikedmoore, fernashes, shellbeezy, danieldudzic, mikaey, dsmithweb, fullysupportedphil, corsonr
|
| 3 |
Tags: credit card, stripe, woocommerce
|
| 4 |
Requires at least: 4.4
|
| 5 |
-
Tested up to: 4.7.
|
| 6 |
-
Stable tag: 3.0
|
| 7 |
License: GPLv3
|
| 8 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
| 9 |
|
|
@@ -11,7 +11,7 @@ Take credit card payments on your store using Stripe.
|
|
| 11 |
|
| 12 |
== Description ==
|
| 13 |
|
| 14 |
-
Accept Visa, MasterCard, American Express, Discover, JCB, Diners Club, and more cards directly on your store with the Stripe payment gateway for WooCommerce.
|
| 15 |
|
| 16 |
= Take Credit card payments easily and directly on your store =
|
| 17 |
|
|
@@ -38,6 +38,14 @@ Stripe has no setup fees, no monthly fees, no hidden costs: you only get charged
|
|
| 38 |
|
| 39 |
Stripe also supports the [Subscriptions extension](http://www.woothemes.com/extension/subscriptions/) and re-using cards. When a customer pays, they are set up in Stripe as a customer. If they create another order, they can check out using the same card. A massive timesaver for returning customers.
|
| 40 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
== Installation ==
|
| 42 |
|
| 43 |
Please note, v3 of this gateway requires WooCommerce 2.5 and above.
|
|
@@ -87,6 +95,10 @@ If you get stuck, you can ask for help in the Plugin Forum.
|
|
| 87 |
|
| 88 |
== Changelog ==
|
| 89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
= 3.0.7 =
|
| 91 |
* New - Option to allow/disallow remember me on Stripe checkout modal.
|
| 92 |
* Fix - Paying for order incorrectly uses cart amount.
|
|
@@ -134,7 +146,6 @@ If you get stuck, you can ask for help in the Plugin Forum.
|
|
| 134 |
|
| 135 |
== Upgrade Notice ==
|
| 136 |
|
| 137 |
-
= 3.0
|
| 138 |
-
* New -
|
| 139 |
-
*
|
| 140 |
-
* Fix - Using WC function before checking exists causes fatal error.
|
| 1 |
=== WooCommerce Stripe Payment Gateway ===
|
| 2 |
+
Contributors: automattic, woothemes, mikejolley, akeda, royho, mattyza, slash1andy, woosteve, spraveenitpro, mikedmoore, fernashes, shellbeezy, danieldudzic, mikaey, dsmithweb, fullysupportedphil, corsonr, deskroid, luminus, tiagonoronha
|
| 3 |
Tags: credit card, stripe, woocommerce
|
| 4 |
Requires at least: 4.4
|
| 5 |
+
Tested up to: 4.7.2
|
| 6 |
+
Stable tag: 3.1.0
|
| 7 |
License: GPLv3
|
| 8 |
License URI: http://www.gnu.org/licenses/gpl-3.0.html
|
| 9 |
|
| 11 |
|
| 12 |
== Description ==
|
| 13 |
|
| 14 |
+
Accept Visa, MasterCard, American Express, Discover, JCB, Diners Club, and more cards directly on your store with the Stripe payment gateway for WooCommerce, including Apple Pay for mobile and desktop.
|
| 15 |
|
| 16 |
= Take Credit card payments easily and directly on your store =
|
| 17 |
|
| 38 |
|
| 39 |
Stripe also supports the [Subscriptions extension](http://www.woothemes.com/extension/subscriptions/) and re-using cards. When a customer pays, they are set up in Stripe as a customer. If they create another order, they can check out using the same card. A massive timesaver for returning customers.
|
| 40 |
|
| 41 |
+
= Apple Pay Support =
|
| 42 |
+
|
| 43 |
+
WooCommerce Stripe now includes [Apple Pay](https://stripe.com/apple-pay) support, which means customers can pay using payment details associated to their Apple ID. Checkout is now just a thumbprint away. on both mobile and desktop.
|
| 44 |
+
|
| 45 |
+
= Web Payments API Support =
|
| 46 |
+
|
| 47 |
+
WooCommerce Stripe now includes [Web Payments API](https://www.w3.org/TR/payment-request/) support, which means customers can pay using payment details associated to their mobile devices, in browsers supporting the Web Payments API (Chrome for Android, amongst others). Checkout is now just a few taps away. on mobile.
|
| 48 |
+
|
| 49 |
== Installation ==
|
| 50 |
|
| 51 |
Please note, v3 of this gateway requires WooCommerce 2.5 and above.
|
| 95 |
|
| 96 |
== Changelog ==
|
| 97 |
|
| 98 |
+
= 3.1.0 =
|
| 99 |
+
* New - Apple Pay Support.
|
| 100 |
+
* New - Add Google Payment Request API.
|
| 101 |
+
|
| 102 |
= 3.0.7 =
|
| 103 |
* New - Option to allow/disallow remember me on Stripe checkout modal.
|
| 104 |
* Fix - Paying for order incorrectly uses cart amount.
|
| 146 |
|
| 147 |
== Upgrade Notice ==
|
| 148 |
|
| 149 |
+
= 3.1.0 =
|
| 150 |
+
* New - Apple Pay Support.
|
| 151 |
+
* New - Add Google Payment Request API.
|
|
|
woocommerce-gateway-stripe.php
CHANGED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
* Description: Take credit card payments on your store using Stripe.
|
| 6 |
* Author: WooCommerce
|
| 7 |
* Author URI: https://woocommerce.com/
|
| 8 |
-
* Version: 3.0
|
| 9 |
* Text Domain: woocommerce-gateway-stripe
|
| 10 |
* Domain Path: /languages
|
| 11 |
*
|
|
@@ -32,454 +32,599 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|
| 32 |
/**
|
| 33 |
* Required minimums and constants
|
| 34 |
*/
|
| 35 |
-
define( 'WC_STRIPE_VERSION', '3.0
|
| 36 |
-
define( 'WC_STRIPE_MIN_PHP_VER', '5.
|
| 37 |
define( 'WC_STRIPE_MIN_WC_VER', '2.5.0' );
|
| 38 |
define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
|
| 39 |
define( 'WC_STRIPE_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
|
|
|
|
| 40 |
|
| 41 |
if ( ! class_exists( 'WC_Stripe' ) ) :
|
| 42 |
|
| 43 |
-
class WC_Stripe {
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
|
| 57 |
-
|
| 58 |
-
|
| 59 |
-
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
|
|
|
|
|
|
|
| 63 |
}
|
| 64 |
-
return self::$instance;
|
| 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 |
-
add_action( 'woocommerce_order_status_on-hold_to_completed', array( $this, 'capture_payment' ) );
|
| 133 |
-
add_action( 'woocommerce_order_status_on-hold_to_cancelled', array( $this, 'cancel_payment' ) );
|
| 134 |
-
add_action( 'woocommerce_order_status_on-hold_to_refunded', array( $this, 'cancel_payment' ) );
|
| 135 |
-
add_filter( 'woocommerce_get_customer_payment_tokens', array( $this, 'woocommerce_get_customer_payment_tokens' ), 10, 3 );
|
| 136 |
-
add_action( 'woocommerce_payment_token_deleted', array( $this, 'woocommerce_payment_token_deleted' ), 10, 2 );
|
| 137 |
-
add_action( 'woocommerce_payment_token_set_default', array( $this, 'woocommerce_payment_token_set_default' ) );
|
| 138 |
-
}
|
| 139 |
|
| 140 |
-
|
| 141 |
-
|
| 142 |
-
|
| 143 |
-
|
| 144 |
-
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
|
| 148 |
-
|
|
|
|
|
|
|
| 149 |
|
| 150 |
-
|
| 151 |
-
* The backup sanity check, in case the plugin is activated in a weird way,
|
| 152 |
-
* or the environment changes after activation.
|
| 153 |
-
*/
|
| 154 |
-
public function check_environment() {
|
| 155 |
-
$environment_warning = self::get_environment_warning();
|
| 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 |
-
if ( ! defined( 'WC_VERSION' ) ) {
|
| 187 |
-
return __( 'WooCommerce Stripe requires WooCommerce to be activated to work.', 'woocommerce-gateway-stripe' );
|
| 188 |
-
}
|
| 189 |
|
| 190 |
-
|
| 191 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 192 |
|
| 193 |
-
|
| 194 |
-
|
| 195 |
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
|
| 200 |
-
|
| 201 |
-
|
| 202 |
|
| 203 |
-
|
| 204 |
-
|
| 205 |
-
*
|
| 206 |
-
* @since 1.0.0
|
| 207 |
-
*/
|
| 208 |
-
public function plugin_action_links( $links ) {
|
| 209 |
-
$setting_link = $this->get_setting_link();
|
| 210 |
-
|
| 211 |
-
$plugin_links = array(
|
| 212 |
-
'<a href="' . $setting_link . '">' . __( 'Settings', 'woocommerce-gateway-stripe' ) . '</a>',
|
| 213 |
-
'<a href="https://docs.woothemes.com/document/stripe/">' . __( 'Docs', 'woocommerce-gateway-stripe' ) . '</a>',
|
| 214 |
-
'<a href="http://support.woothemes.com/">' . __( 'Support', 'woocommerce-gateway-stripe' ) . '</a>',
|
| 215 |
-
);
|
| 216 |
-
return array_merge( $plugin_links, $links );
|
| 217 |
-
}
|
| 218 |
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
|
| 222 |
-
* @since 1.0.0
|
| 223 |
-
*
|
| 224 |
-
* @return string Setting link
|
| 225 |
-
*/
|
| 226 |
-
public function get_setting_link() {
|
| 227 |
-
$use_id_as_section = function_exists( 'WC' ) ? version_compare( WC()->version, '2.6', '>=' ) : false;
|
| 228 |
|
| 229 |
-
|
|
|
|
| 230 |
|
| 231 |
-
|
| 232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
|
| 234 |
-
|
| 235 |
-
|
| 236 |
-
|
| 237 |
-
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
echo wp_kses( $notice['message'], array( 'a' => array( 'href' => array() ) ) );
|
| 241 |
-
echo "</p></div>";
|
| 242 |
}
|
| 243 |
-
}
|
| 244 |
|
| 245 |
-
|
| 246 |
-
|
| 247 |
-
|
| 248 |
-
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 253 |
}
|
| 254 |
|
| 255 |
-
|
| 256 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 257 |
}
|
| 258 |
|
| 259 |
-
|
| 260 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 261 |
}
|
| 262 |
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 268 |
}
|
| 269 |
|
| 270 |
-
|
| 271 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 272 |
|
| 273 |
-
|
| 274 |
-
|
| 275 |
-
|
| 276 |
-
|
| 277 |
-
);
|
| 278 |
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
|
|
|
|
|
|
| 283 |
|
| 284 |
-
|
| 285 |
-
* Add the gateways to WooCommerce
|
| 286 |
-
*
|
| 287 |
-
* @since 1.0.0
|
| 288 |
-
*/
|
| 289 |
-
public function add_gateways( $methods ) {
|
| 290 |
-
if ( $this->subscription_support_enabled || $this->pre_order_enabled ) {
|
| 291 |
-
$methods[] = 'WC_Gateway_Stripe_Addons';
|
| 292 |
-
} else {
|
| 293 |
-
$methods[] = 'WC_Gateway_Stripe';
|
| 294 |
}
|
| 295 |
-
return $methods;
|
| 296 |
-
}
|
| 297 |
|
| 298 |
-
|
| 299 |
-
|
| 300 |
-
|
| 301 |
-
|
| 302 |
-
|
| 303 |
-
|
| 304 |
-
|
| 305 |
-
|
| 306 |
-
|
| 307 |
-
|
| 308 |
-
|
| 309 |
-
|
| 310 |
-
|
| 311 |
-
|
| 312 |
-
|
| 313 |
-
|
| 314 |
-
|
| 315 |
-
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
|
| 321 |
-
|
| 322 |
-
|
| 323 |
-
|
| 324 |
-
|
| 325 |
-
|
| 326 |
-
|
| 327 |
-
|
| 328 |
-
|
| 329 |
-
|
| 330 |
-
|
| 331 |
-
|
|
|
|
| 332 |
}
|
| 333 |
}
|
| 334 |
}
|
| 335 |
}
|
| 336 |
-
}
|
| 337 |
|
| 338 |
-
|
| 339 |
-
|
| 340 |
-
|
| 341 |
-
|
| 342 |
-
|
| 343 |
-
|
| 344 |
-
|
| 345 |
-
|
| 346 |
-
|
| 347 |
-
|
| 348 |
-
|
| 349 |
-
|
| 350 |
-
|
| 351 |
-
|
| 352 |
-
|
| 353 |
-
|
| 354 |
-
|
| 355 |
-
|
| 356 |
-
|
| 357 |
-
|
| 358 |
-
|
| 359 |
-
|
|
|
|
| 360 |
}
|
| 361 |
}
|
| 362 |
}
|
| 363 |
-
}
|
| 364 |
|
| 365 |
-
|
| 366 |
-
|
| 367 |
-
|
| 368 |
-
|
| 369 |
-
|
| 370 |
-
|
| 371 |
-
|
| 372 |
-
|
| 373 |
-
|
| 374 |
-
|
| 375 |
-
|
| 376 |
-
|
| 377 |
-
|
| 378 |
-
|
| 379 |
|
| 380 |
-
|
| 381 |
-
|
| 382 |
-
|
| 383 |
-
|
| 384 |
-
|
| 385 |
-
|
| 386 |
-
|
| 387 |
-
|
| 388 |
-
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
|
|
|
| 392 |
}
|
| 393 |
}
|
|
|
|
| 394 |
}
|
| 395 |
-
return $tokens;
|
| 396 |
-
}
|
| 397 |
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
|
| 402 |
-
|
| 403 |
-
|
| 404 |
-
|
|
|
|
| 405 |
}
|
| 406 |
-
}
|
| 407 |
|
| 408 |
-
|
| 409 |
-
|
| 410 |
-
|
| 411 |
-
|
| 412 |
-
|
| 413 |
-
|
| 414 |
-
|
| 415 |
-
|
| 416 |
-
|
| 417 |
-
}
|
| 418 |
-
|
| 419 |
-
/**
|
| 420 |
-
* Checks Stripe minimum order value authorized per currency
|
| 421 |
-
*/
|
| 422 |
-
public static function get_minimum_amount() {
|
| 423 |
-
|
| 424 |
-
// Check order amount
|
| 425 |
-
switch ( get_woocommerce_currency() ) {
|
| 426 |
-
case 'USD':
|
| 427 |
-
case 'CAD':
|
| 428 |
-
case 'EUR':
|
| 429 |
-
case 'CHF':
|
| 430 |
-
case 'AUD':
|
| 431 |
-
case 'SGD':
|
| 432 |
-
$minimum_amount = 50;
|
| 433 |
-
break;
|
| 434 |
-
case 'GBP':
|
| 435 |
-
$minimum_amount = 30;
|
| 436 |
-
break;
|
| 437 |
-
case 'DKK':
|
| 438 |
-
$minimum_amount = 250;
|
| 439 |
-
break;
|
| 440 |
-
case 'NOK':
|
| 441 |
-
case 'SEK':
|
| 442 |
-
$minimum_amount = 300;
|
| 443 |
-
break;
|
| 444 |
-
case 'JPY':
|
| 445 |
-
$minimum_amount = 5000;
|
| 446 |
-
break;
|
| 447 |
-
case 'MXN':
|
| 448 |
-
$minimum_amount = 1000;
|
| 449 |
-
break;
|
| 450 |
-
case 'HKD':
|
| 451 |
-
$minimum_amount = 400;
|
| 452 |
-
break;
|
| 453 |
-
default:
|
| 454 |
-
$minimum_amount = 50;
|
| 455 |
-
break;
|
| 456 |
}
|
| 457 |
-
|
| 458 |
-
return $minimum_amount;
|
| 459 |
-
|
| 460 |
-
}
|
| 461 |
|
| 462 |
-
|
| 463 |
-
|
| 464 |
-
|
| 465 |
-
|
| 466 |
-
|
| 467 |
-
|
| 468 |
-
|
| 469 |
-
|
| 470 |
-
|
| 471 |
-
|
| 472 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 473 |
}
|
| 474 |
|
| 475 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 476 |
|
| 477 |
-
|
| 478 |
-
error_log( $message );
|
| 479 |
}
|
| 480 |
}
|
| 481 |
-
}
|
| 482 |
|
| 483 |
-
$GLOBALS['wc_stripe'] = WC_Stripe::get_instance();
|
| 484 |
|
| 485 |
endif;
|
| 5 |
* Description: Take credit card payments on your store using Stripe.
|
| 6 |
* Author: WooCommerce
|
| 7 |
* Author URI: https://woocommerce.com/
|
| 8 |
+
* Version: 3.1.0
|
| 9 |
* Text Domain: woocommerce-gateway-stripe
|
| 10 |
* Domain Path: /languages
|
| 11 |
*
|
| 32 |
/**
|
| 33 |
* Required minimums and constants
|
| 34 |
*/
|
| 35 |
+
define( 'WC_STRIPE_VERSION', '3.1.0' );
|
| 36 |
+
define( 'WC_STRIPE_MIN_PHP_VER', '5.6.0' );
|
| 37 |
define( 'WC_STRIPE_MIN_WC_VER', '2.5.0' );
|
| 38 |
define( 'WC_STRIPE_MAIN_FILE', __FILE__ );
|
| 39 |
define( 'WC_STRIPE_PLUGIN_URL', untrailingslashit( plugins_url( basename( plugin_dir_path( __FILE__ ) ), basename( __FILE__ ) ) ) );
|
| 40 |
+
define( 'WC_STRIPE_PLUGIN_PATH', untrailingslashit( plugin_dir_path( __FILE__ ) ) );
|
| 41 |
|
| 42 |
if ( ! class_exists( 'WC_Stripe' ) ) :
|
| 43 |
|
| 44 |
+
class WC_Stripe {
|
| 45 |
+
|
| 46 |
+
/**
|
| 47 |
+
* @var Singleton The reference the *Singleton* instance of this class
|
| 48 |
+
*/
|
| 49 |
+
private static $instance;
|
| 50 |
+
|
| 51 |
+
/**
|
| 52 |
+
* @var Reference to logging class.
|
| 53 |
+
*/
|
| 54 |
+
private static $log;
|
| 55 |
+
|
| 56 |
+
/**
|
| 57 |
+
* Returns the *Singleton* instance of this class.
|
| 58 |
+
*
|
| 59 |
+
* @return Singleton The *Singleton* instance.
|
| 60 |
+
*/
|
| 61 |
+
public static function get_instance() {
|
| 62 |
+
if ( null === self::$instance ) {
|
| 63 |
+
self::$instance = new self();
|
| 64 |
+
}
|
| 65 |
+
return self::$instance;
|
| 66 |
}
|
|
|
|
|
|
|
| 67 |
|
| 68 |
+
/**
|
| 69 |
+
* Private clone method to prevent cloning of the instance of the
|
| 70 |
+
* *Singleton* instance.
|
| 71 |
+
*
|
| 72 |
+
* @return void
|
| 73 |
+
*/
|
| 74 |
+
private function __clone() {}
|
| 75 |
+
|
| 76 |
+
/**
|
| 77 |
+
* Private unserialize method to prevent unserializing of the *Singleton*
|
| 78 |
+
* instance.
|
| 79 |
+
*
|
| 80 |
+
* @return void
|
| 81 |
+
*/
|
| 82 |
+
private function __wakeup() {}
|
| 83 |
+
|
| 84 |
+
/**
|
| 85 |
+
* Flag to indicate whether or not we need to load code for / support subscriptions.
|
| 86 |
+
*
|
| 87 |
+
* @var bool
|
| 88 |
+
*/
|
| 89 |
+
private $subscription_support_enabled = false;
|
| 90 |
+
|
| 91 |
+
/**
|
| 92 |
+
* Flag to indicate whether or not we need to load support for pre-orders.
|
| 93 |
+
*
|
| 94 |
+
* @since 3.0.3
|
| 95 |
+
*
|
| 96 |
+
* @var bool
|
| 97 |
+
*/
|
| 98 |
+
private $pre_order_enabled = false;
|
| 99 |
+
|
| 100 |
+
/**
|
| 101 |
+
* Notices (array)
|
| 102 |
+
* @var array
|
| 103 |
+
*/
|
| 104 |
+
public $notices = array();
|
| 105 |
+
|
| 106 |
+
/**
|
| 107 |
+
* Protected constructor to prevent creating a new instance of the
|
| 108 |
+
* *Singleton* via the `new` operator from outside of this class.
|
| 109 |
+
*/
|
| 110 |
+
protected function __construct() {
|
| 111 |
+
add_action( 'admin_init', array( $this, 'check_environment' ) );
|
| 112 |
+
add_action( 'admin_notices', array( $this, 'admin_notices' ), 15 );
|
| 113 |
+
add_action( 'plugins_loaded', array( $this, 'init' ) );
|
| 114 |
+
}
|
| 115 |
+
|
| 116 |
+
/**
|
| 117 |
+
* Init the plugin after plugins_loaded so environment variables are set.
|
| 118 |
+
*/
|
| 119 |
+
public function init() {
|
| 120 |
+
// Don't hook anything else in the plugin if we're in an incompatible environment
|
| 121 |
+
if ( self::get_environment_warning() ) {
|
| 122 |
+
return;
|
| 123 |
+
}
|
| 124 |
|
| 125 |
+
include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-api.php' );
|
| 126 |
+
include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-customer.php' );
|
| 127 |
+
|
| 128 |
+
// Init the gateway itself
|
| 129 |
+
$this->init_gateways();
|
| 130 |
+
|
| 131 |
+
add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( $this, 'plugin_action_links' ) );
|
| 132 |
+
add_action( 'woocommerce_order_status_on-hold_to_processing', array( $this, 'capture_payment' ) );
|
| 133 |
+
add_action( 'woocommerce_order_status_on-hold_to_completed', array( $this, 'capture_payment' ) );
|
| 134 |
+
add_action( 'woocommerce_order_status_on-hold_to_cancelled', array( $this, 'cancel_payment' ) );
|
| 135 |
+
add_action( 'woocommerce_order_status_on-hold_to_refunded', array( $this, 'cancel_payment' ) );
|
| 136 |
+
add_filter( 'woocommerce_get_customer_payment_tokens', array( $this, 'woocommerce_get_customer_payment_tokens' ), 10, 3 );
|
| 137 |
+
add_action( 'woocommerce_payment_token_deleted', array( $this, 'woocommerce_payment_token_deleted' ), 10, 2 );
|
| 138 |
+
add_action( 'woocommerce_payment_token_set_default', array( $this, 'woocommerce_payment_token_set_default' ) );
|
| 139 |
+
add_action( 'wp_ajax_stripe_dismiss_request_api_notice', array( $this, 'dismiss_request_api_notice' ) );
|
| 140 |
+
add_action( 'wp_ajax_stripe_dismiss_apple_pay_notice', array( $this, 'dismiss_apple_pay_notice' ) );
|
| 141 |
+
|
| 142 |
+
include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-payment-request.php' );
|
| 143 |
}
|
| 144 |
|
| 145 |
+
/**
|
| 146 |
+
* Allow this class and other classes to add slug keyed notices (to avoid duplication)
|
| 147 |
+
*/
|
| 148 |
+
public function add_admin_notice( $slug, $class, $message ) {
|
| 149 |
+
$this->notices[ $slug ] = array(
|
| 150 |
+
'class' => $class,
|
| 151 |
+
'message' => $message,
|
| 152 |
+
);
|
| 153 |
+
}
|
| 154 |
|
| 155 |
+
/**
|
| 156 |
+
* The backup sanity check, in case the plugin is activated in a weird way,
|
| 157 |
+
* or the environment changes after activation. Also handles upgrade routines.
|
| 158 |
+
*/
|
| 159 |
+
public function check_environment() {
|
| 160 |
+
if ( ! defined( 'IFRAME_REQUEST' ) && ( WC_STRIPE_VERSION !== get_option( 'woocommerce_stripe_version' ) ) ) {
|
| 161 |
+
$this->install();
|
| 162 |
|
| 163 |
+
do_action( 'woocommerce_stripe_updated' );
|
| 164 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 165 |
|
| 166 |
+
$environment_warning = self::get_environment_warning();
|
| 167 |
+
|
| 168 |
+
if ( $environment_warning && is_plugin_active( plugin_basename( __FILE__ ) ) ) {
|
| 169 |
+
$this->add_admin_notice( 'bad_environment', 'error', $environment_warning );
|
| 170 |
+
}
|
| 171 |
+
|
| 172 |
+
// Check if secret key present. Otherwise prompt, via notice, to go to
|
| 173 |
+
// setting.
|
| 174 |
+
if ( ! class_exists( 'WC_Stripe_API' ) ) {
|
| 175 |
+
include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-api.php' );
|
| 176 |
+
}
|
| 177 |
|
| 178 |
+
$secret = WC_Stripe_API::get_secret_key();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 179 |
|
| 180 |
+
if ( empty( $secret ) && ! ( isset( $_GET['page'], $_GET['section'] ) && 'wc-settings' === $_GET['page'] && 'stripe' === $_GET['section'] ) ) {
|
| 181 |
+
$setting_link = $this->get_setting_link();
|
| 182 |
+
$this->add_admin_notice( 'prompt_connect', 'notice notice-warning', sprintf( __( 'Stripe is almost ready. To get started, <a href="%s">set your Stripe account keys</a>.', 'woocommerce-gateway-stripe' ), $setting_link ) );
|
| 183 |
+
}
|
| 184 |
}
|
| 185 |
|
| 186 |
+
/**
|
| 187 |
+
* Updates the plugin version in db
|
| 188 |
+
*
|
| 189 |
+
* @since 3.1.0
|
| 190 |
+
* @version 3.1.0
|
| 191 |
+
* @return bool
|
| 192 |
+
*/
|
| 193 |
+
private static function _update_plugin_version() {
|
| 194 |
+
delete_option( 'wc_stripe_version' );
|
| 195 |
+
add_option( 'wc_stripe_version', WC_STRIPE_VERSION );
|
| 196 |
+
|
| 197 |
+
return true;
|
| 198 |
}
|
| 199 |
|
| 200 |
+
/**
|
| 201 |
+
* Dismiss the Google Payment Request API Feature notice.
|
| 202 |
+
*
|
| 203 |
+
* @since 3.1.0
|
| 204 |
+
* @version 3.1.0
|
| 205 |
+
*/
|
| 206 |
+
public function dismiss_request_api_notice() {
|
| 207 |
+
add_option( 'wc_stripe_show_request_api_notice', 'no' );
|
| 208 |
+
}
|
| 209 |
|
| 210 |
+
/**
|
| 211 |
+
* Dismiss the Apple Pay Feature notice.
|
| 212 |
+
*
|
| 213 |
+
* @since 3.1.0
|
| 214 |
+
* @version 3.1.0
|
| 215 |
+
*/
|
| 216 |
+
public function dismiss_apple_pay_notice() {
|
| 217 |
+
add_option( 'wc_stripe_show_apple_pay_notice', 'no' );
|
| 218 |
}
|
|
|
|
| 219 |
|
| 220 |
+
/**
|
| 221 |
+
* Handles upgrade routines.
|
| 222 |
+
*
|
| 223 |
+
* @since 3.1.0
|
| 224 |
+
* @version 3.1.0
|
| 225 |
+
*/
|
| 226 |
+
public function install() {
|
| 227 |
+
if ( ! defined( 'WC_STRIPE_INSTALLING' ) ) {
|
| 228 |
+
define( 'WC_STRIPE_INSTALLING', true );
|
| 229 |
+
}
|
| 230 |
|
| 231 |
+
$this->_update_plugin_version();
|
| 232 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
|
| 234 |
+
/**
|
| 235 |
+
* Checks the environment for compatibility problems. Returns a string with the first incompatibility
|
| 236 |
+
* found or false if the environment has no problems.
|
| 237 |
+
*/
|
| 238 |
+
static function get_environment_warning() {
|
| 239 |
+
if ( version_compare( phpversion(), WC_STRIPE_MIN_PHP_VER, '<' ) ) {
|
| 240 |
+
$message = __( 'WooCommerce Stripe - The minimum PHP version required for this plugin is %1$s. You are running %2$s.', 'woocommerce-gateway-stripe' );
|
| 241 |
|
| 242 |
+
return sprintf( $message, WC_STRIPE_MIN_PHP_VER, phpversion() );
|
| 243 |
+
}
|
| 244 |
|
| 245 |
+
if ( ! defined( 'WC_VERSION' ) ) {
|
| 246 |
+
return __( 'WooCommerce Stripe requires WooCommerce to be activated to work.', 'woocommerce-gateway-stripe' );
|
| 247 |
+
}
|
| 248 |
|
| 249 |
+
if ( version_compare( WC_VERSION, WC_STRIPE_MIN_WC_VER, '<' ) ) {
|
| 250 |
+
$message = __( 'WooCommerce Stripe - The minimum WooCommerce version required for this plugin is %1$s. You are running %2$s.', 'woocommerce-gateway-stripe' );
|
| 251 |
|
| 252 |
+
return sprintf( $message, WC_STRIPE_MIN_WC_VER, WC_VERSION );
|
| 253 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 254 |
|
| 255 |
+
if ( ! function_exists( 'curl_init' ) ) {
|
| 256 |
+
return __( 'WooCommerce Stripe - cURL is not installed.', 'woocommerce-gateway-stripe' );
|
| 257 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 258 |
|
| 259 |
+
return false;
|
| 260 |
+
}
|
| 261 |
|
| 262 |
+
/**
|
| 263 |
+
* Adds plugin action links
|
| 264 |
+
*
|
| 265 |
+
* @since 1.0.0
|
| 266 |
+
*/
|
| 267 |
+
public function plugin_action_links( $links ) {
|
| 268 |
+
$setting_link = $this->get_setting_link();
|
| 269 |
|
| 270 |
+
$plugin_links = array(
|
| 271 |
+
'<a href="' . $setting_link . '">' . __( 'Settings', 'woocommerce-gateway-stripe' ) . '</a>',
|
| 272 |
+
'<a href="https://docs.woothemes.com/document/stripe/">' . __( 'Docs', 'woocommerce-gateway-stripe' ) . '</a>',
|
| 273 |
+
'<a href="http://support.woothemes.com/">' . __( 'Support', 'woocommerce-gateway-stripe' ) . '</a>',
|
| 274 |
+
);
|
| 275 |
+
return array_merge( $plugin_links, $links );
|
|
|
|
|
|
|
| 276 |
}
|
|
|
|
| 277 |
|
| 278 |
+
/**
|
| 279 |
+
* Get setting link.
|
| 280 |
+
*
|
| 281 |
+
* @since 1.0.0
|
| 282 |
+
*
|
| 283 |
+
* @return string Setting link
|
| 284 |
+
*/
|
| 285 |
+
public function get_setting_link() {
|
| 286 |
+
$use_id_as_section = function_exists( 'WC' ) ? version_compare( WC()->version, '2.6', '>=' ) : false;
|
| 287 |
+
|
| 288 |
+
$section_slug = $use_id_as_section ? 'stripe' : strtolower( 'WC_Gateway_Stripe' );
|
| 289 |
+
|
| 290 |
+
return admin_url( 'admin.php?page=wc-settings&tab=checkout§ion=' . $section_slug );
|
| 291 |
+
}
|
| 292 |
+
|
| 293 |
+
/**
|
| 294 |
+
* Display any notices we've collected thus far (e.g. for connection, disconnection)
|
| 295 |
+
*/
|
| 296 |
+
public function admin_notices() {
|
| 297 |
+
$show_request_api_notice = get_option( 'wc_stripe_show_request_api_notice' );
|
| 298 |
+
$show_apple_pay_notice = get_option( 'wc_stripe_show_apple_pay_notice' );
|
| 299 |
+
|
| 300 |
+
if ( empty( $show_apple_pay_notice ) ) {
|
| 301 |
+
// @TODO remove this notice in the future.
|
| 302 |
+
?>
|
| 303 |
+
<div class="notice notice-warning wc-stripe-apple-pay-notice is-dismissible"><p><?php esc_html_e( 'New Feature! Stripe now supports Apple Pay. Your customers can now purchase your products even faster. Apple Pay has been enabled by default.', 'woocommerce-gateway-stripe' ); ?></p></div>
|
| 304 |
+
|
| 305 |
+
<script type="application/javascript">
|
| 306 |
+
jQuery( '.wc-stripe-apple-pay-notice' ).on( 'click', '.notice-dismiss', function() {
|
| 307 |
+
var data = {
|
| 308 |
+
action: 'stripe_dismiss_apple_pay_notice'
|
| 309 |
+
};
|
| 310 |
+
|
| 311 |
+
jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data );
|
| 312 |
+
});
|
| 313 |
+
</script>
|
| 314 |
+
|
| 315 |
+
<?php
|
| 316 |
+
}
|
| 317 |
+
|
| 318 |
+
if ( empty( $show_request_api_notice ) ) {
|
| 319 |
+
// @TODO remove this notice in the future.
|
| 320 |
+
?>
|
| 321 |
+
<div class="notice notice-warning wc-stripe-request-api-notice is-dismissible"><p><?php esc_html_e( 'New Feature! Stripe now supports Google Payment Request. Your customers can now use mobile phones with supported browsers such as Chrome to make purchases easier and faster.', 'woocommerce-gateway-stripe' ); ?></p></div>
|
| 322 |
+
|
| 323 |
+
<script type="application/javascript">
|
| 324 |
+
jQuery( '.wc-stripe-request-api-notice' ).on( 'click', '.notice-dismiss', function() {
|
| 325 |
+
var data = {
|
| 326 |
+
action: 'stripe_dismiss_request_api_notice'
|
| 327 |
+
};
|
| 328 |
+
|
| 329 |
+
jQuery.post( '<?php echo admin_url( 'admin-ajax.php' ); ?>', data );
|
| 330 |
+
});
|
| 331 |
+
</script>
|
| 332 |
+
|
| 333 |
+
<?php
|
| 334 |
+
}
|
| 335 |
+
|
| 336 |
+
foreach ( (array) $this->notices as $notice_key => $notice ) {
|
| 337 |
+
echo "<div class='" . esc_attr( $notice['class'] ) . "'><p>";
|
| 338 |
+
echo wp_kses( $notice['message'], array( 'a' => array( 'href' => array() ) ) );
|
| 339 |
+
echo '</p></div>';
|
| 340 |
+
}
|
| 341 |
}
|
| 342 |
|
| 343 |
+
/**
|
| 344 |
+
* Initialize the gateway. Called very early - in the context of the plugins_loaded action
|
| 345 |
+
*
|
| 346 |
+
* @since 1.0.0
|
| 347 |
+
*/
|
| 348 |
+
public function init_gateways() {
|
| 349 |
+
if ( class_exists( 'WC_Subscriptions_Order' ) && function_exists( 'wcs_create_renewal_order' ) ) {
|
| 350 |
+
$this->subscription_support_enabled = true;
|
| 351 |
+
}
|
| 352 |
+
|
| 353 |
+
if ( class_exists( 'WC_Pre_Orders_Order' ) ) {
|
| 354 |
+
$this->pre_order_enabled = true;
|
| 355 |
+
}
|
| 356 |
+
|
| 357 |
+
if ( ! class_exists( 'WC_Payment_Gateway' ) ) {
|
| 358 |
+
return;
|
| 359 |
+
}
|
| 360 |
+
|
| 361 |
+
if ( class_exists( 'WC_Payment_Gateway_CC' ) ) {
|
| 362 |
+
include_once( dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe.php' );
|
| 363 |
+
include_once( dirname( __FILE__ ) . '/includes/class-wc-stripe-apple-pay.php' );
|
| 364 |
+
} else {
|
| 365 |
+
include_once( dirname( __FILE__ ) . '/includes/legacy/class-wc-gateway-stripe.php' );
|
| 366 |
+
include_once( dirname( __FILE__ ) . '/includes/legacy/class-wc-gateway-stripe-saved-cards.php' );
|
| 367 |
+
}
|
| 368 |
+
|
| 369 |
+
load_plugin_textdomain( 'woocommerce-gateway-stripe', false, plugin_basename( dirname( __FILE__ ) ) . '/languages' );
|
| 370 |
+
add_filter( 'woocommerce_payment_gateways', array( $this, 'add_gateways' ) );
|
| 371 |
+
|
| 372 |
+
$load_addons = (
|
| 373 |
+
$this->subscription_support_enabled
|
| 374 |
+
||
|
| 375 |
+
$this->pre_order_enabled
|
| 376 |
+
);
|
| 377 |
+
|
| 378 |
+
if ( $load_addons ) {
|
| 379 |
+
require_once( dirname( __FILE__ ) . '/includes/class-wc-gateway-stripe-addons.php' );
|
| 380 |
+
}
|
| 381 |
}
|
| 382 |
|
| 383 |
+
/**
|
| 384 |
+
* Add the gateways to WooCommerce
|
| 385 |
+
*
|
| 386 |
+
* @since 1.0.0
|
| 387 |
+
*/
|
| 388 |
+
public function add_gateways( $methods ) {
|
| 389 |
+
if ( $this->subscription_support_enabled || $this->pre_order_enabled ) {
|
| 390 |
+
$methods[] = 'WC_Gateway_Stripe_Addons';
|
| 391 |
+
} else {
|
| 392 |
+
$methods[] = 'WC_Gateway_Stripe';
|
| 393 |
+
}
|
| 394 |
+
return $methods;
|
| 395 |
}
|
| 396 |
|
| 397 |
+
/**
|
| 398 |
+
* List of currencies supported by Stripe that has no decimals.
|
| 399 |
+
*
|
| 400 |
+
* @return array $currencies
|
| 401 |
+
*/
|
| 402 |
+
public static function no_decimal_currencies() {
|
| 403 |
+
return array(
|
| 404 |
+
'bif', // Burundian Franc
|
| 405 |
+
'djf', // Djiboutian Franc
|
| 406 |
+
'jpy', // Japanese Yen
|
| 407 |
+
'krw', // South Korean Won
|
| 408 |
+
'pyg', // Paraguayan Guaraní
|
| 409 |
+
'vnd', // Vietnamese Đồng
|
| 410 |
+
'xaf', // Central African Cfa Franc
|
| 411 |
+
'xpf', // Cfp Franc
|
| 412 |
+
'clp', // Chilean Peso
|
| 413 |
+
'gnf', // Guinean Franc
|
| 414 |
+
'kmf', // Comorian Franc
|
| 415 |
+
'mga', // Malagasy Ariary
|
| 416 |
+
'rwf', // Rwandan Franc
|
| 417 |
+
'vuv', // Vanuatu Vatu
|
| 418 |
+
'xof', // West African Cfa Franc
|
| 419 |
+
);
|
| 420 |
}
|
| 421 |
|
| 422 |
+
/**
|
| 423 |
+
* Stripe uses smallest denomination in currencies such as cents.
|
| 424 |
+
* We need to format the returned currency from Stripe into human readable form.
|
| 425 |
+
*
|
| 426 |
+
* @param object $balance_transaction
|
| 427 |
+
* @param string $type Type of number to format
|
| 428 |
+
*/
|
| 429 |
+
public static function format_number( $balance_transaction, $type = 'fee' ) {
|
| 430 |
+
if ( ! is_object( $balance_transaction ) ) {
|
| 431 |
+
return;
|
| 432 |
+
}
|
| 433 |
|
| 434 |
+
if ( in_array( strtolower( $balance_transaction->currency ), self::no_decimal_currencies() ) ) {
|
| 435 |
+
if ( 'fee' === $type ) {
|
| 436 |
+
return $balance_transaction->fee;
|
| 437 |
+
}
|
|
|
|
| 438 |
|
| 439 |
+
return $balance_transaction->net;
|
| 440 |
+
}
|
| 441 |
+
|
| 442 |
+
if ( 'fee' === $type ) {
|
| 443 |
+
return number_format( $balance_transaction->fee / 100, 2, '.', '' );
|
| 444 |
+
}
|
| 445 |
|
| 446 |
+
return number_format( $balance_transaction->net / 100, 2, '.', '' );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 447 |
}
|
|
|
|
|
|
|
| 448 |
|
| 449 |
+
/**
|
| 450 |
+
* Capture payment when the order is changed from on-hold to complete or processing
|
| 451 |
+
*
|
| 452 |
+
* @param int $order_id
|
| 453 |
+
*/
|
| 454 |
+
public function capture_payment( $order_id ) {
|
| 455 |
+
$order = wc_get_order( $order_id );
|
| 456 |
+
|
| 457 |
+
if ( 'stripe' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->payment_method : $order->get_payment_method() ) ) {
|
| 458 |
+
$charge = get_post_meta( $order_id, '_stripe_charge_id', true );
|
| 459 |
+
$captured = get_post_meta( $order_id, '_stripe_charge_captured', true );
|
| 460 |
+
|
| 461 |
+
if ( $charge && 'no' === $captured ) {
|
| 462 |
+
$result = WC_Stripe_API::request( array(
|
| 463 |
+
'amount' => $order->get_total() * 100,
|
| 464 |
+
'expand[]' => 'balance_transaction',
|
| 465 |
+
), 'charges/' . $charge . '/capture' );
|
| 466 |
+
|
| 467 |
+
if ( is_wp_error( $result ) ) {
|
| 468 |
+
$order->add_order_note( __( 'Unable to capture charge!', 'woocommerce-gateway-stripe' ) . ' ' . $result->get_error_message() );
|
| 469 |
+
} else {
|
| 470 |
+
$order->add_order_note( sprintf( __( 'Stripe charge complete (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $result->id ) );
|
| 471 |
+
update_post_meta( $order_id, '_stripe_charge_captured', 'yes' );
|
| 472 |
+
|
| 473 |
+
// Store other data such as fees
|
| 474 |
+
update_post_meta( $order_id, 'Stripe Payment ID', $result->id );
|
| 475 |
+
|
| 476 |
+
if ( isset( $result->balance_transaction ) && isset( $result->balance_transaction->fee ) ) {
|
| 477 |
+
// Fees and Net needs to both come from Stripe to be accurate as the returned
|
| 478 |
+
// values are in the local currency of the Stripe account, not from WC.
|
| 479 |
+
$fee = ! empty( $result->balance_transaction->fee ) ? self::format_number( $result->balance_transaction, 'fee' ) : 0;
|
| 480 |
+
$net = ! empty( $result->balance_transaction->net ) ? self::format_number( $result->balance_transaction, 'net' ) : 0;
|
| 481 |
+
update_post_meta( $order_id, 'Stripe Fee', $fee );
|
| 482 |
+
update_post_meta( $order_id, 'Net Revenue From Stripe', $net );
|
| 483 |
+
}
|
| 484 |
}
|
| 485 |
}
|
| 486 |
}
|
| 487 |
}
|
|
|
|
| 488 |
|
| 489 |
+
/**
|
| 490 |
+
* Cancel pre-auth on refund/cancellation
|
| 491 |
+
*
|
| 492 |
+
* @param int $order_id
|
| 493 |
+
*/
|
| 494 |
+
public function cancel_payment( $order_id ) {
|
| 495 |
+
$order = wc_get_order( $order_id );
|
| 496 |
+
|
| 497 |
+
if ( 'stripe' === ( version_compare( WC_VERSION, '3.0.0', '<' ) ? $order->payment_method : $order->get_payment_method() ) ) {
|
| 498 |
+
$charge = get_post_meta( $order_id, '_stripe_charge_id', true );
|
| 499 |
+
|
| 500 |
+
if ( $charge ) {
|
| 501 |
+
$result = WC_Stripe_API::request( array(
|
| 502 |
+
'amount' => $order->get_total() * 100,
|
| 503 |
+
), 'charges/' . $charge . '/refund' );
|
| 504 |
+
|
| 505 |
+
if ( is_wp_error( $result ) ) {
|
| 506 |
+
$order->add_order_note( __( 'Unable to refund charge!', 'woocommerce-gateway-stripe' ) . ' ' . $result->get_error_message() );
|
| 507 |
+
} else {
|
| 508 |
+
$order->add_order_note( sprintf( __( 'Stripe charge refunded (Charge ID: %s)', 'woocommerce-gateway-stripe' ), $result->id ) );
|
| 509 |
+
delete_post_meta( $order_id, '_stripe_charge_captured' );
|
| 510 |
+
delete_post_meta( $order_id, '_stripe_charge_id' );
|
| 511 |
+
}
|
| 512 |
}
|
| 513 |
}
|
| 514 |
}
|
|
|
|
| 515 |
|
| 516 |
+
/**
|
| 517 |
+
* Gets saved tokens from API if they don't already exist in WooCommerce.
|
| 518 |
+
* @param array $tokens
|
| 519 |
+
* @return array
|
| 520 |
+
*/
|
| 521 |
+
public function woocommerce_get_customer_payment_tokens( $tokens, $customer_id, $gateway_id ) {
|
| 522 |
+
if ( is_user_logged_in() && 'stripe' === $gateway_id && class_exists( 'WC_Payment_Token_CC' ) ) {
|
| 523 |
+
$stripe_customer = new WC_Stripe_Customer( $customer_id );
|
| 524 |
+
$stripe_cards = $stripe_customer->get_cards();
|
| 525 |
+
$stored_tokens = array();
|
| 526 |
+
|
| 527 |
+
foreach ( $tokens as $token ) {
|
| 528 |
+
$stored_tokens[] = $token->get_token();
|
| 529 |
+
}
|
| 530 |
|
| 531 |
+
foreach ( $stripe_cards as $card ) {
|
| 532 |
+
if ( ! in_array( $card->id, $stored_tokens ) ) {
|
| 533 |
+
$token = new WC_Payment_Token_CC();
|
| 534 |
+
$token->set_token( $card->id );
|
| 535 |
+
$token->set_gateway_id( 'stripe' );
|
| 536 |
+
$token->set_card_type( strtolower( $card->brand ) );
|
| 537 |
+
$token->set_last4( $card->last4 );
|
| 538 |
+
$token->set_expiry_month( $card->exp_month );
|
| 539 |
+
$token->set_expiry_year( $card->exp_year );
|
| 540 |
+
$token->set_user_id( $customer_id );
|
| 541 |
+
$token->save();
|
| 542 |
+
$tokens[ $token->get_id() ] = $token;
|
| 543 |
+
}
|
| 544 |
}
|
| 545 |
}
|
| 546 |
+
return $tokens;
|
| 547 |
}
|
|
|
|
|
|
|
| 548 |
|
| 549 |
+
/**
|
| 550 |
+
* Delete token from Stripe
|
| 551 |
+
*/
|
| 552 |
+
public function woocommerce_payment_token_deleted( $token_id, $token ) {
|
| 553 |
+
if ( 'stripe' === $token->get_gateway_id() ) {
|
| 554 |
+
$stripe_customer = new WC_Stripe_Customer( get_current_user_id() );
|
| 555 |
+
$stripe_customer->delete_card( $token->get_token() );
|
| 556 |
+
}
|
| 557 |
}
|
|
|
|
| 558 |
|
| 559 |
+
/**
|
| 560 |
+
* Set as default in Stripe
|
| 561 |
+
*/
|
| 562 |
+
public function woocommerce_payment_token_set_default( $token_id ) {
|
| 563 |
+
$token = WC_Payment_Tokens::get( $token_id );
|
| 564 |
+
if ( 'stripe' === $token->get_gateway_id() ) {
|
| 565 |
+
$stripe_customer = new WC_Stripe_Customer( get_current_user_id() );
|
| 566 |
+
$stripe_customer->set_default_card( $token->get_token() );
|
| 567 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 568 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
| 569 |
|
| 570 |
+
/**
|
| 571 |
+
* Checks Stripe minimum order value authorized per currency
|
| 572 |
+
*/
|
| 573 |
+
public static function get_minimum_amount() {
|
| 574 |
+
// Check order amount
|
| 575 |
+
switch ( get_woocommerce_currency() ) {
|
| 576 |
+
case 'USD':
|
| 577 |
+
case 'CAD':
|
| 578 |
+
case 'EUR':
|
| 579 |
+
case 'CHF':
|
| 580 |
+
case 'AUD':
|
| 581 |
+
case 'SGD':
|
| 582 |
+
$minimum_amount = 50;
|
| 583 |
+
break;
|
| 584 |
+
case 'GBP':
|
| 585 |
+
$minimum_amount = 30;
|
| 586 |
+
break;
|
| 587 |
+
case 'DKK':
|
| 588 |
+
$minimum_amount = 250;
|
| 589 |
+
break;
|
| 590 |
+
case 'NOK':
|
| 591 |
+
case 'SEK':
|
| 592 |
+
$minimum_amount = 300;
|
| 593 |
+
break;
|
| 594 |
+
case 'JPY':
|
| 595 |
+
$minimum_amount = 5000;
|
| 596 |
+
break;
|
| 597 |
+
case 'MXN':
|
| 598 |
+
$minimum_amount = 1000;
|
| 599 |
+
break;
|
| 600 |
+
case 'HKD':
|
| 601 |
+
$minimum_amount = 400;
|
| 602 |
+
break;
|
| 603 |
+
default:
|
| 604 |
+
$minimum_amount = 50;
|
| 605 |
+
break;
|
| 606 |
+
}
|
| 607 |
+
|
| 608 |
+
return $minimum_amount;
|
| 609 |
}
|
| 610 |
|
| 611 |
+
/**
|
| 612 |
+
* What rolls down stairs
|
| 613 |
+
* alone or in pairs,
|
| 614 |
+
* and over your neighbor's dog?
|
| 615 |
+
* What's great for a snack,
|
| 616 |
+
* And fits on your back?
|
| 617 |
+
* It's log, log, log
|
| 618 |
+
*/
|
| 619 |
+
public static function log( $message ) {
|
| 620 |
+
if ( empty( self::$log ) ) {
|
| 621 |
+
self::$log = new WC_Logger();
|
| 622 |
+
}
|
| 623 |
|
| 624 |
+
self::$log->add( 'woocommerce-gateway-stripe', $message );
|
|
|
|
| 625 |
}
|
| 626 |
}
|
|
|
|
| 627 |
|
| 628 |
+
$GLOBALS['wc_stripe'] = WC_Stripe::get_instance();
|
| 629 |
|
| 630 |
endif;
|
