Updated to change the branding from SagePay to Opayo
1.0.2
Raised Tested up to WordPress 6.9.4 in the plugin header and readme.
1.0.3
Gravity Forms: minimum version 2.5; aligned with current Payment Add-On patterns; subscribe() returns a clear error (subscriptions are not implemented for this gateway).
Feed settings: billing First/Last name mappings use get_field / replace_field and scan nested Address-style field maps (no brittle fixed section index).
Billing data for Opayo: ISO 3166-1 alpha-2 country codes (UK→GB, common alpha-3 map, Gravity Forms country helpers); resolve country from submission, entry, and Address field .6 when needed; clear validation if country is missing.
Billing address: resolve street, city, state, postcode, email, and phone from submission data, entry, and Address sub-inputs .1–.5; promote line 2 to line 1 when line 1 is empty; trim values to typical Opayo field lengths.
Callback / IPN: validate oid, session, and entry; per-feed test/live mode for gateway URLs; home_url()-based IPN URLs; sanitized inputs; escaped output on challenge and status pages; HOUR_IN_SECONDS for transients where used.
3-D Secure: optional parent page with embedded iframe for the challenge (filter gf_sagepay_direct_3ds_use_iframe to disable if an issuer blocks iframes); after authentication, redirect targets the top window using session state so the thank-you page is not trapped inside the frame (ACS may omit query parameters on return).
Reliability: JSON.stringify for delayed-notification IDs; strict notification ID matching; fixed error URL message parameter (legacy meesage still accepted); update_post_meta only when the entry has a post_id; HTTP timeouts and default TLS verification for gateway wp_remote_post calls; wp_safe_redirect / confirmation redirects where appropriate.