/* General Header ChiefSoft September 2017 */ #include "clog.h" #include "cgi.h" #include "input.h" #include "wrenchboard_api.h" #include "safestring.h" #include #include "pgsql.h" #include "pgsql_wrapper.h" #include "cfg.h" #include /* Other Headers */ #include "stripe.h" long stripe_save_card(CVars in, CVars &out) { logfmt(logINFO, "stripe_save_card()"); long res, card_id = 0; char token[64], customer[64], card[64]; const char *stripe_key = CfgReadChar("stripe.secret_key"); if (load_db_record(out, "SELECT stripe_customer_id,email FROM members WHERE id = %lu ", in["member_id"].Long()) && out["stripe_customer_id"].length() > 0) { // Existing stripe account logfmt(logINFO, "stripe_customer_id=%s", out["stripe_customer_id"].c_str()); snprintf(customer, sizeof (customer), "%s", out["stripe_customer_id"].c_str()); // Tokenize card bzero(token, sizeof (token)); res = stripe_tokenize_card( stripe_key, in["card"].c_str(), in["expiration_month"].c_str(), in["expiration_year"].c_str(), in["cvv2"].c_str(), token, sizeof (token) ); remove_all_chars(token, '"'); logfmt(logINFO, "stripe_tokenize_card(%ld)=%s\n", res, token); // Create a card if (res == 0L) { bzero(card, sizeof (card)); res = stripe_create_card( stripe_key, customer, token, card, sizeof (card)); remove_all_chars(card, '"'); logfmt(logINFO, "stripe_create_card(%ld)=%s\n", res, card); if (res == 0L) { // Save card into our DB in["stripe_card_id"] = card; in["stripe_card_id"].set_valid(); in["card"].set_valid(false); in["cvv2"].set_valid(false); in["description"] = stripe_get_card_type(in["card"].c_str()); in["description"].set_valid(); card_id = insert_db_record(DBS_VALID, "creditcard", "creditcard_id_seq", in); if (card_id > 0) { out["card_id"]=card_id; out["result"] = "Card was saved successfully"; } else { out["result"] = "Failed to save card"; } } else { out["result"] = "Failed to create card with stripe"; } } else { out["result"] = "Failed to tokenize card"; logfmt(FLOG_MAX, out["result"].c_str()); } } else if (out["email"].length() > 0) { // Tokenize card bzero(token, sizeof (token)); res = stripe_tokenize_card( stripe_key, in["card"].c_str(), in["expiration_month"].c_str(), in["expiration_year"].c_str(), in["cvv2"].c_str(), token, sizeof (token) ); remove_all_chars(token, '"'); logfmt(logINFO, "stripe_tokenize_card(%ld)=%s\n", res, token); // Create customer if (res == 0L) { bzero(customer, sizeof (customer)); res = stripe_create_customer( stripe_key, token, out["email"].c_str(), in["description"].c_str(), in["member_id"].c_str(), customer, sizeof (customer)); remove_all_chars(customer, '"'); logfmt(logINFO, "stripe_create_customer(%ld)=%s\n", res, customer); if (res == 0L) { out["customer"] = customer; if (pgsql_exec("UPDATE members SET stripe_customer_id='%s' WHERE id=%ld", customer, in["member_id"].Long()) > 0) { // Get card ID bzero(card, sizeof (card)); res = stripe_get_card( stripe_key, customer, in["digits"].c_str(), in["expiration_month"].c_str(), in["expiration_year"].c_str(), card, sizeof (card)); remove_all_chars(card, '"'); logfmt(logINFO, "stripe_get_card(%ld)=%s\n", res, card); if (res == 0L) { // Save card into our DB in["stripe_card_id"] = card; in["stripe_card_id"].set_valid(); in["card"].set_valid(false); in["cvv2"].set_valid(false); in["description"] = stripe_get_card_type(in["card"].c_str()); in["description"].set_valid(); card_id = insert_db_record(DBS_VALID, "creditcard", "creditcard_id_seq", in); if (card_id > 0) { out["card_id"]=card_id; out["result"] = "Card was saved successfully"; } else { out["result"] = "Failed to save card"; } } else { out["result"] = "Failed to get card stripe ID"; } } else { out["result"] = "Failed to save customer stripe ID"; } } else { out["result"] = "Failed to create stripe customer"; } } else { out["result"] = "Failed to tokenize card"; } } else { out["result"] = "Failed to load customer"; } logfmt(logINFO, "/stripe_save_card()"); return card_id; } long stripe_one_time_charge(CVars in, CVars &out) { logfmt(logINFO, "stripe_charge()"); out["result"] = "stripe_charge() call in progress..."; long res, ret = PHP_API_BAD_PARAM; char token[256], id[256]; const char *stripe_key = CfgReadChar("stripe.secret_key"); //logfmt( logINFO, "stripe_key=%s", stripe_key ); try { REQ_STRING(in, "ccnum", 12, 16, "(.*)"); REQ_STRING(in, "ccexpm", 2, 2, "(.*)"); REQ_STRING(in, "ccexpy", 2, 2, "(.*)"); REQ_STRING(in, "cccvc", 3, 5, "(.*)"); long amount = REQ_LONG(in, "amount", 1, -1); const char * loc = getenv("REMOTE_ADDR"); res = stripe_tokenize_card( stripe_key, in["ccnum"].c_str(), in["ccexpm"].c_str(), in["ccexpy"].c_str(), in["cccvc"].c_str(), token, sizeof (token)); remove_all_chars(token, '"'); logfmt(logINFO, "stripe_tokenize_card(%ld)=%s\n", res, token); if (res == 0L) { char *currency = "usd"; char *description = "Example charge"; char *metadata = "6735"; bzero(id, sizeof (id)); res = stripe_charge_token( stripe_key, token, amount, currency, description, metadata, id, sizeof (id)); remove_all_chars(id, '"'); logfmt(logINFO, "stripe_charge_token(%ld)=%s\n", res, id); if (res == 0L) { logfmt(logINFO, "Processed charge: %s\n", token); ret = PHP_API_OK; out["result"] = "Charge success"; out["id"] = id; } else { out["result"] = "Charge failed"; out["id"] = ""; } } else { out["result"] = "Failed to tokenize card"; } } catch (bad_parameter) { out["result"] = "Bad parameter"; logfmt(logINFO, "ERROR CALL long strip_charge(CVars in, CVars &out)"); } logfmt(logINFO, "/stripe_charge()"); return ret; } long stripe_new_customer_charge(CVars in, CVars &out) { logfmt(logINFO, "stripe_new_customer_charge()"); out["result"] = "stripe_new_customer_charge() call in progress..."; long res, ret = PHP_API_BAD_PARAM; char token[64], customer[64], id[64]; const char *stripe_key = CfgReadChar("stripe.secret_key"); //logfmt( logINFO, "stripe_key=%s", stripe_key ); try { REQ_STRING(in, "ccnum", 12, 16, "(.*)"); REQ_STRING(in, "ccexpm", 2, 2, "(.*)"); REQ_STRING(in, "ccexpy", 2, 2, "(.*)"); REQ_STRING(in, "cccvc", 3, 5, "(.*)"); long amount = REQ_LONG(in, "amount", 1, -1); long customer_id = REQ_LONG(in, "customer_id", 1, -1); REQ_STRING(in, "email", 6, 64, "(.*)"); REQ_STRING(in, "description", 1, 64, "(.*)"); const char * loc = getenv("REMOTE_ADDR"); bzero(token, sizeof (token)); res = stripe_tokenize_card( stripe_key, in["ccnum"].c_str(), in["ccexpm"].c_str(), in["ccexpy"].c_str(), in["cccvc"].c_str(), token, sizeof (token)); remove_all_chars(token, '"'); logfmt(logINFO, "stripe_tokenize_card(%ld)=%s\n", res, token); if (res == 0L) { bzero(customer, sizeof (customer)); res = stripe_create_customer( stripe_key, token, in["email"].c_str(), in["description"].c_str(), in["customer_id"].c_str(), customer, sizeof (customer)); remove_all_chars(customer, '"'); logfmt(logINFO, "stripe_create_customer(%ld)=%s\n", res, customer); if (res == 0L) { out["customer"] = customer; char *currency = "usd"; char *description = "Example charge"; char *metadata = "6735"; bzero(id, sizeof (id)); res = stripe_charge_customer( stripe_key, customer, amount, currency, description, metadata, id, sizeof (id)); remove_all_chars(id, '"'); logfmt(logINFO, "stripe_charge_customer(%ld)=%s\n", res, id); if (res == 0L) { logfmt(logINFO, "Processed charge: %s\n", id); ret = PHP_API_OK; out["id"] = id; out["result"] = "Charge success"; } else { out["result"] = "Charge failed"; } } else { out["result"] = "Create customer failed"; } } else { out["result"] = "Failed to tokenize card"; } } catch (bad_parameter) { out["result"] = "Bad parameter"; logfmt(logINFO, "ERROR CALL long strip_charge(CVars in, CVars &out)"); } logfmt(logINFO, "/stripe_charge()"); return ret; } long stripe_charge_member_paymentid(CVars in, CVars &out) { logfmt(logINFO, "stripe_charge_member_paymentid()"); out["result"] = "stripe_charge_member_paymentid() call in progress..."; long res, ret = PHP_API_BAD_PARAM; try { // REQ_LONG(in, "service_id", 0, -1); // REQ_LONG(in, "payment_id", 0, -1); REQ_LONG(in, "member_id", 0, -1); long payment_id = REQ_LONG(in, "payment_id", 0, -1); char id[64], customer[64], data[64]; const char *stripe_key = CfgReadChar("stripe.secret_key"); if (load_db_record(in, "SELECT *,account_id AS card_id , id AS payment_id FROM members_payments WHERE id = %lu", in["payment_id"].Long()) > 0) { } else { } /* if (load_db_record(in, "SELECT *,id AS service_id FROM members_service_request WHERE id = %lu AND dt_confirmed IS NULL", in["service_id"].Long()) > 0) { } else { out["result"] = "Failed : Duplicate Detected"; return ret; } */ in["description"] = "Account Recharge"; in["invoice_id"] = in["payment_id"]; if (load_db_record(out, "SELECT stripe_customer_id FROM members WHERE id=%lu AND stripe_customer_id IS NOT NULL", in["member_id"].Long()) > 0) { if (load_db_record(out, "SELECT stripe_card_id,currency FROM creditcard WHERE id=%lu AND member_id=%lu AND stripe_card_id IS NOT NULL AND length(stripe_card_id)> 0 ", in["card_id"].Long(), in["member_id"].Long()) > 0) { // Set card as a default funding source const char *entity = "default_source"; snprintf(customer, sizeof (customer), "%s", out["stripe_customer_id"].c_str()); bzero(data, sizeof (data)); res = stripe_update_customer(stripe_key, customer, entity, out["stripe_card_id"].c_str(), entity, data, sizeof (data)); remove_all_chars(data, '"'); if (res == 0L && out["stripe_card_id"].compare(data) == 0) { // charge customer char *metadata = "6735"; bzero(id, sizeof (id)); res = stripe_charge_customer( stripe_key, customer, in["amount"].Long(), out["currency"].c_str(), in["description"].c_str(), in["invoice_id"].c_str(), id, sizeof (id)); remove_all_chars(id, '"'); logfmt(logINFO, "stripe_charge_member_paymentid(%ld)=%s\n", res, id); if (res == 0L) { logfmt(logINFO, "Processed charge: %s\n", id); ret = PHP_API_OK; out["id"] = id; pgsql_exec("UPDATE members_payments SET stripe_confirm='%s',dt_confirmed=now() WHERE id = %lu", id, payment_id); /* */ out["result"] = "Charge success"; } else { out["result"] = "Charge failed"; } } else { out["result"] = "Failed to set customer default funding source"; } } else { out["result"] = "Failed to load stripe card ID"; } } else { out["result"] = "Failed to load stripe customer ID"; } } catch (bad_parameter) { logfmt(logINFO, "ERROR CALL long stripe_charge_member_paymentid(CVars in, CVars &out)"); } logfmt(logINFO, "/stripe_charge_member_paymentid()"); return ret; } long stripe_charge_member(CVars in, CVars &out) { logfmt(logINFO, "stripe_charge_member()"); out["result"] = "stripe_charge_member() call in progress..."; long res, ret = PHP_API_BAD_PARAM; char id[64], customer[64], data[64]; const char *stripe_key = CfgReadChar("stripe.secret_key"); if (load_db_record(out, "SELECT stripe_customer_id FROM members WHERE id=%lu AND stripe_customer_id IS NOT NULL", in["member_id"].Long()) > 0) { if (load_db_record(out, "SELECT stripe_card_id FROM creditcard WHERE id=%lu AND member_id=%lu AND stripe_card_id IS NOT NULL", in["card_id"].Long(), in["member_id"].Long()) > 0) { // Set card as a default funding source const char *entity = "default_source"; snprintf(customer, sizeof (customer), "%s", out["stripe_customer_id"].c_str()); bzero(data, sizeof (data)); res = stripe_update_customer(stripe_key, customer, entity, out["stripe_card_id"].c_str(), entity, data, sizeof (data)); remove_all_chars(data, '"'); if (res == 0L && out["stripe_card_id"].compare(data) == 0) { // charge customer char *metadata = "6735"; bzero(id, sizeof (id)); res = stripe_charge_customer( stripe_key, customer, in["amount"].Long(), in["currency"].c_str(), in["description"].c_str(), in["invoice_id"].c_str(), id, sizeof (id)); remove_all_chars(id, '"'); logfmt(logINFO, "stripe_charge_customer(%ld)=%s\n", res, id); if (res == 0L) { logfmt(logINFO, "Processed charge: %s\n", id); ret = PHP_API_OK; out["id"] = id; out["result"] = "Charge success"; } else { out["result"] = "Charge failed"; } } else { out["result"] = "Failed to set customer default funding source"; } } else { out["result"] = "Failed to load stripe card ID"; } } else { out["result"] = "Failed to load stripe customer ID"; } logfmt(logINFO, "/stripe_charge_member()"); return ret; } /* vi:ts=2 */