summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-11-09 14:14:11 +0800
committerꦌꦫꦶꦏ꧀ꦦꦿꦧꦮꦑꦩꦭ꧀ <erik@darapsa.co.id>2022-11-09 14:14:11 +0800
commita5ec411d34e824a37a09a2e524c1e17dbc4c1836 (patch)
tree4683db3a4c6b9c8a0aac5ce06ac8652117355875
parenta476c2bf2746469808b013b53e9e304935fa8346 (diff)
E-Channel charging (for Mandiri)
-rw-r--r--midtrans.c64
-rw-r--r--midtrans.dart31
-rw-r--r--midtrans.h13
3 files changed, 107 insertions, 1 deletions
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<Utf8> permata;
}
+class MidtransEchannel extends Struct {
+ Pointer<Utf8> bill_info1;
+ Pointer<Utf8> bill_info2;
+}
+
typedef MidtransStatus = Pointer<Utf8> Function(Pointer<Utf8>);
typedef MidtransBanktransferNew = MidtransBanktransfer Function(Pointer<Utf8>);
+typedef MidtransEchannelNew = MidtransEchannel Function(Pointer<Utf8>,
+ Pointer<Utf8>);
typedef MidtransChargeBanktransfer
= Pointer<Utf8> Function(MidtransBanktransfer, MidtransTransaction);
+typedef MidtransChargeEchannel = Pointer<Utf8> 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
+ <MidtransChargeEchannel, MidtransChargeEchannel>
+ ('midtrans_charge_echannel')
+ (dylib.lookupFunction
+ <MidtransEchannelNew, MidtransEchannelNew>
+ ('midtrans_echannel_new')(bill_info1, bill_info2),
+ dylib.lookupFunction
+ <MidtransTransaction Function (Pointer<Utf8>, Long),
+ MidtransTransaction Function (Pointer<Utf8>, 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();