summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-10-06 20:00:58 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-10-06 20:00:58 +0800
commit8f002c08c6fb6938b9ebf8f037465e5061571bc2 (patch)
treebfc7cb9d636d988a79fb945c0b9651f714258532
parent55e3c1b7173c92737aa478008d2c2894d19b25eb (diff)
Charge Transaction draft
-rw-r--r--midtrans.c50
-rw-r--r--midtrans.h32
2 files changed, 82 insertions, 0 deletions
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