CyberSource Payment Gateway Module for WHMCS
We have to use Cybersource’s SOAP Toolkit for the WHMCS payment gateway module.Using the toolkit we can develop a Merchant Gateway as explained in the link https://developers.whmcs.com/payment-gateways/merchant-gateway/
The SOAP toolkit details can be found in the URL https://www.cybersource.com/developers/getting_started/integration_methods/soap_toolkit_api. Also read the PDF http://apps.cybersource.com/library/documentation/dev_guides/SOAP_Toolkits/SOAP_toolkits.pdf
We are not covering basics of Payment gateway module development for WHMCS in this post. But we are explaining basics of Cybersource’s API here. Sample code with PHP can be downloaded from the URL www.cybersource.com/support_center/implementation/downloads/soap_api/sample_files/sample_php.zip
It’s better to store subscription id, returning from the cybersource and use that for recurring payments.In this way we can avoid repeated entry of credit card details. From the _storeremote($params) function of your WHMCS payment gateway code, we can create the subscription_id. Below briefly explaining code to produce the subscription id.
function cybersourcegateway_storeremote($params) { require_once("cybersource_lib/vendor/autoload.php"); $referenceCode = '<order number>'; $options = array(); $client = new CybsSoapClient($options, $params); $request = $client->createRequest($referenceCode); $ccAuthService = new stdClass(); $ccAuthService->run = 'true'; $request->ccAuthService = $ccAuthService; $billTo = new stdClass(); $billTo->firstName = "<First name here>"; $billTo->lastName = "<Last name here>"; $billTo->street1 = " <address here>"; $billTo->city = "<city here>"; $billTo->state = "<State here>"; $billTo->postalCode = "<Post code here>"; $billTo->country = "<Country here>"; $billTo->email = "<Email here>"; $billTo->ipAddress = "<Ip address here>"; $request->billTo = $billTo; $card = new stdClass(); $card->accountNumber = "<card number here>"; $card->expirationMonth = "<expiry month here>"; $card->expirationYear = "<expiry year here>"; $card->cardType = "<card type here>"; $request->card = $card; $purchaseTotals = new stdClass(); $purchaseTotals->currency = $params['currency']; $purchaseTotals->grandTotalAmount = $params['amount']; $request->purchaseTotals = $purchaseTotals; $recurringSubscriptionInfo = new stdClass(); $recurringSubscriptionInfo->frequency = "on-demand"; $request->recurringSubscriptionInfo = $recurringSubscriptionInfo; $paySubscriptionCreateService = new stdClass(); $paySubscriptionCreateService->run = 'true'; $request->paySubscriptionCreateService = $paySubscriptionCreateService; $reply = $client->runTransaction($request); $subscription_id = $reply->paySubscriptionCreateReply->subscriptionID; if ($reply->decision == 'ACCEPT' && $reply->reasonCode == '100') { return array( "status" => "success", "gatewayid" => $subscription_id, "rawdata" => json_encode($reply) ); } else { return array( "status" => "failed", "gatewayid" => $subscription_id, "rawdata" => json_encode($reply) ); } }
Then in your capture function, call API as given below.
function cybersourcegateway_capture($params) { require_once("cybersource_lib/vendor/autoload.php"); $referenceCode = $params['referencecode']; $options = array(); $client = new CybsSoapClient($options, $params); $request = $client->createRequest($referenceCode); $ccAuthService = new stdClass(); $ccAuthService->run = 'true'; $request->ccAuthService = $ccAuthService; $ccCaptureService = new stdClass(); $ccCaptureService->run = 'true'; $request->ccCaptureService = $ccCaptureService; $purchaseTotals = new stdClass(); $purchaseTotals->currency = $params['currency']; $purchaseTotals->grandTotalAmount = $params['amount']; $request->purchaseTotals = $purchaseTotals; $recurringSubscriptionInfo = new stdClass(); $recurringSubscriptionInfo->subscriptionID = $params['gatewayid']; $request->recurringSubscriptionInfo = $recurringSubscriptionInfo; $reply2 = $client->runTransaction($request); if ($reply2->decision == 'ACCEPT' && $reply2->reasonCode == '100') { return array( "status" => "success", "transid" => $reply2->requestID, "rawdata" => json_encode($reply2) ); } else { return array( "status" => "failed", "transid" => $reply2->requestID, "rawdata" => json_encode($reply2) ); } }
Those who would like to hear more about the gateway development, post a comment. Will reply asap.
And those who are looking for a ready made module, please contact us from the link Request a quote. We will get back to you asap.