mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-03 08:37:53 +08:00
Merge branch 'trunk' into pcp-178-gateways
This commit is contained in:
commit
ccf3c88432
7 changed files with 129 additions and 108 deletions
23
.travis.yml
23
.travis.yml
|
@ -1,23 +0,0 @@
|
||||||
language: php
|
|
||||||
os: linux
|
|
||||||
dist: xenial
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
|
|
||||||
php:
|
|
||||||
- 7.0
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
- trunk
|
|
||||||
- compat/ppxo
|
|
||||||
|
|
||||||
script: |
|
|
||||||
CHANGED_FILES=`git diff --name-only --diff-filter=ACMR $TRAVIS_COMMIT_RANGE | grep \\\\.php | awk '{print}' ORS=' '`
|
|
||||||
|
|
||||||
if [ "$CHANGED_FILES" != "" ]; then
|
|
||||||
composer global require woocommerce/woocommerce-sniffs --update-with-all-dependencies
|
|
||||||
$HOME/.config/composer/vendor/bin/phpcs -p $CHANGED_FILES
|
|
||||||
fi
|
|
|
@ -68,11 +68,11 @@ class Payee {
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
public function to_array(): array {
|
public function to_array(): array {
|
||||||
$data = array(
|
$data = array();
|
||||||
'email_address' => $this->email(),
|
|
||||||
);
|
|
||||||
if ( $this->merchant_id ) {
|
if ( $this->merchant_id ) {
|
||||||
$data['merchant_id'] = $this->merchant_id();
|
$data['merchant_id'] = $this->merchant_id();
|
||||||
|
} else {
|
||||||
|
$data['email_address'] = $this->email();
|
||||||
}
|
}
|
||||||
return $data;
|
return $data;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,13 +26,8 @@ class PayeeFactory {
|
||||||
* @throws RuntimeException When JSON object is malformed.
|
* @throws RuntimeException When JSON object is malformed.
|
||||||
*/
|
*/
|
||||||
public function from_paypal_response( \stdClass $data ) {
|
public function from_paypal_response( \stdClass $data ) {
|
||||||
if ( ! isset( $data->email_address ) ) {
|
$email = ( isset( $data->email_address ) ) ? $data->email_address : '';
|
||||||
throw new RuntimeException(
|
|
||||||
__( 'No email for payee given.', 'woocommerce-paypal-payments' )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
$merchant_id = ( isset( $data->merchant_id ) ) ? $data->merchant_id : '';
|
$merchant_id = ( isset( $data->merchant_id ) ) ? $data->merchant_id : '';
|
||||||
return new Payee( $data->email_address, $merchant_id );
|
return new Payee( $email, $merchant_id );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,6 +8,8 @@ class CreditCardRenderer {
|
||||||
this.spinner = spinner;
|
this.spinner = spinner;
|
||||||
this.cardValid = false;
|
this.cardValid = false;
|
||||||
this.formValid = false;
|
this.formValid = false;
|
||||||
|
this.currentHostedFieldsInstance = null;
|
||||||
|
this.formSubmissionSubscribed = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
render(wrapper, contextConfig) {
|
render(wrapper, contextConfig) {
|
||||||
|
@ -31,6 +33,12 @@ class CreditCardRenderer {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.currentHostedFieldsInstance) {
|
||||||
|
this.currentHostedFieldsInstance.teardown()
|
||||||
|
.catch(err => console.error(`Hosted fields teardown error: ${err}`));
|
||||||
|
this.currentHostedFieldsInstance = null;
|
||||||
|
}
|
||||||
|
|
||||||
const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
|
const gateWayBox = document.querySelector('.payment_box.payment_method_ppcp-credit-card-gateway');
|
||||||
const oldDisplayStyle = gateWayBox.style.display;
|
const oldDisplayStyle = gateWayBox.style.display;
|
||||||
gateWayBox.style.display = 'block';
|
gateWayBox.style.display = 'block';
|
||||||
|
@ -92,36 +100,10 @@ class CreditCardRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}).then(hostedFields => {
|
}).then(hostedFields => {
|
||||||
const submitEvent = (event) => {
|
this.currentHostedFieldsInstance = hostedFields;
|
||||||
this.spinner.block();
|
|
||||||
if (event) {
|
|
||||||
event.preventDefault();
|
|
||||||
}
|
|
||||||
this.errorHandler.clear();
|
|
||||||
|
|
||||||
if (this.formValid && this.cardValid) {
|
hostedFields.on('inputSubmitRequest', () => {
|
||||||
const save_card = this.defaultConfig.save_card ? true : false;
|
this._submit(contextConfig);
|
||||||
const vault = document.getElementById('ppcp-credit-card-vault') ?
|
|
||||||
document.getElementById('ppcp-credit-card-vault').checked : save_card;
|
|
||||||
hostedFields.submit({
|
|
||||||
contingencies: ['SCA_WHEN_REQUIRED'],
|
|
||||||
vault: vault
|
|
||||||
}).then((payload) => {
|
|
||||||
payload.orderID = payload.orderId;
|
|
||||||
this.spinner.unblock();
|
|
||||||
return contextConfig.onApprove(payload);
|
|
||||||
}).catch(() => {
|
|
||||||
this.errorHandler.genericError();
|
|
||||||
this.spinner.unblock();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.spinner.unblock();
|
|
||||||
const message = ! this.cardValid ? this.defaultConfig.hosted_fields.labels.card_not_supported : this.defaultConfig.hosted_fields.labels.fields_not_valid;
|
|
||||||
this.errorHandler.message(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
hostedFields.on('inputSubmitRequest', function () {
|
|
||||||
submitEvent(null);
|
|
||||||
});
|
});
|
||||||
hostedFields.on('cardTypeChange', (event) => {
|
hostedFields.on('cardTypeChange', (event) => {
|
||||||
if ( ! event.cards.length ) {
|
if ( ! event.cards.length ) {
|
||||||
|
@ -137,11 +119,18 @@ class CreditCardRenderer {
|
||||||
});
|
});
|
||||||
this.formValid = formValid;
|
this.formValid = formValid;
|
||||||
|
|
||||||
})
|
});
|
||||||
document.querySelector(wrapper + ' button').addEventListener(
|
|
||||||
'click',
|
if (!this.formSubmissionSubscribed) {
|
||||||
submitEvent
|
document.querySelector(wrapper + ' button').addEventListener(
|
||||||
);
|
'click',
|
||||||
|
event => {
|
||||||
|
event.preventDefault();
|
||||||
|
this._submit(contextConfig);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
this.formSubmissionSubscribed = true;
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(
|
document.querySelector('#payment_method_ppcp-credit-card-gateway').addEventListener(
|
||||||
|
@ -151,5 +140,36 @@ class CreditCardRenderer {
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_submit(contextConfig) {
|
||||||
|
this.spinner.block();
|
||||||
|
this.errorHandler.clear();
|
||||||
|
|
||||||
|
if (this.formValid && this.cardValid) {
|
||||||
|
const save_card = this.defaultConfig.save_card ? true : false;
|
||||||
|
const vault = document.getElementById('ppcp-credit-card-vault') ?
|
||||||
|
document.getElementById('ppcp-credit-card-vault').checked : save_card;
|
||||||
|
const contingency = this.defaultConfig.hosted_fields.contingency;
|
||||||
|
const hostedFieldsData = {
|
||||||
|
vault: vault
|
||||||
|
};
|
||||||
|
if (contingency !== 'NO_3D_SECURE') {
|
||||||
|
hostedFieldsData.contingencies = [contingency];
|
||||||
|
}
|
||||||
|
this.currentHostedFieldsInstance.submit(hostedFieldsData).then((payload) => {
|
||||||
|
payload.orderID = payload.orderId;
|
||||||
|
this.spinner.unblock();
|
||||||
|
return contextConfig.onApprove(payload);
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
this.errorHandler.genericError();
|
||||||
|
this.spinner.unblock();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.spinner.unblock();
|
||||||
|
const message = ! this.cardValid ? this.defaultConfig.hosted_fields.labels.card_not_supported : this.defaultConfig.hosted_fields.labels.fields_not_valid;
|
||||||
|
this.errorHandler.message(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
export default CreditCardRenderer;
|
export default CreditCardRenderer;
|
||||||
|
|
|
@ -601,6 +601,19 @@ class SmartButton implements SmartButtonInterface {
|
||||||
return $this->subscription_helper->cart_contains_subscription();
|
return $this->subscription_helper->cart_contains_subscription();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the 3D Secure contingency settings.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function get_3ds_contingency(): string {
|
||||||
|
if ( $this->settings->has( '3d_secure_contingency' ) ) {
|
||||||
|
return $this->settings->get( '3d_secure_contingency' );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'SCA_WHEN_REQUIRED';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The localized data for the smart button.
|
* The localized data for the smart button.
|
||||||
*
|
*
|
||||||
|
@ -677,6 +690,7 @@ class SmartButton implements SmartButtonInterface {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
'valid_cards' => $this->dcc_applies->valid_cards(),
|
'valid_cards' => $this->dcc_applies->valid_cards(),
|
||||||
|
'contingency' => $this->get_3ds_contingency(),
|
||||||
),
|
),
|
||||||
'messages' => $this->message_values(),
|
'messages' => $this->message_values(),
|
||||||
'labels' => array(
|
'labels' => array(
|
||||||
|
|
|
@ -1846,6 +1846,62 @@ return array(
|
||||||
),
|
),
|
||||||
'gateway' => 'dcc',
|
'gateway' => 'dcc',
|
||||||
),
|
),
|
||||||
|
'3d_secure_heading' => array(
|
||||||
|
'heading' => __( '3D Secure', 'woocommerce-paypal-payments' ),
|
||||||
|
'type' => 'ppcp-heading',
|
||||||
|
'description' => wp_kses_post(
|
||||||
|
sprintf(
|
||||||
|
// translators: %1$s and %2$s is a link tag.
|
||||||
|
__(
|
||||||
|
'3D Secure benefits cardholders and merchants by providing
|
||||||
|
an additional layer of verification using Verified by Visa,
|
||||||
|
MasterCard SecureCode and American Express SafeKey.
|
||||||
|
%1$sLearn more about 3D Secure.%2$s',
|
||||||
|
'woocommerce-paypal-payments'
|
||||||
|
),
|
||||||
|
'<a
|
||||||
|
rel="noreferrer noopener"
|
||||||
|
href="https://woocommerce.com/posts/introducing-strong-customer-authentication-sca/"
|
||||||
|
>',
|
||||||
|
'</a>'
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'screens' => array(
|
||||||
|
State::STATE_ONBOARDED,
|
||||||
|
),
|
||||||
|
'requirements' => array(
|
||||||
|
'dcc',
|
||||||
|
),
|
||||||
|
'gateway' => 'dcc',
|
||||||
|
),
|
||||||
|
'3d_secure_contingency' => array(
|
||||||
|
'title' => __( 'Contingency for 3D Secure', 'woocommerce-paypal-payments' ),
|
||||||
|
'type' => 'select',
|
||||||
|
'description' => sprintf(
|
||||||
|
// translators: %1$s and %2$s opening and closing ul tag, %3$s and %4$s opening and closing li tag.
|
||||||
|
__( '%1$s%3$sNo 3D Secure will cause transactions to be denied if 3D Secure is required by the bank of the cardholder.%4$s%3$sSCA_WHEN_REQUIRED returns a 3D Secure contingency when it is a mandate in the region where you operate.%4$s%3$sSCA_ALWAYS triggers 3D Secure for every transaction, regardless of SCA requirements.%4$s%2$s', 'woocommerce-paypal-payments' ),
|
||||||
|
'<ul>',
|
||||||
|
'</ul>',
|
||||||
|
'<li>',
|
||||||
|
'</li>'
|
||||||
|
),
|
||||||
|
'class' => array(),
|
||||||
|
'input_class' => array( 'wc-enhanced-select' ),
|
||||||
|
'default' => 'SCA_WHEN_REQUIRED',
|
||||||
|
'desc_tip' => true,
|
||||||
|
'options' => array(
|
||||||
|
'NO_3D_SECURE' => __( 'No 3D Secure (transaction will be denied if 3D Secure is required)', 'woocommerce-paypal-payments' ),
|
||||||
|
'SCA_WHEN_REQUIRED' => __( '3D Secure when required', 'woocommerce-paypal-payments' ),
|
||||||
|
'3D_SECURE' => __( 'Always trigger 3D Secure', 'woocommerce-paypal-payments' ),
|
||||||
|
),
|
||||||
|
'screens' => array(
|
||||||
|
State::STATE_ONBOARDED,
|
||||||
|
),
|
||||||
|
'requirements' => array(
|
||||||
|
'dcc',
|
||||||
|
),
|
||||||
|
'gateway' => 'dcc',
|
||||||
|
),
|
||||||
);
|
);
|
||||||
if ( ! defined( 'PPCP_FLAG_SUBSCRIPTION' ) || ! PPCP_FLAG_SUBSCRIPTION ) {
|
if ( ! defined( 'PPCP_FLAG_SUBSCRIPTION' ) || ! PPCP_FLAG_SUBSCRIPTION ) {
|
||||||
unset( $fields['vault_enabled'] );
|
unset( $fields['vault_enabled'] );
|
||||||
|
|
|
@ -394,8 +394,6 @@ class SettingsRenderer {
|
||||||
if ( $this->dcc_applies->for_country_currency() ) {
|
if ( $this->dcc_applies->for_country_currency() ) {
|
||||||
if ( State::STATE_ONBOARDED > $this->state->current_state() ) {
|
if ( State::STATE_ONBOARDED > $this->state->current_state() ) {
|
||||||
$this->render_dcc_onboarding_info();
|
$this->render_dcc_onboarding_info();
|
||||||
} elseif ( State::STATE_ONBOARDED === $this->state->current_state() && $this->dcc_product_status->dcc_is_active() ) {
|
|
||||||
$this->render_3d_secure_info();
|
|
||||||
} elseif ( ! $this->dcc_product_status->dcc_is_active() ) {
|
} elseif ( ! $this->dcc_product_status->dcc_is_active() ) {
|
||||||
$this->render_dcc_not_active_yet();
|
$this->render_dcc_not_active_yet();
|
||||||
}
|
}
|
||||||
|
@ -445,45 +443,6 @@ class SettingsRenderer {
|
||||||
<?php
|
<?php
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the 3d secure info text.
|
|
||||||
*/
|
|
||||||
private function render_3d_secure_info() {
|
|
||||||
?>
|
|
||||||
<tr>
|
|
||||||
<th><?php esc_html_e( '3D Secure', 'woocommerce-paypal-payments' ); ?></th>
|
|
||||||
<td>
|
|
||||||
<p>
|
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* We still need to provide a docs link.
|
|
||||||
*
|
|
||||||
* @todo: Provide link to documentation.
|
|
||||||
*/
|
|
||||||
echo wp_kses_post(
|
|
||||||
sprintf(
|
|
||||||
// translators: %1$s and %2$s is a link tag.
|
|
||||||
__(
|
|
||||||
'3D Secure benefits cardholders and merchants by providing
|
|
||||||
an additional layer of verification using Verified by Visa,
|
|
||||||
MasterCard SecureCode and American Express SafeKey.
|
|
||||||
%1$sLearn more about 3D Secure.%2$s',
|
|
||||||
'woocommerce-paypal-payments'
|
|
||||||
),
|
|
||||||
'<a
|
|
||||||
rel="noreferrer noopener"
|
|
||||||
href="https://woocommerce.com/posts/introducing-strong-customer-authentication-sca/"
|
|
||||||
>',
|
|
||||||
'</a>'
|
|
||||||
)
|
|
||||||
);
|
|
||||||
?>
|
|
||||||
</p>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<?php
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders the DCC onboarding info.
|
* Renders the DCC onboarding info.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue