[{"data":1,"prerenderedAt":2394},["ShallowReactive",2],{"navigation":3,"external-navigation":214,"external_core:\u002Fcore\u002Fprocessors\u002Fepay":443},[4,8,201],{"title":5,"path":6,"stem":7},"Documentation","\u002F","README",{"title":9,"path":10,"stem":11,"children":12},"EOS","\u002Feos","eos\u002FREADME",[13,44,121,181],{"title":14,"collapsed":15,"path":16,"stem":17,"children":18,"page":43},"Adrs",true,"\u002Feos\u002Fadrs","eos\u002Fadrs",[19,23,27,31,35,39],{"title":20,"path":21,"stem":22},"Use Turborepo for the EOS monorepo","\u002Feos\u002Fadrs\u002F0001-use-turborepo-for-eos","eos\u002Fadrs\u002F0001-use-turborepo-for-eos",{"title":24,"path":25,"stem":26},"Use Oxc for linting and formatting","\u002Feos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting","eos\u002Fadrs\u002F0003-use-oxc-for-linting-and-formatting",{"title":28,"path":29,"stem":30},"Lint Markdown and validate links in CI","\u002Feos\u002Fadrs\u002F0004-lint-markdown-in-ci","eos\u002Fadrs\u002F0004-lint-markdown-in-ci",{"title":32,"path":33,"stem":34},"Use Lefthook for repository-managed Git hooks","\u002Feos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks","eos\u002Fadrs\u002F0005-use-lefthook-for-repository-git-hooks",{"title":36,"path":37,"stem":38},"Use Commitlint's conventional configuration","\u002Feos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration","eos\u002Fadrs\u002F0006-use-commitlint-conventional-configuration",{"title":40,"path":41,"stem":42},"Use Nx for EOS task execution","\u002Feos\u002Fadrs\u002F0007-use-nx-for-eos","eos\u002Fadrs\u002F0007-use-nx-for-eos",false,{"title":45,"path":46,"stem":47,"children":48},"Harbourmaster","\u002Feos\u002Fharbourmaster","eos\u002Fharbourmaster\u002FREADME",[49,58,71,96],{"title":50,"path":51,"stem":52,"children":53,"page":43},"Decisions","\u002Feos\u002Fharbourmaster\u002Fdecisions","eos\u002Fharbourmaster\u002Fdecisions",[54],{"title":55,"path":56,"stem":57},"AI-50: GitHub auth and fork pull request policy","\u002Feos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy","eos\u002Fharbourmaster\u002Fdecisions\u002Fai-50-auth-and-fork-policy",{"title":59,"path":60,"stem":61,"children":62,"page":43},"Explanation","\u002Feos\u002Fharbourmaster\u002Fexplanation","eos\u002Fharbourmaster\u002Fexplanation",[63,67],{"title":64,"path":65,"stem":66},"The Harbourmaster review pipeline","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline","eos\u002Fharbourmaster\u002Fexplanation\u002Freview-pipeline",{"title":68,"path":69,"stem":70},"The Harbourmaster shared-action trust boundary","\u002Feos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary","eos\u002Fharbourmaster\u002Fexplanation\u002Fshared-action-trust-boundary",{"title":72,"path":73,"stem":74,"children":75,"page":43},"How To","\u002Feos\u002Fharbourmaster\u002Fhow-to","eos\u002Fharbourmaster\u002Fhow-to",[76,80,84,88,92],{"title":77,"path":78,"stem":79},"How to add Harbourmaster reviews to a repository","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository","eos\u002Fharbourmaster\u002Fhow-to\u002Fadd-harbourmaster-to-a-repository",{"title":81,"path":82,"stem":83},"How to build a pilot dashboard","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard","eos\u002Fharbourmaster\u002Fhow-to\u002Fbuild-pilot-dashboard",{"title":85,"path":86,"stem":87},"How to configure model routing","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing","eos\u002Fharbourmaster\u002Fhow-to\u002Fconfigure-model-routing",{"title":89,"path":90,"stem":91},"How to request a Harbourmaster review","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Frequest-a-review",{"title":93,"path":94,"stem":95},"How to diagnose a Harbourmaster review failure","\u002Feos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review","eos\u002Fharbourmaster\u002Fhow-to\u002Ftroubleshoot-a-review",{"title":97,"path":98,"stem":99,"children":100,"page":43},"Reference","\u002Feos\u002Fharbourmaster\u002Freference","eos\u002Fharbourmaster\u002Freference",[101,105,109,113,117],{"title":102,"path":103,"stem":104},"Harbourmaster command-line interface","\u002Feos\u002Fharbourmaster\u002Freference\u002Fcli","eos\u002Fharbourmaster\u002Freference\u002Fcli",{"title":106,"path":107,"stem":108},"Harbourmaster configuration","\u002Feos\u002Fharbourmaster\u002Freference\u002Fconfiguration","eos\u002Fharbourmaster\u002Freference\u002Fconfiguration",{"title":110,"path":111,"stem":112},"Harbourmaster GitHub Action","\u002Feos\u002Fharbourmaster\u002Freference\u002Fgithub-action","eos\u002Fharbourmaster\u002Freference\u002Fgithub-action",{"title":114,"path":115,"stem":116},"Harbourmaster review behavior","\u002Feos\u002Fharbourmaster\u002Freference\u002Freview-behavior","eos\u002Fharbourmaster\u002Freference\u002Freview-behavior",{"title":118,"path":119,"stem":120},"Harbourmaster telemetry","\u002Feos\u002Fharbourmaster\u002Freference\u002Ftelemetry","eos\u002Fharbourmaster\u002Freference\u002Ftelemetry",{"title":72,"path":122,"stem":123,"children":124,"page":43},"\u002Feos\u002Fhow-to","eos\u002Fhow-to",[125,129,133,137,141,145,149,153,157,161,165,169,173,177],{"title":126,"path":127,"stem":128},"How to add an external documentation source","\u002Feos\u002Fhow-to\u002Fadd-external-documentation-source","eos\u002Fhow-to\u002Fadd-external-documentation-source",{"title":130,"path":131,"stem":132},"How to connect SDLC integrations","\u002Feos\u002Fhow-to\u002Fconnect-sdlc-integrations","eos\u002Fhow-to\u002Fconnect-sdlc-integrations",{"title":134,"path":135,"stem":136},"How to consume the EOS plugin marketplace","\u002Feos\u002Fhow-to\u002Fconsume-eos-marketplace","eos\u002Fhow-to\u002Fconsume-eos-marketplace",{"title":138,"path":139,"stem":140},"How to create a spike ticket","\u002Feos\u002Fhow-to\u002Fcreate-spike-ticket","eos\u002Fhow-to\u002Fcreate-spike-ticket",{"title":142,"path":143,"stem":144},"How to finalise a repository change","\u002Feos\u002Fhow-to\u002Ffinalise-change","eos\u002Fhow-to\u002Ffinalise-change",{"title":146,"path":147,"stem":148},"How to install the EOS Docs MCP server","\u002Feos\u002Fhow-to\u002Finstall-eos-docs-mcp","eos\u002Fhow-to\u002Finstall-eos-docs-mcp",{"title":150,"path":151,"stem":152},"How to resolve a spike ticket","\u002Feos\u002Fhow-to\u002Fresolve-spike-ticket","eos\u002Fhow-to\u002Fresolve-spike-ticket",{"title":154,"path":155,"stem":156},"How to run Git hook checks","\u002Feos\u002Fhow-to\u002Frun-git-hook-checks","eos\u002Fhow-to\u002Frun-git-hook-checks",{"title":158,"path":159,"stem":160},"How to use the AI-enabled SDLC","\u002Feos\u002Fhow-to\u002Fuse-ai-enabled-sdlc","eos\u002Fhow-to\u002Fuse-ai-enabled-sdlc",{"title":162,"path":163,"stem":164},"Use the Aikido plugin","\u002Feos\u002Fhow-to\u002Fuse-aikido-plugin","eos\u002Fhow-to\u002Fuse-aikido-plugin",{"title":166,"path":167,"stem":168},"How to use Compass","\u002Feos\u002Fhow-to\u002Fuse-compass","eos\u002Fhow-to\u002Fuse-compass",{"title":170,"path":171,"stem":172},"How to use Fallow","\u002Feos\u002Fhow-to\u002Fuse-fallow","eos\u002Fhow-to\u002Fuse-fallow",{"title":174,"path":175,"stem":176},"How to use incremental mutation tests","\u002Feos\u002Fhow-to\u002Fuse-incremental-mutation-tests","eos\u002Fhow-to\u002Fuse-incremental-mutation-tests",{"title":178,"path":179,"stem":180},"How to use Scout","\u002Feos\u002Fhow-to\u002Fuse-scout","eos\u002Fhow-to\u002Fuse-scout",{"title":97,"path":182,"stem":183,"children":184,"page":43},"\u002Feos\u002Freference","eos\u002Freference",[185,189,193,197],{"title":186,"path":187,"stem":188},"Compass CLI","\u002Feos\u002Freference\u002Fcompass-cli","eos\u002Freference\u002Fcompass-cli",{"title":190,"path":191,"stem":192},"EOS marketplace skills","\u002Feos\u002Freference\u002Fmarketplace-skills","eos\u002Freference\u002Fmarketplace-skills",{"title":194,"path":195,"stem":196},"Nx task execution and cache","\u002Feos\u002Freference\u002Fnx-task-execution","eos\u002Freference\u002Fnx-task-execution",{"title":198,"path":199,"stem":200},"Scout CLI","\u002Feos\u002Freference\u002Fscout-cli","eos\u002Freference\u002Fscout-cli",{"title":202,"path":203,"stem":204,"children":205},"Product engineering","\u002Fproduct-engineering","product-engineering\u002FREADME",[206],{"title":14,"collapsed":15,"path":207,"stem":208,"children":209,"page":43},"\u002Fproduct-engineering\u002Fadrs","product-engineering\u002Fadrs",[210],{"title":211,"path":212,"stem":213},"Codify Engineering Standards as Skills","\u002Fproduct-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills","product-engineering\u002Fadrs\u002F0002-codify-engineering-standards-as-skills",[215,268],{"nav":216,"source":265},[217],{"title":218,"path":219,"stem":220,"children":221},"Ember","\u002Fember","ember",[222,225,257,261],{"title":223,"path":219,"stem":224},"StoreFront Documentation","ember\u002Findex",{"title":14,"path":226,"stem":227,"children":228,"page":43},"\u002Fember\u002Fadrs","ember\u002Fadrs",[229,233,237,241,245,249,253],{"title":230,"path":231,"stem":232},"Add Infection as a non-blocking mutation testing tool for Ember","\u002Fember\u002Fadrs\u002F0001-infection-mutation-testing","ember\u002Fadrs\u002F0001-infection-mutation-testing",{"title":234,"path":235,"stem":236},"Process DELETE scheduled changes before CREATE_UPDATE at the same instant","\u002Fember\u002Fadrs\u002F0002-scheduled-change-processing-order","ember\u002Fadrs\u002F0002-scheduled-change-processing-order",{"title":238,"path":239,"stem":240},"Standard rate scheduling is permanent until overridden","\u002Fember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent","ember\u002Fadrs\u002F0003-standard-rate-scheduling-is-permanent",{"title":242,"path":243,"stem":244},"Promotions require an existing standard rate","\u002Fember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate","ember\u002Fadrs\u002F0004-promotions-require-existing-standard-rate",{"title":246,"path":247,"stem":248},"UTC datetime contract between Storefront and Hub","\u002Fember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub","ember\u002Fadrs\u002F0005-utc-datetime-contract-between-storefront-and-hub",{"title":250,"path":251,"stem":252},"Elapsed unprocessed scheduled changes do not block rate changes","\u002Fember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes","ember\u002Fadrs\u002F0006-stale-scheduler-rows-do-not-block-rate-changes",{"title":254,"path":255,"stem":256},"ADR-0007: Delete ConfigureTenantAuth routing command once OIDC setup migrates to Hub","\u002Fember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command","ember\u002Fadrs\u002F0007-delete-configure-tenant-auth-routing-command",{"title":258,"path":259,"stem":260},"Domain Overview","\u002Fember\u002Fdomain_overview","ember\u002Fdomain_overview",{"title":262,"path":263,"stem":264},"Main Flows","\u002Fember\u002Fkey_flows","ember\u002Fkey_flows",{"collectionName":266,"label":267,"prefix":220},"external_ember","StoreFront (Ember)",{"nav":269,"source":441},[270],{"title":271,"path":272,"stem":273,"children":274},"Core","\u002Fcore","core",[275,278,306,310,332,336,346,363,420,424],{"title":276,"path":272,"stem":277},"Documentation Index","core\u002Findex",{"title":14,"path":279,"stem":280,"children":281,"page":43},"\u002Fcore\u002Fadrs","core\u002Fadrs",[282,286,290,294,298,302],{"title":283,"path":284,"stem":285},"ADR-XXXX: Short, descriptive title","\u002Fcore\u002Fadrs\u002F0000-template","core\u002Fadrs\u002F0000-template",{"title":287,"path":288,"stem":289},"ADR-1: Promotions endpoint","\u002Fcore\u002Fadrs\u002F0001-add-promotions-endpoint","core\u002Fadrs\u002F0001-add-promotions-endpoint",{"title":291,"path":292,"stem":293},"ADR-2: EOM partner report job dispatch","\u002Fcore\u002Fadrs\u002F0002-eom-report-job-dispatch","core\u002Fadrs\u002F0002-eom-report-job-dispatch",{"title":295,"path":296,"stem":297},"ADR-3: Replace PB fee waive flag with a Zero scheme override","\u002Fcore\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme","core\u002Fadrs\u002F0003-replace-pb-fee-waive-with-zero-scheme",{"title":299,"path":300,"stem":301},"ADR-4: No processor Digital Top-up capability gate in Reloadable Commercials","\u002Fcore\u002Fadrs\u002F0004-no-processor-top-up-capability-gate","core\u002Fadrs\u002F0004-no-processor-top-up-capability-gate",{"title":303,"path":304,"stem":305},"ADR-5: Sparse polymorphic sale fee override reason stamp","\u002Fcore\u002Fadrs\u002F0005-sale-fee-override-reason-stamp","core\u002Fadrs\u002F0005-sale-fee-override-reason-stamp",{"title":307,"path":308,"stem":309},"Agent Workflow","\u002Fcore\u002Fai-workflow","core\u002Fai-workflow",{"title":311,"path":312,"stem":313,"children":314},"Backend Guide","\u002Fcore\u002Fbackend","core\u002Fbackend\u002Findex",[315,316,320,324,328],{"title":311,"path":312,"stem":313},{"title":317,"path":318,"stem":319},"Backend AI Tooling","\u002Fcore\u002Fbackend\u002Fai-tooling","core\u002Fbackend\u002Fai-tooling",{"title":321,"path":322,"stem":323},"Backend Linting and Formatting","\u002Fcore\u002Fbackend\u002Flinting-and-formatting","core\u002Fbackend\u002Flinting-and-formatting",{"title":325,"path":326,"stem":327},"Backend Setup","\u002Fcore\u002Fbackend\u002Fsetup","core\u002Fbackend\u002Fsetup",{"title":329,"path":330,"stem":331},"Backend Testing","\u002Fcore\u002Fbackend\u002Ftesting","core\u002Fbackend\u002Ftesting",{"title":333,"path":334,"stem":335},"Documentation Health","\u002Fcore\u002Fdoc-health","core\u002Fdoc-health",{"title":337,"path":338,"stem":339,"children":340},"Frontend Guide","\u002Fcore\u002Ffrontend","core\u002Ffrontend\u002Findex",[341,342],{"title":337,"path":338,"stem":339},{"title":343,"path":344,"stem":345},"Frontend Development","\u002Fcore\u002Ffrontend\u002Fdevelopment","core\u002Ffrontend\u002Fdevelopment",{"title":347,"path":348,"stem":349,"children":350,"page":43},"Modules","\u002Fcore\u002Fmodules","core\u002Fmodules",[351,355],{"title":352,"path":353,"stem":354},"Connect API","\u002Fcore\u002Fmodules\u002Fconnect-api","core\u002Fmodules\u002Fconnect-api",{"title":356,"path":357,"stem":358,"children":359,"page":43},"Secure Links","\u002Fcore\u002Fmodules\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links",[360],{"title":356,"path":361,"stem":362},"\u002Fcore\u002Fmodules\u002Fsecure-links\u002Fsecure-links","core\u002Fmodules\u002Fsecure-links\u002Fsecure-links",{"title":364,"path":365,"stem":366,"children":367,"page":43},"Processors","\u002Fcore\u002Fprocessors","core\u002Fprocessors",[368,372,376,380,384,388,392,396,400,404,408,412,416],{"title":369,"path":370,"stem":371},"Amazon Processor and API","\u002Fcore\u002Fprocessors\u002Famazon","core\u002Fprocessors\u002Famazon",{"title":373,"path":374,"stem":375},"Amilon Processor and API","\u002Fcore\u002Fprocessors\u002Familon","core\u002Fprocessors\u002Familon",{"title":377,"path":378,"stem":379},"Cadooz Processor and API","\u002Fcore\u002Fprocessors\u002Fcadooz","core\u002Fprocessors\u002Fcadooz",{"title":381,"path":382,"stem":383},"Choice Digital Processor and API","\u002Fcore\u002Fprocessors\u002Fchoice-digital","core\u002Fprocessors\u002Fchoice-digital",{"title":385,"path":386,"stem":387},"Diggecard processor reference","\u002Fcore\u002Fprocessors\u002Fdiggecard","core\u002Fprocessors\u002Fdiggecard",{"title":389,"path":390,"stem":391},"ePay Processor and API","\u002Fcore\u002Fprocessors\u002Fepay","core\u002Fprocessors\u002Fepay",{"title":393,"path":394,"stem":395},"GoGift v2 Processor and API","\u002Fcore\u002Fprocessors\u002Fgo-gift-v2","core\u002Fprocessors\u002Fgo-gift-v2",{"title":397,"path":398,"stem":399},"InComm Processor and API","\u002Fcore\u002Fprocessors\u002Fincomm","core\u002Fprocessors\u002Fincomm",{"title":401,"path":402,"stem":403},"Ogloba Processor and API","\u002Fcore\u002Fprocessors\u002Fogloba","core\u002Fprocessors\u002Fogloba",{"title":405,"path":406,"stem":407},"SVSECard Processor and API","\u002Fcore\u002Fprocessors\u002Fsvs-ecard","core\u002Fprocessors\u002Fsvs-ecard",{"title":409,"path":410,"stem":411},"Vananam Processor and API","\u002Fcore\u002Fprocessors\u002Fvananam","core\u002Fprocessors\u002Fvananam",{"title":413,"path":414,"stem":415},"Vouchers Depot processor reference","\u002Fcore\u002Fprocessors\u002Fvouchers-depot","core\u002Fprocessors\u002Fvouchers-depot",{"title":417,"path":418,"stem":419},"You Got a Gift Processor and API","\u002Fcore\u002Fprocessors\u002Fyou-got-a-gift","core\u002Fprocessors\u002Fyou-got-a-gift",{"title":421,"path":422,"stem":423},"Development Quickstart","\u002Fcore\u002Fsetup","core\u002Fsetup",{"title":425,"path":426,"stem":427,"children":428,"page":43},"Workflows","\u002Fcore\u002Fworkflows","core\u002Fworkflows",[429,433,437],{"title":430,"path":431,"stem":432},"Hub Endpoint Workflow","\u002Fcore\u002Fworkflows\u002Fhub-endpoints","core\u002Fworkflows\u002Fhub-endpoints",{"title":434,"path":435,"stem":436},"OpenAPI Tooling","\u002Fcore\u002Fworkflows\u002Fopenapi-tooling","core\u002Fworkflows\u002Fopenapi-tooling",{"title":438,"path":439,"stem":440},"Processor Integration Workflow","\u002Fcore\u002Fworkflows\u002Fprocessors","core\u002Fworkflows\u002Fprocessors",{"collectionName":442,"label":271,"prefix":273},"external_core",{"page":444,"surround":2391},{"id":445,"title":389,"body":446,"config":2386,"description":452,"extension":2387,"meta":2388,"navigation":15,"path":390,"seo":2389,"stem":391,"__hash__":2390},"external_core\u002Fcore\u002Fprocessors\u002Fepay.md",{"type":447,"value":448,"toc":2367},"minimark",[449,453,458,466,555,559,638,642,645,650,669,811,826,1006,1009,1189,1193,1210,1398,1411,1415,1427,1571,1574,1578,1581,1686,1695,1699,1706,1801,1838,1842,1846,1852,1984,1998,2002,2016,2019,2073,2085,2118,2122,2200,2203,2207,2210,2278,2282,2285,2288,2292,2363],[450,451,452],"p",{},"This page describes the ePay integration for operations and customer-service teams. It covers synchronous voucher issuance, manual and automatic cancellation, host and SKU selection, response validation, and the audit fields needed to investigate an order.",[454,455,457],"h2",{"id":456},"what-epay-does","What ePay does",[450,459,460,461,465],{},"ePay is a synchronous digital voucher processor. The application sends one JSON request to a configured ePay host, maps the response into a card, and then creates the application delivery URL. The provider response calls the voucher code ",[462,463,464],"code",{},"PINCREDENTIALS.PIN","; this value is stored as the card code, while the application card PIN is empty.",[467,468,469,482],"table",{},[470,471,472],"thead",{},[473,474,475,479],"tr",{},[476,477,478],"th",{},"Property",[476,480,481],{},"Behaviour",[483,484,485,494,502,510,518,530,545],"tbody",{},[473,486,487,491],{},[488,489,490],"td",{},"Processor type",[488,492,493],{},"SKU per denomination or SKU per product, depending on brand configuration",[473,495,496,499],{},[488,497,498],{},"Processing",[488,500,501],{},"Synchronous request and response",[473,503,504,507],{},[488,505,506],{},"Delivery",[488,508,509],{},"Digital voucher code with an application-generated delivery URL",[473,511,512,515],{},[488,513,514],{},"Balance lookup",[488,516,517],{},"Unsupported by the ePay processor; the shared synchronous default rejects it",[473,519,520,523],{},[488,521,522],{},"Cancellation",[488,524,525,526,529],{},"Supported through manual ",[462,527,528],{},"CANCEL"," requests and automatic cancellation after a create-call failure",[473,531,532,535],{},[488,533,534],{},"Issue success rule",[488,536,537,538,541,542],{},"Response has a successful ",[462,539,540],{},"RESULT"," value and ",[462,543,544],{},"PINCREDENTIALS",[473,546,547,550],{},[488,548,549],{},"Provider reference",[488,551,552],{},[462,553,554],{},"HOSTTXID",[454,556,558],{"id":557},"order-lifecycle","Order lifecycle",[560,561,562,566,577,587,597,607,622,625],"ol",{},[563,564,565],"li",{},"A partner requests an ePay brand, face value, currency, and digital delivery.",[563,567,568,569,572,573,576],{},"The processor reads the brand ",[462,570,571],{},"host"," attribute and selects the matching host credentials and endpoint from ",[462,574,575],{},"config\u002Fepay.php",".",[563,578,579,580,583,584,576],{},"It resolves the product identifier. Fixed-denomination brands use ",[462,581,582],{},"epay-sku-\u003Camount with two decimals>","; open-value brands use ",[462,585,586],{},"epay-sku",[563,588,589,590,593,594,576],{},"It reads the partner attribute ",[462,591,592],{},"epaystoreid-\u003Cpartner slug>"," for ",[462,595,596],{},"SHOPID",[563,598,599,600,603,604,576],{},"It sends a ",[462,601,602],{},"SALE"," request. Amounts are converted to minor units, currency is uppercased, and the partner client request ID is sent as ",[462,605,606],{},"TXID",[563,608,609,610,612,613,615,616,618,619,576],{},"A successful response must contain ",[462,611,544],{},". ",[462,614,554],{}," becomes the processor reference, ",[462,617,464],{}," becomes the voucher code, and the expiry is mapped from the configured brand expiry or provider ",[462,620,621],{},"VALIDTO",[563,623,624],{},"The application creates the delivery URL and records the successful ePay audit. A Wrappr failure after provider success is an error and must be investigated as a potentially issued voucher.",[563,626,627,628,630,631,634,635,576],{},"A manual cancellation uses ",[462,629,528],{}," with the original client request ID in ",[462,632,633],{},"TXREF",". If the initial create call fails before a response is received, the processor attempts an automatic cancellation using a transaction ID suffixed with ",[462,636,637],{},"AC",[454,639,641],{"id":640},"example-api-order-flow","Example API order flow",[450,643,644],{},"The ePay client posts JSON to the selected host endpoint. Credentials are part of the JSON authorization object in this integration; the examples redact them. Values, product IDs, transaction IDs, and voucher data are illustrative.",[646,647,649],"h3",{"id":648},"create-a-voucher","Create a voucher",[450,651,652,653,656,657,660,661,664,665,668],{},"For a non-central host such as ",[462,654,655],{},"gb"," or ",[462,658,659],{},"rest_of_europe",", the request includes ",[462,662,663],{},"MODE"," and ",[462,666,667],{},"PRODUCTID",":",[670,671,676],"pre",{"className":672,"code":673,"language":674,"meta":675,"style":675},"language-http shiki shiki-themes github-dark github-light","POST ${EPAY_ENDPOINTURI}\nAccept: application\u002Fjson\nContent-Type: application\u002Fjson;charset=utf-8\n\n{\n  \"TYPE\": \"SALE\",\n  \"AUTHORIZATION\": {\n    \"USERNAME\": \"[REDACTED]\",\n    \"PASSWORD\": \"[REDACTED]\"\n  },\n  \"TERMINALID\": \"[REDACTED]\",\n  \"LOCALDATETIME\": \"2026-08-21 17:17:00\",\n  \"TXID\": \"client-request-id-example\",\n  \"AMOUNT\": 10000,\n  \"CURRENCY\": \"GBP\",\n  \"SHOPID\": \"[PARTNER SHOP ID]\",\n  \"RECEIPT\": {\n    \"LANGUAGE\": \"ENG\"\n  },\n  \"MODE\": \"DIRECT\",\n  \"PRODUCTID\": \"product-sku-example\"\n}\n","http","",[462,677,678,686,692,698,704,710,716,722,728,734,740,746,752,758,764,770,776,782,788,793,799,805],{"__ignoreMap":675},[679,680,683],"span",{"class":681,"line":682},"line",1,[679,684,685],{},"POST ${EPAY_ENDPOINTURI}\n",[679,687,689],{"class":681,"line":688},2,[679,690,691],{},"Accept: application\u002Fjson\n",[679,693,695],{"class":681,"line":694},3,[679,696,697],{},"Content-Type: application\u002Fjson;charset=utf-8\n",[679,699,701],{"class":681,"line":700},4,[679,702,703],{"emptyLinePlaceholder":15},"\n",[679,705,707],{"class":681,"line":706},5,[679,708,709],{},"{\n",[679,711,713],{"class":681,"line":712},6,[679,714,715],{},"  \"TYPE\": \"SALE\",\n",[679,717,719],{"class":681,"line":718},7,[679,720,721],{},"  \"AUTHORIZATION\": {\n",[679,723,725],{"class":681,"line":724},8,[679,726,727],{},"    \"USERNAME\": \"[REDACTED]\",\n",[679,729,731],{"class":681,"line":730},9,[679,732,733],{},"    \"PASSWORD\": \"[REDACTED]\"\n",[679,735,737],{"class":681,"line":736},10,[679,738,739],{},"  },\n",[679,741,743],{"class":681,"line":742},11,[679,744,745],{},"  \"TERMINALID\": \"[REDACTED]\",\n",[679,747,749],{"class":681,"line":748},12,[679,750,751],{},"  \"LOCALDATETIME\": \"2026-08-21 17:17:00\",\n",[679,753,755],{"class":681,"line":754},13,[679,756,757],{},"  \"TXID\": \"client-request-id-example\",\n",[679,759,761],{"class":681,"line":760},14,[679,762,763],{},"  \"AMOUNT\": 10000,\n",[679,765,767],{"class":681,"line":766},15,[679,768,769],{},"  \"CURRENCY\": \"GBP\",\n",[679,771,773],{"class":681,"line":772},16,[679,774,775],{},"  \"SHOPID\": \"[PARTNER SHOP ID]\",\n",[679,777,779],{"class":681,"line":778},17,[679,780,781],{},"  \"RECEIPT\": {\n",[679,783,785],{"class":681,"line":784},18,[679,786,787],{},"    \"LANGUAGE\": \"ENG\"\n",[679,789,791],{"class":681,"line":790},19,[679,792,739],{},[679,794,796],{"class":681,"line":795},20,[679,797,798],{},"  \"MODE\": \"DIRECT\",\n",[679,800,802],{"class":681,"line":801},21,[679,803,804],{},"  \"PRODUCTID\": \"product-sku-example\"\n",[679,806,808],{"class":681,"line":807},22,[679,809,810],{},"}\n",[450,812,813,814,817,818,821,822,656,824,668],{},"For a ",[462,815,816],{},"central.*"," host, the processor sends the product identifier as ",[462,819,820],{},"CARD.EAN"," and does not add ",[462,823,663],{},[462,825,667],{},[670,827,831],{"className":828,"code":829,"language":830,"meta":675,"style":675},"language-json shiki shiki-themes github-dark github-light","{\n  \"TYPE\": \"SALE\",\n  \"AUTHORIZATION\": {\n    \"USERNAME\": \"[REDACTED]\",\n    \"PASSWORD\": \"[REDACTED]\"\n  },\n  \"TERMINALID\": \"[REDACTED]\",\n  \"LOCALDATETIME\": \"2026-08-21 17:17:00\",\n  \"TXID\": \"client-request-id-example\",\n  \"AMOUNT\": 10000,\n  \"CURRENCY\": \"EUR\",\n  \"SHOPID\": \"[PARTNER SHOP ID]\",\n  \"RECEIPT\": {\n    \"LANGUAGE\": \"ENG\"\n  },\n  \"CARD\": {\n    \"EAN\": \"product-sku-example\"\n  }\n}\n","json",[462,832,833,838,854,862,874,884,888,899,911,923,935,947,959,966,976,980,987,997,1002],{"__ignoreMap":675},[679,834,835],{"class":681,"line":682},[679,836,709],{"class":837},"sQ3_J",[679,839,840,844,847,851],{"class":681,"line":688},[679,841,843],{"class":842},"s0DvM","  \"TYPE\"",[679,845,846],{"class":837},": ",[679,848,850],{"class":849},"sg6BJ","\"SALE\"",[679,852,853],{"class":837},",\n",[679,855,856,859],{"class":681,"line":694},[679,857,858],{"class":842},"  \"AUTHORIZATION\"",[679,860,861],{"class":837},": {\n",[679,863,864,867,869,872],{"class":681,"line":700},[679,865,866],{"class":842},"    \"USERNAME\"",[679,868,846],{"class":837},[679,870,871],{"class":849},"\"[REDACTED]\"",[679,873,853],{"class":837},[679,875,876,879,881],{"class":681,"line":706},[679,877,878],{"class":842},"    \"PASSWORD\"",[679,880,846],{"class":837},[679,882,883],{"class":849},"\"[REDACTED]\"\n",[679,885,886],{"class":681,"line":712},[679,887,739],{"class":837},[679,889,890,893,895,897],{"class":681,"line":718},[679,891,892],{"class":842},"  \"TERMINALID\"",[679,894,846],{"class":837},[679,896,871],{"class":849},[679,898,853],{"class":837},[679,900,901,904,906,909],{"class":681,"line":724},[679,902,903],{"class":842},"  \"LOCALDATETIME\"",[679,905,846],{"class":837},[679,907,908],{"class":849},"\"2026-08-21 17:17:00\"",[679,910,853],{"class":837},[679,912,913,916,918,921],{"class":681,"line":730},[679,914,915],{"class":842},"  \"TXID\"",[679,917,846],{"class":837},[679,919,920],{"class":849},"\"client-request-id-example\"",[679,922,853],{"class":837},[679,924,925,928,930,933],{"class":681,"line":736},[679,926,927],{"class":842},"  \"AMOUNT\"",[679,929,846],{"class":837},[679,931,932],{"class":842},"10000",[679,934,853],{"class":837},[679,936,937,940,942,945],{"class":681,"line":742},[679,938,939],{"class":842},"  \"CURRENCY\"",[679,941,846],{"class":837},[679,943,944],{"class":849},"\"EUR\"",[679,946,853],{"class":837},[679,948,949,952,954,957],{"class":681,"line":748},[679,950,951],{"class":842},"  \"SHOPID\"",[679,953,846],{"class":837},[679,955,956],{"class":849},"\"[PARTNER SHOP ID]\"",[679,958,853],{"class":837},[679,960,961,964],{"class":681,"line":754},[679,962,963],{"class":842},"  \"RECEIPT\"",[679,965,861],{"class":837},[679,967,968,971,973],{"class":681,"line":760},[679,969,970],{"class":842},"    \"LANGUAGE\"",[679,972,846],{"class":837},[679,974,975],{"class":849},"\"ENG\"\n",[679,977,978],{"class":681,"line":766},[679,979,739],{"class":837},[679,981,982,985],{"class":681,"line":772},[679,983,984],{"class":842},"  \"CARD\"",[679,986,861],{"class":837},[679,988,989,992,994],{"class":681,"line":778},[679,990,991],{"class":842},"    \"EAN\"",[679,993,846],{"class":837},[679,995,996],{"class":849},"\"product-sku-example\"\n",[679,998,999],{"class":681,"line":784},[679,1000,1001],{"class":837},"  }\n",[679,1003,1004],{"class":681,"line":790},[679,1005,810],{"class":837},[450,1007,1008],{},"A redacted successful response has this relevant shape:",[670,1010,1012],{"className":828,"code":1011,"language":830,"meta":675,"style":675},"{\n  \"AMOUNT\": 10000,\n  \"CURRENCY\": \"GBP\",\n  \"HOSTTXID\": \"epay-reference-example\",\n  \"MODE\": \"DIRECT\",\n  \"PINCREDENTIALS\": {\n    \"PIN\": \"[REDACTED VOUCHER CODE]\",\n    \"SERIAL\": \"[REDACTED SERIAL]\",\n    \"VALIDTO\": \"2027-08-21T00:00:00.000Z\"\n  },\n  \"RESULT\": 0,\n  \"RESULTTEXT\": \"OK\",\n  \"SERVERDATETIME\": \"2026-08-21 17:17:01\",\n  \"TERMINALID\": \"[REDACTED]\",\n  \"TXID\": \"provider-transaction-example\",\n  \"TXNERROR\": 0,\n  \"TYPE\": \"SALE\"\n}\n",[462,1013,1014,1018,1028,1039,1051,1063,1070,1082,1094,1104,1108,1120,1132,1144,1154,1165,1176,1185],{"__ignoreMap":675},[679,1015,1016],{"class":681,"line":682},[679,1017,709],{"class":837},[679,1019,1020,1022,1024,1026],{"class":681,"line":688},[679,1021,927],{"class":842},[679,1023,846],{"class":837},[679,1025,932],{"class":842},[679,1027,853],{"class":837},[679,1029,1030,1032,1034,1037],{"class":681,"line":694},[679,1031,939],{"class":842},[679,1033,846],{"class":837},[679,1035,1036],{"class":849},"\"GBP\"",[679,1038,853],{"class":837},[679,1040,1041,1044,1046,1049],{"class":681,"line":700},[679,1042,1043],{"class":842},"  \"HOSTTXID\"",[679,1045,846],{"class":837},[679,1047,1048],{"class":849},"\"epay-reference-example\"",[679,1050,853],{"class":837},[679,1052,1053,1056,1058,1061],{"class":681,"line":706},[679,1054,1055],{"class":842},"  \"MODE\"",[679,1057,846],{"class":837},[679,1059,1060],{"class":849},"\"DIRECT\"",[679,1062,853],{"class":837},[679,1064,1065,1068],{"class":681,"line":712},[679,1066,1067],{"class":842},"  \"PINCREDENTIALS\"",[679,1069,861],{"class":837},[679,1071,1072,1075,1077,1080],{"class":681,"line":718},[679,1073,1074],{"class":842},"    \"PIN\"",[679,1076,846],{"class":837},[679,1078,1079],{"class":849},"\"[REDACTED VOUCHER CODE]\"",[679,1081,853],{"class":837},[679,1083,1084,1087,1089,1092],{"class":681,"line":724},[679,1085,1086],{"class":842},"    \"SERIAL\"",[679,1088,846],{"class":837},[679,1090,1091],{"class":849},"\"[REDACTED SERIAL]\"",[679,1093,853],{"class":837},[679,1095,1096,1099,1101],{"class":681,"line":730},[679,1097,1098],{"class":842},"    \"VALIDTO\"",[679,1100,846],{"class":837},[679,1102,1103],{"class":849},"\"2027-08-21T00:00:00.000Z\"\n",[679,1105,1106],{"class":681,"line":736},[679,1107,739],{"class":837},[679,1109,1110,1113,1115,1118],{"class":681,"line":742},[679,1111,1112],{"class":842},"  \"RESULT\"",[679,1114,846],{"class":837},[679,1116,1117],{"class":842},"0",[679,1119,853],{"class":837},[679,1121,1122,1125,1127,1130],{"class":681,"line":748},[679,1123,1124],{"class":842},"  \"RESULTTEXT\"",[679,1126,846],{"class":837},[679,1128,1129],{"class":849},"\"OK\"",[679,1131,853],{"class":837},[679,1133,1134,1137,1139,1142],{"class":681,"line":754},[679,1135,1136],{"class":842},"  \"SERVERDATETIME\"",[679,1138,846],{"class":837},[679,1140,1141],{"class":849},"\"2026-08-21 17:17:01\"",[679,1143,853],{"class":837},[679,1145,1146,1148,1150,1152],{"class":681,"line":760},[679,1147,892],{"class":842},[679,1149,846],{"class":837},[679,1151,871],{"class":849},[679,1153,853],{"class":837},[679,1155,1156,1158,1160,1163],{"class":681,"line":766},[679,1157,915],{"class":842},[679,1159,846],{"class":837},[679,1161,1162],{"class":849},"\"provider-transaction-example\"",[679,1164,853],{"class":837},[679,1166,1167,1170,1172,1174],{"class":681,"line":772},[679,1168,1169],{"class":842},"  \"TXNERROR\"",[679,1171,846],{"class":837},[679,1173,1117],{"class":842},[679,1175,853],{"class":837},[679,1177,1178,1180,1182],{"class":681,"line":778},[679,1179,843],{"class":842},[679,1181,846],{"class":837},[679,1183,1184],{"class":849},"\"SALE\"\n",[679,1186,1187],{"class":681,"line":784},[679,1188,810],{"class":837},[646,1190,1192],{"id":1191},"cancel-a-voucher","Cancel a voucher",[450,1194,1195,1196,1199,1200,1203,1204,1206,1207,1209],{},"Manual cancellation uses ",[462,1197,1198],{},"TYPE: CANCEL",", ",[462,1201,1202],{},"MODE: MANUAL",", and a ",[462,1205,633],{}," containing the original client transaction ID. The serial number from the saved issue response is compared with the cancellation response when ",[462,1208,544],{}," is present.",[670,1211,1213],{"className":828,"code":1212,"language":830,"meta":675,"style":675},"{\n  \"TYPE\": \"CANCEL\",\n  \"AUTHORIZATION\": {\n    \"USERNAME\": \"[REDACTED]\",\n    \"PASSWORD\": \"[REDACTED]\"\n  },\n  \"TERMINALID\": \"[REDACTED]\",\n  \"LOCALDATETIME\": \"2026-08-21 17:18:00\",\n  \"TXID\": \"cancellation-request-id-example\",\n  \"AMOUNT\": 10000,\n  \"CURRENCY\": \"GBP\",\n  \"SHOPID\": \"[PARTNER SHOP ID]\",\n  \"RECEIPT\": {\n    \"LANGUAGE\": \"ENG\"\n  },\n  \"MODE\": \"MANUAL\",\n  \"PRODUCTID\": \"product-sku-example\",\n  \"TXREF\": {\n    \"TYPE\": \"CLIENT\",\n    \"Value\": \"original-client-request-id-example\"\n  }\n}\n",[462,1214,1215,1219,1230,1236,1246,1254,1258,1268,1279,1290,1300,1310,1320,1326,1334,1338,1349,1361,1368,1380,1390,1394],{"__ignoreMap":675},[679,1216,1217],{"class":681,"line":682},[679,1218,709],{"class":837},[679,1220,1221,1223,1225,1228],{"class":681,"line":688},[679,1222,843],{"class":842},[679,1224,846],{"class":837},[679,1226,1227],{"class":849},"\"CANCEL\"",[679,1229,853],{"class":837},[679,1231,1232,1234],{"class":681,"line":694},[679,1233,858],{"class":842},[679,1235,861],{"class":837},[679,1237,1238,1240,1242,1244],{"class":681,"line":700},[679,1239,866],{"class":842},[679,1241,846],{"class":837},[679,1243,871],{"class":849},[679,1245,853],{"class":837},[679,1247,1248,1250,1252],{"class":681,"line":706},[679,1249,878],{"class":842},[679,1251,846],{"class":837},[679,1253,883],{"class":849},[679,1255,1256],{"class":681,"line":712},[679,1257,739],{"class":837},[679,1259,1260,1262,1264,1266],{"class":681,"line":718},[679,1261,892],{"class":842},[679,1263,846],{"class":837},[679,1265,871],{"class":849},[679,1267,853],{"class":837},[679,1269,1270,1272,1274,1277],{"class":681,"line":724},[679,1271,903],{"class":842},[679,1273,846],{"class":837},[679,1275,1276],{"class":849},"\"2026-08-21 17:18:00\"",[679,1278,853],{"class":837},[679,1280,1281,1283,1285,1288],{"class":681,"line":730},[679,1282,915],{"class":842},[679,1284,846],{"class":837},[679,1286,1287],{"class":849},"\"cancellation-request-id-example\"",[679,1289,853],{"class":837},[679,1291,1292,1294,1296,1298],{"class":681,"line":736},[679,1293,927],{"class":842},[679,1295,846],{"class":837},[679,1297,932],{"class":842},[679,1299,853],{"class":837},[679,1301,1302,1304,1306,1308],{"class":681,"line":742},[679,1303,939],{"class":842},[679,1305,846],{"class":837},[679,1307,1036],{"class":849},[679,1309,853],{"class":837},[679,1311,1312,1314,1316,1318],{"class":681,"line":748},[679,1313,951],{"class":842},[679,1315,846],{"class":837},[679,1317,956],{"class":849},[679,1319,853],{"class":837},[679,1321,1322,1324],{"class":681,"line":754},[679,1323,963],{"class":842},[679,1325,861],{"class":837},[679,1327,1328,1330,1332],{"class":681,"line":760},[679,1329,970],{"class":842},[679,1331,846],{"class":837},[679,1333,975],{"class":849},[679,1335,1336],{"class":681,"line":766},[679,1337,739],{"class":837},[679,1339,1340,1342,1344,1347],{"class":681,"line":772},[679,1341,1055],{"class":842},[679,1343,846],{"class":837},[679,1345,1346],{"class":849},"\"MANUAL\"",[679,1348,853],{"class":837},[679,1350,1351,1354,1356,1359],{"class":681,"line":778},[679,1352,1353],{"class":842},"  \"PRODUCTID\"",[679,1355,846],{"class":837},[679,1357,1358],{"class":849},"\"product-sku-example\"",[679,1360,853],{"class":837},[679,1362,1363,1366],{"class":681,"line":784},[679,1364,1365],{"class":842},"  \"TXREF\"",[679,1367,861],{"class":837},[679,1369,1370,1373,1375,1378],{"class":681,"line":790},[679,1371,1372],{"class":842},"    \"TYPE\"",[679,1374,846],{"class":837},[679,1376,1377],{"class":849},"\"CLIENT\"",[679,1379,853],{"class":837},[679,1381,1382,1385,1387],{"class":681,"line":795},[679,1383,1384],{"class":842},"    \"Value\"",[679,1386,846],{"class":837},[679,1388,1389],{"class":849},"\"original-client-request-id-example\"\n",[679,1391,1392],{"class":681,"line":801},[679,1393,1001],{"class":837},[679,1395,1396],{"class":681,"line":807},[679,1397,810],{"class":837},[450,1399,1400,1401,1403,1404,1407,1408,1410],{},"Automatic cancellation uses the same ",[462,1402,633],{}," type, sets ",[462,1405,1406],{},"MODE: AUTOMATIC",", and appends ",[462,1409,637],{}," to the original transaction ID. It is an internal recovery request, not a second customer order.",[454,1412,1414],{"id":1413},"response-mapping-and-validation","Response mapping and validation",[450,1416,1417,1418,1420,1421,1423,1424,1426],{},"The processor treats a response as unsuccessful when ",[462,1419,540],{}," is present and is not ",[462,1422,1117],{},". Empty responses and transport errors are also failures. For an issue response, ",[462,1425,544],{}," must exist; otherwise the sale is not completed.",[467,1428,1429,1439],{},[470,1430,1431],{},[473,1432,1433,1436],{},[476,1434,1435],{},"Provider data",[476,1437,1438],{},"Application result",[483,1440,1441,1451,1467,1475,1488,1499,1508,1522,1536,1547,1557],{},[473,1442,1443,1448],{},[488,1444,1445],{},[462,1446,1447],{},"RESULT: 0",[488,1449,1450],{},"Successful provider result check",[473,1452,1453,1458],{},[488,1454,1455,1456],{},"Non-zero ",[462,1457,540],{},[488,1459,1460,1461,664,1463,1466],{},"ePay error containing ",[462,1462,540],{},[462,1464,1465],{},"RESULTTEXT","; no card is completed",[473,1468,1469,1472],{},[488,1470,1471],{},"Missing or empty response",[488,1473,1474],{},"ePay error; no card is completed",[473,1476,1477,1485],{},[488,1478,1479,1480,1482,1483],{},"Missing ",[462,1481,544],{}," on ",[462,1484,602],{},[488,1486,1487],{},"ePay error even when another response field is present",[473,1489,1490,1494],{},[488,1491,1492],{},[462,1493,554],{},[488,1495,1496],{},[462,1497,1498],{},"processor_reference",[473,1500,1501,1505],{},[488,1502,1503],{},[462,1504,464],{},[488,1506,1507],{},"Card code; it is not copied into the application PIN field",[473,1509,1510,1515],{},[488,1511,1512],{},[462,1513,1514],{},"PINCREDENTIALS.SERIAL",[488,1516,1517,1518,1521],{},"Returned only when the brand ",[462,1519,1520],{},"returnSerialNumber"," attribute is truthy; used for cancellation comparison when available",[473,1523,1524,1529],{},[488,1525,1526,1527],{},"Provider ",[462,1528,621],{},[488,1530,1531,1532,1535],{},"Expiration fallback unless it is the sentinel ",[462,1533,1534],{},"3000-01-01..."," value",[473,1537,1538,1544],{},[488,1539,1540,1541],{},"Brand ",[462,1542,1543],{},"expiry_months",[488,1545,1546],{},"Preferred application expiry when configured",[473,1548,1549,1554],{},[488,1550,1551,1552],{},"Cancellation ",[462,1553,1514],{},[488,1555,1556],{},"Must match the saved issue serial when the response includes it",[473,1558,1559,1564],{},[488,1560,1551,1561],{},[462,1562,1563],{},"AMOUNT",[488,1565,1566,1567,1570],{},"Divided by ",[462,1568,1569],{},"100"," for the returned cancellation card face value",[450,1572,1573],{},"Receipt arrays, server timestamps, and other response fields are retained in the raw audit response but do not by themselves establish voucher completion. The application-generated URL is created after the ePay card has been mapped; a failure in that later URL step leaves a provider-issued voucher requiring manual cancellation review.",[454,1575,1577],{"id":1576},"provider-states-and-retry-behaviour","Provider states and retry behaviour",[450,1579,1580],{},"ePay does not expose a status-polling flow in this processor. The outcome is determined by the one synchronous response or by a cancellation response.",[467,1582,1583,1596],{},[470,1584,1585],{},[473,1586,1587,1590,1593],{},[476,1588,1589],{},"Condition",[476,1591,1592],{},"Processor result",[476,1594,1595],{},"Operational consequence",[483,1597,1598,1613,1626,1639,1650,1661,1675],{},[473,1599,1600,1607,1610],{},[488,1601,1602,1603,1606],{},"HTTP response ",[462,1604,1605],{},"200"," with successful provider result and issue credentials",[488,1608,1609],{},"Success",[488,1611,1612],{},"Voucher code and processor reference are available",[473,1614,1615,1620,1623],{},[488,1616,1455,1617,1619],{},[462,1618,540],{}," or missing issue credentials",[488,1621,1622],{},"Processor error",[488,1624,1625],{},"Do not issue a replacement until the original transaction and audit are checked",[473,1627,1628,1633,1636],{},[488,1629,1630,1631],{},"Transport\u002Fconnection failure before a response is received for ",[462,1632,602],{},[488,1634,1635],{},"Automatic cancellation is attempted",[488,1637,1638],{},"Check both the failed sale audit and automatic cancellation evidence",[473,1640,1641,1644,1647],{},[488,1642,1643],{},"Response received but parsing or URL generation fails",[488,1645,1646],{},"Error; automatic cancellation is not triggered by the create-response guard",[488,1648,1649],{},"Treat the voucher as potentially issued and arrange cancellation review",[473,1651,1652,1655,1658],{},[488,1653,1654],{},"Cancellation response has a mismatched serial",[488,1656,1657],{},"Error",[488,1659,1660],{},"Do not regard the cancellation as confirmed",[473,1662,1663,1669,1672],{},[488,1664,1665,1666],{},"Cancellation message contains ",[462,1667,1668],{},"PRODUCT ALREADY USED",[488,1670,1671],{},"Warning-level cancellation error",[488,1673,1674],{},"Escalate with the original serial and redacted audits; the code treats this as a warning, not success",[473,1676,1677,1680,1683],{},[488,1678,1679],{},"Request timeout",[488,1681,1682],{},"External service-unavailable error",[488,1684,1685],{},"Check ePay outcome before retrying because the provider may have processed the sale",[450,1687,1688,1689,1691,1692,1694],{},"There is no general idempotency key separate from the ePay ",[462,1690,606],{}," in the processor. The sale client request ID is used as the issue transaction ID, while an automatic cancellation uses the original ID plus ",[462,1693,637],{},". A manual re-order after an uncertain network result can create a duplicate voucher; compare the original transaction first.",[454,1696,1698],{"id":1697},"audit-comparison-fields","Audit comparison fields",[450,1700,1701,1702,1705],{},"ePay stores the legacy ",[462,1703,1704],{},"AuditEpay"," record and also writes processor interaction request\u002Fresponse entries keyed by the sale record UUID. Compare:",[560,1707,1708,1726,1750,1768,1774,1787,1798],{},[563,1709,1710,1199,1713,1199,1716,1199,1719,1722,1723,576],{},[462,1711,1712],{},"AuditEpay.clientRequestID",[462,1714,1715],{},"partnerID",[462,1717,1718],{},"transactionTime",[462,1720,1721],{},"status",", and ",[462,1724,1725],{},"errorMessage",[563,1727,1728,1729,1199,1732,1199,1734,1199,1736,1199,1738,1199,1740,1199,1743,1745,1746,1749],{},"The request fields ",[462,1730,1731],{},"TYPE",[462,1733,663],{},[462,1735,606],{},[462,1737,633],{},[462,1739,1563],{},[462,1741,1742],{},"CURRENCY",[462,1744,596],{},", the selected product field, and host endpoint. Never expose ",[462,1747,1748],{},"AUTHORIZATION"," values.",[563,1751,1752,1753,1199,1755,1199,1757,1199,1759,1199,1761,1199,1763,1199,1765,1767],{},"The response fields ",[462,1754,540],{},[462,1756,1465],{},[462,1758,1731],{},[462,1760,554],{},[462,1762,606],{},[462,1764,1563],{},[462,1766,1742],{},", and provider date\u002Ftime fields.",[563,1769,1770,1771,1773],{},"For issue, compare ",[462,1772,554],{}," with the card processor reference and compare the saved serial with any later cancellation serial without copying either credential into a ticket.",[563,1775,1776,1777,1780,1781,1783,1784,576],{},"For manual cancellation, confirm the cancellation ",[462,1778,1779],{},"TXREF.Value"," points to the original client request ID and that ",[462,1782,663],{}," is ",[462,1785,1786],{},"MANUAL",[563,1788,1789,1790,1792,1793,1795,1796,576],{},"For automatic cancellation, look for the ",[462,1791,637],{}," transaction ID, ",[462,1794,1406],{},", and the original issue transaction in ",[462,1797,633],{},[563,1799,1800],{},"Confirm the audit sequence: issue request, issue response, any automatic cancellation request\u002Fresponse, and any later manual cancellation request\u002Fresponse. A successful provider issue followed by a failed application URL generation is not the same as a provider rejection.",[450,1802,1803,1804,1806,1807,1199,1810,1813,1814,664,1817,1199,1820,1199,1823,1826,1827,1199,1830,1833,1834,1837],{},"The ",[462,1805,1704],{}," table contains ",[462,1808,1809],{},"requestParams",[462,1811,1812],{},"responseParams",", raw ",[462,1815,1816],{},"request",[462,1818,1819],{},"response",[462,1821,1822],{},"requestID",[462,1824,1825],{},"gcClaimCodeHash",", and the status values ",[462,1828,1829],{},"REQUESTED",[462,1831,1832],{},"SUCCESS",", or ",[462,1835,1836],{},"ERROR",". Interaction audit content is encrypted at rest and supports redaction when read through the audit model.",[454,1839,1841],{"id":1840},"settings","Settings",[646,1843,1845],{"id":1844},"processor-settings","Processor settings",[450,1847,1848,1849,1851],{},"The host configuration is read from ",[462,1850,575],{},". Each host entry supplies credentials and an endpoint:",[467,1853,1854,1867],{},[470,1855,1856],{},[473,1857,1858,1861,1864],{},[476,1859,1860],{},"Host value",[476,1862,1863],{},"Configuration path",[476,1865,1866],{},"Environment variables",[483,1868,1869,1894,1919],{},[473,1870,1871,1875,1880],{},[488,1872,1873],{},[462,1874,655],{},[488,1876,1877],{},[462,1878,1879],{},"epay.hosts.gb",[488,1881,1882,1199,1885,1199,1888,1199,1891],{},[462,1883,1884],{},"EPAY_USERNAME",[462,1886,1887],{},"EPAY_PASSWORD",[462,1889,1890],{},"EPAY_TERMINALID",[462,1892,1893],{},"EPAY_ENDPOINTURI",[473,1895,1896,1900,1905],{},[488,1897,1898],{},[462,1899,659],{},[488,1901,1902],{},[462,1903,1904],{},"epay.hosts.rest_of_europe",[488,1906,1907,1199,1910,1199,1913,1199,1916],{},[462,1908,1909],{},"EPAY_USERNAME_ROE",[462,1911,1912],{},"EPAY_PASSWORD_ROE",[462,1914,1915],{},"EPAY_TERMINALID_ROE",[462,1917,1918],{},"EPAY_ENDPOINTURI_ROE",[473,1920,1921,1965,1970],{},[488,1922,1923,1199,1926,1199,1929,1199,1932,1199,1935,1199,1938,1199,1941,1199,1944,1199,1947,1199,1950,1199,1953,1199,1956,1199,1959,1199,1962],{},[462,1924,1925],{},"central.france",[462,1927,1928],{},"central.italy",[462,1930,1931],{},"central.spain",[462,1933,1934],{},"central.germany",[462,1936,1937],{},"central.denmark",[462,1939,1940],{},"central.sweden",[462,1942,1943],{},"central.norway",[462,1945,1946],{},"central.finland",[462,1948,1949],{},"central.belgium",[462,1951,1952],{},"central.netherlands",[462,1954,1955],{},"central.austria",[462,1957,1958],{},"central.luxembourg",[462,1960,1961],{},"central.switzerland",[462,1963,1964],{},"central.portugal",[488,1966,1967],{},[462,1968,1969],{},"epay.hosts.central.\u003Ccountry>",[488,1971,1972,1973,664,1976,1979,1980,1983],{},"Country-specific ",[462,1974,1975],{},"EPAY_USERNAME_CENTRAL_*",[462,1977,1978],{},"EPAY_TERMINALID_CENTRAL_*"," values, with ",[462,1981,1982],{},"EPAY_ENDPOINTURI_CENTRAL"," for the endpoint",[450,1985,1986,1987,1990,1991,1994,1995,1997],{},"The request timeout is fixed in ",[462,1988,1989],{},"EpayProcessor"," at ",[462,1992,1993],{},"20.0"," seconds. The provider credentials are sent in the JSON ",[462,1996,1748],{}," object. No live endpoint, credential, terminal ID, or shop ID should be copied into operational documentation or tickets.",[646,1999,2001],{"id":2000},"brand-settings","Brand settings",[450,2003,1803,2004,2006,2007,1199,2009,2011,2012,2015],{},[462,2005,571],{}," brand attribute is required and selects the host configuration. Supported values are ",[462,2008,655],{},[462,2010,659],{},", and the listed ",[462,2013,2014],{},"central.\u003Ccountry>"," values. A missing host produces a configuration error.",[450,2017,2018],{},"Product mappings follow the brand's denomination model:",[467,2020,2021,2034],{},[470,2022,2023],{},[473,2024,2025,2028,2031],{},[476,2026,2027],{},"Brand model",[476,2029,2030],{},"Attribute used by the processor",[476,2032,2033],{},"Request field",[483,2035,2036,2058],{},[473,2037,2038,2041,2050],{},[488,2039,2040],{},"Fixed denominations",[488,2042,2043,2046,2047],{},[462,2044,2045],{},"epay-sku-\u003Cface value with two decimals>",", for example ",[462,2048,2049],{},"epay-sku-123.00",[488,2051,2052,2054,2055,2057],{},[462,2053,667],{}," for non-central hosts or ",[462,2056,820],{}," for central hosts",[473,2059,2060,2063,2067],{},[488,2061,2062],{},"Open value",[488,2064,2065],{},[462,2066,586],{},[488,2068,2069,2054,2071,2057],{},[462,2070,667],{},[462,2072,820],{},[450,2074,2075,2076,2078,2079,2081,2082,2084],{},"The partner must have ",[462,2077,592],{}," as a partner attribute for ",[462,2080,596],{},". Missing product or shop mappings stop request construction. The optional ",[462,2083,1520],{}," brand attribute controls whether the serial is included in the returned application card; its default behavior is false.",[450,2086,2087,2088,1199,2091,1199,2094,2097,2098,1199,2101,2104,2105,1199,2108,1199,2111,1199,2114,2117],{},"The checked-in onboarding migration includes host assignments for brands such as ",[462,2089,2090],{},"itunes-de",[462,2092,2093],{},"itunes-fr",[462,2095,2096],{},"just-eat-ie",", Nintendo country variants, ",[462,2099,2100],{},"share-now-de",[462,2102,2103],{},"share-now-it",", and Xbox country variants. It also records product identifiers for brands including ",[462,2106,2107],{},"itunes",[462,2109,2110],{},"google-play",[462,2112,2113],{},"just-eat",[462,2115,2116],{},"digiigifts",", and YouChoose variants. These migration values are onboarding history, not a substitute for checking the current brand attributes.",[454,2119,2121],{"id":2120},"api-operations","API operations",[467,2123,2124,2140],{},[470,2125,2126],{},[473,2127,2128,2131,2134,2137],{},[476,2129,2130],{},"Operation",[476,2132,2133],{},"Internal service",[476,2135,2136],{},"Provider request",[476,2138,2139],{},"Use",[483,2141,2142,2160,2181],{},[473,2143,2144,2147,2152,2157],{},[488,2145,2146],{},"Issue",[488,2148,2149],{},[462,2150,2151],{},"ePayCreateGC",[488,2153,2154],{},[462,2155,2156],{},"TYPE: SALE",[488,2158,2159],{},"Synchronously issue a voucher",[473,2161,2162,2165,2170,2176],{},[488,2163,2164],{},"Manual cancellation",[488,2166,2167],{},[462,2168,2169],{},"ePayCancelGC",[488,2171,2172,1199,2174],{},[462,2173,1198],{},[462,2175,1202],{},[488,2177,2178,2179],{},"Cancel an existing issue using ",[462,2180,633],{},[473,2182,2183,2186,2191,2197],{},[488,2184,2185],{},"Automatic cancellation",[488,2187,2188],{},[462,2189,2190],{},"ePayCancelAutomatic",[488,2192,2193,1199,2195],{},[462,2194,1198],{},[462,2196,1406],{},[488,2198,2199],{},"Recovery attempt after a create-call failure",[450,2201,2202],{},"No ePay catalogue, balance, or status-retrieval operation is defined in the inspected processor\u002Fclient code. ePay uses the issue response itself rather than a separate retrieval call.",[454,2204,2206],{"id":2205},"customer-service-investigation","Customer-service investigation",[450,2208,2209],{},"For a failed, uncertain, or cancellation-related order:",[560,2211,2212,2215,2230,2240,2256,2262,2272],{},[563,2213,2214],{},"Confirm the sale UUID, client request ID, partner slug, brand slug, denomination, currency, and the requested transaction type.",[563,2216,2217,2218,2220,2221,656,2224,2226,2227,2229],{},"Confirm the current brand ",[462,2219,571],{},", fixed\u002Fopen denomination flag, matching ",[462,2222,2223],{},"epay-sku-*",[462,2225,586],{},", and partner ",[462,2228,592],{}," attribute.",[563,2231,2232,2233,2235,2236,2239],{},"Locate the ",[462,2234,1704],{}," record by ",[462,2237,2238],{},"clientRequestID"," and partner ID. Compare its status, error message, request\u002Fresponse, and transaction time.",[563,2241,2242,2243,1199,2245,1199,2247,1199,2249,1199,2251,1199,2253,2255],{},"In the redacted interaction audit, verify the endpoint family and compare ",[462,2244,1731],{},[462,2246,663],{},[462,2248,606],{},[462,2250,633],{},[462,2252,1563],{},[462,2254,1742],{},", and product field. Never include the authorization object in an escalation.",[563,2257,2258,2259,2261],{},"If ePay returned ",[462,2260,554],{}," or issue credentials, treat the voucher as potentially issued even if the application URL failed. Check for an automatic cancellation attempt before considering a manual cancellation.",[563,2263,2264,2265,1199,2267,2269,2270,576],{},"For cancellation, compare the original response serial with the cancellation response serial, and verify ",[462,2266,1447],{},[462,2268,1198],{},", and the expected ",[462,2271,633],{},[563,2273,2274,2275,2277],{},"Do not manually re-order after a timeout, connection failure, or malformed response until the original ",[462,2276,606],{}," and any automatic cancellation audit have been reviewed.",[454,2279,2281],{"id":2280},"limitations-and-support-contacts","Limitations and support contacts",[450,2283,2284],{},"The ePay integration supports issue and cancellation only. Balance lookup, provider catalogue retrieval, and a separate order-status retrieval operation are not implemented here. The codebase does not define an ePay-specific technical or support contact in the inspected config, migrations, or tests; use the established internal escalation route when the redacted audit comparison is inconclusive.",[450,2286,2287],{},"Escalations should include the internal sale UUID, client request ID, partner ID\u002Fslug, brand and host value, processor reference if present, transaction times, sanitized result code\u002Ftext, and the ordered audit sequence. Do not include passwords, authorization headers, voucher codes, serial numbers, full shop IDs, or live card data.",[454,2289,2291],{"id":2290},"related-code","Related code",[2293,2294,2295,2301,2307,2313,2318,2324,2330,2336,2342,2348,2357],"ul",{},[563,2296,2297,2300],{},[462,2298,2299],{},"app\u002FProcessors\u002FEpayProcessor.php"," — synchronous issue, cancellation, request construction, response mapping, timeout handling, and automatic cancellation.",[563,2302,2303,2306],{},[462,2304,2305],{},"app\u002FAuditEpay.php"," — legacy ePay audit model and stored fields.",[563,2308,2309,2312],{},[462,2310,2311],{},"app\u002FProcessorInteractionAuditLog.php"," — encrypted processor request\u002Fresponse interaction records.",[563,2314,2315,2317],{},[462,2316,575],{}," — host, endpoint, credential, and terminal configuration.",[563,2319,2320,2323],{},[462,2321,2322],{},"app\u002FDataIssuer.php"," — ePay additional brand attributes and SKU format.",[563,2325,2326,2329],{},[462,2327,2328],{},"database\u002Fmigrations\u002F2017_05_22_091328_create_audit_epay.php"," — ePay audit schema and issuer creation.",[563,2331,2332,2335],{},[462,2333,2334],{},"database\u002Fmigrations\u002F2019_08_13_145053_RCC-5187_move_epay_store_id_to_partner_attribute.php"," — partner shop-ID migration.",[563,2337,2338,2341],{},[462,2339,2340],{},"database\u002Fmigrations\u002F2024_06_26_074902_rcc-11795_epay-sku-configuration.php"," — host, serial-return, and product-ID onboarding mappings.",[563,2343,2344,2347],{},[462,2345,2346],{},"database\u002Fmigrations\u002F2024_10_07_134754_r_c_c-15073-correct-bad-epay-skus-and-convert-to-new-format-fixed-denom.php"," — fixed-denomination SKU attribute format.",[563,2349,2350,2353,2354,2356],{},[462,2351,2352],{},"database\u002Fmigrations\u002F2024_10_08_153937_r_c_c-15073-convert-open-value-epay-sku-attribute-names-to-new-format.php"," — open-value ",[462,2355,586],{}," attribute format.",[563,2358,2359,2362],{},[462,2360,2361],{},"tests\u002FUnit\u002FProcessors\u002FEpayProcessorTest.php"," — issue, cancellation, host selection, SKU mapping, expiry, serial-return, audit, and transport scenarios.",[2364,2365,2366],"style",{},"html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sQ3_J, html code.shiki .sQ3_J{--shiki-dark:#E1E4E8;--shiki-default:#24292E}html pre.shiki code .s0DvM, html code.shiki .s0DvM{--shiki-dark:#79B8FF;--shiki-default:#005CC5}html pre.shiki code .sg6BJ, html code.shiki .sg6BJ{--shiki-dark:#9ECBFF;--shiki-default:#032F62}",{"title":675,"searchDepth":694,"depth":694,"links":2368},[2369,2370,2371,2375,2376,2377,2378,2382,2383,2384,2385],{"id":456,"depth":688,"text":457},{"id":557,"depth":688,"text":558},{"id":640,"depth":688,"text":641,"children":2372},[2373,2374],{"id":648,"depth":694,"text":649},{"id":1191,"depth":694,"text":1192},{"id":1413,"depth":688,"text":1414},{"id":1576,"depth":688,"text":1577},{"id":1697,"depth":688,"text":1698},{"id":1840,"depth":688,"text":1841,"children":2379},[2380,2381],{"id":1844,"depth":694,"text":1845},{"id":2000,"depth":694,"text":2001},{"id":2120,"depth":688,"text":2121},{"id":2205,"depth":688,"text":2206},{"id":2280,"depth":688,"text":2281},{"id":2290,"depth":688,"text":2291},{},"md",{},{"title":389,"description":452},"87LlGoUZxu86bF39oZdYSWcMYEN0VSYV-Z8F0I_nVqI",[2392,2393],{"title":385,"path":386,"stem":387,"children":-1},{"title":393,"path":394,"stem":395,"children":-1},1789777549015]