[{"data":1,"prerenderedAt":669},["ShallowReactive",2],{"header:help":3,"footer:default":67,"story:navigation\u002Fsearch:help":250,"story:help\u002Fcategories":288,"story:help\u002Farticles\u002Frespond-to-the-pre-payment-webhook":314,"no-guide:respond-to-the-pre-payment-webhook":59,"article:\u002Fhelp\u002Farticles\u002Frespond-to-the-pre-payment-webhook":410,"story:contact":426,"help:tree:497b1fc1-0791-4398-870b-bfb5ae424311":617,"_apollo:default":668},{"name":4,"created_at":5,"published_at":6,"updated_at":7,"id":8,"uuid":9,"content":10,"slug":57,"full_slug":58,"sort_by_date":59,"position":60,"tag_list":61,"is_startpage":24,"parent_id":62,"meta_data":59,"group_id":63,"first_published_at":64,"release_id":59,"lang":65,"path":59,"alternates":66,"default_full_slug":59,"translated_slugs":59},"Help Center Header","2024-08-09T18:06:34.939Z","2024-10-21T21:58:39.217Z","2024-10-21T21:58:39.232Z",10082752,"3e9b88f7-c163-4657-a2f2-62532d600fad",{"_uid":11,"link":12,"badge":16,"items":17,"title":13,"buttons":50,"new_tab":24,"submenu":51,"alignment":13,"component":52,"badge_link":53,"top_menu_items":56},"e5645a1a-f991-40e8-8d67-e40ebc082b5a",{"id":13,"url":13,"linktype":14,"fieldtype":15,"cached_url":13},"","story","multilink","Help Center",[18,27,34,39,44],{"_uid":19,"link":20,"title":23,"new_tab":24,"submenu":25,"component":26},"5cbe2861-1f49-4166-97da-a4dddd8105e3",{"id":21,"url":13,"linktype":14,"fieldtype":15,"cached_url":22},"4c0a2d99-ec30-4579-8ef1-6bf5564d4839","help\u002Fcategories\u002F","Articles",false,[],"header___item",{"_uid":28,"link":29,"title":32,"new_tab":33,"component":26},"1c8edeb5-b9e9-4cb8-b1c6-c1f292f7d7cd",{"id":13,"url":30,"linktype":31,"fieldtype":15,"cached_url":30},"https:\u002F\u002Fwiki.foxycart.com\u002F","url","Documentation",true,{"_uid":35,"link":36,"title":38,"new_tab":33,"component":26},"8d7df70e-f087-4da0-b616-6f0e9a5af35c",{"id":13,"url":37,"linktype":31,"fieldtype":15,"cached_url":37},"https:\u002F\u002Fapi.foxycart.com\u002F","API Documentation",{"_uid":40,"link":41,"title":43,"new_tab":33,"component":26},"f76e7944-23d5-4652-87e4-cdae79272762",{"id":13,"url":42,"linktype":31,"fieldtype":15,"cached_url":42},"https:\u002F\u002Fstatus.foxy.io\u002F","System Status",{"_uid":45,"link":46,"title":49,"new_tab":24,"component":26},"0de16771-4c84-466c-a1da-d8568113c71f",{"id":47,"url":13,"linktype":14,"fieldtype":15,"cached_url":48},"01e4e370-f9b9-45af-8fa9-f15540699b0d","contact","Contact Us",[],[],"header",{"id":54,"url":13,"linktype":14,"fieldtype":15,"cached_url":55},"4a679eb7-662d-4ea4-a976-5a2acbf0b663","help\u002F",[],"help-header","navigation\u002Fhelp-header",null,20,[],10082747,"71b81c2e-5e09-48a1-a397-a3c72fcd344a","2022-09-21T14:50:25.655Z","default",[],{"name":68,"created_at":69,"published_at":70,"updated_at":71,"id":72,"uuid":73,"content":74,"slug":243,"full_slug":244,"sort_by_date":59,"position":245,"tag_list":246,"is_startpage":24,"parent_id":62,"meta_data":59,"group_id":247,"first_published_at":248,"release_id":59,"lang":65,"path":59,"alternates":249,"default_full_slug":59,"translated_slugs":59},"Default Footer","2024-08-09T18:06:59.024Z","2025-09-04T06:24:46.223Z","2025-09-04T06:24:46.241Z",10082753,"e59e67ac-248a-482f-84a1-53d4f318186a",{"_uid":75,"about":76,"logos":77,"socials":82,"sections":108,"component":225,"cta_title":226,"bottom_links":227,"cta_subtitle":241,"cta_button_link":242,"cta_button_text":183},"830983f5-c4c4-43c8-b150-86a5e3fa6dc8","Foxy’s hosted cart & payment page allow you to sell anything, using your existing website or platform.",[78],{"id":79,"alt":13,"name":13,"focus":13,"title":13,"filename":80,"copyright":13,"fieldtype":81},14760,"https:\u002F\u002Fa-us.storyblok.com\u002Ff\u002F1001040\u002Fx\u002F3b030847ec\u002Fb-corp.svg","asset",[83,90,96,102],{"_uid":84,"icon":85,"link":86,"name":88,"component":89},"faf0a618-ea94-42ea-9182-03be18c43216","fa-facebook",{"id":13,"url":87,"linktype":31,"fieldtype":15,"cached_url":87},"https:\u002F\u002Fwww.facebook.com\u002Ffoxycart","Facebook","footer___social",{"_uid":91,"icon":92,"link":93,"name":95,"component":89},"14309c18-7e79-423e-b375-34555bac0811","fa-instagram",{"id":13,"url":94,"linktype":31,"fieldtype":15,"cached_url":94},"https:\u002F\u002Fwww.instagram.com\u002Ffoxy_io","Instagram",{"_uid":97,"icon":98,"link":99,"name":101,"component":89},"8f7fe7cf-0dd3-4596-8334-226ea466716a","fa-linkedin",{"id":13,"url":100,"linktype":31,"fieldtype":15,"cached_url":100},"https:\u002F\u002Fwww.linkedin.com\u002Fcompany\u002Ffoxycart.com","LinkedIn",{"_uid":103,"icon":104,"link":105,"name":107,"component":89},"90a675b4-dd97-40b5-be09-00a87223d4c5","fa-youtube",{"id":13,"url":106,"linktype":31,"fieldtype":15,"cached_url":106},"https:\u002F\u002Fwww.youtube.com\u002Fuser\u002Ffoxycart","Youtube",[109,139,184,206],{"_uid":110,"name":111,"items":112,"component":138},"82849945-282f-488c-b18d-a8d2252f514a","Company",[113,120,126,132],{"_uid":114,"link":115,"title":118,"new_tab":24,"component":119},"1f699ab1-938b-4d9d-9825-aabcbe6f57fe",{"id":116,"url":13,"linktype":14,"fieldtype":15,"cached_url":117},"63634293-a749-4226-9439-9f38ee6dcda0","about-us","About Us","footer___menu_items",{"_uid":121,"link":122,"title":125,"new_tab":24,"component":119},"b26b00f1-a0e7-4be2-8ab3-428b8cc841f8",{"id":123,"url":13,"linktype":14,"fieldtype":15,"cached_url":124},"26cb7c55-faed-4a77-a291-1552d4111b3e","how-foxy-works","How Foxy Works",{"_uid":127,"link":128,"title":131,"new_tab":24,"component":119},"b40c68a0-1ceb-4226-9515-6176534f61fe",{"id":129,"url":13,"linktype":14,"fieldtype":15,"cached_url":130},"dc6657d7-7f4f-4c0d-b781-e971b038ee26","for-good","Foxy For Good",{"_uid":133,"link":134,"title":137,"new_tab":24,"component":119},"3ad0c134-bef9-4fff-b891-e09f16109036",{"id":135,"url":13,"linktype":14,"fieldtype":15,"cached_url":136},"23cae210-baf4-4588-9862-d09f4f52ccd2","brand-assets","Brand Assets","footer___section",{"_uid":140,"name":141,"items":142,"component":138},"a6805fa8-ac60-47f1-b8f0-f27aded0afbe","Product",[143,149,155,161,167,173,179],{"_uid":144,"link":145,"title":148,"new_tab":24,"component":119},"b39c8a4e-2383-486f-b76a-11fbb15d8134",{"id":146,"url":13,"linktype":14,"fieldtype":15,"cached_url":147},"bb04690f-fe98-4ce6-80be-05b950f2364f","features\u002F","Features",{"_uid":150,"link":151,"title":154,"new_tab":24,"component":119},"64f8a41f-c181-433d-bc0a-fc94e71ecbf6",{"id":152,"url":13,"linktype":14,"fieldtype":15,"cached_url":153},"c450c58d-761d-48c0-a9af-0b064611689b","pricing","Pricing",{"_uid":156,"link":157,"title":160,"new_tab":24,"component":119},"6e0b287f-fd8c-4146-9e0e-0ab0b5c9ce3c",{"id":158,"url":13,"linktype":14,"fieldtype":15,"cached_url":159},"fab20ad9-e76a-4947-b709-3a6fdfa88028","blog\u002Fcategories\u002Fproduct-updates","Product Updates",{"_uid":162,"link":163,"title":166,"new_tab":24,"component":119},"47e5a074-a6b5-4f1c-8c2f-89a2ae9f83eb",{"id":164,"url":13,"linktype":14,"fieldtype":15,"cached_url":165},"d2c83612-d611-47f3-a3b4-ca7fe08540b8","changelogs\u002F","Changelogs",{"_uid":168,"link":169,"title":172,"new_tab":24,"component":119},"b5c08774-542f-4ffd-b357-c94d674488b9",{"id":170,"url":13,"linktype":14,"fieldtype":15,"cached_url":171},"08876121-0df3-4ed9-aa11-902b3e41cd02","whats-next","What's Next",{"_uid":174,"link":175,"title":178,"new_tab":24,"component":119},"9c2704ed-6d9f-43e1-9e67-c8d91c083288",{"id":176,"url":13,"linktype":14,"fieldtype":15,"cached_url":177},"056a7857-b18f-4025-8f97-91a38fc19bc8","compare\u002F","Compare",{"_uid":180,"link":181,"title":183,"new_tab":24,"component":119},"5f2db35b-674b-406a-8fa7-d246633af9fe",{"id":13,"url":182,"linktype":31,"fieldtype":15,"cached_url":182},"https:\u002F\u002Fadmin.foxy.io\u002Fsign-up","Try Foxy Free",{"_uid":185,"name":186,"items":187,"component":138},"63fa1f29-4252-4640-9922-fe310e69e54a","Security",[188,194,200],{"_uid":189,"link":190,"title":193,"new_tab":24,"component":119},"1158ddb6-9eb0-466f-8eb6-7ca2ae66c8b8",{"id":191,"url":13,"linktype":14,"fieldtype":15,"cached_url":192},"1f58fb2c-8681-4742-b6e8-09999beae9f6","security-contact","Security Contact",{"_uid":195,"link":196,"title":199,"new_tab":24,"component":119},"9a79c54a-6022-4dfd-854b-766f5e4703ba",{"id":197,"url":13,"linktype":14,"fieldtype":15,"cached_url":198},"55cbfcc3-425a-4261-8037-54e919851d2d","pci","PCI Compliance",{"_uid":201,"link":202,"title":205,"new_tab":24,"component":119},"0b85f5b6-9534-4071-b323-b39d053dd4d7",{"id":203,"url":13,"linktype":14,"fieldtype":15,"cached_url":204},"c3ac0fe3-83e2-4879-afbd-d4c83e1590df","help\u002Farticles\u002Four-official-domains-public-code","Domains & Codebases",{"_uid":207,"name":208,"items":209,"component":138},"998ded67-d107-49f4-8154-ca6be51671ec","Support",[210,213,216,219,222],{"_uid":211,"link":212,"title":16,"new_tab":24,"component":119},"594ffd35-3049-4004-bb08-0db568ebd819",{"id":54,"url":13,"linktype":14,"fieldtype":15,"cached_url":55},{"_uid":214,"link":215,"title":32,"new_tab":33,"component":119},"0a1a55ab-a985-4f9d-8b42-26da714d0c1c",{"id":13,"url":30,"linktype":31,"fieldtype":15,"cached_url":30},{"_uid":217,"link":218,"title":38,"new_tab":33,"component":119},"61e0b7c8-aadf-419b-a339-b3ccabc65bf4",{"id":13,"url":37,"linktype":31,"fieldtype":15,"cached_url":37},{"_uid":220,"link":221,"title":43,"new_tab":33,"component":119},"fd67a89e-1c54-4d31-94b5-64be999062d6",{"id":13,"url":42,"linktype":31,"fieldtype":15,"cached_url":42},{"_uid":223,"link":224,"title":49,"new_tab":24,"component":119},"231a6f71-e996-4ad4-b033-d4d5542f34f0",{"id":47,"url":13,"linktype":14,"fieldtype":15,"cached_url":48},"footer","Get started with our *unlimited free trial*.",[228,235],{"_uid":229,"link":230,"text":233,"component":234},"f0b77210-2632-45a2-8436-e57cad84d01a",{"id":231,"url":13,"linktype":14,"fieldtype":15,"cached_url":232},"60ba16a2-c1f4-485f-b978-8d2eeeafbf5a","terms-of-service","Terms of Service","footer___bottom_links",{"_uid":236,"link":237,"text":240,"component":234},"4bd497b0-993f-4b4d-a5b7-8a49c7c8fec9",{"id":238,"url":13,"linktype":14,"fieldtype":15,"cached_url":239},"332302b9-1d18-4016-b9c8-9b33c72d782b","privacy-policy","Privacy Policy","No credit card required.",{"id":13,"url":182,"linktype":31,"fieldtype":15,"cached_url":182},"default-footer","navigation\u002Fdefault-footer",50,[],"11006268-07f9-41e9-96f3-c51fb723399d","2022-09-21T20:39:02.357Z",[],{"name":251,"created_at":252,"published_at":253,"updated_at":254,"id":255,"uuid":256,"content":257,"slug":279,"full_slug":282,"sort_by_date":59,"position":283,"tag_list":284,"is_startpage":24,"parent_id":62,"meta_data":59,"group_id":285,"first_published_at":286,"release_id":59,"lang":65,"path":59,"alternates":287,"default_full_slug":59,"translated_slugs":59},"Search","2024-10-21T22:08:54.973Z","2025-05-26T09:17:25.790Z","2025-05-26T09:17:25.804Z",13592003,"14cbc359-9ac1-4a7a-a8de-ad4ac8ef26d4",{"_uid":258,"name":251,"indices":259,"summary":13,"component":279,"primary_image":280},"5e4a56e8-76f1-4790-b3a7-70f1be97d042",[260,265,269,274],{"key":261,"_uid":262,"icon":13,"name":263,"component":264},"all","c12a3210-7323-4273-8217-5215e52efe84","All","index",{"key":266,"_uid":267,"icon":268,"name":23,"component":264},"help_center_article","5acff080-95e4-44d3-8dcf-1b19720af382","fa-file-alt",{"key":270,"_uid":271,"icon":272,"name":273,"component":264},"help_center_guide","b8fbc206-c083-471e-a1f0-0ebeb90a669d","fa-book","Guides",{"key":275,"_uid":276,"icon":277,"name":278,"component":264},"blog_post","23419e83-2e56-4c4c-8a05-9fd1b3c9a9bd","fa-file-image","Blog Posts","search",{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":281},{},"navigation\u002Fsearch",60,[],"11e1fd31-95cd-4fc9-b736-8b8910663e6c","2024-10-21T23:17:05.904Z",[],{"name":23,"created_at":289,"published_at":290,"updated_at":291,"id":292,"uuid":21,"content":293,"slug":307,"full_slug":22,"sort_by_date":59,"position":308,"tag_list":309,"is_startpage":33,"parent_id":310,"meta_data":59,"group_id":311,"first_published_at":312,"release_id":59,"lang":65,"path":59,"alternates":313,"default_full_slug":59,"translated_slugs":59},"2022-09-19T14:42:29.685Z","2024-07-30T18:17:22.506Z","2024-07-30T18:17:22.525Z",2660,{"_uid":294,"icon":13,"name":23,"guides":295,"pinned":24,"summary":296,"category":13,"component":297,"blog_posts":298,"content_hub":24,"icon_custom":299,"case_studies":300,"faq_sections":301,"help_articles":302,"featured_guides":303,"mailbox_category":13,"featured_articles":304,"featured_blog_posts":305,"featured_case_studies":306},"d6dae89a-907a-4bf7-82de-fe2ba875ee6e",[],"Get your questions answered with our browsable knowledge base.","help_center_category",[],{"id":59,"alt":59,"name":13,"focus":59,"title":59,"filename":13,"copyright":59,"fieldtype":81},[],[],[],[],[],[],[],"categories",530,[],2658,"19ebcdd2-027f-47f5-9a5b-a8992c959578","2022-09-19T16:24:39.219Z",[],{"name":315,"created_at":316,"published_at":317,"updated_at":318,"id":319,"uuid":320,"content":321,"slug":403,"full_slug":404,"sort_by_date":59,"position":405,"tag_list":406,"is_startpage":24,"parent_id":407,"meta_data":59,"group_id":408,"first_published_at":317,"release_id":59,"lang":65,"path":59,"alternates":409,"default_full_slug":59,"translated_slugs":59},"Respond to the pre-payment webhook","2026-07-20T20:25:55.946Z","2026-07-20T20:30:24.522Z","2026-07-20T20:30:24.546Z",200251621205885,"497b1fc1-0791-4398-870b-bfb5ae424311",{"_uid":322,"body":323,"name":315,"image":398,"pinned":24,"summary":400,"category":401,"component":266,"related_articles":402},"5de18c08-ba1d-44e3-9d10-13b3abe22ad5",{"type":324,"content":325},"doc",[326,333,340,346,358,363,368,373,378,383,388,393],{"type":327,"attrs":328,"content":329},"paragraph",{"textAlign":59},[330],{"text":331,"type":332},"In response, a JSON payload in the following format should be output on the page.","text",{"type":334,"attrs":335,"content":337},"heading",{"level":336,"textAlign":59},2,[338],{"text":339,"type":332},"Approve",{"type":341,"attrs":342,"content":343},"code_block",{"class":59},[344],{"text":345,"type":332},"{\n  \"ok\": true,\n  \"details\": \"\"\n}\n",{"type":327,"attrs":347,"content":348},{"textAlign":59},[349,351,356],{"text":350,"type":332},"If you’re using the Square Platform payment splitting integration, an additional ",{"text":352,"type":332,"marks":353},"payment_logic",[354],{"type":355},"code",{"text":357,"type":332}," parameter can be passed through as well.",{"type":334,"attrs":359,"content":360},{"level":336,"textAlign":59},[361],{"text":362,"type":332},"Reject",{"type":341,"attrs":364,"content":365},{"class":59},[366],{"text":367,"type":332},"{\n  \"ok\": false,\n  \"details\": \"Sorry, we're all out of Example Products. Please remove that item from your cart and try again.\"\n}\n",{"type":327,"attrs":369,"content":370},{"textAlign":59},[371],{"text":372,"type":332},"Only a valid JSON object should be output from your endpoint. If you output anything else on the page that isn’t part of a valid JSON object, the hook fails to process and default handling occurs.",{"type":334,"attrs":374,"content":375},{"level":336,"textAlign":59},[376],{"text":377,"type":332},"Example endpoint",{"type":327,"attrs":379,"content":380},{"textAlign":59},[381],{"text":382,"type":332},"The following is an example PHP endpoint for handling the pre-payment hook. It’s for illustrative purposes — it will work as-is, but blocking based on IP or email isn’t necessarily a recommended approach.",{"type":341,"attrs":384,"content":385},{"class":59},[386],{"text":387,"type":332},"\u003C?php\n$rawPost = file_get_contents('php:\u002F\u002Finput');\n$cart_details = json_decode($rawPost, true);\n\n$response = array(\n    'ok' => true,\n    'details' => \"Sorry, we couldn't process your transaction. Please contact us to proceed.\"\n);\n\n$log_file = '.\u002Flog.txt';\n$date = new DateTime();\n$date_string = $date->format('Y-m-d H:i:s');\n\n$log_line = $date_string . ': ' . $cart_details['customer_ip'] . ' - '. $cart_details['_embedded']['fx:customer']['email'] . ' -- ';\n\n\u002F\u002F Example: Loop through cart items and reject on specific product names\nforeach($cart_details['_embedded']['fx:items'] as $item) {\n    if ($item['name'] == 'Example Product') {\n        $response['ok'] = false;\n        $response['details'] = \"Sorry, we're all out of Example Products. Please remove that item from your cart and try again.\";\n    }\n}\n\n\u002F\u002F Example: Reject on specific IP addresses\n\u002F\u002F The IPs to block should be in a separate file named `ips_to_reject.txt`\n\u002F\u002F Note that this looks for exact matches.\n\u002F\u002F If you wanted to check CIDR ranges, try adding something like https:\u002F\u002Fgithub.com\u002Ftholu\u002Fphp-cidr-match\n$ips_to_reject = file('.\u002Fips_to_reject.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\nif ($ips_to_reject) {\n  foreach ($ips_to_reject as $ip) {\n    if ($ip == $cart_details['customer_ip']) {\n      $log_line .= \"IP MATCH: $ip\";\n      $response['ok'] = false;\n      break;\n    }\n  }\n}\n\n\u002F\u002F Example: Reject on specific email addresses (exact matches)\n\u002F\u002F The emails to block should be in a separate file named `emails_to_reject.txt`\n$emails_to_reject = file('.\u002Femails_to_reject.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\nif ($emails_to_reject) {\n  foreach ($emails_to_reject as $email) {\n    if (trim($email) == trim($cart_details['_embedded']['fx:customer']['email'])) {\n      $log_line .= \"EMAIL MATCH. REJECTING.\";\n      $response['ok'] = false;\n      break;\n    }\n  }\n}\n\n$log_line .= (string) $response['ok'] . \"\\n\";\n$fp = fopen($log_file, 'a');\nfwrite($fp, $log_line);\n\nheader('Content-Type: application\u002Fjson');\nprint json_encode($response);\n",{"type":334,"attrs":389,"content":390},{"level":336,"textAlign":59},[391],{"text":392,"type":332},"Debugging errors",{"type":327,"attrs":394,"content":395},{"textAlign":59},[396],{"text":397,"type":332},"If your pre-payment hook endpoint fails to return a response, or returns a non-JSON response, an error is added to your store’s error log in the administration.",{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":399},{},"The JSON response format for approving or rejecting a transaction, with an example PHP endpoint.","5c49218e-d3ae-4f94-b450-8f27240924b1",[],"respond-to-the-pre-payment-webhook","help\u002Farticles\u002Frespond-to-the-pre-payment-webhook",-3990,[],2659,"48f04da2-40de-40b1-aa03-000f94a6d19c",[],{"html":411,"sections":412,"segments":422},"\u003Cp>In response, a JSON payload in the following format should be output on the page.\u003C\u002Fp>\u003Csection id=\"approve\" data-title=\"Approve\" data-title-node=\"H2\">\u003Chr class=\"my-8\" style=\"margin-left: -48px; margin-right: -40vw\">\u003Ch2 data-anchor-id=\"approve\">Approve\u003C\u002Fh2>\u003Cdiv class=\"position-relative w-100 overflow-hidden rounded-2\" data-code-block>\u003Cdiv class=\"d-flex justify-content-end border-bottom\" style=\"background:#2b2c3b;\">\u003Cbutton type=\"button\" class=\"btn btn-link btn-sm text-light\" title=\"Copy\" data-code-button>\u003Cspan data-code-default style=\"\">\u003Ci class=\"fal fa-copy me-2\">\u003C\u002Fi> Copy \u003C\u002Fspan>\u003Cspan class=\"text-success\" data-code-success style=\"display:none;\">\u003Ci class=\"fal fa-check ms-2\">\u003C\u002Fi> Copied \u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"small\">\u003Cpre class=\"hljs p-2\" data-code-content>{\n  &quot;ok&quot;: true,\n  &quot;details&quot;: &quot;&quot;\n}\n\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>If you’re using the Square Platform payment splitting integration, an additional \u003Ccode class=\"badge bg-soft-danger text-danger\">payment_logic\u003C\u002Fcode> parameter can be passed through as well.\u003C\u002Fp>\u003C\u002Fsection>\u003Csection id=\"reject\" data-title=\"Reject\" data-title-node=\"H2\">\u003Chr class=\"my-8\" style=\"margin-left: -48px; margin-right: -40vw\">\u003Ch2 data-anchor-id=\"reject\">Reject\u003C\u002Fh2>\u003Cdiv class=\"position-relative w-100 overflow-hidden rounded-2\" data-code-block>\u003Cdiv class=\"d-flex justify-content-end border-bottom\" style=\"background:#2b2c3b;\">\u003Cbutton type=\"button\" class=\"btn btn-link btn-sm text-light\" title=\"Copy\" data-code-button>\u003Cspan data-code-default style=\"\">\u003Ci class=\"fal fa-copy me-2\">\u003C\u002Fi> Copy \u003C\u002Fspan>\u003Cspan class=\"text-success\" data-code-success style=\"display:none;\">\u003Ci class=\"fal fa-check ms-2\">\u003C\u002Fi> Copied \u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"small\">\u003Cpre class=\"hljs p-2\" data-code-content>{\n  &quot;ok&quot;: false,\n  &quot;details&quot;: &quot;Sorry, we&#x27;re all out of Example Products. Please remove that item from your cart and try again.&quot;\n}\n\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003Cp>Only a valid JSON object should be output from your endpoint. If you output anything else on the page that isn’t part of a valid JSON object, the hook fails to process and default handling occurs.\u003C\u002Fp>\u003C\u002Fsection>\u003Csection id=\"example-endpoint\" data-title=\"Example endpoint\" data-title-node=\"H2\">\u003Chr class=\"my-8\" style=\"margin-left: -48px; margin-right: -40vw\">\u003Ch2 data-anchor-id=\"example-endpoint\">Example endpoint\u003C\u002Fh2>\u003Cp>The following is an example PHP endpoint for handling the pre-payment hook. It’s for illustrative purposes — it will work as-is, but blocking based on IP or email isn’t necessarily a recommended approach.\u003C\u002Fp>\u003Cdiv class=\"position-relative w-100 overflow-hidden rounded-2\" data-code-block>\u003Cdiv class=\"d-flex justify-content-end border-bottom\" style=\"background:#2b2c3b;\">\u003Cbutton type=\"button\" class=\"btn btn-link btn-sm text-light\" title=\"Copy\" data-code-button>\u003Cspan data-code-default style=\"\">\u003Ci class=\"fal fa-copy me-2\">\u003C\u002Fi> Copy \u003C\u002Fspan>\u003Cspan class=\"text-success\" data-code-success style=\"display:none;\">\u003Ci class=\"fal fa-check ms-2\">\u003C\u002Fi> Copied \u003C\u002Fspan>\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"small\">\u003Cpre class=\"hljs p-2\" data-code-content>\u003Cspan class=\"hljs-meta\">&lt;?php\n$rawPost = file_get_contents(&#x27;php:\u002F\u002Finput&#x27;);\n$cart_details = json_decode($rawPost, true);\n\n$response = array(\n    &#x27;ok&#x27; =&gt; true,\n    &#x27;details&#x27; =&gt; &quot;Sorry, we couldn&#x27;t process your transaction. Please contact us to proceed.&quot;\n);\n\n$log_file = &#x27;.\u002Flog.txt&#x27;;\n$date = new DateTime();\n$date_string = $date-&gt;format(&#x27;Y-m-d H:i:s&#x27;);\n\n$log_line = $date_string . &#x27;: &#x27; . $cart_details[&#x27;customer_ip&#x27;] . &#x27; - &#x27;. $cart_details[&#x27;_embedded&#x27;][&#x27;fx:customer&#x27;][&#x27;email&#x27;] . &#x27; -- &#x27;;\n\n\u002F\u002F Example: Loop through cart items and reject on specific product names\nforeach($cart_details[&#x27;_embedded&#x27;][&#x27;fx:items&#x27;] as $item) {\n    if ($item[&#x27;name&#x27;] == &#x27;Example Product&#x27;) {\n        $response[&#x27;ok&#x27;] = false;\n        $response[&#x27;details&#x27;] = &quot;Sorry, we&#x27;re all out of Example Products. Please remove that item from your cart and try again.&quot;;\n    }\n}\n\n\u002F\u002F Example: Reject on specific IP addresses\n\u002F\u002F The IPs to block should be in a separate file named `ips_to_reject.txt`\n\u002F\u002F Note that this looks for exact matches.\n\u002F\u002F If you wanted to check CIDR ranges, try adding something like https:\u002F\u002Fgithub.com\u002Ftholu\u002Fphp-cidr-match\n$ips_to_reject = file(&#x27;.\u002Fips_to_reject.txt&#x27;, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\nif ($ips_to_reject) {\n  foreach ($ips_to_reject as $ip) {\n    if ($ip == $cart_details[&#x27;customer_ip&#x27;]) {\n      $log_line .= &quot;IP MATCH: $ip&quot;;\n      $response[&#x27;ok&#x27;] = false;\n      break;\n    }\n  }\n}\n\n\u002F\u002F Example: Reject on specific email addresses (exact matches)\n\u002F\u002F The emails to block should be in a separate file named `emails_to_reject.txt`\n$emails_to_reject = file(&#x27;.\u002Femails_to_reject.txt&#x27;, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\nif ($emails_to_reject) {\n  foreach ($emails_to_reject as $email) {\n    if (trim($email) == trim($cart_details[&#x27;_embedded&#x27;][&#x27;fx:customer&#x27;][&#x27;email&#x27;])) {\n      $log_line .= &quot;EMAIL MATCH. REJECTING.&quot;;\n      $response[&#x27;ok&#x27;] = false;\n      break;\n    }\n  }\n}\n\n$log_line .= (string) $response[&#x27;ok&#x27;] . &quot;\\n&quot;;\n$fp = fopen($log_file, &#x27;a&#x27;);\nfwrite($fp, $log_line);\n\nheader(&#x27;Content-Type: application\u002Fjson&#x27;);\nprint json_encode($response);\n\u003C\u002Fspan>\u003C\u002Fpre>\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fsection>\u003Csection id=\"debugging-errors\" data-title=\"Debugging errors\" data-title-node=\"H2\">\u003Chr class=\"my-8\" style=\"margin-left: -48px; margin-right: -40vw\">\u003Ch2 data-anchor-id=\"debugging-errors\">Debugging errors\u003C\u002Fh2>\u003Cp>If your pre-payment hook endpoint fails to return a response, or returns a non-JSON response, an error is added to your store’s error log in the administration.\u003C\u002Fp>\u003C\u002Fsection>",[413,416,418,420],{"id":414,"title":339,"level":415},"approve","H2",{"id":417,"title":362,"level":415},"reject",{"id":419,"title":377,"level":415},"example-endpoint",{"id":421,"title":392,"level":415},"debugging-errors",[423],{"type":424,"content":425},"html","\u003Cp>In response, a JSON payload in the following format should be output on the page.\u003C\u002Fp>\u003Ch2>Approve\u003C\u002Fh2>\u003Cpre>\u003Ccode>{\n  &quot;ok&quot;: true,\n  &quot;details&quot;: &quot;&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>If you’re using the Square Platform payment splitting integration, an additional \u003Ccode class=\"badge bg-soft-danger text-danger\">payment_logic\u003C\u002Fcode> parameter can be passed through as well.\u003C\u002Fp>\u003Ch2>Reject\u003C\u002Fh2>\u003Cpre>\u003Ccode>{\n  &quot;ok&quot;: false,\n  &quot;details&quot;: &quot;Sorry, we&#039;re all out of Example Products. Please remove that item from your cart and try again.&quot;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Cp>Only a valid JSON object should be output from your endpoint. If you output anything else on the page that isn’t part of a valid JSON object, the hook fails to process and default handling occurs.\u003C\u002Fp>\u003Ch2>Example endpoint\u003C\u002Fh2>\u003Cp>The following is an example PHP endpoint for handling the pre-payment hook. It’s for illustrative purposes — it will work as-is, but blocking based on IP or email isn’t necessarily a recommended approach.\u003C\u002Fp>\u003Cpre>\u003Ccode>&lt;?php\n$rawPost = file_get_contents(&#039;php:\u002F\u002Finput&#039;);\n$cart_details = json_decode($rawPost, true);\n\n$response = array(\n    &#039;ok&#039; =&gt; true,\n    &#039;details&#039; =&gt; &quot;Sorry, we couldn&#039;t process your transaction. Please contact us to proceed.&quot;\n);\n\n$log_file = &#039;.\u002Flog.txt&#039;;\n$date = new DateTime();\n$date_string = $date-&gt;format(&#039;Y-m-d H:i:s&#039;);\n\n$log_line = $date_string . &#039;: &#039; . $cart_details[&#039;customer_ip&#039;] . &#039; - &#039;. $cart_details[&#039;_embedded&#039;][&#039;fx:customer&#039;][&#039;email&#039;] . &#039; -- &#039;;\n\n\u002F\u002F Example: Loop through cart items and reject on specific product names\nforeach($cart_details[&#039;_embedded&#039;][&#039;fx:items&#039;] as $item) {\n    if ($item[&#039;name&#039;] == &#039;Example Product&#039;) {\n        $response[&#039;ok&#039;] = false;\n        $response[&#039;details&#039;] = &quot;Sorry, we&#039;re all out of Example Products. Please remove that item from your cart and try again.&quot;;\n    }\n}\n\n\u002F\u002F Example: Reject on specific IP addresses\n\u002F\u002F The IPs to block should be in a separate file named `ips_to_reject.txt`\n\u002F\u002F Note that this looks for exact matches.\n\u002F\u002F If you wanted to check CIDR ranges, try adding something like https:\u002F\u002Fgithub.com\u002Ftholu\u002Fphp-cidr-match\n$ips_to_reject = file(&#039;.\u002Fips_to_reject.txt&#039;, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\nif ($ips_to_reject) {\n  foreach ($ips_to_reject as $ip) {\n    if ($ip == $cart_details[&#039;customer_ip&#039;]) {\n      $log_line .= &quot;IP MATCH: $ip&quot;;\n      $response[&#039;ok&#039;] = false;\n      break;\n    }\n  }\n}\n\n\u002F\u002F Example: Reject on specific email addresses (exact matches)\n\u002F\u002F The emails to block should be in a separate file named `emails_to_reject.txt`\n$emails_to_reject = file(&#039;.\u002Femails_to_reject.txt&#039;, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);\nif ($emails_to_reject) {\n  foreach ($emails_to_reject as $email) {\n    if (trim($email) == trim($cart_details[&#039;_embedded&#039;][&#039;fx:customer&#039;][&#039;email&#039;])) {\n      $log_line .= &quot;EMAIL MATCH. REJECTING.&quot;;\n      $response[&#039;ok&#039;] = false;\n      break;\n    }\n  }\n}\n\n$log_line .= (string) $response[&#039;ok&#039;] . &quot;\\n&quot;;\n$fp = fopen($log_file, &#039;a&#039;);\nfwrite($fp, $log_line);\n\nheader(&#039;Content-Type: application\u002Fjson&#039;);\nprint json_encode($response);\n\u003C\u002Fcode>\u003C\u002Fpre>\u003Ch2>Debugging errors\u003C\u002Fh2>\u003Cp>If your pre-payment hook endpoint fails to return a response, or returns a non-JSON response, an error is added to your store’s error log in the administration.\u003C\u002Fp>",{"name":427,"created_at":428,"published_at":429,"updated_at":430,"id":431,"uuid":47,"content":432,"slug":48,"full_slug":48,"sort_by_date":59,"position":612,"tag_list":613,"is_startpage":24,"parent_id":59,"meta_data":59,"group_id":614,"first_published_at":615,"release_id":59,"lang":65,"path":59,"alternates":616,"default_full_slug":59,"translated_slugs":59},"Contact","2022-09-23T19:56:58.957Z","2025-05-08T18:24:40.382Z","2025-05-08T18:24:40.392Z",3138,{"seo":433,"_uid":436,"title":437,"action":438,"fields":439,"method":588,"columns":589,"subtitle":603,"component":48,"button_text":609,"submit_title":610,"submit_subtitle":611},{"_uid":434,"title":427,"plugin":435,"description":13},"24ff7574-3bcc-48d2-85b5-e529dfea1cc4","meta-fields","8f54f1da-9d8f-49b2-89e7-840e886491cb","We're here to help.","https:\u002F\u002Fusebasin.com\u002Ff\u002F029f48d65402",[440,445,449,559,562,567,582],{"_uid":441,"name":442,"type":332,"label":443,"options":13,"required":33,"component":444,"placeholder":13},"9a70b226-2036-4f90-a052-b3efa61c5896","name","Name","form___field",{"_uid":446,"name":447,"type":447,"label":448,"options":13,"required":33,"component":444,"placeholder":13},"86ba35be-ff43-4a28-8633-14052a8f6622","email","Email Address",{"_uid":450,"name":451,"type":452,"label":453,"options":454,"required":33,"component":444,"conditions":455,"placeholder":13},"3f827475-492c-4f97-aa1e-2386ac263b6c","topic","select","Topic","Presales, Support, Billing, Partnerships, Order Enquiry, Other",[456,513,523,530,538,546,552],{"_uid":457,"equals":458,"fields":459,"component":512},"e21d97dd-e68e-4fa6-ba97-bc40f3041dde","Order Enquiry",[460],{"_uid":461,"body":462,"type":510,"title":13,"component":511},"b64992bc-6d53-48b8-b7a0-d81e5a062e50",{"type":324,"content":463},[464],{"type":327,"content":465},[466,468,476,478,480,481,486,488,493,501,503,508],{"text":467,"type":332},"We are ",{"text":469,"type":332,"marks":470},"Foxy.io",[471],{"type":472,"attrs":473},"link",{"href":474,"uuid":59,"anchor":59,"custom":475,"target":59,"linktype":31},"http:\u002F\u002FFoxy.io",{},{"text":477,"type":332},", an ecommerce platform powering ecommerce for other merchants. We do not sell products, and are unable to assist with questions about order statuses or refunds for any merchants using our platform. Please contact the merchant you ordered from for assistance. If you’d like to report a store using Foxy for fraudulent practices, please select ‘other’ in the subject.",{"type":479},"hard_break",{"type":479},{"text":482,"type":332,"marks":483},"NOTE:",[484],{"type":485},"bold",{"text":487,"type":332}," We are ",{"text":489,"type":332,"marks":490},"not ",[491],{"type":492},"italic",{"text":494,"type":332,"marks":495},"Foxy.in",[496,500],{"type":472,"attrs":497},{"href":498,"uuid":59,"anchor":59,"custom":499,"target":59,"linktype":31},"http:\u002F\u002FFoxy.in",{},{"type":492},{"text":502,"type":332},". We are not in any way affiliated with ",{"text":494,"type":332,"marks":504},[505],{"type":472,"attrs":506},{"href":498,"uuid":59,"anchor":59,"custom":507,"target":59,"linktype":31},{},{"text":509,"type":332},", and cannot help in any way with your order from that website.","danger","global___alert","form___condition",{"_uid":514,"equals":515,"fields":516,"component":512},"8765c3e1-25cf-44aa-b8ea-fc6094acf9c3","Presales",[517],{"_uid":518,"name":519,"type":520,"label":13,"options":13,"required":24,"component":444,"conditions":521,"placeholder":13,"default_value":522},"cf464f8e-d643-4f6e-af29-d3abffaf7380","department_email_address","hidden",[],"hello@foxy.io",{"_uid":524,"equals":208,"fields":525,"component":512},"4007b6d8-77e5-421d-bd1e-6f336dd853fb",[526],{"_uid":527,"name":519,"type":520,"label":13,"options":13,"required":24,"component":444,"conditions":528,"placeholder":13,"default_value":529},"7b4c6aa5-a68c-45e0-9ce1-0a36af10c0c2",[],"help@foxy.io",{"_uid":531,"equals":532,"fields":533,"component":512},"1dbb8f11-613d-43cd-9e09-1b94f6e19219","Billing",[534],{"_uid":535,"name":519,"type":520,"label":13,"options":13,"required":24,"component":444,"conditions":536,"placeholder":13,"default_value":537},"a0ac0d1b-bc4f-4a6c-a682-581d450b0b73",[],"help+billing@foxy.io",{"_uid":539,"equals":540,"fields":541,"component":512},"a0a53a50-7172-4a29-ba58-181e38874e12","Partnerships",[542],{"_uid":543,"name":519,"type":520,"label":13,"options":13,"required":24,"component":444,"conditions":544,"placeholder":13,"default_value":545},"7aa011d9-f374-4aed-b5a5-929b54aaf152",[],"partners@foxy.io",{"_uid":547,"equals":458,"fields":548,"component":512},"a4cd431f-25d5-41c7-bfdc-02c908c8fb47",[549],{"_uid":550,"name":519,"type":520,"label":13,"options":13,"required":24,"component":444,"conditions":551,"placeholder":13,"default_value":522},"f5d52168-d6ae-451b-94ee-2ced1cbd28ad",[],{"_uid":553,"equals":554,"fields":555,"component":512},"25aba1ed-eb41-4bbc-aa89-f7a7167ea86e","Other",[556],{"_uid":557,"name":519,"type":520,"label":13,"options":13,"required":24,"component":444,"conditions":558,"placeholder":13,"default_value":522},"f40dfaef-c203-4b71-bf4e-e1b43cef192b",[],{"_uid":560,"component":561},"e9c53a05-f40a-4510-aaf8-bc072a235a0c","form___subject",{"_uid":563,"name":564,"type":565,"label":566,"options":13,"required":33,"component":444,"placeholder":13},"a4c4d385-fff4-4978-99fb-b68cfea623d6","message","textarea","Message",{"_uid":568,"name":569,"type":452,"label":570,"options":571,"required":33,"component":444,"conditions":572,"placeholder":13},"8a3c9f85-f438-427d-9c7a-d7b295a14b5b","existing_user","Are you an existing user?","No, Yes",[573],{"_uid":574,"equals":575,"fields":576,"component":512},"115933d6-262a-4b59-8fa8-579c5ad73de1","Yes",[577],{"_uid":578,"name":579,"type":332,"label":580,"options":13,"required":33,"component":444,"conditions":581,"placeholder":13},"44b6ff23-98f0-4e95-b7f5-c23e06415c2d","subdomain","Store Subdomain",[],{"_uid":583,"name":584,"type":452,"label":585,"options":586,"required":33,"component":444,"conditions":587,"placeholder":13},"922a5cef-3af2-4113-8855-36c7910e3ee3","user_type","What type of user are you?","Developer, Designer, Merchant",[],"POST",[590],{"_uid":591,"text":592,"title":601,"component":602},"7323b90d-a93a-4bf1-baa9-20d0b7ead61b",{"type":324,"content":593},[594],{"type":327,"content":595},[596,598,599],{"text":597,"type":332},"855.369.9227",{"type":479},{"text":600,"type":332},"9:30am-6pm Central M-F","Pre-sales, Sales, & Partnerships","contact___footer_column",{"type":324,"content":604},[605],{"type":327,"content":606},[607],{"text":608,"type":332},"Get in touch to get help from our friendly support team.","Submit","Success!","Your email has been received. We'll get back to you as soon as we can, but it might take a business day. If you don't hear back from us in a timely manner, please check your spam folder to ensure our reply didn't go there.",-80,[],"2fd9fb7d-a48a-4184-acfd-30022d8d6f08","2022-09-23T20:10:45.360Z",[],[288,618,644],{"name":619,"created_at":620,"published_at":621,"updated_at":622,"id":623,"uuid":624,"content":625,"slug":638,"full_slug":639,"sort_by_date":59,"position":640,"tag_list":641,"is_startpage":24,"parent_id":310,"meta_data":59,"group_id":642,"first_published_at":621,"release_id":59,"lang":65,"path":59,"alternates":643,"default_full_slug":59,"translated_slugs":59},"Webhooks","2026-07-20T19:37:26.231Z","2026-07-20T19:41:27.137Z","2026-07-20T19:41:27.157Z",200239703052833,"5f8f8006-b68e-4a03-8638-2d28a556726e",{"_uid":626,"icon":13,"name":619,"type":627,"pinned":24,"summary":628,"category":13,"component":297,"blog_posts":629,"icon_custom":630,"case_studies":632,"faq_sections":633,"featured_guides":634,"mailbox_category":13,"featured_articles":635,"featured_blog_posts":636,"featured_case_studies":637},"c8a9b798-94ba-4a83-9ba5-c851b17946df","simple","Send real-time event notifications to your own endpoint when transactions, subscriptions, and customers change.",[],{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":631},{},[],[],[],[],[],[],"webhooks","help\u002Fcategories\u002Fwebhooks",-750,[],"c59e6243-064a-4f06-a367-c14a15c02ff3",[],{"name":645,"created_at":646,"published_at":647,"updated_at":648,"id":649,"uuid":401,"content":650,"slug":662,"full_slug":663,"sort_by_date":59,"position":664,"tag_list":665,"is_startpage":24,"parent_id":310,"meta_data":59,"group_id":666,"first_published_at":647,"release_id":59,"lang":65,"path":59,"alternates":667,"default_full_slug":59,"translated_slugs":59},"Pre-Payment Webhook","2026-07-20T19:40:10.710Z","2026-07-20T19:41:25.621Z","2026-07-20T19:41:25.642Z",200240376723276,{"_uid":651,"icon":13,"name":645,"type":627,"pinned":24,"summary":652,"category":624,"component":297,"blog_posts":653,"icon_custom":654,"case_studies":656,"faq_sections":657,"featured_guides":658,"mailbox_category":13,"featured_articles":659,"featured_blog_posts":660,"featured_case_studies":661},"d1f89ece-95ef-4c06-b1ce-30e0c404e9b4","Approve or reject a transaction with custom validation before payment is sent to the gateway.",[],{"id":59,"alt":59,"name":13,"focus":59,"title":59,"source":59,"filename":13,"copyright":59,"fieldtype":81,"meta_data":655},{},[],[],[],[],[],[],"pre-payment-webhook","help\u002Fcategories\u002Fpre-payment-webhook",-810,[],"5e799081-aa86-40f8-add1-8646aa9b5f96",[],{},1784651809631]