/** ** WHMCS method to capture payments ** This method is triggered by WHMCS in an attempt to capture a PreAuth payment ** ** @param array $params Array of paramaters parsed by WHMCS **/ function gocardless_capture($params) { # create GoCardless DB if it hasn't already been created gocardless_createdb(); # grab the gateway information from WHMCS $gateway = getGatewayVariables('gocardless'); # Send the relevant API information to the GoCardless class for future processing gocardless_set_account_details($params); # check against the database if the bill relevant to this invoice has already been created $existing_payment_query = select_query('mod_gocardless', 'resource_id', array('invoiceid' => $params['invoiceid'])); $existing_payment = mysql_fetch_assoc($existing_payment_query); # check if any rows have been returned or if the returned result is empty. # If no rows were returned, the bill has not already been made for this invoice # If a row was returned but the resource ID is empty, the bill has not been completed # we have already raised a bill with GoCardless (in theory) if (!mysql_num_rows($existing_payment_query) || empty($existing_payment['resource_id'])) { #MOD-START #Use PreAuth table $userid_query = select_query('tblinvoices', 'userid', array('id' => $params['invoiceid'])); $userid_result = mysql_fetch_array($userid_query); if (!empty($userid_result['userid'])) { $userid = $userid_result['userid']; $preauth_query = select_query('mod_gocardless_preauth', 'subscriptionid', array('userid' => $userid)); $preauth_result = mysql_fetch_array($preauth_query); if (!empty($preauth_result['subscriptionid'])) { $preauthid = $preauth_result['subscriptionid']; } } #MOD-END # now we are out of the loop, check if we have been able to get the PreAuth ID if (isset($preauthid)) { # we have found the PreAuth ID, so get it from GoCardless and process a new bill $pre_auth = GoCardless_PreAuthorization::find($preauthid); # check the preauth returned something if ($pre_auth) { # Create a bill with the $pre_auth object try { $bill = $pre_auth->create_bill(array('amount' => $params['amount'], 'name' => "Invoice #" . $params['invoiceid'])); } catch (Exception $e) { # we failed to create a new bill, lets update mod_gocardless to alert the admin why payment hasnt been received, # log this in the transaction log and exit out update_query('mod_gocardless', array('payment_failed' => 1), array('invoiceid' => $params['invoiceid'])); logTransaction($params['paymentmethod'], "Failed to create GoCardless bill against pre-authorization " . $preauthid . " for invoice " . $params['invoiceid'] . ": " . print_r($e, true) . print_r($bill, true), 'Failed'); return array('status' => 'error', 'rawdata' => $e); } # check that the bill has been created if ($bill->id) { # check if the bill already exists in the database, if it does we will just update the record # if not, we will create a new record and record the transaction if (!mysql_num_rows($existing_payment_query)) { # Add the bill ID to the table and mark the transaction as pending insert_query('mod_gocardless', array('invoiceid' => $params['invoiceid'], 'billcreated' => 1, 'resource_id' => $bill->id, 'preauth_id' => $pre_auth->id)); if ($gateway['instantpaid'] == on) { # The Instant Activation option is on, so add to the Gateway Log and log a transaction on the invoice addInvoicePayment($params['invoiceid'], $bill->id, $bill->amount, $bill->gocardless_fees, $gateway['paymentmethod']); logTransaction($gateway['paymentmethod'], 'Bill of ' . $bill->amount . ' raised and logged for invoice ' . $params['invoiceid'] . ' with GoCardless ID ' . $bill->id, 'Successful'); return array('status' => 'success', 'rawdata' => print_r($bill, true)); } else { # Instant Activation is off, so just add to the gateway log and wait before marking as paid until web hook arrives logTransaction($gateway['paymentmethod'], 'Bill of ' . $bill->amount . ' raised for invoice ' . $params['invoiceid'] . ' with GoCardless ID ' . $bill->id, 'Successful'); return array('status' => 'pending', 'rawdata' => print_r($bill, true)); } } else { # update the table with the bill ID update_query('mod_gocardless', array('billcreated' => 1, 'resource_id' => $bill->id), array('invoiceid' => $params['invoiceid'])); } } } else { # PreAuth could not be verified logTransaction($gateway['paymentmethod'], 'The pre-authorization specified for invoice ' . $params['invoiceid'] . ' (' . $preauthid . ') does not seem to exist - something has gone wrong, or the customer needs to set up their Direct Debit again.', 'Incomplete'); return array('status' => 'error', 'rawdata' => array('message' => 'The pre-authorization ID was found for invoice ' . $params['invoiceid'] . ' but it could not be fetched.')); } } else { # we couldn't find the PreAuthID meaning at this point all we can do is give up! # the client will have to setup a new preauth to begin recurring payments again # or pay using an alternative method logTransaction($gateway['paymentmethod'], 'No pre-authorization found when trying to raise payment for invoice ' . $params['invoiceid'] . ' - something has gone wrong, or the customer needs to set up their Direct Debit again.', 'Incomplete'); return array('status' => 'error', 'rawdata' => array('message' => 'No pre-authorisation ID found in WHMCS for invoice ' . $params['invoiceid'])); } } else { # WHMCS is trying to collect the bill but one has already been created - this happens because the bill is not mark as 'paid' # until a web hook is received by default, so WHMCS thinks it still needs to collect. # logTransaction('GoCardless', 'Bill already created - awaiting update via web hook...' . "\nBill ID: " . $existing_payment['resource_id'], 'Pending'); # return array('status' => 'Bill already created - awaiting update via web hook...', 'rawdata' => # array('message' => 'Bill already created - awaiting update via web hook...')); return array('status' => 'pending', 'rawdata' => array('message' => 'The bill has already been created for invoice ' . $params['invoiceid'])); } }
/** ** WHMCS method to capture payments ** This method is triggered by WHMCS in an attempt to capture a PreAuth payment ** ** @param array $params Array of paramaters parsed by WHMCS **/ function gocardless_capture($params) { # create GoCardless DB if it hasn't already been created gocardless_createdb(); # Send the relevant API information to the GoCardless class for future processing gocardless_set_account_details($params); # check against the database if the bill relevant to this invoice has already been created $existing_payment_query = select_query('mod_gocardless', 'resource_id', array('invoiceid' => $params['invoiceid'])); $existing_payment = mysql_fetch_assoc($existing_payment_query); # check if any rows have been returned or if the returned result is empty. # If no rows were returned, the bill has not already been made for this invoice # If a row was returned but the resource ID is empty, the bill has not been completed # we have already raised a bill with GoCardless (in theory) if (!mysql_num_rows($existing_payment_query) || empty($existing_payment['resource_id'])) { # query the database to get the relid of all invoice items $invoice_item_query = select_query('tblinvoiceitems', 'relid', array('invoiceid' => $params['invoiceid'], 'type' => 'Hosting')); # loop through each returned (each invoice item) and attempt to find a subscription ID while ($invoice_item = mysql_fetch_assoc($invoice_item_query)) { $package_query = select_query('tblhosting', 'subscriptionid', array('id' => $invoice_item['relid'])); $package = mysql_fetch_assoc($package_query); # if we have found a subscriptionID, store it in $preauthid if (!empty($package['subscriptionid'])) { $preauthid = $package['subscriptionid']; } } # now we are out of the loop, check if we have been able to get the PreAuth ID if (isset($preauthid)) { # we have found the PreAuth ID, so get it from GoCardless and process a new bill $pre_auth = GoCardless_PreAuthorization::find($preauthid); # check the preauth returned something if ($pre_auth) { # Create a bill with the $pre_auth object try { $bill = $pre_auth->create_bill(array('amount' => $params['amount'])); } catch (Exception $e) { # we failed to create a new bill, lets update mod_gocardless to alert the admin why payment hasnt been received, # log this in the transaction log and exit out update_query('mod_gocardless', array('payment_failed' => 1), array('invoiceid' => $params['invoiceid'])); logTransaction($params['paymentmethod'], "Failed to create GoCardless bill: " . print_r($e, true) . print_r($bill, true), 'Failed'); return array('status' => 'error', 'rawdata' => $e); } # check that the bill has been created if ($bill->id) { # check if the bill already exists in the database, if it does we will just update the record # if not, we will create a new record and record the transaction if (!mysql_num_rows($existing_payment_query)) { # Add the bill ID to the table and mark the transaction as pending insert_query('mod_gocardless', array('invoiceid' => $params['invoiceid'], 'billcreated' => 1, 'resource_id' => $bill->id, 'preauth_id' => $pre_auth->id)); logTransaction('GoCardless', 'Transaction initiated successfully, confirmation will take 2-5 days' . "\nPreAuth: " . $pre_auth->id . "\nBill ID: " . $bill->id, 'Pending'); return array('status' => 'Bill Created', 'rawdata' => $bill); } else { # update the table with the bill ID update_query('mod_gocardless', array('billcreated' => 1, 'resource_id' => $bill->id), array('invoiceid' => $params['invoiceid'])); } } } else { # PreAuth could not be verified logTransaction('GoCardless', 'Pre-Authorisation could not be verified', 'Incomplete'); return array('status' => 'Pre-Authorisation could not be verified', 'rawdata' => array('message' => 'No pre-authorisation ID found in WHMCS')); } } else { # we couldn't find the PreAuthID meaning at this point all we can do is give up! # the client will have to setup a new preauth to begin recurring payments again # or pay using an alternative method logTransaction('GoCardless', 'No pre-authorisation found', 'Incomplete'); return array('status' => 'No Pre-auth Found', 'rawdata' => array('message' => 'No pre-authorisation ID found in WHMCS')); } } else { # WHMCS is trying to collect the bill but one has already been created - this happens because the bill is not mark as 'paid' # until a web hook is received by default, so WHMCS thinks it still needs to collect. logTransaction('GoCardless', 'Bill already created - awaiting update via web hook...' . "\nBill ID: " . $existing_payment['resource_id'], 'Pending'); return array('status' => 'Bill already created - awaiting update via web hook...', 'rawdata' => array('message' => 'Bill already created - awaiting update via web hook...')); } }