[{"data":1,"prerenderedAt":551},["ShallowReactive",2],{"article-en-/articles/about-jdonate":3},{"id":4,"title":5,"body":6,"date":537,"description":19,"extension":538,"head":539,"image":540,"meta":541,"navigation":542,"ogImage":539,"path":543,"readingTime":544,"robots":539,"schemaOrg":539,"seo":545,"sitemap":546,"stem":547,"tags":548},"articles_en/articles/about-jdonate.md","JDonate 2 | Laravel 11 | Vue3",{"type":7,"value":8,"toc":530},"minimal",[9,17,20,25,28,32,35,40,43,151,155,158,200,203,405,408,455,458,506,510,513,526],[10,11,12],"p",{},[13,14],"img",{"alt":15,"src":16},"preview","/articles/jdonate_project.png",[10,18,19],{},"JDonate 2 — автодонат магазин под Steam авторизацию. Имеет на борту мультисерверность, API для работы с корзиной, админ панель.",[21,22,24],"h3",{"id":23},"требования-к-серверу","Требования к серверу",[10,26,27],{},"Для запуска JDonate 2 на вашем сервере рекомендуется использовать VPS с минимальной конфигурацией: 2 ГБ оперативной памяти и операционную систему Linux. Для защиты от DDoS-атак мы советуем использовать Cloudflare, что поможет обеспечить стабильную работу сайта даже при атаках.",[21,29,31],{"id":30},"система-промокодов","Система промокодов",[10,33,34],{},"Позволяет создавать промокоды, типы - на бонусный баланс, и на бонус при пополнение. Промокоды имеют свойство накапливаться.",[36,37,39],"h2",{"id":38},"плагин","Плагин",[10,41,42],{},"Плагин поставляется отдельно, 5.000рублей. Хотите написать свой? Нет проблем! Ниже описано API позволяющее это сделать, а также конфиг штатного плагина.",[44,45,50],"pre",{"className":46,"code":47,"language":48,"meta":49,"style":49},"language-bash shiki shiki-themes github-dark github-dark github-light","\"Настройки API\": {\n  \"Основная ссылка\": \"https://domain.ru/\",\n  \"API ключ\": \"your_api_key\",\n  \"ID сервера\": \"your_server_ID\",\n},\n\"Настройки плагина\": {\n  \"Запретить получать товар в зоне чужого шкафа?\": true,\n  \"Включить отображение подключяемых игроков в Терак сервере?\": true\n}\n","bash","",[51,52,53,70,81,92,103,110,120,134,145],"code",{"__ignoreMap":49},[54,55,58,62,66],"span",{"class":56,"line":57},"line",1,[54,59,61],{"class":60},"sm1F7","\"Настройки API\"",[54,63,65],{"class":64},"sUGc6",":",[54,67,69],{"class":68},"sAU8f"," {\n",[54,71,73,76,78],{"class":56,"line":72},2,[54,74,75],{"class":60},"  \"Основная ссылка\"",[54,77,65],{"class":64},[54,79,80],{"class":68}," \"https://domain.ru/\",\n",[54,82,84,87,89],{"class":56,"line":83},3,[54,85,86],{"class":60},"  \"API ключ\"",[54,88,65],{"class":64},[54,90,91],{"class":68}," \"your_api_key\",\n",[54,93,95,98,100],{"class":56,"line":94},4,[54,96,97],{"class":60},"  \"ID сервера\"",[54,99,65],{"class":64},[54,101,102],{"class":68}," \"your_server_ID\",\n",[54,104,106],{"class":56,"line":105},5,[54,107,109],{"class":108},"s2o2U","},\n",[54,111,113,116,118],{"class":56,"line":112},6,[54,114,115],{"class":60},"\"Настройки плагина\"",[54,117,65],{"class":64},[54,119,69],{"class":68},[54,121,123,126,128,131],{"class":56,"line":122},7,[54,124,125],{"class":60},"  \"Запретить получать товар в зоне чужого шкафа?\"",[54,127,65],{"class":64},[54,129,130],{"class":64}," true",[54,132,133],{"class":68},",\n",[54,135,137,140,142],{"class":56,"line":136},8,[54,138,139],{"class":60},"  \"Включить отображение подключяемых игроков в Терак сервере?\"",[54,141,65],{"class":64},[54,143,144],{"class":64}," true\n",[54,146,148],{"class":56,"line":147},9,[54,149,150],{"class":108},"}\n",[36,152,154],{"id":153},"api-для-работы-с-корзиной","API для работы с корзиной",[10,156,157],{},"Одной из особенностей JDonate 2 является поддержка API для работы с корзиной. Взаимодействие с корзиной происходит через REST API, с конечной точкой:",[44,159,161],{"className":46,"code":160,"language":48,"meta":49,"style":49},"POST /api/cart\n{\n  \"server_id\": server_id,\n  \"steamid\": your_steam_id\n}\n",[51,162,163,171,176,186,196],{"__ignoreMap":49},[54,164,165,168],{"class":56,"line":57},[54,166,167],{"class":60},"POST",[54,169,170],{"class":68}," /api/cart\n",[54,172,173],{"class":56,"line":72},[54,174,175],{"class":108},"{\n",[54,177,178,181,183],{"class":56,"line":83},[54,179,180],{"class":60},"  \"server_id\"",[54,182,65],{"class":64},[54,184,185],{"class":68}," server_id,\n",[54,187,188,191,193],{"class":56,"line":94},[54,189,190],{"class":60},"  \"steamid\"",[54,192,65],{"class":64},[54,194,195],{"class":68}," your_steam_id\n",[54,197,198],{"class":56,"line":105},[54,199,150],{"class":108},[10,201,202],{},"Ответ:",[44,204,208],{"className":205,"code":206,"language":207,"meta":49,"style":49},"language-php shiki shiki-themes github-dark github-dark github-light","{\n    \"id\": 16,\n    \"user_id\": \"76561198996849773\",\n    \"server_id\": \"1\",\n    \"items\": [\n        {\n            \"type\": \"item\",\n            \"id\": 11,\n            \"itemid\": -1321651331,\n            \"name\": \"Explosive 5.56 Rifle Ammo\",\n            \"image\": \"https://jdonate.jaehaerys.dev/images/items/ammo.rifle.explosive.png\",\n            \"amount\": 64,\n            \"shop_cart_id\": \"72ce6a89-e68b-4d2b-9172-ec21dba60e91\"\n        },\n        {\n            \"type\": \"blueprint\",\n            \"id\": 246,\n            \"itemid\": -1878475007,\n            \"name\": \"Satchel Charge\",\n            \"image\": \"https://jdonate.jaehaerys.dev/images/items/explosive.satchel.png\",\n            \"amount\": 1,\n            \"shop_cart_id\": \"b4eab3bf-97ca-4c61-b644-758f78374516\"\n        },\n        {\n            \"type\": \"custom\",\n            \"name\": \"13\",\n            \"image\": \"13\",\n            \"amount\": 1,\n            \"command\": \"grant.group 76561198996849773 test 13d \",\n            \"shop_cart_id\": \"9ead63a5-7cd7-4805-a8c5-88dc83e3df92\"\n        }\n    ],\n    \"created_at\": \"2025-02-20T09:56:43.000000Z\",\n    \"updated_at\": \"2025-02-20T09:56:43.000000Z\"\n}\n","php",[51,209,210,214,219,224,229,234,239,244,249,254,260,266,272,278,284,289,295,301,307,313,319,325,331,336,341,347,353,359,364,370,376,382,388,394,400],{"__ignoreMap":49},[54,211,212],{"class":56,"line":57},[54,213,175],{},[54,215,216],{"class":56,"line":72},[54,217,218],{},"    \"id\": 16,\n",[54,220,221],{"class":56,"line":83},[54,222,223],{},"    \"user_id\": \"76561198996849773\",\n",[54,225,226],{"class":56,"line":94},[54,227,228],{},"    \"server_id\": \"1\",\n",[54,230,231],{"class":56,"line":105},[54,232,233],{},"    \"items\": [\n",[54,235,236],{"class":56,"line":112},[54,237,238],{},"        {\n",[54,240,241],{"class":56,"line":122},[54,242,243],{},"            \"type\": \"item\",\n",[54,245,246],{"class":56,"line":136},[54,247,248],{},"            \"id\": 11,\n",[54,250,251],{"class":56,"line":147},[54,252,253],{},"            \"itemid\": -1321651331,\n",[54,255,257],{"class":56,"line":256},10,[54,258,259],{},"            \"name\": \"Explosive 5.56 Rifle Ammo\",\n",[54,261,263],{"class":56,"line":262},11,[54,264,265],{},"            \"image\": \"https://jdonate.jaehaerys.dev/images/items/ammo.rifle.explosive.png\",\n",[54,267,269],{"class":56,"line":268},12,[54,270,271],{},"            \"amount\": 64,\n",[54,273,275],{"class":56,"line":274},13,[54,276,277],{},"            \"shop_cart_id\": \"72ce6a89-e68b-4d2b-9172-ec21dba60e91\"\n",[54,279,281],{"class":56,"line":280},14,[54,282,283],{},"        },\n",[54,285,287],{"class":56,"line":286},15,[54,288,238],{},[54,290,292],{"class":56,"line":291},16,[54,293,294],{},"            \"type\": \"blueprint\",\n",[54,296,298],{"class":56,"line":297},17,[54,299,300],{},"            \"id\": 246,\n",[54,302,304],{"class":56,"line":303},18,[54,305,306],{},"            \"itemid\": -1878475007,\n",[54,308,310],{"class":56,"line":309},19,[54,311,312],{},"            \"name\": \"Satchel Charge\",\n",[54,314,316],{"class":56,"line":315},20,[54,317,318],{},"            \"image\": \"https://jdonate.jaehaerys.dev/images/items/explosive.satchel.png\",\n",[54,320,322],{"class":56,"line":321},21,[54,323,324],{},"            \"amount\": 1,\n",[54,326,328],{"class":56,"line":327},22,[54,329,330],{},"            \"shop_cart_id\": \"b4eab3bf-97ca-4c61-b644-758f78374516\"\n",[54,332,334],{"class":56,"line":333},23,[54,335,283],{},[54,337,339],{"class":56,"line":338},24,[54,340,238],{},[54,342,344],{"class":56,"line":343},25,[54,345,346],{},"            \"type\": \"custom\",\n",[54,348,350],{"class":56,"line":349},26,[54,351,352],{},"            \"name\": \"13\",\n",[54,354,356],{"class":56,"line":355},27,[54,357,358],{},"            \"image\": \"13\",\n",[54,360,362],{"class":56,"line":361},28,[54,363,324],{},[54,365,367],{"class":56,"line":366},29,[54,368,369],{},"            \"command\": \"grant.group 76561198996849773 test 13d \",\n",[54,371,373],{"class":56,"line":372},30,[54,374,375],{},"            \"shop_cart_id\": \"9ead63a5-7cd7-4805-a8c5-88dc83e3df92\"\n",[54,377,379],{"class":56,"line":378},31,[54,380,381],{},"        }\n",[54,383,385],{"class":56,"line":384},32,[54,386,387],{},"    ],\n",[54,389,391],{"class":56,"line":390},33,[54,392,393],{},"    \"created_at\": \"2025-02-20T09:56:43.000000Z\",\n",[54,395,397],{"class":56,"line":396},34,[54,398,399],{},"    \"updated_at\": \"2025-02-20T09:56:43.000000Z\"\n",[54,401,403],{"class":56,"line":402},35,[54,404,150],{},[10,406,407],{},"Удалить предмет:",[44,409,411],{"className":46,"code":410,"language":48,"meta":49,"style":49},"DELETE /api/cart\n{\n  \"steamid\": steamid,\n  \"server_id\": server_id,\n  \"shop_cart_id\": your_cart_id\n}\n",[51,412,413,420,424,433,441,451],{"__ignoreMap":49},[54,414,415,418],{"class":56,"line":57},[54,416,417],{"class":60},"DELETE",[54,419,170],{"class":68},[54,421,422],{"class":56,"line":72},[54,423,175],{"class":108},[54,425,426,428,430],{"class":56,"line":83},[54,427,190],{"class":60},[54,429,65],{"class":64},[54,431,432],{"class":68}," steamid,\n",[54,434,435,437,439],{"class":56,"line":94},[54,436,180],{"class":60},[54,438,65],{"class":64},[54,440,185],{"class":68},[54,442,443,446,448],{"class":56,"line":105},[54,444,445],{"class":60},"  \"shop_cart_id\"",[54,447,65],{"class":64},[54,449,450],{"class":68}," your_cart_id\n",[54,452,453],{"class":56,"line":112},[54,454,150],{"class":108},[10,456,457],{},"Изменить баланс",[44,459,461],{"className":46,"code":460,"language":48,"meta":49,"style":49},"POST /api/user/balance\n{\n  \"steamid\": steamid,\n  \"balance\": balance,\n  \"type\": subtract/add\n}\n",[51,462,463,470,474,482,492,502],{"__ignoreMap":49},[54,464,465,467],{"class":56,"line":57},[54,466,167],{"class":60},[54,468,469],{"class":68}," /api/user/balance\n",[54,471,472],{"class":56,"line":72},[54,473,175],{"class":108},[54,475,476,478,480],{"class":56,"line":83},[54,477,190],{"class":60},[54,479,65],{"class":64},[54,481,432],{"class":68},[54,483,484,487,489],{"class":56,"line":94},[54,485,486],{"class":60},"  \"balance\"",[54,488,65],{"class":64},[54,490,491],{"class":68}," balance,\n",[54,493,494,497,499],{"class":56,"line":105},[54,495,496],{"class":60},"  \"type\"",[54,498,65],{"class":64},[54,500,501],{"class":68}," subtract/add\n",[54,503,504],{"class":56,"line":112},[54,505,150],{"class":108},[36,507,509],{"id":508},"безопасность-api","Безопасность API",[10,511,512],{},"Для обеспечения безопасности запросов все взаимодействия с API должны сопровождаться использованием уникального ключа API, который передается в заголовках запросов. В заголовках должен быть обязательно указан параметр X-API-KEY.",[44,514,516],{"className":46,"code":515,"language":48,"meta":49,"style":49},"X-API-KEY: your-api-key-here\n",[51,517,518],{"__ignoreMap":49},[54,519,520,523],{"class":56,"line":57},[54,521,522],{"class":60},"X-API-KEY:",[54,524,525],{"class":68}," your-api-key-here\n",[527,528,529],"style",{},"html pre.shiki code .sm1F7, html code.shiki .sm1F7{--shiki-dark:#B392F0;--shiki-default:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sUGc6, html code.shiki .sUGc6{--shiki-dark:#79B8FF;--shiki-default:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAU8f, html code.shiki .sAU8f{--shiki-dark:#9ECBFF;--shiki-default:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s2o2U, html code.shiki .s2o2U{--shiki-dark:#E1E4E8;--shiki-default:#E1E4E8;--shiki-light:#24292E}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 .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":49,"searchDepth":72,"depth":72,"links":531},[532,533,534,535,536],{"id":23,"depth":83,"text":24},{"id":30,"depth":83,"text":31},{"id":38,"depth":72,"text":39},{"id":153,"depth":72,"text":154},{"id":508,"depth":72,"text":509},"10/02/2025","md",null,"https://jaehaerys.dev/articles/jdonate_project.png",{},true,"/articles/about-jdonate","10",{"title":5,"description":19},{"loc":543},"articles/about-jdonate",[549,550],"Laravel","Vue",1752319263834]