Add Stripe Customer creation to save payment methods
- Get user info (StripeCustomerId, email, name) when creating PaymentIntent - Create Stripe Customer if user doesn't have one - Add customer and setup_future_usage=off_session to PaymentIntent - Cards are automatically saved after successful payment Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
9e2c3a8478
commit
07c2f24d67
1 changed files with 57 additions and 4 deletions
|
|
@ -73,11 +73,14 @@ try {
|
||||||
abort;
|
abort;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get order's delivery fee, grant economics, and existing PaymentIntent
|
// Get order's delivery fee, grant economics, existing PaymentIntent, and user info
|
||||||
qOrder = queryExecute("
|
qOrder = queryExecute("
|
||||||
SELECT DeliveryFee, OrderTypeID, GrantID, GrantOwnerBusinessID, GrantEconomicsType, GrantEconomicsValue, StripePaymentIntentID
|
SELECT o.DeliveryFee, o.OrderTypeID, o.GrantID, o.GrantOwnerBusinessID,
|
||||||
FROM Orders
|
o.GrantEconomicsType, o.GrantEconomicsValue, o.StripePaymentIntentID,
|
||||||
WHERE ID = :orderID
|
o.UserID, u.StripeCustomerId, u.EmailAddress, u.FirstName, u.LastName
|
||||||
|
FROM Orders o
|
||||||
|
LEFT JOIN Users u ON u.ID = o.UserID
|
||||||
|
WHERE o.ID = :orderID
|
||||||
", { orderID: orderID }, { datasource: "payfrit" });
|
", { orderID: orderID }, { datasource: "payfrit" });
|
||||||
|
|
||||||
// Check if order already has a PaymentIntent (idempotency check)
|
// Check if order already has a PaymentIntent (idempotency check)
|
||||||
|
|
@ -137,6 +140,50 @@ try {
|
||||||
totalAmountCents = round(totalCustomerPays * 100);
|
totalAmountCents = round(totalCustomerPays * 100);
|
||||||
totalPlatformFeeCents = round((payfritCustomerFee + payfritBusinessFee) * 100);
|
totalPlatformFeeCents = round((payfritCustomerFee + payfritBusinessFee) * 100);
|
||||||
|
|
||||||
|
// ============================================================
|
||||||
|
// STRIPE CUSTOMER (for saving payment methods)
|
||||||
|
// ============================================================
|
||||||
|
stripeCustomerId = "";
|
||||||
|
orderUserID = val(qOrder.UserID ?: 0);
|
||||||
|
|
||||||
|
if (orderUserID > 0) {
|
||||||
|
stripeCustomerId = qOrder.StripeCustomerId ?: "";
|
||||||
|
|
||||||
|
// Create Stripe Customer if user doesn't have one
|
||||||
|
if (len(trim(stripeCustomerId)) == 0) {
|
||||||
|
customerService = new http();
|
||||||
|
customerService.setMethod("POST");
|
||||||
|
customerService.setUrl("https://api.stripe.com/v1/customers");
|
||||||
|
customerService.setUsername(stripeSecretKey);
|
||||||
|
customerService.setPassword("");
|
||||||
|
|
||||||
|
// Build customer name
|
||||||
|
customerName = trim((qOrder.FirstName ?: "") & " " & (qOrder.LastName ?: ""));
|
||||||
|
if (len(customerName) > 0) {
|
||||||
|
customerService.addParam(type="formfield", name="name", value=customerName);
|
||||||
|
}
|
||||||
|
if (len(trim(qOrder.EmailAddress ?: "")) > 0) {
|
||||||
|
customerService.addParam(type="formfield", name="email", value=qOrder.EmailAddress);
|
||||||
|
}
|
||||||
|
customerService.addParam(type="formfield", name="metadata[user_id]", value=orderUserID);
|
||||||
|
|
||||||
|
customerResult = customerService.send().getPrefix();
|
||||||
|
customerData = deserializeJSON(customerResult.fileContent);
|
||||||
|
|
||||||
|
if (!structKeyExists(customerData, "error") && structKeyExists(customerData, "id")) {
|
||||||
|
stripeCustomerId = customerData.id;
|
||||||
|
// Save to Users table
|
||||||
|
queryExecute("
|
||||||
|
UPDATE Users SET StripeCustomerId = :custId WHERE ID = :userId
|
||||||
|
", {
|
||||||
|
custId: stripeCustomerId,
|
||||||
|
userId: orderUserID
|
||||||
|
}, { datasource: "payfrit" });
|
||||||
|
writeLog(file="stripe_webhooks", text="Created Stripe Customer #stripeCustomerId# for user #orderUserID#");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Create PaymentIntent
|
// Create PaymentIntent
|
||||||
httpService = new http();
|
httpService = new http();
|
||||||
httpService.setMethod("POST");
|
httpService.setMethod("POST");
|
||||||
|
|
@ -151,6 +198,12 @@ try {
|
||||||
httpService.addParam(type="formfield", name="currency", value="usd");
|
httpService.addParam(type="formfield", name="currency", value="usd");
|
||||||
httpService.addParam(type="formfield", name="automatic_payment_methods[enabled]", value="true");
|
httpService.addParam(type="formfield", name="automatic_payment_methods[enabled]", value="true");
|
||||||
|
|
||||||
|
// Attach customer and save payment method for future use
|
||||||
|
if (len(trim(stripeCustomerId)) > 0) {
|
||||||
|
httpService.addParam(type="formfield", name="customer", value=stripeCustomerId);
|
||||||
|
httpService.addParam(type="formfield", name="setup_future_usage", value="off_session");
|
||||||
|
}
|
||||||
|
|
||||||
if (hasStripeConnect) {
|
if (hasStripeConnect) {
|
||||||
// SP-SM: Add grant owner fee to platform fee (Payfrit collects, then transfers to owner)
|
// SP-SM: Add grant owner fee to platform fee (Payfrit collects, then transfers to owner)
|
||||||
effectivePlatformFeeCents = totalPlatformFeeCents + grantOwnerFeeCents;
|
effectivePlatformFeeCents = totalPlatformFeeCents + grantOwnerFeeCents;
|
||||||
|
|
|
||||||
Reference in a new issue