initial commit
This commit is contained in:
14
app/Services/Payment/GateWay.php
Normal file
14
app/Services/Payment/GateWay.php
Normal file
@@ -0,0 +1,14 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Payment;
|
||||
|
||||
use App\Services\Payment\Gateway\NmiPayment;
|
||||
|
||||
class GateWay
|
||||
{
|
||||
public static function getGateWayInstance($gateway_code){
|
||||
if($gateway_code == config('constant.PAYMENT_GATEWAY.NMI')){
|
||||
return new NmiPayment();
|
||||
}
|
||||
}
|
||||
}
|
||||
879
app/Services/Payment/Gateway/NmiPayment.php
Normal file
879
app/Services/Payment/Gateway/NmiPayment.php
Normal file
@@ -0,0 +1,879 @@
|
||||
<?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'];
|
||||
}
|
||||
|
||||
}
|
||||
36
app/Services/Payment/Payment.php
Normal file
36
app/Services/Payment/Payment.php
Normal file
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Payment;
|
||||
|
||||
class Payment
|
||||
{
|
||||
|
||||
private array $paymentData = [];
|
||||
private PaymentInterface $payment;
|
||||
|
||||
public function __construct(PaymentInterface $payment, $inputData)
|
||||
{
|
||||
$this->paymentData = $inputData;
|
||||
$this->payment = $payment;
|
||||
}
|
||||
|
||||
public function pay()
|
||||
{
|
||||
return $this->payment->makePayment($this->payment->prepareData($this->paymentData));
|
||||
}
|
||||
|
||||
public function makeRecurringPayment()
|
||||
{
|
||||
return $this->payment->makeRecurringPayment($this->paymentData);
|
||||
}
|
||||
|
||||
public function deleteSubscription()
|
||||
{
|
||||
return $this->payment->deleteRecurringPayment($this->paymentData);
|
||||
}
|
||||
public function getSubscriptionInfoBySubscriptionId()
|
||||
{
|
||||
return $this->payment->getRecurringInfoBySubscriptionId($this->paymentData);
|
||||
}
|
||||
|
||||
}
|
||||
12
app/Services/Payment/PaymentInterface.php
Normal file
12
app/Services/Payment/PaymentInterface.php
Normal file
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Payment;
|
||||
|
||||
interface PaymentInterface
|
||||
{
|
||||
|
||||
public function makePayment($data);
|
||||
|
||||
public function prepareData($data);
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user