0% found this document useful (0 votes)
2 views

Ecinetwireless backend code2

This document outlines a Flask application that interfaces with the Econet XML-RPC API to perform various operations such as loading airtime, purchasing data bundles, deducting value, checking account balances, validating MSISDNs, and transferring funds between accounts. It includes error handling, validation of required fields, and logging for API responses. The application is designed to handle JSON requests and provides structured responses based on the outcomes of the API calls.

Uploaded by

emeliamakore
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
2 views

Ecinetwireless backend code2

This document outlines a Flask application that interfaces with the Econet XML-RPC API to perform various operations such as loading airtime, purchasing data bundles, deducting value, checking account balances, validating MSISDNs, and transferring funds between accounts. It includes error handling, validation of required fields, and logging for API responses. The application is designed to handle JSON requests and provides structured responses based on the outcomes of the API calls.

Uploaded by

emeliamakore
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 6

from flask import Flask, request, jsonify

import xmlrpc.client
import xmltodict # Simplified XML parsing
import os
import logging

# Initialize Flask app


app = Flask(__name__)

# Configure logging
logging.basicConfig(level=logging.ERROR)

# Load environment variables


ECONET_USERNAME = os.environ.get("ECONET_USERNAME")
ECONET_PASSWORD = os.environ.get("ECONET_PASSWORD")
ECONET_API_URL = os.environ.get("ECONET_API_URL",
"https://your_econet_api_url/xmlrpc")

# Validate environment variables


