From 277fe2de4742654322ae891cef0ac81c31f379b9 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 9 Oct 2019 14:04:28 +0530 Subject: support new instance API, fix check_status bug --- talerdonations/donations/donations.py | 33 ++++++++++++++++----------------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/talerdonations/donations/donations.py b/talerdonations/donations/donations.py index 9fd28c1..22511c8 100644 --- a/talerdonations/donations/donations.py +++ b/talerdonations/donations/donations.py @@ -41,7 +41,7 @@ app.debug = True app.secret_key = base64.b64encode(os.urandom(64)).decode('utf-8') TC = TalerConfig.from_env() -BACKEND_URL = TC["frontends"]["backend"].value_string(required=True) +BACKEND_BASE_URL = TC["frontends"]["backend"].value_string(required=True) CURRENCY = TC["taler"]["currency"].value_string(required=True) APIKEY = TC["frontends"]["backend_apikey"].value_string(required=True) @@ -78,11 +78,12 @@ def err_abort(abort_status_code, **params): # @param params (dict type of) URL parameters to append to the request. # @return the JSON response from the backend, or a error response # if something unexpected happens. -def backend_get(endpoint, params): +def backend_instanced_get(instance, endpoint, params): + backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/") headers = {"Authorization": "ApiKey " + APIKEY} try: resp = requests.get( - urljoin(BACKEND_URL, endpoint), params=params, headers=headers + urljoin(backend_url, endpoint), params=params, headers=headers ) except requests.ConnectionError: err_abort(500, message="Could not establish connection to backend") @@ -108,14 +109,14 @@ def backend_get(endpoint, params): # this request. # @param json the POST's body. # @return the backend response (JSON format). -def backend_post(endpoint, json): - headers = {"Authorization": "ApiKey " + APIKEY} +def backend_instanced_post(instance, endpoint, json): + backend_url = urljoin(BACKEND_BASE_URL, f"instances/{instance}/") try: resp = requests.post( - urljoin(BACKEND_URL, endpoint), json=json, headers=headers + urljoin(backend_url, endpoint), json=json, headers=headers ) except requests.ConnectionError: - err_abort(500, message="Could not establish connection to backend") + err_abort(500, message=f"Could not establish connection to backend (url={url})") try: response_json = resp.json() except ValueError: @@ -237,10 +238,9 @@ def donate(): amount=donation_amount ), fulfillment_url=fulfillment_url, - instance=donation_receiver, summary="Donation to {}".format(donation_receiver), ) - order_resp = backend_post("order", dict(order=order)) + order_resp = backend_instanced_post(donation_receiver, "order", dict(order=order)) order_id = order_resp["order_id"] return flask.redirect( flask.url_for( @@ -252,10 +252,10 @@ def donate(): ## # This endpoint is used by the payment request page # to check if the payment has been completed via the QR code. -@app.route("/check-status/") -def check_status(order_id, session_id): - pay_params = dict(instance=INSTANCE, order_id=order_id) - pay_status = backend_get("check-payment", pay_params) +@app.route("/check-status//") +def check_status(instance, order_id): + pay_params = dict(order_id=order_id) + pay_status = backend_instanced_get(instance, "check-payment", pay_params) return flask.jsonify(paid=pay_status["paid"]) @@ -276,9 +276,8 @@ def get_qrcode_svg(data): @app.route("/donation/") def fulfillment(receiver): order_id = expect_parameter("order_id") - pay_params = dict(instance=receiver, order_id=order_id) - pay_status = backend_get("check-payment", pay_params) - + pay_params = dict(order_id=order_id) + pay_status = backend_instanced_get(receiver, "check-payment", pay_params) if pay_status.get("paid"): extra = pay_status["contract_terms"]["extra"] @@ -294,7 +293,7 @@ def fulfillment(receiver): taler_pay_uri = pay_status["taler_pay_uri"] qrcode_svg = get_qrcode_svg(taler_pay_uri) check_status_url_enc = urllib.parse.quote( - flask.url_for("check_status", order_id=order_id) + flask.url_for("check_status", instance=receiver, order_id=order_id) ) content = flask.render_template( "templates/request_payment.html", -- cgit v1.2.3