feat(GBMinService, MainService): integrate Stripe payment success handling and update dialog flow
All checks were successful
GBCI / build (push) Successful in 1m18s
All checks were successful
GBCI / build (push) Successful in 1m18s
This commit is contained in:
parent
e3ac4f58b3
commit
ec8b0d44df
3 changed files with 62 additions and 7 deletions
|
|
@ -105,6 +105,7 @@ import { GBConversationalService } from './GBConversationalService.js';
|
||||||
import { GBDeployer } from './GBDeployer.js';
|
import { GBDeployer } from './GBDeployer.js';
|
||||||
import { GBLogEx } from './GBLogEx.js';
|
import { GBLogEx } from './GBLogEx.js';
|
||||||
import { GBSSR } from './GBSSR.js';
|
import { GBSSR } from './GBSSR.js';
|
||||||
|
import Stripe from 'stripe';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Minimal service layer for a bot and encapsulation of BOT Framework calls.
|
* Minimal service layer for a bot and encapsulation of BOT Framework calls.
|
||||||
|
|
@ -459,7 +460,61 @@ export class GBMinService {
|
||||||
|
|
||||||
this.createCheckHealthAddress(GBServer.globals.server, min, min.instance);
|
this.createCheckHealthAddress(GBServer.globals.server, min, min.instance);
|
||||||
|
|
||||||
|
GBServer.globals.server
|
||||||
|
.all(`/${min.instance.botId}/paymentSuccess`, async (req, res) => {
|
||||||
|
try {
|
||||||
|
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
|
||||||
|
GBLogEx.info(min, `Payment success webhook received for bot ${min.instance.botId}`);
|
||||||
|
|
||||||
|
const sessionId = req.query.session_id;
|
||||||
|
if (!sessionId) {
|
||||||
|
GBLogEx.info(min, 'No session_id parameter found in payment success callback');
|
||||||
|
return res.status(400).json({ success: false, error: 'Missing session_id parameter' });
|
||||||
|
}
|
||||||
|
|
||||||
|
const session = await stripe.checkout.sessions.retrieve(sessionId);
|
||||||
|
|
||||||
|
if (session.payment_status === 'paid') {
|
||||||
|
GBLogEx.info(min, `Payment confirmed for session ${sessionId}`);
|
||||||
|
|
||||||
|
// Only for successful payment - send HTML to close window
|
||||||
|
res.send(`
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Payment Successful</title>
|
||||||
|
<script>
|
||||||
|
// Close the window after a short delay
|
||||||
|
setTimeout(() => {
|
||||||
|
window.close();
|
||||||
|
}, 1000);
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body style="text-align: center; padding: 40px; font-family: Arial;">
|
||||||
|
<h1 style="color: #4CAF50;">Payment Successful!</h1>
|
||||||
|
<p>General Bots: Your transaction was completed successfully.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
`);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
GBLogEx.info(min, `Payment not completed for session ${sessionId}`);
|
||||||
|
res.status(402).json({
|
||||||
|
success: false,
|
||||||
|
error: 'Payment not completed',
|
||||||
|
sessionId: sessionId
|
||||||
|
});
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
GBLogEx.error(min, `Error processing payment success: ${error.message}`);
|
||||||
|
res.status(500).json({
|
||||||
|
success: false,
|
||||||
|
error: error.message
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.bind(min);
|
||||||
// Setups official handler for WhatsApp.
|
// Setups official handler for WhatsApp.
|
||||||
|
|
||||||
GBServer.globals.server
|
GBServer.globals.server
|
||||||
|
|
@ -742,9 +797,9 @@ export class GBMinService {
|
||||||
|
|
||||||
if (GBConfigService.get('GB_MODE') !== 'legacy') {
|
if (GBConfigService.get('GB_MODE') !== 'legacy') {
|
||||||
const url =
|
const url =
|
||||||
process.env.BOT_URL ||
|
process.env.BOT_URL && !process.env.BOT_URL.includes('ngrok')
|
||||||
`http://localhost:${GBConfigService.get('PORT')}`;
|
? process.env.BOT_URL
|
||||||
|
: `http://localhost:${GBConfigService.get('PORT')}`;
|
||||||
config['domain'] = urlJoin(url, 'directline', botId);
|
config['domain'] = urlJoin(url, 'directline', botId);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ export class NewUserDialog extends IGBDialog {
|
||||||
return await step.replaceDialog('/ask', { isReturning: true });
|
return await step.replaceDialog('/ask', { isReturning: true });
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
await step.context.sendActivity(`Error: ${error.message}`);
|
await step.context.sendActivity(`Error: ${error.message}`);
|
||||||
return await step.replaceDialog('/welcome_saas_plan');
|
return await step.replaceDialog('/welcome_saas');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ export class MainService {
|
||||||
price: priceId,
|
price: priceId,
|
||||||
quantity: 1,
|
quantity: 1,
|
||||||
}],
|
}],
|
||||||
|
success_url: urlJoin(process.env.BOT_URL, min.botId, 'paymentSuccess?session_id={CHECKOUT_SESSION_ID}'),
|
||||||
mode: 'subscription',
|
mode: 'subscription',
|
||||||
metadata: {
|
metadata: {
|
||||||
subscriptionId: subscription.subscriptionId.toString(),
|
subscriptionId: subscription.subscriptionId.toString(),
|
||||||
|
|
@ -103,7 +103,7 @@ export class MainService {
|
||||||
return await this.createBotResources(min, subscription, templateName);
|
return await this.createBotResources(min, subscription, templateName);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (session.payment_status === 'unpaid' || session.status === 'expired') {
|
if (session.status === 'expired') {
|
||||||
throw new Error('Payment failed or session expired. Please try again.');
|
throw new Error('Payment failed or session expired. Please try again.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue