Added: A licensed subscription now also removes the Payment Page plugin's transaction fee on the same site (on Payment Page's free version). Requires Payment Page 1.5.4 or later.
Fixed: The Payment Page integration is more resilient — it no longer assumes Payment Page is loaded, or that its payment-method catalog has the expected shape, before reading it.
Fix: Multi-currency — the approximate CNY (¥) estimate now also appears next to the shipping, cart fee, and tax lines on the cart and checkout (classic and the WooCommerce Checkout block), and correctly includes tax when prices are displayed inclusive of tax.
Fix: WeChat Pay, Alipay, and UnionPay now appear and work on the WooCommerce Checkout block again (they were missing from the block checkout due to a packaging issue). Classic checkout was unaffected.
Fix: When a payment fails, customers can now retry it from the order-pay page (My Account → Orders) — WeChat Pay and Alipay are shown there instead of "no available payment methods."
Fix: LifterLMS — after paying with WeChat Pay or Alipay, students are taken straight to their course success page instead of being left on the payment-confirmation screen.
Improvement: Consistent WeChat Pay, Alipay, and UnionPay icon sizing on the WooCommerce Checkout block.
Fix: UnionPay now works on the classic checkout, not just the Checkout block — the card field appears and the payment completes. (Previously it stalled with no card field and left the order unpaid.) WeChat Pay and Alipay are unchanged.
Fix (security): The UnionPay card step now keeps its after-payment redirect on your own site.
Improvement: The WeChat Pay, Alipay, and UnionPay icons now show at a consistent size and line up with their labels at checkout.
Improvement: Stripe payment-confirmation webhooks are now acknowledged instantly and the order is completed in the background, so a burst of payments can no longer slow down or tie up your site. Order completion is unchanged and stays safe against duplicate or retried webhooks.
Fix: The plugin is now properly translated. Its translations previously never loaded (the loader referenced the wrong text domain) and weren't bundled. All 13 community translations from WordPress.org — Danish, German, Spanish, French, Italian, Japanese, Dutch, Portuguese, Swedish, and Simplified Chinese — now ship with the plugin and apply automatically based on your site language.
Fix: Automatic Stripe webhook creation failed on connected accounts (missing the required api_version parameter), so payment-confirmation webhooks were never registered and order completion fell back to the 24-hour cron. Webhooks now register correctly on connect.
Fix: Resolved an admin JavaScript error ("Cannot read properties of undefined (reading 'first_name')") that could block the Stripe Connect button from working.
Improvement: Storefront localization now applies WordPress's full installed language pack for the chosen locale (WordPress core, WooCommerce, blocks, theme, and plugin strings), with the plugin's curated overrides still on top. A new setting lets you force any installed language — not only Chinese. The WordPress admin stays in your site language.
Build: Cleaner customer ZIP — dev configs (phpunit.xml.dist, phpcs.xml.dist, phpstan.neon, playwright.config.js, .wp-env.json) no longer ship inside the plugin. All tests + dev tooling now live in our separate testing-suite repo. Customer-facing plugin code is byte-identical to 3.5.3.
Fix: Correct Stripe minor-unit conversion for 9 PaymentIntent.amount sites. Previously, intval( floatval( $amount ) * 100 ) could silently truncate $X.99 amounts by 1 cent (e.g. $0.99 → 98 cents) due to PHP float drift. Now routed through a new ChinaPayments\Core\CurrencyHelper::to_stripe_amount() that uses round-half-up and a full Stripe-spec 0-/2-/3-decimal currency map (16 zero-decimal currencies incl. BIF / MGA / VND / JPY; 5 three-decimal currencies BHD / KWD / OMR / JOD / TND).
Fix: Stripe webhook now returns proper HTTP 400 on unsigned or invalid-signature payloads. Previously http_response_code() was a no-op inside the WP REST controller, causing all failure responses to ship as HTTP 200 (Stripe interprets 200 as "stop retrying"). Switched all responses to new WP_REST_Response( $body, $status ).
Fix: Webhook now catches \Stripe\Exception\SignatureVerificationException explicitly, returning 400 instead of 500 on bad signatures.
Security: Migration AJAX handler (wp_ajax_china_payments_migration_handler) now verifies a check_ajax_referer() nonce in addition to its existing capability check.
i18n: Two __( 'Order' ) calls in the WooCommerce gateway were missing the wp-stripe-global-payments text domain — now translatable. One __() call in the payment-gateway REST file had a stray third argument (silently misclassifying the text domain) — corrected.
Compat: WooCommerce HPOS (custom order tables) compatibility declaration locked under regression tests.
Compat: Declared HPOS (High-Performance Order Storage) compatibility for WooCommerce 8.x+. Removes the "Plugin is not compatible" warning on stores with the new custom-order-tables data store enabled.
Fix: UnionPay icon max-width set to 128px to match its native aspect ratio in WooCommerce classic + block checkouts (was rendering too small).