if not ECONET_USERNAME or not ECONET_PASSWORD:
raise ValueError("Econet username and password must be set as environment
variables.")
if ECONET_API_URL == "https://your_econet_api_url/xmlrpc":
raise ValueError("ECONET_API_URL must be set as an environment variable.")

def call_econet_api(method_name, params):


"""Calls the Econet XML-RPC API."""
try:
server = xmlrpc.client.ServerProxy(ECONET_API_URL)
api_params = [ECONET_USERNAME, ECONET_PASSWORD]
api_params.append(params)
result = getattr(server, method_name)(*api_params)

if isinstance(result, str):
# Use xmltodict for simplified XML parsing
response_data = xmltodict.parse(result)
return response_data
else:
logging.error(f"Unexpected response from Econet API: {result}")
return None

except xmlrpc.client.Fault as e:
logging.error(f"XML-RPC Fault: {e}")
return None
except Exception as e:
logging.error(f"An error occurred: {e}")
return None

def validate_response(response, required_fields):


"""Validates that the response contains the required fields."""
if not response:
return False
for field in required_fields:
if field not in response:
return False
return True

@app.route("/api/airtime/load", methods=["POST"])
def load_airtime():
"""Loads airtime to a specified MSISDN."""
data = request.get_json()
msisdn = data.get("msisdn")
amount = data.get("amount")
reference = data.get("reference")
currency = data.get("currency", 840) # Default to USD (840) if not provided

# Validate required fields


if not msisdn or not amount or not reference:
return jsonify({"error": "Missing msisdn, amount, or reference"}), 400

# Validate amount and currency


try:
amount = int(amount)
currency = int(currency)
except ValueError:
return jsonify({"error": "Amount and Currency must be valid integers"}),
400

api_params = {
"MSISDN": str(msisdn),
"Amount": amount,
"Reference": str(reference),
"Currency": currency # Defaults to 840 (USD)
}

response = call_econet_api("load_value", api_params)

if validate_response(response, ["Status", "StatusCode", "Description"]):


status = response.get("Status")
status_code = response.get("StatusCode")
description = response.get("Description")

if status == 1:
return jsonify({
"status": "success",
"statusCode": status_code,
"description": description,
"serial": response.get("Serial"),
"providerReference": response.get("ProviderReference"),
"rate": response.get("Rate")
}), 200
else:
return jsonify({
"status": "error",
"statusCode": status_code,
"description": description
}), 400
else:
return jsonify({"error": "Invalid response structure from Econet API"}),
500

@app.route("/api/bundle/load", methods=["POST"])
def load_bundle():
"""Purchases a data bundle for a specified MSISDN."""
data = request.get_json()
msisdn = data.get("msisdn")
provider_code = data.get("provider_code")
amount = data.get("amount")
currency = data.get("currency", 840) # Default to USD (840) if not provided
account_type = data.get("account_type")
quantity = data.get("quantity")
reference = data.get("reference")
product_code = data.get("product_code")

# Validate required fields


if not msisdn or not provider_code or not amount or not currency or not
account_type or not quantity or not reference or not product_code:
return jsonify({"error": "Missing required parameters for load_bundle"}),
400

# Validate amount, currency, and quantity


try:
amount = int(amount)
currency = int(currency)
quantity = int(quantity)
except ValueError:
return jsonify({"error": "Amount, Currency, and Quantity must be valid
integers"}), 400

api_params = {
"MSISDN": str(msisdn),
"ProviderCode": int(provider_code),
"Amount": amount,
"Currency": currency, # Defaults to 840 (USD)
"AccountType": int(account_type),
"Quantity": quantity,
"Reference": str(reference),
"ProductCode": str(product_code)
}

response = call_econet_api("load_bundle", api_params)

if validate_response(response, ["Status", "StatusCode", "Description"]):


status = response.get("Status")
status_code = response.get("StatusCode")
description = response.get("Description")

if status == 1:
return jsonify({
"status": "success",
"statusCode": status_code,
"description": description,
"serial": response.get("Serial"),
"providerReference": response.get("ProviderReference")
}), 200
else:
return jsonify({
"status": "error",
"statusCode": status_code,
"description": description
}), 400
else:
return jsonify({"error": "Invalid response structure from Econet API"}),
500

@app.route("/api/value/deduct", methods=["POST"])
def deduct_value():
"""Deducts airtime value from a specified MSISDN."""
data = request.get_json()
msisdn = data.get("msisdn")
provider_code = data.get("provider_code")
amount = data.get("amount")
reference = data.get("reference")

# Validate required fields


if not msisdn or not provider_code or not amount or not reference:
return jsonify({"error": "Missing required parameters for deduct_value"}),
400

# Validate amount
try:
amount = int(amount)
except ValueError:
return jsonify({"error": "Amount must be a valid integer"}), 400

api_params = {
"MSISDN": str(msisdn),
"ProviderCode": int(provider_code),
"Amount": amount,
"Reference": str(reference)
}

response = call_econet_api("deduct_value", api_params)

if validate_response(response, ["Status", "StatusCode", "Description"]):


status = response.get("Status")
status_code = response.get("StatusCode")
description = response.get("Description")

if status == 1:
return jsonify({
"status": "success",
"statusCode": status_code,
"description": description,
"serial": response.get("Serial"),
"providerReference": response.get("ProviderReference")
}), 200
else:
return jsonify({
"status": "error",
"statusCode": status_code,
"description": description
}), 400
else:
return jsonify({"error": "Invalid response structure from Econet API"}),
500

@app.route("/api/balance", methods=["POST"])
def account_balance_enquiry():
"""Enquires the balance of a specified MSISDN."""
data = request.get_json()
msisdn = data.get("msisdn")
provider_code = data.get("provider_code")

# Validate required fields


if not msisdn or not provider_code:
return jsonify({"error": "Missing msisdn and provider_code"}), 400

api_params = {
"MSISDN": str(msisdn),
"ProviderCode": int(provider_code)
}

response = call_econet_api("account_balance_enquiry", api_params)

if validate_response(response, ["AccountType", "Currency", "Amount"]):


return jsonify(response), 200
else:
return jsonify({"error": "Invalid response structure for
account_balance_enquiry"}), 500

@app.route("/api/msisdn/validate", methods=["POST"])
def validate_msisdn():
"""Validates a specified MSISDN."""
data = request.get_json()
msisdn = data.get("msisdn")
provider_code = data.get("provider_code")

# Validate required fields


if not msisdn or not provider_code:
return jsonify({"error": "Missing msisdn and provider_code"}), 400

api_params = {
"MSISDN": str(msisdn),
"ProviderCode": int(provider_code)
}

response = call_econet_api("validate_msisdn", api_params)

if validate_response(response, ["Status", "StatusCode", "Description"]):


return jsonify({
"status": response.get("Status"),
"statusCode": response.get("StatusCode"),
"description": response.get("Description")
}), 200
else:
return jsonify({"error": "Invalid response structure from Econet API"}),
500

@app.route("/api/transaction/status", methods=["POST"])
def get_transaction_status():
"""Checks the status of a previously submitted transaction."""
data = request.get_json()
reference = data.get("reference")

# Validate required fields


if not reference:
return jsonify({"error": "Missing reference"}), 400

api_params = {
"Reference": str(reference)
}

response = call_econet_api("get_transaction_status", api_params)


if validate_response(response, ["Status", "StatusCode", "Description"]):
return jsonify({
"status": response.get("Status"),
"statusCode": response.get("StatusCode"),
"description": response.get("Description")
}), 200
else:
return jsonify({"error": "Invalid response structure from Econet API"}),
500

@app.route("/api/account/transfer", methods=["POST"])
def account_transfer():
"""Transfers funds between company accounts."""
data = request.get_json()
from_company_id = data.get("from_company_id")
to_company_id = data.get("to_company_id")
currency = data.get("currency", 840) # Default to USD (840) if not provided
amount = data.get("amount")
reference = data.get("reference")

# Validate required fields


if not from_company_id or not to_company_id or not currency or not amount or
not reference:
return jsonify({"error": "Missing required parameters for
account_transfer"}), 400

# Validate amount and currency


try:
amount = int(amount)
currency = int(currency)
except ValueError:
return jsonify({"error": "Amount and Currency must be valid integers"}),
400

api_params = {
"FromCompanyID": int(from_company_id),
"ToCompanyID": int(to_company_id),
"Currency": currency, # Defaults to 840 (USD)
"Amount": amount,
"Reference": str(reference)
}

response = call_econet_api("account_transfer", api_params)

if validate_response(response, ["Status", "StatusCode", "Description"]):


return jsonify({
"status": response.get("Status"),
"statusCode": response.get("StatusCode"),
"description": response.get("Description")
}), 200
else:
return jsonify({"error": "Invalid response structure from Econet API"}),
500

if __name__ == "__main__":
app.run(debug=True)

You might also like