summaryrefslogtreecommitdiff
path: root/midtrans.c
diff options
context:
space:
mode:
Diffstat (limited to 'midtrans.c')
-rw-r--r--midtrans.c50
1 files changed, 50 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++)