/** * Create Stripe Checkout Session for activation early unlock. * Worker pays remaining activation balance via card. */ response = { "OK": false }; try { requestData = deserializeJSON(toString(getHttpRequestData().content)); userID = val(requestData.UserID ?: 0); if (userID == 0 && structKeyExists(request, "UserID")) { userID = val(request.UserID); } if (userID == 0) { response["ERROR"] = "missing_params"; response["MESSAGE"] = "UserID is required."; writeOutput(serializeJSON(response)); abort; } qUser = queryTimed(" SELECT ActivationBalanceCents, ActivationCapCents FROM Users WHERE ID = :userID ", { userID: userID }, { datasource: "payfrit" }); if (qUser.recordCount == 0) { response["ERROR"] = "user_not_found"; writeOutput(serializeJSON(response)); abort; } remainingCents = val(qUser.ActivationCapCents) - val(qUser.ActivationBalanceCents); if (remainingCents <= 0) { response["OK"] = true; response["ALREADY_COMPLETE"] = true; writeOutput(serializeJSON(response)); abort; } // Create Stripe Checkout Session stripeSecretKey = application.stripeSecretKey ?: ""; httpService = new http(); httpService.setMethod("POST"); httpService.setUrl("https://api.stripe.com/v1/checkout/sessions"); httpService.setUsername(stripeSecretKey); httpService.setPassword(""); httpService.addParam(type="formfield", name="mode", value="payment"); httpService.addParam(type="formfield", name="line_items[0][price_data][unit_amount]", value=remainingCents); httpService.addParam(type="formfield", name="line_items[0][price_data][currency]", value="usd"); httpService.addParam(type="formfield", name="line_items[0][price_data][product_data][name]", value="Payfrit Activation"); httpService.addParam(type="formfield", name="line_items[0][quantity]", value="1"); baseUrl = application.baseUrl; httpService.addParam(type="formfield", name="success_url", value=baseUrl & "/works/stripe-return.cfm?status=success"); httpService.addParam(type="formfield", name="cancel_url", value=baseUrl & "/works/stripe-return.cfm?status=cancel"); httpService.addParam(type="formfield", name="metadata[user_id]", value=userID); httpService.addParam(type="formfield", name="metadata[type]", value="activation_unlock"); result = httpService.send().getPrefix(); sessionData = deserializeJSON(result.fileContent); if (structKeyExists(sessionData, "error")) { response["ERROR"] = sessionData.error.message; writeOutput(serializeJSON(response)); abort; } response["OK"] = true; response["CHECKOUT_URL"] = sessionData.url; response["AMOUNT_DUE_CENTS"] = remainingCents; } catch (any e) { response["ERROR"] = e.message; } writeOutput(serializeJSON(response));