merchant

Merchant backend to process payments, run by merchants
Log | Files | Refs | Submodules | README | LICENSE

commit 46dccc5558e828a2c8e4b03ed418832843ebd3a5
parent 80434f9f0ad5fb51e2713e1c122ad5646599cb9c
Author: Marcello Stanisci <marcello.stanisci@inria.fr>
Date:   Mon, 19 Jun 2017 15:09:48 +0200

80% GET /refund logic

Diffstat:
Msrc/include/taler_merchant_service.h | 113++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------
Msrc/lib/merchant_api_refund.c | 107++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
2 files changed, 173 insertions(+), 47 deletions(-)

diff --git a/src/include/taler_merchant_service.h b/src/include/taler_merchant_service.h @@ -32,16 +32,15 @@ struct TALER_MERCHANT_RefundIncreaseOperation; +struct TALER_MERCHANT_RefundLookupOperation; + /** - * Callbacks of this type get passed the result of a GET /refund - * request to the backend. + * Callback to process a POST /refund request * * @param cls closure - * @param http_status the HTTP status of the connection to the backend + * @param http_status HTTP status code for this request * @param ec taler-specific error code - * @param obj the resposne in JSON format. NOTE, this object is an array, - * so it makes little sense to extract values from it and serve them to the - * callback. + * @param obj the response body */ typedef void (*TALER_MERCHANT_RefundIncreaseCallback) (void *cls, @@ -49,6 +48,76 @@ typedef void enum TALER_ErrorCode ec, const json_t *obj); +/** + * Callback to process a GET /refund request + * + * @param cls closure + * @param http_status HTTP status code for this request + * @param ec taler-specific error code + * @param obj the response body + */ +typedef void +(*TALER_MERCHANT_RefundLookupCallback) (void *cls, + unsigned int http_status, + enum TALER_ErrorCode ec, + const json_t *obj); + +/** + * Does a GET /refund. + * + * @param ctx execution context + * @param backend_uri base URL of the merchant backend + * @param order_id order id used to perform the lookup + * @param cb callback which will work the response gotten from the backend + * @param cb_cls closure to pass to the callback + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_RefundLookupOperation * +TALER_MERCHANT_refund_lookup (struct GNUNET_CURL_Context *ctx, + const char *backend_uri, + const char *order_id, + const char *instance, + TALER_MERCHANT_RefundLookupCallback cb, + void *cb_cls); + +/** + * Increase the refund associated to a order + * + * @param ctx the CURL context used to connect to the backend + * @param backend_uri backend's base URL, including final "/" + * @param order_id id of the order whose refund is to be increased + * @param refund amount to which increase the refund + * @param reason human-readable reason justifying the refund + * @param instance id of the merchant instance issuing the request + * @param cb callback processing the response from /refund + * @param cb_cls closure for cb + */ +struct TALER_MERCHANT_RefundIncreaseOperation * +TALER_MERCHANT_refund_increase (struct GNUNET_CURL_Context *ctx, + const char *backend_uri, + const char *order_id, + const struct TALER_Amount *refund, + const char *reason, + const char *instance, + TALER_MERCHANT_RefundIncreaseCallback cb, + void *cb_cls); + +/** + * Cancel a POST /refund request. + * + * @param rio the refund increasing operation to cancel + */ +void +TALER_MERCHANT_refund_increase_cancel (struct TALER_MERCHANT_RefundIncreaseOperation *rio); + +/** + * Cancel a GET /refund request. + * + * @param rlo the refund increasing operation to cancel + */ +void +TALER_MERCHANT_refund_lookup_cancel (struct TALER_MERCHANT_RefundLookupOperation *rlo); + /* ********************* /proposal *********************** */ @@ -621,36 +690,4 @@ TALER_MERCHANT_history (struct GNUNET_CURL_Context *ctx, void TALER_MERCHANT_history_cancel (struct TALER_MERCHANT_HistoryOperation *ho); -/************************ /refund ****************************/ - -/** - * Increase the refund associated to a order - * - * @param ctx the CURL context used to connect to the backend - * @param backend_uri backend's base URL, including final "/" - * @param order_id id of the order whose refund is to be increased - * @param refund amount to which increase the refund - * @param reason human-readable reason justifying the refund - * @param instance id of the merchant instance issuing the request - * @param cb callback processing the response from /refund - * @param cb_cls closure for cb - */ -struct TALER_MERCHANT_RefundIncreaseOperation * -TALER_MERCHANT_refund_increase (struct GNUNET_CURL_Context *ctx, - const char *backend_uri, - const char *order_id, - const struct TALER_Amount *refund, - const char *reason, - const char *instance, - TALER_MERCHANT_RefundIncreaseCallback cb, - void *cb_cls); - -/** - * Cancel a POST /refund request. - * - * @param rio the refund increasing operation to cancel - */ -void -TALER_MERCHANT_refund_increase_cancel (struct TALER_MERCHANT_RefundIncreaseOperation *rio); - #endif /* _TALER_MERCHANT_SERVICE_H */ diff --git a/src/lib/merchant_api_refund.c b/src/lib/merchant_api_refund.c @@ -31,6 +31,36 @@ #include <taler/taler_json_lib.h> #include <taler/taler_signatures.h> + +struct TALER_MERCHANT_RefundLookupOperation +{ + /** + * URL of the request, includes parameters + */ + char *url; + + /** + * Handle of the request + */ + struct GNUNET_CURL_Job *job; + + /** + * Function to call with the response + */ + TALER_MERCHANT_RefundLookupCallback cb; + + /** + * Closure for cb + */ + void *cb_cls; + + /** + * Reference to the execution context + */ + struct GNUNET_CURL_Context *ctx; + +}; + struct TALER_MERCHANT_RefundIncreaseOperation { /** @@ -78,7 +108,7 @@ handle_refund_increase_finished (void *cls, long response_code, const json_t *json) { - + /* TBD */ } /** @@ -133,28 +163,21 @@ TALER_MERCHANT_refund_increase (struct GNUNET_CURL_Context *ctx, "%s%s", backend_uri, "/refund"); - /** - * FIXME: pack the data to POST. - */ req = json_pack ("{s:o, s:s, s:s}", "refund", TALER_JSON_from_amount (refund), "order_id", order_id, "reason", reason, "instance", instance); - eh = curl_easy_init (); - rio->json_enc = json_dumps (req, JSON_COMPACT); json_decref (req); - if (NULL == rio->json_enc) { GNUNET_break (0); GNUNET_free (rio); return NULL; } - GNUNET_assert (CURLE_OK == curl_easy_setopt (eh, CURLOPT_URL, @@ -172,7 +195,73 @@ TALER_MERCHANT_refund_increase (struct GNUNET_CURL_Context *ctx, GNUNET_YES, &handle_refund_increase_finished, rio); + return NULL; +} +/** + * Process GET /refund response + */ +void +handle_refund_lookup_finished (void *cls, + long response_code, + const json_t *json) +{ + /** + * TBD + */ - return NULL; +} + +/** + * Does a GET /refund. + * + * @param ctx execution context + * @param backend_uri base URL of the merchant backend + * @param order_id order id used to perform the lookup + * @param cb callback which will work the response gotten from the backend + * @param cb_cls closure to pass to the callback + * @return handle for this operation, NULL upon errors + */ +struct TALER_MERCHANT_RefundLookupOperation * +TALER_MERCHANT_refund_lookup (struct GNUNET_CURL_Context *ctx, + const char *backend_uri, + const char *order_id, + const char *instance, + TALER_MERCHANT_RefundLookupCallback cb, + void *cb_cls) +{ + struct TALER_MERCHANT_RefundLookupOperation *rlo; + CURL *eh; + + rlo = GNUNET_new (struct TALER_MERCHANT_RefundLookupOperation); + rlo->ctx = ctx; + rlo->cb = cb; + rlo->cb_cls = cb_cls; + + GNUNET_asprintf (&rlo->url, + "%s/refund?instance=%s&order_id=%s", + backend_uri, + instance, + order_id); + eh = curl_easy_init (); + if (CURLE_OK != curl_easy_setopt (eh, + CURLOPT_URL, + rlo->url)) + { + GNUNET_break (0); + return NULL; + } + + if (NULL == (rlo->job = GNUNET_CURL_job_add (ctx, + eh, + GNUNET_NO, + handle_refund_lookup_finished, + rlo))) + { + GNUNET_break (0); + return NULL; + + } + + return rlo; }