diff --git a/README.md b/README.md index e00aad3..a3364ac 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,19 @@ Then to start the master api server screen -dmS hnshosting-master python3 main.py ``` +## Stripe webhook +Create a new webhook endpoint on stripe and set the url to https://master-server-domain:5000/stripe-webhook (note: you need to add a https proxy to your master server if you want to use stripe) +Add these environment variables to your master server +```yaml +STRIPE_SECRET: your-stripe-secret-key +STRIPE_ENDPOINT_SECRET: your-stripe-endpoint-secret +SMTP_HOST: smtp-server +SMTP_PORT: smtp-port +SMTP_USER: smtp-user +SMTP_PASS: smtp-pass +SMTP_FROM: smtp-from +``` + ## Worker server install diff --git a/master/main.py b/master/main.py index edbca2b..9384027 100644 --- a/master/main.py +++ b/master/main.py @@ -2,6 +2,8 @@ from flask import Flask, request, jsonify import dotenv import os import requests +import stripe # For stripe payments +import smtplib, ssl # For sending emails dotenv.load_dotenv() @@ -232,6 +234,65 @@ def tlsa(): return resp.json() + +@app.route('/stripe', methods=['POST']) +def stripeapi(): + payload = request.data + stripe.api_key = os.getenv('STRIPE_SECRET') + endpoint_secret = os.getenv('STRIPE_ENDPOINT_SECRET') + sig_header = request.headers.get('Stripe-Signature') + events = None + try: + event = stripe.Webhook.construct_event( + payload, sig_header, endpoint_secret + ) + except ValueError as e: + # Invalid payload + return jsonify({'success': 'false'}) + except stripe.error.SignatureVerificationError as e: + return jsonify({'success': 'false'}) + + # Handle the event + if event.type == 'payment_intent.succeeded': + payment_intent = event.data.object + # Get email + email = payment_intent['receipt_email'] + # Create licence key + licence_key = os.urandom(16).hex() + # Add licence key to file + key_file = open('/data/licence_key.txt', 'a') + key_file.write(licence_key + '\n') + key_file.close() + # Send email + host = os.getenv('SMTP_HOST') + port = os.getenv('SMTP_PORT') + user = os.getenv('SMTP_USER') + password = os.getenv('SMTP_PASS') + from_email = os.getenv('SMTP_FROM') + if from_email == None: + from_email = user + + context = ssl.create_default_context() + with smtplib.SMTP_SSL(host, port, context=context) as server: + server.login(user, password) + message = "From: Hosting <" + from_email + ">\nTo: " + email + \ + "\nSubject: Your Licence key\n\nHello,\n\n"\ + +"This email contains your licence key for your new wordpress site.\n" \ + +"You can redeem this key via the discord bot or api.\n\n"\ + +"Your licence key is: " + licence_key +"\nThanks,\nHNSHosting" + + server.sendmail(from_email, email, message) + + + + print('PaymentIntent was successful!', flush=True) + else: + print('Unhandled event type {}'.format(event.type)) + return jsonify({'success': 'true'}) + + + + def get_sites_count(): # If file doesn't exist, create it try: diff --git a/master/requirements.txt b/master/requirements.txt index 01ad091..9a8f17f 100644 --- a/master/requirements.txt +++ b/master/requirements.txt @@ -1,4 +1,5 @@ python-dotenv requests flask -jsonify \ No newline at end of file +jsonify +stripe \ No newline at end of file