[{"data":1,"prerenderedAt":1673},["ShallowReactive",2],{"navigation_docs":3,"-guides-payments-non-charcole-users":119,"-guides-payments-non-charcole-users-surround":1668},[4,25],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"/getting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","/getting-started/introduction","1.getting-started/2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","/getting-started/installation","1.getting-started/3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project Structure","/getting-started/project-structure","1.getting-started/4.project-structure","i-lucide-folder-tree",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Guides","/guides","2. guides",[30,34,49,74],{"title":31,"path":32,"stem":33,"icon":24},"Repositories","/guides/respositories","2. guides/3. respositories",{"title":35,"icon":6,"path":36,"stem":37,"children":38,"page":6},"Authentication","/guides/authentication","2. guides/4. authentication",[39,44],{"title":40,"path":41,"stem":42,"icon":43},"Authentication Setup","/guides/authentication/setup","2. guides/4. authentication/5. setup","i-lucide-lock-keyhole",{"title":45,"path":46,"stem":47,"icon":48},"JWT Configuration","/guides/authentication/jwt-configuration","2. guides/4. authentication/6. jwt-configuration","i-lucide-key",{"title":50,"icon":6,"path":51,"stem":52,"children":53,"page":6},"Charcoles Swagger","/guides/swagger","2. guides/5. swagger",[54,59,64,69],{"title":55,"path":56,"stem":57,"icon":58},"Introduction to Charcole Swagger Documentation","/guides/swagger/introduction","2. guides/5. swagger/6. introduction","i-lucide-book-open",{"title":60,"path":61,"stem":62,"icon":63},"Adding Swagger to Existing Charcole Projects","/guides/swagger/swagger-migration","2. guides/5. swagger/7. swagger-migration","i-lucide-arrow-up-circle",{"title":65,"path":66,"stem":67,"icon":68},"Swagger for Non-Charcole Projects","/guides/swagger/non-charcole-users","2. guides/5. swagger/8. non-charcole-users","i-lucide-package-plus",{"title":70,"path":71,"stem":72,"icon":73},"Swagger Examples","/guides/swagger/swagger-examples","2. guides/5. swagger/9. swagger-examples","i-lucide-code-2",{"title":75,"icon":76,"path":77,"stem":78,"children":79,"page":6},"Charcoles Payments","i-heroicons-credit-card","/guides/payments","2. guides/6. payments",[80,84,89,94,99,104,109,114],{"title":81,"path":82,"stem":83,"icon":76},"Payments","/guides/payments/introduction","2. guides/6. payments/1. introduction",{"title":85,"path":86,"stem":87,"icon":88},"Setup","/guides/payments/setup","2. guides/6. payments/2. setup","i-heroicons-wrench-screwdriver",{"title":90,"path":91,"stem":92,"icon":93},"Providers","/guides/payments/providers","2. guides/6. payments/3. providers","i-heroicons-building-library",{"title":95,"path":96,"stem":97,"icon":98},"API Endpoints","/guides/payments/endpoints","2. guides/6. payments/4. endpoints","i-heroicons-arrows-right-left",{"title":100,"path":101,"stem":102,"icon":103},"Webhooks","/guides/payments/webhooks","2. guides/6. payments/5. webhooks","i-heroicons-bolt",{"title":105,"path":106,"stem":107,"icon":108},"Environment Variables","/guides/payments/environment-variables","2. guides/6. payments/6. environment-variables","i-heroicons-key",{"title":110,"path":111,"stem":112,"icon":113},"Using Without Charcole","/guides/payments/non-charcole-users","2. guides/6. payments/7. non-charcole-users","i-heroicons-puzzle-piece",{"title":115,"path":116,"stem":117,"icon":118},"Examples","/guides/payments/payments-examples","2. guides/6. payments/8. payments-examples","i-heroicons-code-bracket",{"id":120,"title":110,"body":121,"description":1654,"extension":1655,"links":1656,"meta":1657,"navigation":1658,"path":111,"seo":1659,"stem":112,"__hash__":1667},"docs/2. guides/6. payments/7. non-charcole-users.md",{"type":122,"value":123,"toc":1640},"minimark",[124,129,138,141,144,169,171,174,186,478,481,483,487,494,625,627,631,702,708,732,734,738,831,833,837,844,933,935,939,942,1132,1323,1326,1348,1350,1354,1361,1520,1522,1525,1531,1585,1592,1594,1598,1601,1607,1609,1613,1636],[125,126,128],"h2",{"id":127},"for-existing-express-apps","For Existing Express Apps",[130,131,132,133,137],"p",{},"If you have an existing Express application and want to add ",[134,135,136],"code",{},"@charcoles/payments"," without using the Charcole CLI, install the package directly.",[139,140],"hr",{},[125,142,16],{"id":143},"installation",[145,146,151],"pre",{"className":147,"code":148,"language":149,"meta":150,"style":150},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","npm install @charcoles/payments\n","bash","",[134,152,153],{"__ignoreMap":150},[154,155,158,162,166],"span",{"class":156,"line":157},"line",1,[154,159,161],{"class":160},"sBMFI","npm",[154,163,165],{"class":164},"sfazB"," install",[154,167,168],{"class":164}," @charcoles/payments\n",[139,170],{},[125,172,85],{"id":173},"setup",[130,175,176,177,181,182,185],{},"The critical requirement is middleware ordering. Register the raw body middleware ",[178,179,180],"strong",{},"before"," ",[134,183,184],{},"express.json()",":",[145,187,191],{"className":188,"code":189,"language":190,"meta":150,"style":150},"language-js shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import express from 'express'\nimport { setupPayments } from '@charcoles/payments'\n\nconst app = express()\n\n// ⚠️ Must come BEFORE express.json()\napp.use('/payments/webhook', express.raw({ type: 'application/json' }))\n\napp.use(express.json())\n// ... rest of your middleware\n\nsetupPayments(app, {\n  provider: 'stripe',\n  stripeSecretKey: process.env.STRIPE_SECRET_KEY,\n  stripeWebhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\n})\n\napp.listen(3000)\n","js",[134,192,193,216,239,246,266,271,278,334,339,359,365,370,384,402,425,446,455,460],{"__ignoreMap":150},[154,194,195,199,203,206,210,213],{"class":156,"line":157},[154,196,198],{"class":197},"s7zQu","import",[154,200,202],{"class":201},"sTEyZ"," express ",[154,204,205],{"class":197},"from",[154,207,209],{"class":208},"sMK4o"," '",[154,211,212],{"class":164},"express",[154,214,215],{"class":208},"'\n",[154,217,219,221,224,227,230,233,235,237],{"class":156,"line":218},2,[154,220,198],{"class":197},[154,222,223],{"class":208}," {",[154,225,226],{"class":201}," setupPayments",[154,228,229],{"class":208}," }",[154,231,232],{"class":197}," from",[154,234,209],{"class":208},[154,236,136],{"class":164},[154,238,215],{"class":208},[154,240,242],{"class":156,"line":241},3,[154,243,245],{"emptyLinePlaceholder":244},true,"\n",[154,247,249,253,256,259,263],{"class":156,"line":248},4,[154,250,252],{"class":251},"spNyl","const",[154,254,255],{"class":201}," app ",[154,257,258],{"class":208},"=",[154,260,262],{"class":261},"s2Zo4"," express",[154,264,265],{"class":201},"()\n",[154,267,269],{"class":156,"line":268},5,[154,270,245],{"emptyLinePlaceholder":244},[154,272,274],{"class":156,"line":273},6,[154,275,277],{"class":276},"sHwdD","// ⚠️ Must come BEFORE express.json()\n",[154,279,281,284,287,290,293,296,299,301,304,306,308,311,313,316,320,322,324,327,329,331],{"class":156,"line":280},7,[154,282,283],{"class":201},"app",[154,285,286],{"class":208},".",[154,288,289],{"class":261},"use",[154,291,292],{"class":201},"(",[154,294,295],{"class":208},"'",[154,297,298],{"class":164},"/payments/webhook",[154,300,295],{"class":208},[154,302,303],{"class":208},",",[154,305,262],{"class":201},[154,307,286],{"class":208},[154,309,310],{"class":261},"raw",[154,312,292],{"class":201},[154,314,315],{"class":208},"{",[154,317,319],{"class":318},"swJcz"," type",[154,321,185],{"class":208},[154,323,209],{"class":208},[154,325,326],{"class":164},"application/json",[154,328,295],{"class":208},[154,330,229],{"class":208},[154,332,333],{"class":201},"))\n",[154,335,337],{"class":156,"line":336},8,[154,338,245],{"emptyLinePlaceholder":244},[154,340,342,344,346,348,351,353,356],{"class":156,"line":341},9,[154,343,283],{"class":201},[154,345,286],{"class":208},[154,347,289],{"class":261},[154,349,350],{"class":201},"(express",[154,352,286],{"class":208},[154,354,355],{"class":261},"json",[154,357,358],{"class":201},"())\n",[154,360,362],{"class":156,"line":361},10,[154,363,364],{"class":276},"// ... rest of your middleware\n",[154,366,368],{"class":156,"line":367},11,[154,369,245],{"emptyLinePlaceholder":244},[154,371,373,376,379,381],{"class":156,"line":372},12,[154,374,375],{"class":261},"setupPayments",[154,377,378],{"class":201},"(app",[154,380,303],{"class":208},[154,382,383],{"class":208}," {\n",[154,385,387,390,392,394,397,399],{"class":156,"line":386},13,[154,388,389],{"class":318},"  provider",[154,391,185],{"class":208},[154,393,209],{"class":208},[154,395,396],{"class":164},"stripe",[154,398,295],{"class":208},[154,400,401],{"class":208},",\n",[154,403,405,408,410,413,415,418,420,423],{"class":156,"line":404},14,[154,406,407],{"class":318},"  stripeSecretKey",[154,409,185],{"class":208},[154,411,412],{"class":201}," process",[154,414,286],{"class":208},[154,416,417],{"class":201},"env",[154,419,286],{"class":208},[154,421,422],{"class":201},"STRIPE_SECRET_KEY",[154,424,401],{"class":208},[154,426,428,431,433,435,437,439,441,444],{"class":156,"line":427},15,[154,429,430],{"class":318},"  stripeWebhookSecret",[154,432,185],{"class":208},[154,434,412],{"class":201},[154,436,286],{"class":208},[154,438,417],{"class":201},[154,440,286],{"class":208},[154,442,443],{"class":201},"STRIPE_WEBHOOK_SECRET",[154,445,401],{"class":208},[154,447,449,452],{"class":156,"line":448},16,[154,450,451],{"class":208},"}",[154,453,454],{"class":201},")\n",[154,456,458],{"class":156,"line":457},17,[154,459,245],{"emptyLinePlaceholder":244},[154,461,463,465,467,470,472,476],{"class":156,"line":462},18,[154,464,283],{"class":201},[154,466,286],{"class":208},[154,468,469],{"class":261},"listen",[154,471,292],{"class":201},[154,473,475],{"class":474},"sbssI","3000",[154,477,454],{"class":201},[130,479,480],{},"If you reverse the order, webhook signature verification will fail silently.",[139,482],{},[125,484,486],{"id":485},"configuration-options","Configuration Options",[130,488,489,490,493],{},"The ",[134,491,492],{},"setupPayments()"," function accepts an options object:",[145,495,497],{"className":188,"code":496,"language":190,"meta":150,"style":150},"setupPayments(app, {\n  provider: 'stripe',              // or 'lemonsqueezy'\n  stripeSecretKey: '...',\n  stripeWebhookSecret: '...',\n  lemonSqueezyApiKey: '...',\n  lemonSqueezyWebhookSecret: '...',\n  lemonSqueezyStoreId: '...',\n  mountPath: '/payments',          // default — change if needed\n})\n",[134,498,499,509,526,541,555,570,585,600,619],{"__ignoreMap":150},[154,500,501,503,505,507],{"class":156,"line":157},[154,502,375],{"class":261},[154,504,378],{"class":201},[154,506,303],{"class":208},[154,508,383],{"class":208},[154,510,511,513,515,517,519,521,523],{"class":156,"line":218},[154,512,389],{"class":318},[154,514,185],{"class":208},[154,516,209],{"class":208},[154,518,396],{"class":164},[154,520,295],{"class":208},[154,522,303],{"class":208},[154,524,525],{"class":276},"              // or 'lemonsqueezy'\n",[154,527,528,530,532,534,537,539],{"class":156,"line":241},[154,529,407],{"class":318},[154,531,185],{"class":208},[154,533,209],{"class":208},[154,535,536],{"class":164},"...",[154,538,295],{"class":208},[154,540,401],{"class":208},[154,542,543,545,547,549,551,553],{"class":156,"line":248},[154,544,430],{"class":318},[154,546,185],{"class":208},[154,548,209],{"class":208},[154,550,536],{"class":164},[154,552,295],{"class":208},[154,554,401],{"class":208},[154,556,557,560,562,564,566,568],{"class":156,"line":268},[154,558,559],{"class":318},"  lemonSqueezyApiKey",[154,561,185],{"class":208},[154,563,209],{"class":208},[154,565,536],{"class":164},[154,567,295],{"class":208},[154,569,401],{"class":208},[154,571,572,575,577,579,581,583],{"class":156,"line":273},[154,573,574],{"class":318},"  lemonSqueezyWebhookSecret",[154,576,185],{"class":208},[154,578,209],{"class":208},[154,580,536],{"class":164},[154,582,295],{"class":208},[154,584,401],{"class":208},[154,586,587,590,592,594,596,598],{"class":156,"line":280},[154,588,589],{"class":318},"  lemonSqueezyStoreId",[154,591,185],{"class":208},[154,593,209],{"class":208},[154,595,536],{"class":164},[154,597,295],{"class":208},[154,599,401],{"class":208},[154,601,602,605,607,609,612,614,616],{"class":156,"line":336},[154,603,604],{"class":318},"  mountPath",[154,606,185],{"class":208},[154,608,209],{"class":208},[154,610,611],{"class":164},"/payments",[154,613,295],{"class":208},[154,615,303],{"class":208},[154,617,618],{"class":276},"          // default — change if needed\n",[154,620,621,623],{"class":156,"line":341},[154,622,451],{"class":208},[154,624,454],{"class":201},[139,626],{},[125,628,630],{"id":629},"stripe-setup","Stripe Setup",[145,632,634],{"className":188,"code":633,"language":190,"meta":150,"style":150},"setupPayments(app, {\n  provider: 'stripe',\n  stripeSecretKey: process.env.STRIPE_SECRET_KEY,\n  stripeWebhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\n})\n",[134,635,636,646,660,678,696],{"__ignoreMap":150},[154,637,638,640,642,644],{"class":156,"line":157},[154,639,375],{"class":261},[154,641,378],{"class":201},[154,643,303],{"class":208},[154,645,383],{"class":208},[154,647,648,650,652,654,656,658],{"class":156,"line":218},[154,649,389],{"class":318},[154,651,185],{"class":208},[154,653,209],{"class":208},[154,655,396],{"class":164},[154,657,295],{"class":208},[154,659,401],{"class":208},[154,661,662,664,666,668,670,672,674,676],{"class":156,"line":241},[154,663,407],{"class":318},[154,665,185],{"class":208},[154,667,412],{"class":201},[154,669,286],{"class":208},[154,671,417],{"class":201},[154,673,286],{"class":208},[154,675,422],{"class":201},[154,677,401],{"class":208},[154,679,680,682,684,686,688,690,692,694],{"class":156,"line":248},[154,681,430],{"class":318},[154,683,185],{"class":208},[154,685,412],{"class":201},[154,687,286],{"class":208},[154,689,417],{"class":201},[154,691,286],{"class":208},[154,693,443],{"class":201},[154,695,401],{"class":208},[154,697,698,700],{"class":156,"line":268},[154,699,451],{"class":208},[154,701,454],{"class":201},[130,703,704,705,185],{},"All endpoints are live at ",[134,706,707],{},"/payments/*",[709,710,711,717,722,727],"ul",{},[712,713,714],"li",{},[134,715,716],{},"POST /payments/create-intent",[712,718,719],{},[134,720,721],{},"POST /payments/refund",[712,723,724],{},[134,725,726],{},"GET /payments/status/:paymentId",[712,728,729],{},[134,730,731],{},"POST /payments/webhook",[139,733],{},[125,735,737],{"id":736},"lemonsqueezy-setup","LemonSqueezy Setup",[145,739,741],{"className":188,"code":740,"language":190,"meta":150,"style":150},"setupPayments(app, {\n  provider: 'lemonsqueezy',\n  lemonSqueezyApiKey: process.env.LEMONSQUEEZY_API_KEY,\n  lemonSqueezyWebhookSecret: process.env.LEMONSQUEEZY_WEBHOOK_SECRET,\n  lemonSqueezyStoreId: process.env.LEMONSQUEEZY_STORE_ID,\n})\n",[134,742,743,753,768,787,806,825],{"__ignoreMap":150},[154,744,745,747,749,751],{"class":156,"line":157},[154,746,375],{"class":261},[154,748,378],{"class":201},[154,750,303],{"class":208},[154,752,383],{"class":208},[154,754,755,757,759,761,764,766],{"class":156,"line":218},[154,756,389],{"class":318},[154,758,185],{"class":208},[154,760,209],{"class":208},[154,762,763],{"class":164},"lemonsqueezy",[154,765,295],{"class":208},[154,767,401],{"class":208},[154,769,770,772,774,776,778,780,782,785],{"class":156,"line":241},[154,771,559],{"class":318},[154,773,185],{"class":208},[154,775,412],{"class":201},[154,777,286],{"class":208},[154,779,417],{"class":201},[154,781,286],{"class":208},[154,783,784],{"class":201},"LEMONSQUEEZY_API_KEY",[154,786,401],{"class":208},[154,788,789,791,793,795,797,799,801,804],{"class":156,"line":248},[154,790,574],{"class":318},[154,792,185],{"class":208},[154,794,412],{"class":201},[154,796,286],{"class":208},[154,798,417],{"class":201},[154,800,286],{"class":208},[154,802,803],{"class":201},"LEMONSQUEEZY_WEBHOOK_SECRET",[154,805,401],{"class":208},[154,807,808,810,812,814,816,818,820,823],{"class":156,"line":268},[154,809,589],{"class":318},[154,811,185],{"class":208},[154,813,412],{"class":201},[154,815,286],{"class":208},[154,817,417],{"class":201},[154,819,286],{"class":208},[154,821,822],{"class":201},"LEMONSQUEEZY_STORE_ID",[154,824,401],{"class":208},[154,826,827,829],{"class":156,"line":273},[154,828,451],{"class":208},[154,830,454],{"class":201},[139,832],{},[125,834,836],{"id":835},"custom-mount-path","Custom Mount Path",[130,838,839,840,843],{},"If you want to mount payment endpoints at a different path, use the ",[134,841,842],{},"mountPath"," option:",[145,845,847],{"className":188,"code":846,"language":190,"meta":150,"style":150},"setupPayments(app, {\n  provider: 'stripe',\n  stripeSecretKey: process.env.STRIPE_SECRET_KEY,\n  stripeWebhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\n  mountPath: '/api/payments',      // endpoints at /api/payments/*\n})\n",[134,848,849,859,873,891,909,927],{"__ignoreMap":150},[154,850,851,853,855,857],{"class":156,"line":157},[154,852,375],{"class":261},[154,854,378],{"class":201},[154,856,303],{"class":208},[154,858,383],{"class":208},[154,860,861,863,865,867,869,871],{"class":156,"line":218},[154,862,389],{"class":318},[154,864,185],{"class":208},[154,866,209],{"class":208},[154,868,396],{"class":164},[154,870,295],{"class":208},[154,872,401],{"class":208},[154,874,875,877,879,881,883,885,887,889],{"class":156,"line":241},[154,876,407],{"class":318},[154,878,185],{"class":208},[154,880,412],{"class":201},[154,882,286],{"class":208},[154,884,417],{"class":201},[154,886,286],{"class":208},[154,888,422],{"class":201},[154,890,401],{"class":208},[154,892,893,895,897,899,901,903,905,907],{"class":156,"line":248},[154,894,430],{"class":318},[154,896,185],{"class":208},[154,898,412],{"class":201},[154,900,286],{"class":208},[154,902,417],{"class":201},[154,904,286],{"class":208},[154,906,443],{"class":201},[154,908,401],{"class":208},[154,910,911,913,915,917,920,922,924],{"class":156,"line":268},[154,912,604],{"class":318},[154,914,185],{"class":208},[154,916,209],{"class":208},[154,918,919],{"class":164},"/api/payments",[154,921,295],{"class":208},[154,923,303],{"class":208},[154,925,926],{"class":276},"      // endpoints at /api/payments/*\n",[154,928,929,931],{"class":156,"line":273},[154,930,451],{"class":208},[154,932,454],{"class":201},[139,934],{},[125,936,938],{"id":937},"using-adapters-directly","Using Adapters Directly",[130,940,941],{},"If you only need the adapter logic without the Express routes, instantiate adapters directly:",[145,943,945],{"className":188,"code":944,"language":190,"meta":150,"style":150},"import { StripeAdapter, LemonSqueezyAdapter } from '@charcoles/payments'\n\n// Stripe\nconst stripeAdapter = new StripeAdapter({\n  secretKey: process.env.STRIPE_SECRET_KEY,\n  webhookSecret: process.env.STRIPE_WEBHOOK_SECRET,\n})\n\nconst result = await stripeAdapter.createPayment({\n  amount: 2999,\n  currency: 'usd',\n})\n\nconsole.log(result.data.clientSecret)\n",[134,946,947,971,975,980,999,1018,1037,1043,1047,1071,1083,1099,1105,1109],{"__ignoreMap":150},[154,948,949,951,953,956,958,961,963,965,967,969],{"class":156,"line":157},[154,950,198],{"class":197},[154,952,223],{"class":208},[154,954,955],{"class":201}," StripeAdapter",[154,957,303],{"class":208},[154,959,960],{"class":201}," LemonSqueezyAdapter",[154,962,229],{"class":208},[154,964,232],{"class":197},[154,966,209],{"class":208},[154,968,136],{"class":164},[154,970,215],{"class":208},[154,972,973],{"class":156,"line":218},[154,974,245],{"emptyLinePlaceholder":244},[154,976,977],{"class":156,"line":241},[154,978,979],{"class":276},"// Stripe\n",[154,981,982,984,987,989,992,994,996],{"class":156,"line":248},[154,983,252],{"class":251},[154,985,986],{"class":201}," stripeAdapter ",[154,988,258],{"class":208},[154,990,991],{"class":208}," new",[154,993,955],{"class":261},[154,995,292],{"class":201},[154,997,998],{"class":208},"{\n",[154,1000,1001,1004,1006,1008,1010,1012,1014,1016],{"class":156,"line":268},[154,1002,1003],{"class":318},"  secretKey",[154,1005,185],{"class":208},[154,1007,412],{"class":201},[154,1009,286],{"class":208},[154,1011,417],{"class":201},[154,1013,286],{"class":208},[154,1015,422],{"class":201},[154,1017,401],{"class":208},[154,1019,1020,1023,1025,1027,1029,1031,1033,1035],{"class":156,"line":273},[154,1021,1022],{"class":318},"  webhookSecret",[154,1024,185],{"class":208},[154,1026,412],{"class":201},[154,1028,286],{"class":208},[154,1030,417],{"class":201},[154,1032,286],{"class":208},[154,1034,443],{"class":201},[154,1036,401],{"class":208},[154,1038,1039,1041],{"class":156,"line":280},[154,1040,451],{"class":208},[154,1042,454],{"class":201},[154,1044,1045],{"class":156,"line":336},[154,1046,245],{"emptyLinePlaceholder":244},[154,1048,1049,1051,1054,1056,1059,1062,1064,1067,1069],{"class":156,"line":341},[154,1050,252],{"class":251},[154,1052,1053],{"class":201}," result ",[154,1055,258],{"class":208},[154,1057,1058],{"class":197}," await",[154,1060,1061],{"class":201}," stripeAdapter",[154,1063,286],{"class":208},[154,1065,1066],{"class":261},"createPayment",[154,1068,292],{"class":201},[154,1070,998],{"class":208},[154,1072,1073,1076,1078,1081],{"class":156,"line":361},[154,1074,1075],{"class":318},"  amount",[154,1077,185],{"class":208},[154,1079,1080],{"class":474}," 2999",[154,1082,401],{"class":208},[154,1084,1085,1088,1090,1092,1095,1097],{"class":156,"line":367},[154,1086,1087],{"class":318},"  currency",[154,1089,185],{"class":208},[154,1091,209],{"class":208},[154,1093,1094],{"class":164},"usd",[154,1096,295],{"class":208},[154,1098,401],{"class":208},[154,1100,1101,1103],{"class":156,"line":372},[154,1102,451],{"class":208},[154,1104,454],{"class":201},[154,1106,1107],{"class":156,"line":386},[154,1108,245],{"emptyLinePlaceholder":244},[154,1110,1111,1114,1116,1119,1122,1124,1127,1129],{"class":156,"line":404},[154,1112,1113],{"class":201},"console",[154,1115,286],{"class":208},[154,1117,1118],{"class":261},"log",[154,1120,1121],{"class":201},"(result",[154,1123,286],{"class":208},[154,1125,1126],{"class":201},"data",[154,1128,286],{"class":208},[154,1130,1131],{"class":201},"clientSecret)\n",[145,1133,1135],{"className":188,"code":1134,"language":190,"meta":150,"style":150},"// LemonSqueezy\nconst lsAdapter = new LemonSqueezyAdapter({\n  apiKey: process.env.LEMONSQUEEZY_API_KEY,\n  webhookSecret: process.env.LEMONSQUEEZY_WEBHOOK_SECRET,\n  storeId: process.env.LEMONSQUEEZY_STORE_ID,\n})\n\nconst result = await lsAdapter.createPayment({\n  amount: 2999,\n  currency: 'usd',\n  metadata: { variantId: '78901' },\n})\n\nconsole.log(result.data.checkoutUrl)\n",[134,1136,1137,1142,1159,1178,1196,1215,1221,1225,1246,1256,1270,1294,1300,1304],{"__ignoreMap":150},[154,1138,1139],{"class":156,"line":157},[154,1140,1141],{"class":276},"// LemonSqueezy\n",[154,1143,1144,1146,1149,1151,1153,1155,1157],{"class":156,"line":218},[154,1145,252],{"class":251},[154,1147,1148],{"class":201}," lsAdapter ",[154,1150,258],{"class":208},[154,1152,991],{"class":208},[154,1154,960],{"class":261},[154,1156,292],{"class":201},[154,1158,998],{"class":208},[154,1160,1161,1164,1166,1168,1170,1172,1174,1176],{"class":156,"line":241},[154,1162,1163],{"class":318},"  apiKey",[154,1165,185],{"class":208},[154,1167,412],{"class":201},[154,1169,286],{"class":208},[154,1171,417],{"class":201},[154,1173,286],{"class":208},[154,1175,784],{"class":201},[154,1177,401],{"class":208},[154,1179,1180,1182,1184,1186,1188,1190,1192,1194],{"class":156,"line":248},[154,1181,1022],{"class":318},[154,1183,185],{"class":208},[154,1185,412],{"class":201},[154,1187,286],{"class":208},[154,1189,417],{"class":201},[154,1191,286],{"class":208},[154,1193,803],{"class":201},[154,1195,401],{"class":208},[154,1197,1198,1201,1203,1205,1207,1209,1211,1213],{"class":156,"line":268},[154,1199,1200],{"class":318},"  storeId",[154,1202,185],{"class":208},[154,1204,412],{"class":201},[154,1206,286],{"class":208},[154,1208,417],{"class":201},[154,1210,286],{"class":208},[154,1212,822],{"class":201},[154,1214,401],{"class":208},[154,1216,1217,1219],{"class":156,"line":273},[154,1218,451],{"class":208},[154,1220,454],{"class":201},[154,1222,1223],{"class":156,"line":280},[154,1224,245],{"emptyLinePlaceholder":244},[154,1226,1227,1229,1231,1233,1235,1238,1240,1242,1244],{"class":156,"line":336},[154,1228,252],{"class":251},[154,1230,1053],{"class":201},[154,1232,258],{"class":208},[154,1234,1058],{"class":197},[154,1236,1237],{"class":201}," lsAdapter",[154,1239,286],{"class":208},[154,1241,1066],{"class":261},[154,1243,292],{"class":201},[154,1245,998],{"class":208},[154,1247,1248,1250,1252,1254],{"class":156,"line":341},[154,1249,1075],{"class":318},[154,1251,185],{"class":208},[154,1253,1080],{"class":474},[154,1255,401],{"class":208},[154,1257,1258,1260,1262,1264,1266,1268],{"class":156,"line":361},[154,1259,1087],{"class":318},[154,1261,185],{"class":208},[154,1263,209],{"class":208},[154,1265,1094],{"class":164},[154,1267,295],{"class":208},[154,1269,401],{"class":208},[154,1271,1272,1275,1277,1279,1282,1284,1286,1289,1291],{"class":156,"line":367},[154,1273,1274],{"class":318},"  metadata",[154,1276,185],{"class":208},[154,1278,223],{"class":208},[154,1280,1281],{"class":318}," variantId",[154,1283,185],{"class":208},[154,1285,209],{"class":208},[154,1287,1288],{"class":164},"78901",[154,1290,295],{"class":208},[154,1292,1293],{"class":208}," },\n",[154,1295,1296,1298],{"class":156,"line":372},[154,1297,451],{"class":208},[154,1299,454],{"class":201},[154,1301,1302],{"class":156,"line":386},[154,1303,245],{"emptyLinePlaceholder":244},[154,1305,1306,1308,1310,1312,1314,1316,1318,1320],{"class":156,"line":404},[154,1307,1113],{"class":201},[154,1309,286],{"class":208},[154,1311,1118],{"class":261},[154,1313,1121],{"class":201},[154,1315,286],{"class":208},[154,1317,1126],{"class":201},[154,1319,286],{"class":208},[154,1321,1322],{"class":201},"checkoutUrl)\n",[130,1324,1325],{},"Available adapter methods:",[709,1327,1328,1333,1338,1343],{},[712,1329,1330],{},[134,1331,1332],{},"createPayment()",[712,1334,1335],{},[134,1336,1337],{},"refundPayment()",[712,1339,1340],{},[134,1341,1342],{},"getPaymentStatus()",[712,1344,1345],{},[134,1346,1347],{},"verifyWebhookSignature()",[139,1349],{},[125,1351,1353],{"id":1352},"typescript-support","TypeScript Support",[130,1355,1356,1357,1360],{},"The package ships with TypeScript types (",[134,1358,1359],{},"index.d.ts","). All types are available:",[145,1362,1366],{"className":1363,"code":1364,"language":1365,"meta":150,"style":150},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import type {\n  CreatePaymentResult,\n  RefundPaymentResult,\n  PaymentStatus,\n  SetupPaymentsOptions,\n  PaymentEvent,\n  StripeAdapter,\n  LemonSqueezyAdapter,\n} from '@charcoles/payments'\n\nconst options: SetupPaymentsOptions = {\n  provider: 'stripe',\n  stripeSecretKey: '...',\n  stripeWebhookSecret: '...',\n}\n\nsetupPayments(app, options)\n","ts",[134,1367,1368,1376,1383,1390,1397,1404,1411,1418,1425,1437,1441,1458,1472,1486,1500,1505,1509],{"__ignoreMap":150},[154,1369,1370,1372,1374],{"class":156,"line":157},[154,1371,198],{"class":197},[154,1373,319],{"class":197},[154,1375,383],{"class":208},[154,1377,1378,1381],{"class":156,"line":218},[154,1379,1380],{"class":201},"  CreatePaymentResult",[154,1382,401],{"class":208},[154,1384,1385,1388],{"class":156,"line":241},[154,1386,1387],{"class":201},"  RefundPaymentResult",[154,1389,401],{"class":208},[154,1391,1392,1395],{"class":156,"line":248},[154,1393,1394],{"class":201},"  PaymentStatus",[154,1396,401],{"class":208},[154,1398,1399,1402],{"class":156,"line":268},[154,1400,1401],{"class":201},"  SetupPaymentsOptions",[154,1403,401],{"class":208},[154,1405,1406,1409],{"class":156,"line":273},[154,1407,1408],{"class":201},"  PaymentEvent",[154,1410,401],{"class":208},[154,1412,1413,1416],{"class":156,"line":280},[154,1414,1415],{"class":201},"  StripeAdapter",[154,1417,401],{"class":208},[154,1419,1420,1423],{"class":156,"line":336},[154,1421,1422],{"class":201},"  LemonSqueezyAdapter",[154,1424,401],{"class":208},[154,1426,1427,1429,1431,1433,1435],{"class":156,"line":341},[154,1428,451],{"class":208},[154,1430,232],{"class":197},[154,1432,209],{"class":208},[154,1434,136],{"class":164},[154,1436,215],{"class":208},[154,1438,1439],{"class":156,"line":361},[154,1440,245],{"emptyLinePlaceholder":244},[154,1442,1443,1445,1448,1450,1453,1456],{"class":156,"line":367},[154,1444,252],{"class":251},[154,1446,1447],{"class":201}," options",[154,1449,185],{"class":208},[154,1451,1452],{"class":160}," SetupPaymentsOptions",[154,1454,1455],{"class":208}," =",[154,1457,383],{"class":208},[154,1459,1460,1462,1464,1466,1468,1470],{"class":156,"line":372},[154,1461,389],{"class":318},[154,1463,185],{"class":208},[154,1465,209],{"class":208},[154,1467,396],{"class":164},[154,1469,295],{"class":208},[154,1471,401],{"class":208},[154,1473,1474,1476,1478,1480,1482,1484],{"class":156,"line":386},[154,1475,407],{"class":318},[154,1477,185],{"class":208},[154,1479,209],{"class":208},[154,1481,536],{"class":164},[154,1483,295],{"class":208},[154,1485,401],{"class":208},[154,1487,1488,1490,1492,1494,1496,1498],{"class":156,"line":404},[154,1489,430],{"class":318},[154,1491,185],{"class":208},[154,1493,209],{"class":208},[154,1495,536],{"class":164},[154,1497,295],{"class":208},[154,1499,401],{"class":208},[154,1501,1502],{"class":156,"line":427},[154,1503,1504],{"class":208},"}\n",[154,1506,1507],{"class":156,"line":448},[154,1508,245],{"emptyLinePlaceholder":244},[154,1510,1511,1513,1515,1517],{"class":156,"line":457},[154,1512,375],{"class":261},[154,1514,378],{"class":201},[154,1516,303],{"class":208},[154,1518,1519],{"class":201}," options)\n",[139,1521],{},[125,1523,105],{"id":1524},"environment-variables",[130,1526,1527,1528,185],{},"Set these in your ",[134,1529,1530],{},".env",[145,1532,1535],{"className":1533,"code":1534,"language":417,"meta":150,"style":150},"language-env shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","PAYMENT_PROVIDER=stripe\n\n# Stripe\nSTRIPE_SECRET_KEY=sk_test_...\nSTRIPE_WEBHOOK_SECRET=whsec_...\n\n# Or LemonSqueezy\nLEMONSQUEEZY_API_KEY=...\nLEMONSQUEEZY_WEBHOOK_SECRET=...\nLEMONSQUEEZY_STORE_ID=12345\n",[134,1536,1537,1542,1546,1551,1556,1561,1565,1570,1575,1580],{"__ignoreMap":150},[154,1538,1539],{"class":156,"line":157},[154,1540,1541],{},"PAYMENT_PROVIDER=stripe\n",[154,1543,1544],{"class":156,"line":218},[154,1545,245],{"emptyLinePlaceholder":244},[154,1547,1548],{"class":156,"line":241},[154,1549,1550],{},"# Stripe\n",[154,1552,1553],{"class":156,"line":248},[154,1554,1555],{},"STRIPE_SECRET_KEY=sk_test_...\n",[154,1557,1558],{"class":156,"line":268},[154,1559,1560],{},"STRIPE_WEBHOOK_SECRET=whsec_...\n",[154,1562,1563],{"class":156,"line":273},[154,1564,245],{"emptyLinePlaceholder":244},[154,1566,1567],{"class":156,"line":280},[154,1568,1569],{},"# Or LemonSqueezy\n",[154,1571,1572],{"class":156,"line":336},[154,1573,1574],{},"LEMONSQUEEZY_API_KEY=...\n",[154,1576,1577],{"class":156,"line":341},[154,1578,1579],{},"LEMONSQUEEZY_WEBHOOK_SECRET=...\n",[154,1581,1582],{"class":156,"line":361},[154,1583,1584],{},"LEMONSQUEEZY_STORE_ID=12345\n",[130,1586,1587,1588,1591],{},"See ",[1589,1590,105],"a",{"href":106}," for complete reference.",[139,1593],{},[125,1595,1597],{"id":1596},"webhook-handling","Webhook Handling",[130,1599,1600],{},"Webhooks are handled automatically by the module. The webhook route verifies signatures and ensures events are processed only once (in-memory deduplication).",[130,1602,1603,1604,1606],{},"To add custom fulfillment logic, you'll need to extend the module or implement a separate webhook handler. Refer to ",[1589,1605,100],{"href":101}," for event types.",[139,1608],{},[125,1610,1612],{"id":1611},"what-comes-next","What Comes Next",[709,1614,1615,1622,1629],{},[712,1616,1617,1621],{},[178,1618,1619],{},[1589,1620,95],{"href":96}," — Make payment requests",[712,1623,1624,1628],{},[178,1625,1626],{},[1589,1627,100],{"href":101}," — Handle payment events",[712,1630,1631,1635],{},[178,1632,1633],{},[1589,1634,115],{"href":116}," — Copy-paste examples",[1637,1638,1639],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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);}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 .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 pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":150,"searchDepth":218,"depth":218,"links":1641},[1642,1643,1644,1645,1646,1647,1648,1649,1650,1651,1652,1653],{"id":127,"depth":218,"text":128},{"id":143,"depth":218,"text":16},{"id":173,"depth":218,"text":85},{"id":485,"depth":218,"text":486},{"id":629,"depth":218,"text":630},{"id":736,"depth":218,"text":737},{"id":835,"depth":218,"text":836},{"id":937,"depth":218,"text":938},{"id":1352,"depth":218,"text":1353},{"id":1524,"depth":218,"text":105},{"id":1596,"depth":218,"text":1597},{"id":1611,"depth":218,"text":1612},"Install the payments module into any Express application.","md",null,{},{"icon":113},{"title":1660,"description":1661,"keywords":1662},"Payments Without Charcole","Add payment processing to any Express app with @charcoles/payments.",[212,1663,1664,1665,1666],"standalone","npm package","payment integration","non-charcole","CmJua74vLp5mx_MjfGM5ao_Eum0JOOkujkloumQvSR8",[1669,1671],{"title":105,"path":106,"stem":107,"description":1670,"icon":108,"children":-1},"Complete reference of all payment-related environment variables.",{"title":115,"path":116,"stem":117,"description":1672,"icon":118,"children":-1},"Copy-paste ready examples for common payment scenarios.",1777986766508]