From 8f002c08c6fb6938b9ebf8f037465e5061571bc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=A6=8C=EA=A6=AB=EA=A6=B6=EA=A6=8F=EA=A7=80=EA=A6=A6?= =?UTF-8?q?=EA=A6=BF=EA=A6=A7=EA=A6=AE=EA=A6=91=EA=A6=A9=EA=A6=AD=EA=A7=80?= Date: Thu, 6 Oct 2022 20:00:58 +0800 Subject: Charge Transaction draft --- midtrans.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ midtrans.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/midtrans.c b/midtrans.c index e8472a9..9d171a0 100644 --- a/midtrans.c +++ b/midtrans.c @@ -105,6 +105,56 @@ void midtrans_status(const char *order_id) pthread_create(&threads[num_threads - 1], NULL, request, NULL); } +void midtrans_charge(enum midtrans_payment type, void *object, + struct midtrans_transaction *transaction, + char *custom_fields[]) +{ + static const char *url_tmpl = "%scharge"; + char url[strlen(url_tmpl) - strlen("%s") + strlen(base_url) + 1]; + sprintf(url, url_tmpl, base_url); + curl_easy_setopt(curl, CURLOPT_URL, url); + + size_t payment_len = 0; + char *payment = NULL; + switch (type) { + case MIDTRANS_BANKTRANSFER: + default: + ; + char *payment_tmpl = "bank_transfer\"," + "\t\"bank_transfer\": {" + "\t\t\"bank\": \"%s\""; + struct midtrans_banktransfer *banktransfer + = object; + payment_len = strlen(payment_tmpl) - strlen("%s") + + strlen(banktransfer->bank); + payment = malloc(payment_len + 1); + sprintf(payment, payment_tmpl, banktransfer->bank); + break; + } + static const char *post_tmpl = + "{\n" + "\t\"payment_type\": \"%s" + "\t}," + "\t\"transaction_details\": {" + "\t\t\"order_id\": \"%s\"," + "\t\t\"gross_amount\": %ld" + "}"; + long gross_amount = transaction->gross_amount; + size_t gross_amount_len = 1; + while ((gross_amount /= 10)) + gross_amount_len++; + char post[strlen(post_tmpl) - strlen("%s") * 2 - strlen("%ld") + + payment_len + strlen(transaction->order_id) + + gross_amount_len + 1]; + sprintf(post, post_tmpl, payment, transaction->order_id, + transaction->gross_amount); + free(payment); + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post); + + threads = realloc(threads, ++num_threads * sizeof(pthread_t)); + pthread_create(&threads[num_threads - 1], NULL, request, NULL); +} + void midtrans_cleanup() { for (size_t i = 0; i < num_threads; i++) diff --git a/midtrans.h b/midtrans.h index 9afce42..3bb8174 100644 --- a/midtrans.h +++ b/midtrans.h @@ -1,12 +1,44 @@ #ifndef MIDTRANS_H #define MIDTRANS_H +struct midtrans_transaction { + char *order_id; + long gross_amount; +}; + +enum midtrans_payment { + MIDTRANS_CREDITCARD, + MIDTRANS_BANKTRANSFER, + MIDTRANS_BCA_KLIKBCA, + MIDTRANS_BCA_KLIKPAY, + MIDTRANS_BRI_EPAY, + MIDTRANS_CIMB_CLICKS, + MIDTRANS_DANAMON_ONLINE, + MIDTRANS_UOB_EZPAY, + MIDTRANS_QRIS, + MIDTRANS_GOPAY, + MIDTRANS_SHOPEEPAY, + MIDTRANS_CSTORE, + MIDTRANS_AKULAKU, + MIDTRANS_KREDIVO +}; + +struct midtrans_banktransfer { + char *bank; + char *va_number; + char *bca; + char *permata; +}; + #ifdef __cplusplus extern "C" { #endif void midtrans_init(const char *api_key, const char *cainfo); void midtrans_status(const char *order_id); +void midtrans_charge(enum midtrans_payment payment, void *object, + struct midtrans_transaction *transaction, + char *custom_fields[]); void midtrans_cleanup(); #ifdef __cplusplus -- cgit v1.2.3