Files
Business-credit-asistant/app/Services/Payment/Gateway/NmiPayment.php
2026-06-29 13:00:18 +06:00

880 lines
36 KiB
PHP

<?php
namespace App\Services\Payment\Gateway;
use App\Services\Payment\PaymentInterface;
class NmiPayment implements PaymentInterface
{
// Initial Setting Functions
private string $base_url = "https://secure.nmi.com/api/transact.php";
private array $login = [];
private array $responses = [];
private array $recurringData = [];
private array $preparePaymentData = [];
private array $shipping = [];
private array $billing = [];
private array $order = [];
private bool $isRecurring = false;
private string $pay_log_id="";
private array $logData = [];
private array $data=[];
function setLogin($security_key) {
$this->login['security_key'] = $security_key;
$this->pay_log_id = "LOG_".getSecurityKey();
}
function setOrder($orderid,
$orderdescription,
$tax,
$shipping,
$ponumber,
$ipaddress) {
$this->order['orderid'] = $orderid;
$this->order['orderdescription'] = $orderdescription;
$this->order['tax'] = $tax;
$this->order['shipping'] = $shipping;
$this->order['ponumber'] = $ponumber;
$this->order['ipaddress'] = $ipaddress;
}
function setBilling($firstname,
$lastname,
$company,
$address1,
$address2,
$city,
$state,
$zip,
$country,
$phone,
$fax,
$email,
$website) {
$this->billing['firstname'] = $firstname;
$this->billing['lastname'] = $lastname;
$this->billing['company'] = $company;
$this->billing['address1'] = $address1;
$this->billing['address2'] = $address2;
$this->billing['city'] = $city;
$this->billing['state'] = $state;
$this->billing['zip'] = $zip;
$this->billing['country'] = $country;
$this->billing['phone'] = $phone;
$this->billing['fax'] = $fax;
$this->billing['email'] = $email;
$this->billing['website'] = $website;
}
function setShipping($firstname,
$lastname,
$company,
$address1,
$address2,
$city,
$state,
$zip,
$country,
$email) {
$this->shipping['firstname'] = $firstname;
$this->shipping['lastname'] = $lastname;
$this->shipping['company'] = $company;
$this->shipping['address1'] = $address1;
$this->shipping['address2'] = $address2;
$this->shipping['city'] = $city;
$this->shipping['state'] = $state;
$this->shipping['zip'] = $zip;
$this->shipping['country'] = $country;
$this->shipping['email'] = $email;
}
public static function nmiAmountValueFormat($value){
return number_format($value,2,".","");
}
private function preparePaymentData($inputData)
{
$this->preparePaymentData['type'] = "sale";
$this->preparePaymentData['ccnumber'] = $inputData['card_number'];
$this->preparePaymentData['ccexp'] = $inputData['expiry'];
$this->preparePaymentData['amount'] = self::nmiAmountValueFormat($inputData['amount']);
$this->preparePaymentData['cvv'] = $inputData['cvv'] ?? "";
$this->preparePaymentData['orderid'] = $inputData['order_id'];
$this->preparePaymentData['orderdescription'] = $inputData['order_description'];
$this->preparePaymentData['tax'] = number_format($inputData['tax'],2,".","") ;
$this->preparePaymentData['shipping'] = number_format($inputData['shipping'],2,".","");
$this->preparePaymentData['ponumber'] = $inputData['ponumber'];
$this->preparePaymentData['ipaddress'] = $inputData['ip'];
$this->preparePaymentData['firstname'] = $inputData['first_name'];
$this->preparePaymentData['lastname'] = $inputData['last_name'];
$this->preparePaymentData['company'] = $inputData['company'];
$this->preparePaymentData['address1'] = $inputData['address1'];
$this->preparePaymentData['address2'] = $inputData['address2'];
$this->preparePaymentData['city'] = $inputData['city'];
$this->preparePaymentData['state'] = $inputData['state'];
$this->preparePaymentData['zip'] = $inputData['zip'];
$this->preparePaymentData['country'] = $inputData['country'];
$this->preparePaymentData['email'] = $inputData['email'];
$this->preparePaymentData['phone'] = $inputData['phone'];
$this->preparePaymentData['fax'] = $inputData['fax'];
$this->preparePaymentData['website'] = $inputData['website'];
$this->preparePaymentData['shipping_firstname'] = $inputData['first_name'];
$this->preparePaymentData['shipping_lastname'] = $inputData['last_name'];
$this->preparePaymentData['shipping_company'] = $inputData['company'];
$this->preparePaymentData['shipping_address1'] = $inputData['address1'];
$this->preparePaymentData['shipping_address2'] = $inputData['address2'];
$this->preparePaymentData['shipping_city'] = $inputData['city'];
$this->preparePaymentData['shipping_state'] = $inputData['state'];
$this->preparePaymentData['shipping_zip'] = $inputData['zip'];
$this->preparePaymentData['shipping_country'] = $inputData['country'];
$this->preparePaymentData['shipping_email'] = $inputData['email'];
}
// Transaction Functions
private function doSale() {
if(empty($this->preparePaymentData)){
throw new \Exception('You must have to set payment data by calling preparePaymentData method.');
}
/*
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Sales Information
$query .= "ccnumber=" . urlencode($ccnumber) . "&";
$query .= "ccexp=" . urlencode($ccexp) . "&";
$query .= "amount=" . urlencode(number_format($amount,2,".","")) . "&";
$query .= "cvv=" . urlencode($cvv) . "&";
// Order Information
$query .= "ipaddress=" . urlencode($this->order['ipaddress']) . "&";
$query .= "orderid=" . urlencode($this->order['orderid']) . "&";
$query .= "orderdescription=" . urlencode($this->order['orderdescription']) . "&";
$query .= "tax=" . urlencode(number_format($this->order['tax'],2,".","")) . "&";
$query .= "shipping=" . urlencode(number_format($this->order['shipping'],2,".","")) . "&";
$query .= "ponumber=" . urlencode($this->order['ponumber']) . "&";
// Billing Information
$query .= "firstname=" . urlencode($this->billing['firstname']) . "&";
$query .= "lastname=" . urlencode($this->billing['lastname']) . "&";
$query .= "company=" . urlencode($this->billing['company']) . "&";
$query .= "address1=" . urlencode($this->billing['address1']) . "&";
$query .= "address2=" . urlencode($this->billing['address2']) . "&";
$query .= "city=" . urlencode($this->billing['city']) . "&";
$query .= "state=" . urlencode($this->billing['state']) . "&";
$query .= "zip=" . urlencode($this->billing['zip']) . "&";
$query .= "country=" . urlencode($this->billing['country']) . "&";
$query .= "phone=" . urlencode($this->billing['phone']) . "&";
$query .= "fax=" . urlencode($this->billing['fax']) . "&";
$query .= "email=" . urlencode($this->billing['email']) . "&";
$query .= "website=" . urlencode($this->billing['website']) . "&";
// Shipping Information
$query .= "shipping_firstname=" . urlencode($this->shipping['firstname']) . "&";
$query .= "shipping_lastname=" . urlencode($this->shipping['lastname']) . "&";
$query .= "shipping_company=" . urlencode($this->shipping['company']) . "&";
$query .= "shipping_address1=" . urlencode($this->shipping['address1']) . "&";
$query .= "shipping_address2=" . urlencode($this->shipping['address2']) . "&";
$query .= "shipping_city=" . urlencode($this->shipping['city']) . "&";
$query .= "shipping_state=" . urlencode($this->shipping['state']) . "&";
$query .= "shipping_zip=" . urlencode($this->shipping['zip']) . "&";
$query .= "shipping_country=" . urlencode($this->shipping['country']) . "&";
$query .= "shipping_email=" . urlencode($this->shipping['email']) . "&";
$query .= "type=sale";
return $this->_doPost($query);
*/
$query = "";
// Login Information
if(!empty($this->preparePaymentData)) {
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
foreach ($this->preparePaymentData as $key => $value) {
$query .= "&{$key}=" . urlencode($value);
}
}
if(!empty($query)){
return $this->_doPost($query);
}
return false;
}
function doAuth($amount, $ccnumber, $ccexp, $cvv="") {
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Sales Information
$query .= "ccnumber=" . urlencode($ccnumber) . "&";
$query .= "ccexp=" . urlencode($ccexp) . "&";
$query .= "amount=" . urlencode(number_format($amount,2,".","")) . "&";
$query .= "cvv=" . urlencode($cvv) . "&";
// Order Information
$query .= "ipaddress=" . urlencode($this->order['ipaddress']) . "&";
$query .= "orderid=" . urlencode($this->order['orderid']) . "&";
$query .= "orderdescription=" . urlencode($this->order['orderdescription']) . "&";
$query .= "tax=" . urlencode(number_format($this->order['tax'],2,".","")) . "&";
$query .= "shipping=" . urlencode(number_format($this->order['shipping'],2,".","")) . "&";
$query .= "ponumber=" . urlencode($this->order['ponumber']) . "&";
// Billing Information
$query .= "firstname=" . urlencode($this->billing['firstname']) . "&";
$query .= "lastname=" . urlencode($this->billing['lastname']) . "&";
$query .= "company=" . urlencode($this->billing['company']) . "&";
$query .= "address1=" . urlencode($this->billing['address1']) . "&";
$query .= "address2=" . urlencode($this->billing['address2']) . "&";
$query .= "city=" . urlencode($this->billing['city']) . "&";
$query .= "state=" . urlencode($this->billing['state']) . "&";
$query .= "zip=" . urlencode($this->billing['zip']) . "&";
$query .= "country=" . urlencode($this->billing['country']) . "&";
$query .= "phone=" . urlencode($this->billing['phone']) . "&";
$query .= "fax=" . urlencode($this->billing['fax']) . "&";
$query .= "email=" . urlencode($this->billing['email']) . "&";
$query .= "website=" . urlencode($this->billing['website']) . "&";
// Shipping Information
$query .= "shipping_firstname=" . urlencode($this->shipping['firstname']) . "&";
$query .= "shipping_lastname=" . urlencode($this->shipping['lastname']) . "&";
$query .= "shipping_company=" . urlencode($this->shipping['company']) . "&";
$query .= "shipping_address1=" . urlencode($this->shipping['address1']) . "&";
$query .= "shipping_address2=" . urlencode($this->shipping['address2']) . "&";
$query .= "shipping_city=" . urlencode($this->shipping['city']) . "&";
$query .= "shipping_state=" . urlencode($this->shipping['state']) . "&";
$query .= "shipping_zip=" . urlencode($this->shipping['zip']) . "&";
$query .= "shipping_country=" . urlencode($this->shipping['country']) . "&";
$query .= "shipping_email=" . urlencode($this->shipping['email']) . "&";
$query .= "type=auth";
return $this->_doPost($query);
}
function doCredit($amount, $ccnumber, $ccexp) {
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Sales Information
$query .= "ccnumber=" . urlencode($ccnumber) . "&";
$query .= "ccexp=" . urlencode($ccexp) . "&";
$query .= "amount=" . urlencode(number_format($amount,2,".","")) . "&";
// Order Information
$query .= "ipaddress=" . urlencode($this->order['ipaddress']) . "&";
$query .= "orderid=" . urlencode($this->order['orderid']) . "&";
$query .= "orderdescription=" . urlencode($this->order['orderdescription']) . "&";
$query .= "tax=" . urlencode(number_format($this->order['tax'],2,".","")) . "&";
$query .= "shipping=" . urlencode(number_format($this->order['shipping'],2,".","")) . "&";
$query .= "ponumber=" . urlencode($this->order['ponumber']) . "&";
// Billing Information
$query .= "firstname=" . urlencode($this->billing['firstname']) . "&";
$query .= "lastname=" . urlencode($this->billing['lastname']) . "&";
$query .= "company=" . urlencode($this->billing['company']) . "&";
$query .= "address1=" . urlencode($this->billing['address1']) . "&";
$query .= "address2=" . urlencode($this->billing['address2']) . "&";
$query .= "city=" . urlencode($this->billing['city']) . "&";
$query .= "state=" . urlencode($this->billing['state']) . "&";
$query .= "zip=" . urlencode($this->billing['zip']) . "&";
$query .= "country=" . urlencode($this->billing['country']) . "&";
$query .= "phone=" . urlencode($this->billing['phone']) . "&";
$query .= "fax=" . urlencode($this->billing['fax']) . "&";
$query .= "email=" . urlencode($this->billing['email']) . "&";
$query .= "website=" . urlencode($this->billing['website']) . "&";
$query .= "type=credit";
return $this->_doPost($query);
}
function doOffline($authorizationcode, $amount, $ccnumber, $ccexp) {
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Sales Information
$query .= "ccnumber=" . urlencode($ccnumber) . "&";
$query .= "ccexp=" . urlencode($ccexp) . "&";
$query .= "amount=" . urlencode(number_format($amount,2,".","")) . "&";
$query .= "authorizationcode=" . urlencode($authorizationcode) . "&";
// Order Information
$query .= "ipaddress=" . urlencode($this->order['ipaddress']) . "&";
$query .= "orderid=" . urlencode($this->order['orderid']) . "&";
$query .= "orderdescription=" . urlencode($this->order['orderdescription']) . "&";
$query .= "tax=" . urlencode(number_format($this->order['tax'],2,".","")) . "&";
$query .= "shipping=" . urlencode(number_format($this->order['shipping'],2,".","")) . "&";
$query .= "ponumber=" . urlencode($this->order['ponumber']) . "&";
// Billing Information
$query .= "firstname=" . urlencode($this->billing['firstname']) . "&";
$query .= "lastname=" . urlencode($this->billing['lastname']) . "&";
$query .= "company=" . urlencode($this->billing['company']) . "&";
$query .= "address1=" . urlencode($this->billing['address1']) . "&";
$query .= "address2=" . urlencode($this->billing['address2']) . "&";
$query .= "city=" . urlencode($this->billing['city']) . "&";
$query .= "state=" . urlencode($this->billing['state']) . "&";
$query .= "zip=" . urlencode($this->billing['zip']) . "&";
$query .= "country=" . urlencode($this->billing['country']) . "&";
$query .= "phone=" . urlencode($this->billing['phone']) . "&";
$query .= "fax=" . urlencode($this->billing['fax']) . "&";
$query .= "email=" . urlencode($this->billing['email']) . "&";
$query .= "website=" . urlencode($this->billing['website']) . "&";
// Shipping Information
$query .= "shipping_firstname=" . urlencode($this->shipping['firstname']) . "&";
$query .= "shipping_lastname=" . urlencode($this->shipping['lastname']) . "&";
$query .= "shipping_company=" . urlencode($this->shipping['company']) . "&";
$query .= "shipping_address1=" . urlencode($this->shipping['address1']) . "&";
$query .= "shipping_address2=" . urlencode($this->shipping['address2']) . "&";
$query .= "shipping_city=" . urlencode($this->shipping['city']) . "&";
$query .= "shipping_state=" . urlencode($this->shipping['state']) . "&";
$query .= "shipping_zip=" . urlencode($this->shipping['zip']) . "&";
$query .= "shipping_country=" . urlencode($this->shipping['country']) . "&";
$query .= "shipping_email=" . urlencode($this->shipping['email']) . "&";
$query .= "type=offline";
return $this->_doPost($query);
}
function doCapture($transactionid, $amount =0) {
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Transaction Information
$query .= "transactionid=" . urlencode($transactionid) . "&";
if ($amount>0) {
$query .= "amount=" . urlencode(number_format($amount,2,".","")) . "&";
}
$query .= "type=capture";
return $this->_doPost($query);
}
function doVoid($transactionid) {
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Transaction Information
$query .= "transactionid=" . urlencode($transactionid) . "&";
$query .= "type=void";
return $this->_doPost($query);
}
function doRefund($transactionid, $amount = 0) {
$query = "";
// Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// Transaction Information
$query .= "transactionid=" . urlencode($transactionid) . "&";
if ($amount>0) {
$query .= "amount=" . urlencode(number_format($amount,2,".","")) . "&";
}
$query .= "type=refund";
return $this->_doPost($query);
}
function doRecurringUpdate()
{
$query = "";
// // Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// update subscription
$query .= "recurring=" . urlencode($this->recurringData['recurring']) . "&";
$query .= "subscription_id=" . urlencode($this->recurringData['subscription_id']);
return $this->_doPost($query);
}
function doTransactionInfo()
{
$query = "";
// // Login Information
$query .= "security_key=" . urlencode($this->login['security_key']) . "&";
// update subscription
$query .= "transaction_id=" . urlencode($this->recurringData['transaction_id']) . "&";
$query .= "subscription_id=" . urlencode($this->recurringData['subscription_id']);
return $this->_doPost($query);
}
function _doPost($query) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->base_url);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
curl_setopt($ch, CURLOPT_POST, 1);
if (!($data = curl_exec($ch))) {
return 3;
}
curl_close($ch);
unset($ch);
// print "\n$data\n";
$data = explode("&",$data);
for($i=0;$i<count($data);$i++) {
$rdata = explode("=",$data[$i]);
$this->responses[$rdata[0]] = $rdata[1];
}
return $this->responses['response'];
}
function doRecurring()
{
// Login Information
$query_string = "";
if(!empty($this->recurringData)){
$query_string .= "security_key=" . urlencode($this->login['security_key']);
foreach ($this->recurringData as $key => $value){
$query_string .= "&{$key}=".urlencode($value);
}
}
if(!empty($query_string)){
return $this->_doPost($query_string);
}
return false;
}
/**
* @throws \Exception
*/
public function prepareData($inputData): array
{
if(empty($inputData['order_id'])){
throw new \Exception('Order id missing');
}
if(empty($inputData['order_description'])){
throw new \Exception('order description missing');
}
if(empty($inputData['ip'])){
throw new \Exception('ip missing');
}
$prepareData['first_name'] = $inputData['first_name'];
$prepareData['last_name'] = $inputData['last_name'];
$prepareData['company'] = $inputData['company'] ?? config('app.name');
$prepareData['address1'] = $inputData['street_no'];
$prepareData['address2'] = $inputData['street_name'];
$prepareData['city']= $inputData['city'];
$prepareData['state']= $inputData['state'];
$prepareData['zip']= $inputData['zip_code'];
$prepareData['country']= $inputData['country'] ?? 'US';
$prepareData['phone']= $inputData['phone'];
$prepareData['fax']= $inputData['fax'] ?? "";
$prepareData['email']= $inputData['email'];
$prepareData['website'] = $inputData['website'] ?? "";
$prepareData['order_id']= $inputData['order_id'];
$prepareData['order_description']= $inputData['order_description'];
$prepareData['tax']= 1;
$prepareData['shipping']= 1;
$prepareData['ponumber']= "PO1234";
$prepareData['ip'] = $inputData['ip'];
$prepareData['amount']= $inputData['amount'];
$prepareData['card_number']= $inputData['card_number'];
$prepareData['expiry'] = str_replace("/","",$inputData['expiry']);
return $prepareData;
}
/**
* @throws \Exception
*/
public function makePayment($prepareData)
{
$result = [];
// $logData['action'] = "NMI_PAYMENT";
$this->setLogin(config('app.NMI_SECURITY_KEY'));
/*
$this->setBilling(
$prepareData['first_name'],
$prepareData['last_name'],
$prepareData['company'],
$prepareData['address1'],
$prepareData['address2'],
$prepareData['city'],
$prepareData['state'],
$prepareData['zip'],
$prepareData['country'],
$prepareData['phone'],
$prepareData['fax'],
$prepareData['email'],
$prepareData['website']
);
$this->setShipping(
$prepareData['first_name'],
$prepareData['last_name'],
$prepareData['company'],
$prepareData['address1'],
$prepareData['address2'],
$prepareData['city'],
$prepareData['state'],
$prepareData['zip'],
$prepareData['country'],
$prepareData['email']
);
$this->setOrder(
$prepareData['order_id'],
$prepareData['order_description'],
$prepareData['tax'],
$prepareData['shipping'],
$prepareData['ponumber'], //"PO1234",
$prepareData['ip']
);
*/
$this->preparePaymentData($prepareData);
$this->doSale();
// $this->responseDataSample();
$result['status_code'] = config('constant.API_FAILED_CODE');
$result['auth_code'] = $this->responses['authcode'] ?? "";
$result['transaction_id'] = $this->responses['transactionid'] ?? "";
$result['order_id'] = $this->responses['orderid'] ?? "";
$result['message'] = $this->responses['responsetext'] ?? "";
if(isset($this->responses['response_code']) && $this->responses['response_code'] == config('constant.API_SUCCESS_CODE')){
$result['status_code'] = config('constant.API_SUCCESS_CODE');
}
// $logData['data'] = $this->responses;
$this->logData['NMI_PAYMENT_API_LOG'][$this->pay_log_id]["MAKE_PAYMENT"]= $this->prepareLogData($this->base_url,'POST',$prepareData);
appLog($this->logData);
return $result;
}
public function makeRecurringPayment($inputData)
{
$result=[];
$result['status'] = false;
$this->setLogin(config('app.NMI_SECURITY_KEY'));
$this->prepareRecurringData($inputData);
$this->doRecurring();
$result['status_code'] = config('constant.API_FAILED_CODE');
$result['transaction_status'] = $this->responses['response'] ?? 0;
$result['transaction_id'] = $this->responses['transactionid'] ?? "";
$result['subscription_id'] = $this->responses['subscription_id'] ?? "";
$result['message'] = $this->responses['responsetext'] ?? "";
if(isset($this->responses['response_code']) && $this->responses['response_code'] == config('constant.API_SUCCESS_CODE'))
{
$result['status_code'] = config('constant.API_SUCCESS_CODE');
$result['status'] = true;
}
$this->logData['NMI_RECURRING_API_LOG'][$this->pay_log_id]["MAKE_RECURRING"]= $this->prepareLogData($this->base_url,'POST',$inputData);
appLog( $this->logData);
return $result;
}
// prepare data for add subscription in existing plan
public function prepareRecurringData($prepareData)
{
/*
first_name Cardholder's first name. Legacy variable includes: firstname
last_name Cardholder's last name. Legacy variable includes: lastname
address1 Card billing address.
city Card billing city
state Card billing state.
zip Card billing postal code.
country Card billing country code.
phone Billing phone number.
email Billing email address.
company Cardholder's company.
address2 Card billing address, line 2.
fax Billing fax number.
*/
// these are mandatory field for CZ
$this->recurringData['recurring'] = 'add_subscription';
$this->recurringData['plan_id'] = "creditzombiesplan";
$this->recurringData['payment'] = "creditcard";
$this->recurringData['company'] = "Creditzombies";
$this->recurringData['country'] = "US";
// these are mandatory field for CZ
$this->recurringData['ccnumber'] = $prepareData['card_number'];
$this->recurringData['ccexp'] = $prepareData['expiry'];
$this->recurringData['first_name'] = $prepareData['first_name'];
$this->recurringData['last_name'] = $prepareData['last_name'];
$this->recurringData['address1'] = $prepareData['street_no'];
$this->recurringData['address2'] = $prepareData['street_name'];
$this->recurringData['city'] = $prepareData['city'];
$this->recurringData['state'] = $prepareData['state'];
$this->recurringData['zip'] = $prepareData['zip_code'];
$this->recurringData['phone'] = $prepareData['phone'];
$this->recurringData['email'] = $prepareData['email'];
}
private function prepareLogData($url,$method,$request_data){
if(isset($request_data['ccnumber'])){
$request_data['ccnumber'] = "*********";
}
if(isset($request_data['card_number'])){
$request_data['card_number'] = "*********";
}
if(!empty($request_data['password'])){
$request_data['password'] = "*********";
}
return [
'request' => [
'url' => $url,
'method' => $method,
'body'=> $request_data,
'Header'=>[
'ContentType' => 'application/x-www-form-urlencoded'
]
],
'response' => $this->responses
];
}
private function getRecurringBySubscriptionId($security_key,$constraints){
// transactionFields has all of the fields we want to validate
// in the transaction tag in the XML output
$transactionFields = array(
'transaction_id',
'partial_payment_id',
'partial_payment_balance',
'platform_id',
'transaction_type',
'condition',
'order_id',
'authorization_code',
'ponumber',
'order_description',
'first_name',
'last_name',
'address_1',
'address_2',
'company',
'city',
'state',
'postal_code',
'country',
'email',
'phone',
'fax',
'cell_phone',
'customertaxid',
'customerid',
'website',
'shipping_first_name',
'shipping_last_name',
'shipping_address_1',
'shipping_address_2',
'shipping_company',
'shipping_city',
'shipping_state',
'shipping_postal_code',
'shipping_country',
'shipping_email',
'shipping_carrier',
'tracking_number',
'shipping_date',
'shipping',
'shipping_phone',
'cc_number',
'cc_hash',
'cc_exp',
'cavv',
'cavv_result',
'xid',
'eci',
'avs_response',
'csc_response',
'cardholder_auth',
'cc_start_date',
'cc_issue_number',
'check_account',
'check_hash',
'check_aba',
'check_name',
'account_holder_type',
'account_type',
'sec_code',
'drivers_license_number',
'drivers_license_state',
'drivers_license_dob',
'social_security_number',
'processor_id',
'tax',
'currency',
'surcharge',
'tip',
'card_balance',
'card_available_balance',
'entry_mode',
'cc_bin',
'cc_type'
);
// actionFields is used to validate the XML tags in the
// action element
$actionFields = array(
'amount',
'action_type',
'date',
'success',
'ip_address',
'source',
'api_method',
'username',
'response_text',
'batch_id',
'processor_batch_id',
'response_code',
'processor_response_text',
'processor_response_code',
'device_license_number',
'device_nickname'
);
$mycurl=curl_init();
$postStr='security_key='.$security_key.$constraints;
$url="https://secure.nmi.com/api/query.php?". $postStr;
curl_setopt($mycurl, CURLOPT_URL, $url);
curl_setopt($mycurl, CURLOPT_RETURNTRANSFER, 1);
$responseXML=curl_exec($mycurl);
curl_close($mycurl);
$testXmlSimple= new \SimpleXMLElement($responseXML);
if (!isset($testXmlSimple->transaction)) {
throw new \Exception('No transactions returned');
}
$transNum = 1;
foreach($testXmlSimple->transaction as $transaction) {
foreach ($transactionFields as $xmlField) {
if (!isset($transaction->{$xmlField}[0])){
throw new \Exception('Error in transaction_id:'. $transaction->transaction_id[0] .' id Transaction tag is missing field ' . $xmlField);
}
}
if (!isset ($transaction->action)) {
throw new \Exception('Error, Action tag is missing from transaction_id '. $transaction->transaction_id[0]);
}
$actionNum = 1;
foreach ($transaction->action as $action){
foreach ($actionFields as $xmlField){
if (!isset($action->{$xmlField}[0])){
throw new \Exception('Error with transaction_id'.$transaction->transaction_id[0].'
Action number '. $actionNum . ' Action tag is missing field ' . $xmlField);
}
}
$actionNum++;
}
$transNum++;
}
return $testXmlSimple;
}
public function getRecurringInfoBySubscriptionId($inputData){
$this->responses['data'] = [];
try {
// $this->setLogin(config('app.NMI_SECURITY_KEY'));
$this->setLogin('BeErzh5W79nA2cfr5McWWtqXm65fwYFF');
// $this->login['security_key'] = config('app.NMI_SECURITY_KEY');
$this->pay_log_id = "LOG_".generateUniqueId();
$constraints = "&subscription_id={$inputData['subscription_id']}&condition=complete&start_date={$inputData['start_date']}&end_date={$inputData['end_date']}";
$result = $this->getRecurringBySubscriptionId($this->login['security_key'],$constraints);
$result_json = json_encode($result);
$result_json_array = json_decode($result_json,TRUE);
$this->responses['data'] = $result_json_array['transaction'];
$this->responses['status_code'] = config('constant.API_SUCCESS_CODE');
$this->responses['message'] = "Successfully get data.";
} catch (\Exception $e) {
$this->responses['message'] = $e->getMessage();
$this->responses['status_code'] = config('constant.API_FAILED_CODE');
}
$this->logData['NMI_PAYMENT_API_LOG'][$this->pay_log_id]["SUBSCRIPTION_UPDATE_FOR_RECURRING"]= $this->prepareLogData($this->base_url,'POST',$inputData);
appLog( $this->logData);
return $this->responses;
}
private function responseDataSample()
{
$data = '{"response": "2","responsetext": "Issuer Declined MCC","authcode": " ","transactionid": "8105207298",
"avsresponse": "Y","cvvresponse": "","orderid": "167760085077649","type": "sale","response_code": "204"
}';
$this->responses = json_decode($data,true);
}
public function deleteRecurringPayment($inputData)
{
$result = [];
$result['status'] = false;
$this->setLogin(config('app.NMI_SECURITY_KEY'));
$this->prepareDeleteRecurringData($inputData);
$this->doRecurring();
$result['status_code'] = config('constant.API_FAILED_CODE');
$result['transaction_status'] = $this->responses['response'] ?? 0;
$result['transaction_id'] = $this->responses['transactionid'] ?? "";
$result['subscription_id'] = $this->responses['subscription_id'] ?? "";
$result['message'] = $this->responses['responsetext'] ?? "";
if(isset($this->responses['response_code']) && $this->responses['response_code'] == config('constant.API_SUCCESS_CODE'))
{
$result['status_code'] = config('constant.API_SUCCESS_CODE');
$result['status'] = true;
}
$this->logData['NMI_RECURRING_API_LOG'][$this->pay_log_id]["DELETE_MAKE_RECURRING"]= $this->prepareLogData($this->base_url,'POST',$inputData);
appLog( $this->logData);
return $result;
}
private function prepareDeleteRecurringData($prepareData)
{
$this->recurringData['recurring'] = 'delete_subscription';
$this->recurringData['subscription_id'] = $prepareData['subscription_id'];
}
}