{"id":396265,"date":"2026-11-06T08:09:32","date_gmt":"2026-11-06T08:09:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/paymos-for-easy-digital-downloads\/"},"modified":"2026-11-06T08:09:12","modified_gmt":"2026-11-06T08:09:12","slug":"paymos-easy-digital-downloads","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/paymos-easy-digital-downloads\/","author":23593504,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.2","stable_tag":"1.6.2","tested":"7.1.4","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Paymos for Easy Digital Downloads","header_author":"Paymos","header_description":"Accept stablecoin payments in Easy Digital Downloads through Paymos.","assets_banners_color":"","last_updated":"2026-11-06 08:09:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/paymos.io\/docs\/cms-easy-digital-downloads","header_author_uri":"https:\/\/paymos.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":127,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.6.2":{"tag":"1.6.2","author":"paymos","date":"2026-11-06 08:09:12","revision":3787430}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3787430,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3787430,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.6.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[5484,1887,231844,209195,204245],"plugin_category":[45],"plugin_contributors":[289198],"plugin_business_model":[],"class_list":["post-396265","plugin","type-plugin","status-publish","hentry","plugin_tags-easy-digital-downloads","plugin_tags-payments","plugin_tags-stablecoin","plugin_tags-usdc","plugin_tags-usdt","plugin_category-ecommerce","plugin_contributors-paymos","plugin_committers-paymos"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/paymos-easy-digital-downloads\/assets\/icon-128x128.png?rev=3787430","icon_2x":"https:\/\/ps.w.org\/paymos-easy-digital-downloads\/assets\/icon-256x256.png?rev=3787430","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>The official package contains no merchant credentials. Open Downloads -&gt; Settings -&gt; Payments -&gt; Paymos and click Connect Paymos. Approve the current project in Paymos; the plugin receives Sandbox and Live credentials once, stores them in an AES-256-GCM encrypted WordPress option, and discards the short-lived OAuth token.<\/p>\n\n<p>Runtime Merchant API requests remain HMAC signed. Signed webhooks update invoices without a local invoice reconciliation job: a delivery that fails is retried by Paymos across roughly 16 hours, and anything that outlives the ladder is replayed from the Paymos dashboard. Pending refunds are reconciled locally by a 1-minute WP-Cron job (<code>paymos_edd_refunds_reconcile<\/code>).<\/p>\n\n<h3>External services<\/h3>\n\n<p>Paymos handles payment requests for this Easy Digital Downloads gateway. To connect, click <strong>Connect Paymos<\/strong> in your WordPress admin and approve the connection in Paymos. Device authorization starts at <code>https:\/\/app.paymos.io\/connect\/cms\/device<\/code>; the plugin polls <code>https:\/\/app.paymos.io\/connect\/token<\/code> for approval. The browser approval URL carries the plugin identifier, store origin, admin return URL, and <code>user_code<\/code>. The plugin sends the secret <code>device_code<\/code> to the token endpoint. It stores the returned Sandbox and Live credentials in AES-256-GCM-encrypted WordPress options and discards the short-lived OAuth token.<\/p>\n\n<p>For payments, the plugin creates invoices at <code>https:\/\/api.paymos.io\/v1\/invoices<\/code>, checks them with <code>GET \/v1\/invoices\/{invoice_id}<\/code>, and cancels them with <code>POST \/v1\/invoices\/{invoice_id}\/cancel<\/code>. Each signed request sends a key ID, timestamp, and HMAC signature. The API secret stays with the plugin for signing. Invoice fields include <code>project_id<\/code>, <code>amount<\/code>, <code>currency<\/code>, <code>external_order_id<\/code>, and, when available, the native customer ID as <code>client_id<\/code>. New orders use a random opaque reference. Existing references remain in use and can contain an EDD purchase key.<\/p>\n\n<p>For refunds, the plugin sends <code>POST \/v1\/refunds<\/code> requests to <code>https:\/\/api.paymos.io\/v1\/refunds<\/code> with only <code>invoice_id<\/code>, <code>mode<\/code> (<code>full<\/code> or <code>overpayment<\/code>), and <code>external_order_id<\/code>; Paymos returns funds strictly to the verified <code>first_sender<\/code> address recorded on the invoice. The plugin checks individual refund status with <code>GET \/v1\/refunds\/{refund_id}<\/code>, polls cursor-paginated refund pages with <code>GET \/v1\/refunds<\/code> (<code>cursor<\/code>, <code>limit<\/code>, <code>invoice_id<\/code>, and <code>status<\/code>), and in Sandbox mode simulates terminal outcomes with <code>POST \/v1\/sandbox\/refunds\/{refund_id}\/simulate<\/code> sending <code>status<\/code> (<code>completed<\/code>, <code>failed<\/code>, or <code>cancelled<\/code>). Pending refunds are polled by a 1-minute WP-Cron job (<code>paymos_edd_refunds_reconcile<\/code>).<\/p>\n\n<p>Buyers pay over HTTPS at <code>https:\/\/checkout.paymos.io<\/code>. Signed invoice and payment webhooks return to the store to update orders. Service terms and data handling appear in the <a href=\"https:\/\/paymos.io\/terms\">Terms<\/a> and <a href=\"https:\/\/paymos.io\/privacy\">Privacy Policy<\/a>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the official release.<\/li>\n<li>Open the intended project in Paymos; that current project is used automatically.<\/li>\n<li>Open Downloads -&gt; Settings -&gt; Payments -&gt; Paymos.<\/li>\n<li>Click Connect Paymos and approve the displayed store URL and current project.<\/li>\n<li>Test in Sandbox, then switch to Live.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20zip%20contain%20secrets%3F\"><h3>Does the ZIP contain secrets?<\/h3><\/dt>\n<dd><p>No. Every merchant downloads the same public package.<\/p><\/dd>\n<dt id=\"where%20are%20credentials%20stored%3F\"><h3>Where are credentials stored?<\/h3><\/dt>\n<dd><p>In a non-autoloaded WordPress option encrypted with AES-256-GCM using installation security salts.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>fix(cms): align marketplace manifests, refund copy, store links, and release guards<\/li>\n<li>chore: bundle Paymos PHP SDK v1.9.1<\/li>\n<li>chore: rebuild canonical CMS package<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>fix(plugins): use wp_add_inline_script, sanitize nonces before wp_verify_nonce, and guard curl_close on PHP 8+<\/li>\n<li><p>chore: bundle Paymos PHP SDK v1.9.1<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>feat(refunds): finalize clean merchant refunds spec, SDKs, CMS plugins, and targeted test scripts<\/li>\n<li>wip: snapshot shared working tree before merging main<\/li>\n<li>wip(refunds): merchant refund plugin work (CMS adapters, PHP SDK, tests) - unverified WIP snapshot<\/li>\n<li>chore: bundle Paymos PHP SDK v1.9.0<\/li>\n<li><p>chore: rebuild canonical CMS package<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li><p>chore: bundle Paymos PHP SDK v1.8.1<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li><p>chore: rebuild canonical CMS package<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li><p>fix(edd): validate refund controls and prepare directory database queries<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li><p>fix(plugins): require helper-complete PHP SDK for refunds<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>fix(ton): return friendly addresses with existing webhook schema<\/li>\n<li>feat(edd): native refund adapter for full and overpayment refunds<\/li>\n<li>fix(edd): refuse native refunds that bypass the Paymos gateway<\/li>\n<li>fix(edd): prepare clean WordPress.org distribution<\/li>\n<li>chore: bundle Paymos PHP SDK v1.8.0<\/li>\n<li><p>chore: rebuild canonical CMS package<\/p><\/li>\n<li><p>Moved optional Paymos diagnostics from PHP error_log to the EDD debug log, with masking for supported key patterns. Logging remains off by default.<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.4.10<\/h4>\n\n<ul>\n<li><p>chore: rebuild canonical CMS package<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>\n\n<h4>1.4.9<\/h4>\n\n<ul>\n<li><p>chore: rebuild canonical CMS package<\/p><\/li>\n<li><p>Compare amounts as exact decimals and require complete invoice snapshots plus API confirmation before changing payment state.<\/p><\/li>\n<li>Serialize order updates and recover when native payment completion returns <code>false<\/code> from save or status updates.<\/li>\n<li>Check ownership when updating event reservations, and purge at most 100 expired records per reservation.<\/li>\n<\/ul>\n\n<p>Fixed:\n* Entries that were present, non-empty and still English \u2014 <code>Connect Paymos<\/code> in\n  German and Spanish, the plugin name in Turkish and Chinese, <code>Webhook URL<\/code> in\n  Chinese \u2014 and one string missing from every catalogue\n  (<code>in the invoice currency<\/code>, the fallback in the underpayment notice).\n* A late non-final webhook could reopen a finished order. Webhooks are\n  delivered at least once and in no particular order, and only paid orders were\n  guarded: an <code>invoice.underpaid_waiting<\/code> or <code>invoice.confirming<\/code> arriving after\n  the invoice had already ended underpaid, expired or cancelled moved the order\n  back into an open state. Nothing leaves a final status on the server, so once\n  one is recorded for an invoice every later event for it is ignored and the\n  final status stays recorded.\n* A new invoice now resets the Paymos status recorded on the payment, so an\n  event for it is never taken for a stale one after an earlier final status.\n* A webhook retry that arrived while the first delivery was still being\n  processed was answered 200 \"duplicate\". Paymos gives a delivery 10 seconds and\n  retries, while a slow reverse-verification call can take longer; the retry was\n  acknowledged as delivered, and if the first attempt then failed the event was\n  lost. An event that is only locked, not yet committed, is now answered 409 so\n  Paymos tries again, and the lock the first delivery holds is left alone.<\/p>","raw_excerpt":"Accept stablecoin payments in Easy Digital Downloads with Paymos hosted checkout.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/396265","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=396265"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/paymos"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=396265"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=396265"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=396265"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=396265"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=396265"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=396265"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}