diff --git a/app/Http/Controllers/ClientPortal/PaymentMethodController.php b/app/Http/Controllers/ClientPortal/PaymentMethodController.php index beccffe5c32f..b068605ee9e2 100644 --- a/app/Http/Controllers/ClientPortal/PaymentMethodController.php +++ b/app/Http/Controllers/ClientPortal/PaymentMethodController.php @@ -44,7 +44,7 @@ class PaymentMethodController extends Controller $gateway = auth()->user()->client->getCreditCardGateway(); $auth = new AuthorizePaymentDriver($gateway, auth()->user()->client); - + return $auth->authorizeView(); // $data = [ @@ -69,10 +69,14 @@ class PaymentMethodController extends Controller { $gateway = auth()->user()->client->getCreditCardGateway(); - return $gateway - ->driver(auth()->user()->client) - ->setPaymentMethod('App\\PaymentDrivers\\Stripe\\CreditCard') - ->authorizeCreditCardResponse($request); + $auth = new AuthorizePaymentDriver($gateway, auth()->user()->client); + + return $auth->authorizeResponseView($request->all()); + + // return $gateway + // ->driver(auth()->user()->client) + // ->setPaymentMethod('App\\PaymentDrivers\\Stripe\\CreditCard') + // ->authorizeCreditCardResponse($request); } /** diff --git a/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php b/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php new file mode 100644 index 000000000000..51e12d9edfba --- /dev/null +++ b/app/PaymentDrivers/Authorize/AuthorizeCreateCustomer.php @@ -0,0 +1,38 @@ +authorize = $authorize; + } + + public function create($data = null) + { + + } + +} \ No newline at end of file diff --git a/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php b/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php new file mode 100644 index 000000000000..d6b49eec792e --- /dev/null +++ b/app/PaymentDrivers/Authorize/AuthorizeCreditCard.php @@ -0,0 +1,109 @@ +authorize = $authorize; + } + + public function authorizeView($payment_method) + { + + switch ($payment_method) { + case GatewayType::CREDIT_CARD: + return $this->authorizeCreditCard(); + break; + case GatewayType::BANK_TRANSFER: + return $this->authorizeBankTransfer(); + break; + + default: + # code... + break; + } + + } + + public function authorizeResponseView($payment_method, $data) + { + + switch ($payment_method) { + case GatewayType::CREDIT_CARD: + return $this->authorizeCreditCardResponse($data); + break; + case GatewayType::BANK_TRANSFER: + return $this->authorizeBankTransferResponse($data); + break; + + default: + # code... + break; + } + + } + + public function authorizeCreditCard() + { + $data['gateway'] = $this->authorize->company_gateway; + $data['public_client_id'] = $this->authorize->init()->getPublicClientKey(); + $data['api_login_id'] = $this->authorize->company_gateway->getConfigField('apiLoginId'); + + return render('gateways.authorize.add_credit_card', $data); + } + + public function authorizeBankTransfer() + { + + } + + public function authorizeCreditCardResponse($data) + { + + if($client_gateway_token_record = $this->authorize->findClientGatewayRecord()) + $this->addCreditCardToClient($client_gateway_token_record, $data); + else{ + $client_gateway_token_record = (new AuthorizeCreateCustomer($this->authorize))->create($data); + $this->addCreditCardToClient($client_gateway_token_record, $data); + } + + return redirect()->route('client.payment_methods.index'); + + } + + public function authorizeBankTransferResponse($data) + { + + } + + private function addCreditCardToClient(ClientGatewayToken $client_gateway_token, $data) + { + //add a payment profile to the client profile + + //we only use the $client_gateway_token record as a reference to create a NEW client_gateway_token for this gateway + } + +} diff --git a/app/PaymentDrivers/AuthorizePaymentDriver.php b/app/PaymentDrivers/AuthorizePaymentDriver.php index 65ea829c2e32..4e44b3fb62e0 100644 --- a/app/PaymentDrivers/AuthorizePaymentDriver.php +++ b/app/PaymentDrivers/AuthorizePaymentDriver.php @@ -12,6 +12,8 @@ namespace App\PaymentDrivers; +use App\Models\ClientGatewayToken; +use App\PaymentDrivers\Authorize\AuthorizeCreditCard; use net\authorize\api\constants\ANetEnvironment; use net\authorize\api\contract\v1\CreateTransactionRequest; use net\authorize\api\contract\v1\GetMerchantDetailsRequest; @@ -63,13 +65,29 @@ class AuthorizePaymentDriver extends BaseDriver } - public function authorizeView() + public function authorizeView($payment_method) { - $data['gateway'] = $this->company_gateway; - $data['public_client_id'] = $this->init()->getPublicClientKey(); - $data['api_login_id'] = $this->company_gateway->getConfigField('apiLoginId'); + return (new AuthorizePaymentMethod($this))->authorizeView($payment_method); + } + + public function authorizeResponse($payment_method, array $data) + { + + // + // + // + + + // $client_gateway_token = new ClientGatewayToken(); + // $client_gateway_token->company_id = $this->stripe->client->company->id; + // $client_gateway_token->client_id = $this->stripe->client->id; + // $client_gateway_token->token = $payment_method; + // $client_gateway_token->company_gateway_id = $this->stripe->company_gateway->id; + // $client_gateway_token->gateway_type_id = $gateway_type_id; + // $client_gateway_token->gateway_customer_reference = $customer->id; + // $client_gateway_token->meta = $payment_meta; + // $client_gateway_token->save(); - return render('gateways.authorize.add_credit_card', $data); } // public function fire() @@ -82,11 +100,25 @@ class AuthorizePaymentDriver extends BaseDriver // } - public function authorize() {} - - public function purchase() {} - - public function refund() {} + public function authorize($payment_method) + { + } + public function purchase() + { + + } + + public function refund() + { + + } + + private function findClientGatewayRecord() :?ClientGatewayToken + { + return ClientGatewayToken::where('client_id', $this->client->id) + ->where('company_gateway_id', $this->company_gateway->id) + ->first(); + } } diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index f6891d8da1d3..15eef40c7493 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -32,9 +32,6 @@ class BaseDriver extends AbstractPaymentDriver /* The company gateway instance*/ public $company_gateway; - /* The Gateway Driver instance*/ - protected $gateway; - /* The Invitation */ protected $invitation; diff --git a/tests/Integration/PaymentDrivers/AuthorizeTest.php b/tests/Integration/PaymentDrivers/AuthorizeTest.php index 95888c28904c..71a3d6dbba0f 100644 --- a/tests/Integration/PaymentDrivers/AuthorizeTest.php +++ b/tests/Integration/PaymentDrivers/AuthorizeTest.php @@ -5,10 +5,25 @@ namespace Tests\Integration\PaymentDrivers; use Tests\TestCase; use net\authorize\api\constants\ANetEnvironment; use net\authorize\api\contract\v1 as AnetAPI; +use net\authorize\api\contract\v1\CreateCustomerPaymentProfileRequest; use net\authorize\api\contract\v1\CreateTransactionRequest; +use net\authorize\api\contract\v1\CreditCardType; +use net\authorize\api\contract\v1\CustomerAddressType; +use net\authorize\api\contract\v1\CustomerPaymentProfileType; +use net\authorize\api\contract\v1\CustomerProfilePaymentType; +use net\authorize\api\contract\v1\CustomerProfileType; +use net\authorize\api\contract\v1\GetCustomerProfileIdsRequest; +use net\authorize\api\contract\v1\GetCustomerProfileRequest; use net\authorize\api\contract\v1\GetMerchantDetailsRequest; use net\authorize\api\contract\v1\MerchantAuthenticationType; +use net\authorize\api\contract\v1\PaymentProfileType; +use net\authorize\api\contract\v1\PaymentType; +use net\authorize\api\contract\v1\TransactionRequestType; +use net\authorize\api\controller\CreateCustomerPaymentProfileController; +use net\authorize\api\controller\CreateCustomerProfileController; use net\authorize\api\controller\CreateTransactionController; +use net\authorize\api\controller\GetCustomerProfileController; +use net\authorize\api\controller\GetCustomerProfileIdsController; use net\authorize\api\controller\GetMerchantDetailsController; /** @@ -17,6 +32,10 @@ use net\authorize\api\controller\GetMerchantDetailsController; class AuthorizeTest extends TestCase { + public $customer_profile_id = 1512191314; + + public $customer_payment_profile = 1512219932; + public function setUp() :void { parent::setUp(); @@ -54,4 +73,305 @@ class AuthorizeTest extends TestCase $this->assertNotNull($response->getPublicClientKey()); } + public function testProfileIdList() + { + + error_reporting (E_ALL & ~E_DEPRECATED); + + $vars = json_decode(config('ninja.testvars.authorize')); + + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($vars->apiLoginId); + $merchantAuthentication->setTransactionKey($vars->transactionKey); + + // Set the transaction's refId + $refId = 'ref' . time(); + + // Get all existing customer profile ID's + $request = new GetCustomerProfileIdsRequest(); + $request->setMerchantAuthentication($merchantAuthentication); + $controller = new GetCustomerProfileIdsController($request); + $response = $controller->executeWithApiResponse( \net\authorize\api\constants\ANetEnvironment::SANDBOX); + if (($response != null) && ($response->getMessages()->getResultCode() == "Ok") ) + { + info("GetCustomerProfileId's SUCCESS: " . "\n"); + info(print_r($response->getIds(),1)); + } + else + { + info("GetCustomerProfileId's ERROR : Invalid response\n"); + $errorMessages = $response->getMessages()->getMessage(); + info("Response : " . $errorMessages[0]->getCode() . " " .$errorMessages[0]->getText() . "\n"); + } + + $this->assertNotNull($response); + + } + + public function testCreateProfile() + { + + error_reporting (E_ALL & ~E_DEPRECATED); + + $vars = json_decode(config('ninja.testvars.authorize')); + + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($vars->apiLoginId); + $merchantAuthentication->setTransactionKey($vars->transactionKey); + + // Create the Bill To info for new payment type + $billTo = new CustomerAddressType(); + $billTo->setFirstName("Ellen"); + $billTo->setLastName("Johnson"); + $billTo->setCompany("Souveniropolis"); + $billTo->setAddress("14 Main Street"); + $billTo->setCity("Pecan Springs"); + $billTo->setState("TX"); + $billTo->setZip("44628"); + $billTo->setCountry("USA"); + $billTo->setPhoneNumber("888-888-8888"); + $billTo->setfaxNumber("999-999-9999"); + + // Create a customer shipping address + $customerShippingAddress = new CustomerAddressType(); + $customerShippingAddress->setFirstName("James"); + $customerShippingAddress->setLastName("White"); + $customerShippingAddress->setCompany("Addresses R Us"); + $customerShippingAddress->setAddress(rand() . " North Spring Street"); + $customerShippingAddress->setCity("Toms River"); + $customerShippingAddress->setState("NJ"); + $customerShippingAddress->setZip("08753"); + $customerShippingAddress->setCountry("USA"); + $customerShippingAddress->setPhoneNumber("888-888-8888"); + $customerShippingAddress->setFaxNumber("999-999-9999"); + + // Create an array of any shipping addresses + $shippingProfiles[] = $customerShippingAddress; + $refId = 'ref' . time(); + $email = "test@gmail.com"; + + // // Create a new CustomerPaymentProfile object + // $paymentProfile = new AnetAPI\CustomerPaymentProfileType(); + // $paymentProfile->setCustomerType('individual'); + // $paymentProfile->setBillTo($billTo); + // $paymentProfile->setPayment($paymentCreditCard); + // $paymentProfiles[] = $paymentProfile; + + + // Create a new CustomerProfileType and add the payment profile object + $customerProfile = new CustomerProfileType(); + $customerProfile->setDescription("Customer 2 Test PHP"); + $customerProfile->setMerchantCustomerId("M_" . time()); + $customerProfile->setEmail($email); + //$customerProfile->setpaymentProfiles($paymentProfiles); + $customerProfile->setShipToList($shippingProfiles); + + + // Assemble the complete transaction request + $request = new AnetAPI\CreateCustomerProfileRequest(); + $request->setMerchantAuthentication($merchantAuthentication); + $request->setRefId($refId); + $request->setProfile($customerProfile); + + // Create the controller and get the response + $controller = new CreateCustomerProfileController($request); + $response = $controller->executeWithApiResponse(\net\authorize\api\constants\ANetEnvironment::SANDBOX); + + if (($response != null) && ($response->getMessages()->getResultCode() == "Ok")) { + info("Succesfully created customer profile : " . $response->getCustomerProfileId() . "\n"); + $paymentProfiles = $response->getCustomerPaymentProfileIdList(); + info(print_r($paymentProfiles,1)); + + + } else { + info("ERROR : Invalid response\n"); + $errorMessages = $response->getMessages()->getMessage(); + info("Response : " . $errorMessages[0]->getCode() . " " .$errorMessages[0]->getText() . "\n"); + } + + $this->assertNotNull($response); + + } + + public function testGetCustomerProfileId() + { + + error_reporting (E_ALL & ~E_DEPRECATED); + + $vars = json_decode(config('ninja.testvars.authorize')); + + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($vars->apiLoginId); + $merchantAuthentication->setTransactionKey($vars->transactionKey); + + $request = new GetCustomerProfileRequest(); + $request->setMerchantAuthentication($merchantAuthentication); + $request->setCustomerProfileId($this->customer_profile_id); + $controller = new GetCustomerProfileController($request); + $response = $controller->executeWithApiResponse( \net\authorize\api\constants\ANetEnvironment::SANDBOX); + + if (($response != null) && ($response->getMessages()->getResultCode() == "Ok")) { + + info("got profile"); + info(print_r($response->getProfile(),1)); + + + } else { + info("ERROR : Invalid response\n"); + } + + $this->assertNotNull($response); + } + + + public function testCreateCustomerPaymentProfile() + { + info("test create customer payment profile"); + + error_reporting (E_ALL & ~E_DEPRECATED); + + $vars = json_decode(config('ninja.testvars.authorize')); + + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($vars->apiLoginId); + $merchantAuthentication->setTransactionKey($vars->transactionKey); + + // Set the transaction's refId + $refId = 'ref' . time(); + + // Set credit card information for payment profile + $creditCard = new CreditCardType(); + $creditCard->setCardNumber("4007000000027"); + $creditCard->setExpirationDate("2038-12"); + $creditCard->setCardCode("142"); + $paymentCreditCard = new PaymentType(); + $paymentCreditCard->setCreditCard($creditCard); + + // Create the Bill To info for new payment type + $billto = new CustomerAddressType(); + $billto->setFirstName("Ellen"); + $billto->setLastName("Johnson"); + $billto->setCompany("Souveniropolis"); + $billto->setAddress("14 Main Street"); + $billto->setCity("Pecan Springs"); + $billto->setState("TX"); + $billto->setZip("44628"); + $billto->setCountry("USA"); + $billto->setPhoneNumber("999-999-9999"); + $billto->setfaxNumber("999-999-9999"); + + // Create a new Customer Payment Profile object + $paymentprofile = new CustomerPaymentProfileType(); + $paymentprofile->setCustomerType('individual'); + $paymentprofile->setBillTo($billto); + $paymentprofile->setPayment($paymentCreditCard); + $paymentprofile->setDefaultPaymentProfile(true); + + $paymentprofiles[] = $paymentprofile; + + // Assemble the complete transaction request + $paymentprofilerequest = new CreateCustomerPaymentProfileRequest(); + $paymentprofilerequest->setMerchantAuthentication($merchantAuthentication); + + // Add an existing profile id to the request + $paymentprofilerequest->setCustomerProfileId($this->customer_profile_id); + $paymentprofilerequest->setPaymentProfile($paymentprofile); + $paymentprofilerequest->setValidationMode("liveMode"); + + // Create the controller and get the response + $controller = new CreateCustomerPaymentProfileController($paymentprofilerequest); + $response = $controller->executeWithApiResponse(\net\authorize\api\constants\ANetEnvironment::SANDBOX); + + if (($response != null) && ($response->getMessages()->getResultCode() == "Ok") ) { + info("Create Customer Payment Profile SUCCESS: " . $response->getCustomerPaymentProfileId() . "\n"); + } else { + info("Create Customer Payment Profile: ERROR Invalid response\n"); + $errorMessages = $response->getMessages()->getMessage(); + info("Response : " . $errorMessages[0]->getCode() . " " .$errorMessages[0]->getText() . "\n"); + + } + + $this->assertNotNull($response); + } + + function testChargeCustomerProfile() + { + error_reporting (E_ALL & ~E_DEPRECATED); + + $vars = json_decode(config('ninja.testvars.authorize')); + + $merchantAuthentication = new AnetAPI\MerchantAuthenticationType(); + $merchantAuthentication->setName($vars->apiLoginId); + $merchantAuthentication->setTransactionKey($vars->transactionKey); + + // Set the transaction's refId + $refId = 'ref' . time(); + + $profileToCharge = new CustomerProfilePaymentType(); + $profileToCharge->setCustomerProfileId($this->customer_profile_id); + $paymentProfile = new PaymentProfileType(); + $paymentProfile->setPaymentProfileId($this->customer_payment_profile); + $profileToCharge->setPaymentProfile($paymentProfile); + + $transactionRequestType = new TransactionRequestType(); + $transactionRequestType->setTransactionType( "authCaptureTransaction"); + $transactionRequestType->setAmount(400); + $transactionRequestType->setProfile($profileToCharge); + + $request = new CreateTransactionRequest(); + $request->setMerchantAuthentication($merchantAuthentication); + $request->setRefId( $refId); + $request->setTransactionRequest( $transactionRequestType); + $controller = new CreateTransactionController($request); + $response = $controller->executeWithApiResponse( \net\authorize\api\constants\ANetEnvironment::SANDBOX); + + if ($response != null) + { + if($response->getMessages()->getResultCode() == "Ok") + { + $tresponse = $response->getTransactionResponse(); + + if ($tresponse != null && $tresponse->getMessages() != null) + { + info( " Transaction Response code : " . $tresponse->getResponseCode() . "\n"); + info( "Charge Customer Profile APPROVED :" . "\n"); + info( " Charge Customer Profile AUTH CODE : " . $tresponse->getAuthCode() . "\n"); + info( " Charge Customer Profile TRANS ID : " . $tresponse->getTransId() . "\n"); + info( " Code : " . $tresponse->getMessages()[0]->getCode() . "\n"); + info( " Description : " . $tresponse->getMessages()[0]->getDescription() . "\n"); + } + else + { + info( "Transaction Failed \n"); + if($tresponse->getErrors() != null) + { + info( " Error code : " . $tresponse->getErrors()[0]->getErrorCode() . "\n"); + info( " Error message : " . $tresponse->getErrors()[0]->getErrorText() . "\n"); + } + } + } + else + { + info( "Transaction Failed \n"); + $tresponse = $response->getTransactionResponse(); + if($tresponse != null && $tresponse->getErrors() != null) + { + info( " Error code : " . $tresponse->getErrors()[0]->getErrorCode() . "\n"); + info( " Error message : " . $tresponse->getErrors()[0]->getErrorText() . "\n"); + } + else + { + info( " Error code : " . $response->getMessages()->getMessage()[0]->getCode() . "\n"); + info( " Error message : " . $response->getMessages()->getMessage()[0]->getText() . "\n"); + } + } + } + else + { + info( "No response returned \n"); + } + + $this->assertNotNull($response); + } + }