diff --git a/lnbits/core/services.py b/lnbits/core/services.py
index 73bfa0610..10b33073b 100644
--- a/lnbits/core/services.py
+++ b/lnbits/core/services.py
@@ -27,6 +27,12 @@ from .crud import (
update_payment_status,
get_wallet_payment,
)
+
+
+class PaymentFailure(Exception):
+ pass
+
+
async def create_invoice(
*,
wallet_id: str,
@@ -160,8 +166,9 @@ async def pay_invoice(
)
await delete_payment(temp_id, conn=conn)
else:
- raise Exception(
- payment.error_message or "Failed to pay_invoice on backend."
+ raise PaymentFailure(
+ payment.error_message
+ or "Payment failed, but backend didn't give us an error message."
)
return invoice.payment_hash
diff --git a/lnbits/core/views/api.py b/lnbits/core/views/api.py
index 2d1b99a9b..02cb788a8 100644
--- a/lnbits/core/views/api.py
+++ b/lnbits/core/views/api.py
@@ -12,7 +12,7 @@ from lnbits import bolt11
from lnbits.decorators import api_check_wallet_key, api_validate_post_request
from .. import core_app, db
-from ..services import create_invoice, pay_invoice, perform_lnurlauth
+from ..services import PaymentFailure, create_invoice, pay_invoice, perform_lnurlauth
from ..tasks import sse_listeners
@@ -127,6 +127,8 @@ async def api_payments_pay_invoice():
return jsonify({"message": str(e)}), HTTPStatus.BAD_REQUEST
except PermissionError as e:
return jsonify({"message": str(e)}), HTTPStatus.FORBIDDEN
+ except PaymentFailure as e:
+ return jsonify({"message": str(e)}), 520
except Exception as exc:
raise exc
diff --git a/lnbits/templates/base.html b/lnbits/templates/base.html
index d81cf2a99..59016e99e 100644
--- a/lnbits/templates/base.html
+++ b/lnbits/templates/base.html
@@ -14,6 +14,8 @@
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
+
+
{% block head_scripts %}{% endblock %}
diff --git a/lnbits/wallets/lndrest.py b/lnbits/wallets/lndrest.py
index fa46c573e..b6746c6b8 100644
--- a/lnbits/wallets/lndrest.py
+++ b/lnbits/wallets/lndrest.py
@@ -102,12 +102,8 @@ class LndRestWallet(Wallet):
timeout=180,
)
- if r.is_error:
- error_message = r.text
- try:
- error_message = r.json()["error"]
- except:
- pass
+ if r.is_error or r.json().get("payment_error"):
+ error_message = r.json().get("payment_error") or r.text
return PaymentResponse(False, None, 0, None, error_message)
data = r.json()