From a5ec411d34e824a37a09a2e524c1e17dbc4c1836 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: Wed, 9 Nov 2022 14:14:11 +0800 Subject: E-Channel charging (for Mandiri) --- midtrans.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ midtrans.dart | 31 +++++++++++++++++++++++++++++ midtrans.h | 13 +++++++++++- 3 files changed, 107 insertions(+), 1 deletion(-) diff --git a/midtrans.c b/midtrans.c index 8138a4a..ff79861 100644 --- a/midtrans.c +++ b/midtrans.c @@ -86,6 +86,12 @@ struct midtrans_banktransfer midtrans_banktransfer_new(char *bank) return (struct midtrans_banktransfer){ bank, NULL, NULL, NULL }; } +struct midtrans_echannel midtrans_echannel_new(char *bill_info1, + char *bill_info2) +{ + return (struct midtrans_echannel){ bill_info1, bill_info2 }; +} + struct midtrans_transaction midtrans_transaction_new(char *order_id, long gross_amount) { @@ -188,6 +194,64 @@ char *midtrans_charge_banktransfer(struct midtrans_banktransfer banktransfer, return virtualaccount_number; } +char *midtrans_charge_echannel(struct midtrans_echannel echannel, + struct midtrans_transaction transaction) +{ + 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); + + static const char *payment_tmpl = "echannel\",\n" + "\t\"echannel\": {\n" + "\t\t\"bill_info1\": \"%s\"%s," + "\t\t\"bill_info2\": \"%s\"%s"; + const size_t payment_len = strlen(payment_tmpl) - strlen("%s") * 4 + + strlen(echannel.bill_info1) + strlen(echannel.bill_info2); + char *payment = malloc(payment_len + 1); + sprintf(payment, payment_tmpl, echannel.bill_info1, + echannel.bill_info2); + + static const char *post_tmpl = + "{\n" + "\t\"payment_type\": \"%s\n" + "\t},\n" + "\t\"transaction_details\": {\n" + "\t\t\"order_id\": \"%s\",\n" + "\t\t\"gross_amount\": %ld\n" + "\t}\n" + "}"; + 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") * 3 - 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); + + struct response res = { 0, NULL }; + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &res); + curl_easy_perform(curl); + + json_tokener *tokener = json_tokener_new(); + json_object *status = json_tokener_parse_ex(tokener, res.data, + res.size); + free(res.data); + + json_object *bill_key = NULL; + json_object_object_get_ex(status, "bill_key", &bill_key); + const char *string = json_object_get_string(bill_key); + char *key = malloc(strlen(string) + 1); + strcpy(key, string); + json_tokener_free(tokener); + + return key; +} + char *midtrans_status(const char *order_id) { static const char *tmpl = "%s%s/status"; diff --git a/midtrans.dart b/midtrans.dart index 4c220d4..9b388d9 100644 --- a/midtrans.dart +++ b/midtrans.dart @@ -16,10 +16,19 @@ class MidtransBanktransfer extends Struct { Pointer permata; } +class MidtransEchannel extends Struct { + Pointer bill_info1; + Pointer bill_info2; +} + typedef MidtransStatus = Pointer Function(Pointer); typedef MidtransBanktransferNew = MidtransBanktransfer Function(Pointer); +typedef MidtransEchannelNew = MidtransEchannel Function(Pointer, + Pointer); typedef MidtransChargeBanktransfer = Pointer Function(MidtransBanktransfer, MidtransTransaction); +typedef MidtransChargeEchannel = Pointer Function(MidtransEchannel, + MidtransTransaction); class Midtrans { final dylib = Platform.isAndroid ? DynamicLibrary.open('libmidtrans.so') @@ -56,6 +65,28 @@ class Midtrans { return vaNumber; } + String chargeEchannel(String billInfo1, String billInfo2, + String orderID, int grossAmount) { + final bill_info1 = billInfo1.toNativeUtf8(); + final bill_info2 = billInfo2.toNativeUtf8(); + final order_id = orderID.toNativeUtf8(); + final billKey = dylib.lookupFunction + + ('midtrans_charge_echannel') + (dylib.lookupFunction + + ('midtrans_echannel_new')(bill_info1, bill_info2), + dylib.lookupFunction + , Long), + MidtransTransaction Function (Pointer, int)> + ('midtrans_transaction_new')(order_id, grossAmount)) + .toDartString(); + calloc.free(bill_info1); + calloc.free(bill_info2); + calloc.free(order_id); + return billKey; + } + String status(String orderID) { final order_id = orderID.toNativeUtf8(); final status = dylib.lookupFunction diff --git a/midtrans.h b/midtrans.h index 37c35c2..d791045 100644 --- a/midtrans.h +++ b/midtrans.h @@ -13,9 +13,16 @@ struct midtrans_banktransfer { char *permata; }; +struct midtrans_echannel { + char *bill_info1; + char *bill_info2; +}; + #define midtrans_charge(x, y) _Generic((x),\ struct midtrans_banktransfer:\ - midtrans_charge_banktransfer(x, y)\ + midtrans_charge_banktransfer(x, y),\ + struct midtrans_echannel:\ + midtrans_charge_echannel(x, y)\ ) #ifdef __cplusplus @@ -24,11 +31,15 @@ extern "C" { void midtrans_init(const char *api_key, char *pem); struct midtrans_banktransfer midtrans_banktransfer_new(char *bank); +struct midtrans_echannel midtrans_echannel_new(char *bill_info1, + char *bill_info2); struct midtrans_transaction midtrans_transaction_new(char *order_id, long gross_amount); char *midtrans_charge_banktransfer(struct midtrans_banktransfer banktransfer, struct midtrans_transaction transaction /*, char *custom_fields[]*/); +char *midtrans_charge_echannel(struct midtrans_echannel echannel, + struct midtrans_transaction transaction); char *midtrans_status(const char *order_id); void midtrans_cleanup(); -- cgit v1.2.3