diff options
-rw-r--r-- | midtrans.c | 50 | ||||
-rw-r--r-- | midtrans.h | 32 |
2 files changed, 82 insertions, 0 deletions
@@ -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++) @@ -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 |