The WooCommerce plugin comes with its own free version of PayPal Standard. PayPal can be enabled via the WooCommerce settings and once your PayPal email is entered your WooCommerce shop is ready to take PayPal payments.
Now, there is extensive documentation online which explains, with a little bit of code, how to switch PayPal account programmatically and conditionally i.e. for a given product ID or product category slug. For example, you may want to use a PayPal account for consulting services, another for online courses and another for physical products.
By adding this simple code and hooking into woocommerce_paypal_args is indeed possible to use different / multiple PayPal Standard accounts in a single WooCommerce installation.
However, there is an outstanding problem with “IPN Validation“: once you tell WooCommerce to use a different PayPal email account, the WooCommerce order is correctly placed, but its status goes “on hold” because IPN validation on the PayPal end fails (and that’s because you’re using a different PayPal account).
So, here’s the fully working version, included the IPN validation fix. Please read the disclaimer below and – only then – enjoy!
PHP Snippet: Use Different PayPal Standard Account For a Product ID @ WooCommerce Checkout
/**
* @snippet Switch PayPal Account @ WooCommerce Checkout
* @how-to Get tutoraspire.com FREE
* @author Tutor Aspire, BusinessBloomer.com
* @testedwith WooCommerce 4.6
* @donate $9 https://tutoraspire.com
*/
// -------------------
// 1. Switch PayPal email for Product ID
add_filter( 'woocommerce_paypal_args' , 'tutoraspire_switch_paypal_email_based_product', 9999, 2 );
function tutoraspire_switch_paypal_email_based_product( $paypal_args, $order ) {
foreach ( $order->get_items() as $item_id => $item ) {
// ENTER PRODUCT ID HERE
if ( 123456 == $item->get_product_id() ) {
// ENTER OTHER PAYPAL EMAIL HERE
$paypal_args['business'] = '[email protected]';
break;
}
}
return $paypal_args;
}
// -------------------
// 2. Avoid IPN Failure after switching PayPal email for Product ID
require_once WC()->plugin_path() . '/includes/gateways/paypal/includes/class-wc-gateway-paypal-ipn-handler.php';
class WC_Gateway_Paypal_IPN_Handler_Switch extends WC_Gateway_Paypal_IPN_Handler {
protected function validate_receiver_email( $order, $receiver_email ) {
if ( strcasecmp( trim( $receiver_email ), trim( $this->receiver_email ) ) !== 0 ) {
// ENTER HERE SAME PAYPAL EMAIL USED ABOVE
if ( $receiver_email != '[email protected]' ) {
WC_Gateway_Paypal::log( "IPN Response is for another account: {$receiver_email}. Your email is {$this->receiver_email}" );
$order->update_status( 'on-hold', sprintf( __( 'Validation error: PayPal IPN response from a different email address (%s).', 'woocommerce' ), $receiver_email ) );
exit;
}
}
}
}
new WC_Gateway_Paypal_IPN_Handler_Switch();
Is There a (Reliable) Plugin For That?
If you’d love to code but don’t feel 100% confident with PHP, I decided to look for a reliable plugin that achieves the same result (well, actually it gives you more).
In this case, I recommend the WooCommerce Multiple PayPal Accounts Plugin. On top of sending the whole order total to a different PayPal account based on total, billing country, category, tag, user role, shipping class, currency, you can also split payments between PayPal accounts, keep a commission as a store owner, integrate with WC Vendors and Dokan and much more.
But in case you hate plugins and wish to code (or wish to try that), then keep reading 🙂