/** * Stripe Connect Onboarding * Creates a connected account and returns the onboarding URL * * POST: { BusinessID: int } * Returns: { OK: true, ONBOARDING_URL: string } or { OK: false, ERROR: string } */ // Initialize response response = { "OK": false }; try { // Get request data requestData = deserializeJSON(toString(getHttpRequestData().content)); businessID = val(requestData.BusinessID ?: 0); if (businessID == 0) { response["ERROR"] = "BusinessID is required"; writeOutput(serializeJSON(response)); abort; } // Get Stripe keys from application settings stripeSecretKey = application.stripeSecretKey ?: ""; if (stripeSecretKey == "") { response["ERROR"] = "Stripe is not configured"; writeOutput(serializeJSON(response)); abort; } // Check if business already has a Stripe account qBusiness = queryExecute(" SELECT BusinessStripeAccountID, BusinessName, BusinessEmail FROM Businesses WHERE BusinessID = :businessID ", { businessID: businessID }); if (qBusiness.recordCount == 0) { response["ERROR"] = "Business not found"; writeOutput(serializeJSON(response)); abort; } stripeAccountID = qBusiness.BusinessStripeAccountID; // Create new connected account if none exists if (stripeAccountID == "" || isNull(stripeAccountID)) { // Create Stripe Connect Express account httpService = new http(); httpService.setMethod("POST"); httpService.setUrl("https://api.stripe.com/v1/accounts"); httpService.setUsername(stripeSecretKey); httpService.setPassword(""); httpService.addParam(type="formfield", name="type", value="express"); httpService.addParam(type="formfield", name="country", value="US"); httpService.addParam(type="formfield", name="email", value=qBusiness.BusinessEmail); httpService.addParam(type="formfield", name="capabilities[card_payments][requested]", value="true"); httpService.addParam(type="formfield", name="capabilities[transfers][requested]", value="true"); httpService.addParam(type="formfield", name="business_profile[name]", value=qBusiness.BusinessName); result = httpService.send().getPrefix(); accountData = deserializeJSON(result.fileContent); if (structKeyExists(accountData, "error")) { response["ERROR"] = accountData.error.message; writeOutput(serializeJSON(response)); abort; } stripeAccountID = accountData.id; // Save to database queryExecute(" UPDATE Businesses SET BusinessStripeAccountID = :stripeAccountID, BusinessStripeOnboardingStarted = NOW() WHERE BusinessID = :businessID ", { stripeAccountID: stripeAccountID, businessID: businessID }); } // Create account link for onboarding baseURL = "https://biz.payfrit.com"; httpService = new http(); httpService.setMethod("POST"); httpService.setUrl("https://api.stripe.com/v1/account_links"); httpService.setUsername(stripeSecretKey); httpService.setPassword(""); httpService.addParam(type="formfield", name="account", value=stripeAccountID); httpService.addParam(type="formfield", name="refresh_url", value=baseURL & "/portal/index.html?stripe=retry"); httpService.addParam(type="formfield", name="return_url", value=baseURL & "/portal/index.html?stripe=complete"); httpService.addParam(type="formfield", name="type", value="account_onboarding"); result = httpService.send().getPrefix(); linkData = deserializeJSON(result.fileContent); if (structKeyExists(linkData, "error")) { response["ERROR"] = linkData.error.message; writeOutput(serializeJSON(response)); abort; } response["OK"] = true; response["ONBOARDING_URL"] = linkData.url; response["STRIPE_ACCOUNT_ID"] = stripeAccountID; } catch (any e) { response["ERROR"] = e.message; } writeOutput(serializeJSON(response));