'PayPal', 'cc' => 'CreditCard', 'sb#GPY' => 'giropay', 'sb#PNT' => 'Sofort', 'wlt#PDT' => 'paydirekt', 'fnc' => 'Rechnungskauf', 'pref' => 'Vorauskasse', ];*/ namespace App\Http\Controllers\Pay; use App\Http\Controllers\Controller; use App\Models\PaymentTransaction; use App\Models\ShoppingPayment; use App\Services\CheckoutFunnelTracker; use App\Services\MyLog; use App\Services\Payone; use Util; class PayoneController extends Controller { const PREAUTHORIZATION = 'preauthorization'; const AUTHORIZATION = 'authorization'; const CAPTURE = 'capture'; const REFUND = 'refund'; const DEBIT = 'debit'; private $default = []; private $personalData = []; private $aboInitPayment = []; private $method = []; private $prepayment = []; /* private $onlineTransfer = []; private $creditCard = []; */ private $deliveryData = []; // private $payment_method; private $urls = []; private $shopping_user; private $shopping_order; private $shopping_payment; private $reference; public function __construct() { $this->default = \Config::get('payone.defaults'); } public function init($shopping_user, $shopping_order) { $this->shopping_user = $shopping_user; $this->shopping_order = $shopping_order; $this->default['mode'] = $this->shopping_order->mode; } public function getShoppingPayment() { return $this->shopping_payment; } public function setAboPayment($user_abo, $amount, $currency) { $this->reference = substr(uniqid('m', false), 0, 16); $amount = intval($amount); $this->method = [ 'clearingtype' => $user_abo->clearingtype, 'wallettype' => $user_abo->wallettype, 'pseudocardpan' => isset($user_abo->carddata['pseudocardpan']) ? $user_abo->carddata['pseudocardpan'] : '', 'cardexpiredate' => isset($user_abo->carddata['cardexpiredate']) ? $user_abo->carddata['cardexpiredate'] : '', 'userid' => $user_abo->payone_userid, 'onlinebanktransfertype' => '', 'request' => 'authorization', ]; $this->aboInitPayment = [ 'recurrence' => 'recurring', 'customer_is_present' => 'no', 'request' => 'authorization', 'amount' => $amount, ]; $this->prepayment = [ 'reference' => $this->reference, // a unique reference, e.g. order number 'amount' => $amount, // amount in smallest currency unit, i.e. cents 'currency' => $currency, 'param' => $this->shopping_order->id, ]; $this->shopping_payment = ShoppingPayment::create([ 'shopping_order_id' => $this->shopping_order->id, 'clearingtype' => $this->method['clearingtype'], 'wallettype' => $this->method['wallettype'], 'onlinebanktransfertype' => $this->method['onlinebanktransfertype'], 'carddata' => $user_abo->carddata, 'reference' => $this->reference, 'amount' => $amount, 'currency' => $currency, 'is_abo' => $this->shopping_order->is_abo, 'abo_interval' => 0, 'mode' => $this->shopping_order->mode, ]); } // make Payone payment public function setPrePayment($payment_method, $amount, $currency, $ret = []) { $amount = intval($amount); $this->reference = substr(uniqid('m', false), 0, 16); $this->setMethod($payment_method, $ret); $this->urls = [ 'successurl' => route('checkout.transaction_status', ['success', $this->reference]), 'errorurl' => route('checkout.transaction_status', ['error', $this->reference]), 'backurl' => route('checkout.transaction_status', ['cancel', $this->reference]), ]; $this->prepayment = [ 'reference' => $this->reference, // a unique reference, e.g. order number 'amount' => $amount, // amount in smallest currency unit, i.e. cents 'currency' => $currency, 'param' => $this->shopping_order->id, ]; // init Abo if ($this->shopping_order->is_abo) { if ($this->method['clearingtype'] === 'cc') { $this->aboInitPayment = [ 'recurrence' => 'recurring', 'customer_is_present' => 'yes', 'request' => 'authorization', 'amount' => $amount, ]; $this->method['request'] = 'authorization'; } if ($this->method['clearingtype'] === 'wlt') { // payment for Abo PayPal $this->aboInitPayment = [ 'recurrence' => 'recurring', 'customer_is_present' => 'yes', 'request' => 'authorization', 'amount' => $amount, 'add_paydata[redirection_mode]' => 'DIRECT_TO_MERCHANT', ]; $this->setDeliverylData($this->shopping_user); $this->method['request'] = 'authorization'; } } $this->shopping_payment = ShoppingPayment::create([ 'shopping_order_id' => $this->shopping_order->id, 'clearingtype' => $this->method['clearingtype'], 'wallettype' => $this->method['wallettype'], 'onlinebanktransfertype' => $this->method['onlinebanktransfertype'], 'carddata' => isset($ret['cc']) ? $ret['cc'] : null, 'reference' => $this->reference, 'amount' => $amount, 'currency' => $currency, 'is_abo' => $this->shopping_order->is_abo, 'abo_interval' => $this->shopping_order->abo_interval, 'identifier' => Util::getUserShopIdentifier(), 'mode' => $this->shopping_order->mode, ]); CheckoutFunnelTracker::initiatedPayment( shoppingUserId: $this->shopping_user->id, shoppingOrderId: $this->shopping_order->id, shoppingPaymentId: $this->shopping_payment->id, consultantUserId: $this->shopping_user->auth_user_id ?? null, paymentMethod: $payment_method, amountCents: $amount, ); $this->default['mode'] = $this->shopping_order->mode; return $this->reference; } public function setPersonalData() { $this->personalData = [ 'firstname' => $this->shopping_user->billing_firstname, 'lastname' => $this->shopping_user->billing_lastname, // mandatory 'street' => $this->shopping_user->billing_address, 'zip' => $this->shopping_user->billing_zipcode, 'city' => $this->shopping_user->billing_city, 'country' => ($this->shopping_user->billing_country) ? $this->shopping_user->billing_country->code : 'DE', // mandatory 'email' => $this->shopping_user->billing_email, // "language" => ($this->shopping_user->billing_country) ? strtoupper($this->shopping_user->billing_country->code) : "DE", // mandatory 'language' => 'DE', ]; /** * Paydirekt requires both, personal data and shipping data */ /* $this->deliveryData = array( "shipping_firstname" => "Paul", "shipping_lastname" => "Neverpayer", "shipping_street" => "Hamburger Allee 26-28", "shipping_zip" => "60486", "shipping_city" => "Frankfurt am Main", "shipping_country" => "DE" );*/ } private function setMethod($payment_method, $ret = []) { if ($payment_method) { if (strpos($payment_method, '#')) { $payment_method = explode('#', $payment_method); // wallet Paypal if ($payment_method[0] === 'wlt') { $this->method = [ 'clearingtype' => 'wlt', 'wallettype' => $payment_method[1], 'onlinebanktransfertype' => '', 'request' => 'authorization', ]; } // Online-Überweisung if ($payment_method[0] === 'sb') { $this->method = [ 'clearingtype' => 'sb', 'wallettype' => '', 'onlinebanktransfertype' => $payment_method[1], // this is the type for Sofort.com 'bankcountry' => 'DE', // we need to know the country of the customer's bank, i.e. of the invoice address 'request' => 'authorization', ]; } // Rechnungskauf if ($payment_method[0] === 'fnc') { // MIVITA if (isset($payment_method[1]) && $payment_method[1] === 'MIV') { $this->method = [ 'clearingtype' => 'fnc', 'wallettype' => '', 'onlinebanktransfertype' => 'MIV', 'request' => 'authorization', ]; } // PAYONE /* $this->method = [ "clearingtype" => "fnc", "wallettype" => "", 'onlinebanktransfertype' => "", "financingtype" => "PYV", "request" => "genericpayment", "add_paydata[action]" => "pre_check", "add_paydata[payment_type]" => "Payolution-Invoicing", ];*/ } } // vorkasse if ($payment_method === 'elv') { $this->method = [ 'clearingtype' => 'elv', 'wallettype' => '', 'onlinebanktransfertype' => '', 'request' => 'authorization', 'mandate_identification' => $ret['elv']['mandate_identification'], 'iban' => $ret['elv']['iban'], 'bic' => $ret['elv']['bic'], 'bankaccountholder' => $ret['elv']['bankaccountholder'], // "bankcountry" => "DE", ]; } // vorkasse if ($payment_method === 'vor') { $this->method = [ 'clearingtype' => 'vor', 'wallettype' => '', 'onlinebanktransfertype' => '', 'request' => 'authorization', ]; } // CreditCard if ($payment_method === 'cc') { // need the $cc_ret $this->method = [ 'clearingtype' => 'cc', 'wallettype' => '', 'onlinebanktransfertype' => '', 'request' => 'authorization', 'pseudocardpan' => $ret['cc']['pseudocardpan'], // "xid" => "3-D Secure transaction ID" ]; } } } public function onlyPaymentResponse() { $request = array_merge($this->default, $this->personalData, $this->deliveryData, $this->method, $this->prepayment, $this->aboInitPayment, $this->urls); $response = Payone::sendRequest($request); return $response; } public function ResponseData($is_abo = false) { $request = array_merge($this->default, $this->personalData, $this->deliveryData, $this->method, $this->prepayment, $this->aboInitPayment, $this->urls); if ($this->shopping_payment->clearingtype === 'fnc' && $this->shopping_payment->onlinebanktransfertype === 'MIV') { $payt = PaymentTransaction::create([ 'shopping_payment_id' => $this->shopping_payment->id, 'request' => $this->method['request'], 'txid' => 0, 'userid' => 0, 'status' => 'FNCMIV', 'transmitted_data' => $request, 'txaction' => 'invoice_open', 'mode' => $this->shopping_payment->mode, ]); Util::setUserHistoryValue(['status' => 5]); if ($is_abo) { return $this->reference; } return redirect(route('checkout.transaction_approved', [$payt->id, $this->reference])); exit; } $response = Payone::sendRequest($request); /* * status APPROVED / REDIRECT / ERROR / PENDING */ if ($response['status'] === 'ERROR') { MyLog::writeLog( 'payone', 'error', 'PayPal Preauthorization Fehler: '.$response['errormessage'], $response ); PaymentTransaction::create([ 'shopping_payment_id' => $this->shopping_payment->id, 'request' => $this->method['request'], 'errorcode' => $response['errorcode'], 'errormessage' => $response['errormessage'], 'customermessage' => $response['customermessage'], 'transmitted_data' => $request, 'status' => $response['status'], 'mode' => $this->shopping_payment->mode, ]); Util::setUserHistoryValue(['status' => 3]); if ($is_abo) { return $response; } \Session::flash('errormessage', $response['errormessage']); \Session::flash('customermessage', $response['customermessage']); return redirect(route('checkout.checkout_card')); } if ($response['status'] === 'REDIRECT') { PaymentTransaction::create([ 'shopping_payment_id' => $this->shopping_payment->id, 'request' => $this->method['request'], 'txid' => $response['txid'], 'userid' => $response['userid'], 'status' => $response['status'], 'mode' => $this->shopping_payment->mode, ]); Util::setUserHistoryValue(['status' => 4]); if ($is_abo) { return $response; } return redirect()->away($response['redirecturl']); exit; } if ($response['status'] === 'APPROVED') { // header("Location: " . $response["redirecturl"]); // or other redirect method $payt = PaymentTransaction::create([ 'shopping_payment_id' => $this->shopping_payment->id, 'request' => $this->method['request'], 'txid' => $response['txid'], 'userid' => $response['userid'], 'status' => $response['status'], 'transmitted_data' => $response, 'mode' => $this->shopping_payment->mode, ]); Util::setUserHistoryValue(['status' => 5]); if ($is_abo) { return $response; } if ($payt->shopping_payment->clearingtype === 'vor') { // vorkasse return redirect(route('checkout.transaction_approved', [$payt->id, $this->reference])); exit; } if ($payt->shopping_payment->clearingtype === 'cc') { // creditcard return redirect(route('checkout.transaction_approved', [$payt->id, $this->reference])); exit; } if ($payt->shopping_payment->clearingtype === 'elv') { // sepa return redirect(route('checkout.transaction_approved', [$payt->id, $this->reference])); exit; } var_dump($response); exit(); // txid // Payment process ID (PAYONE) // userid // Debtor ID (PAYONE) } if ($response['status'] === 'PENDING') { MyLog::writeLog( 'payone', 'error', 'Error:1000 Status PENDING App\Http\Controllers\Pay\PayoneController::ResponseData response status PENDING', $response ); exit(); // txid // Payment process ID (PAYONE) // userid // Debtor ID (PAYONE) } MyLog::writeLog( 'payone', 'error', 'Error:1001 Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. App\Http\Controllers\Pay\PayoneController::ResponseData error no response status', $response ); abort(403, 'Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. Bitte versuchen Sie es später erneut. Fehlercode: 1001'); } public function checkCreditCard($data) { $this->prepayment = [ 'request' => 'creditcardcheck', // create account receivable and instantly book the amount 'cardholder' => $data['cc_cardholder_first'].' '.$data['cc_cardholder_last'], 'cardpan' => $data['cc_cardpan'], 'cardexpiredate' => substr($data['cc_cardexpireyear'], -2).$data['cc_cardexpiremonth'], 'cardtype' => $data['cc_cardtype'], 'cardcvc2' => $data['cc_cardcvc2'], 'storecarddata' => 'yes', 'language' => 'de', ]; $request = array_merge($this->default, $this->prepayment); return Payone::sendRequest($request); } public function checkBankAccount($data, $amount, $currency, $shopping_user) { $this->shopping_user = $shopping_user; $this->setPersonalData(); $this->prepayment = [ 'clearingtype' => 'elv', 'amount' => $amount, // amount in smallest currency unit, i.e. cents 'currency' => $currency, 'request' => 'managemandate', // create account receivable and instantly book the amount 'bankaccountholder' => $data['elv_bankaccountholder'], 'iban' => $data['elv_iban'], 'bic' => $data['elv_bic'], // "language" => 'de', ]; $request = array_merge($this->default, $this->personalData, $this->deliveryData, $this->method, $this->prepayment, $this->urls); return Payone::sendRequest($request); } public function setDeliverylData($shopping_user) { if ($shopping_user->same_as_billing == true) { $this->deliveryData = [ 'shipping_firstname' => $shopping_user->billing_firstname, 'shipping_lastname' => $shopping_user->billing_lastname, 'shipping_zip' => $shopping_user->billing_zipcode, 'shipping_city' => $shopping_user->billing_city, 'shipping_country' => $shopping_user->billing_country->code, 'shipping_street' => $shopping_user->billing_address, ]; } else { $this->deliveryData = [ 'shipping_firstname' => $shopping_user->shipping_firstname, 'shipping_lastname' => $shopping_user->shipping_lastname, 'shipping_zip' => $shopping_user->shipping_zipcode, 'shipping_city' => $shopping_user->shipping_city, 'shipping_country' => $shopping_user->shipping_country->code, 'shipping_street' => $shopping_user->shipping_address, ]; } } /* public function getPDFFile($mandateId) { $params['file_reference'] = $mandateId;//"XX-T0000000"; $params['file_type'] = 'SEPA_MANDATE'; $params['file_format'] = 'PDF'; $request = array_merge($this->default, $params); return Payone::sendRequest($request); } */ /* public function checkStatus(){ // again, the default values will be needed $capture = array( "request" => "capture", "txid" => "your_txid", "sequencenumber" => "previous_sequencenumber_plus_one", // get this from the last received transactionsstatus "amount" => "your_amount", // you can either capture the full amount of the tx, or less "currency" => "EUR" ); $request = array_merge($this->default, $capture); $response = Payone::sendRequest($request); } */ // set for clearingtype // debit payment /* * * * $params['bankaccountholder'] = $paymentData['mopt_payone__debit_bankaccountholder']; $params['iban'] = $this->removeWhitespaces($paymentData['mopt_payone__debit_iban']); $params['bic'] = $this->removeWhitespaces($paymentData['mopt_payone__debit_bic']); * $params['bankcountry'] = $paymentData['mopt_payone__debit_bankcountry']; $params['bankaccount'] = $this->removeWhitespaces($paymentData['mopt_payone__debit_bankaccount']); $params['bankcode'] = $this->removeWhitespaces($paymentData['mopt_payone__debit_bankcode']); if (Shopware()->Session()->moptMandateData) { $params['mandate_identification'] = Shopware()->Session()->moptMandateData['mopt_payone__mandateIdentification']; } * * ["clearing_bankaccount"]=> string(10) "2599100003" ["clearing_bankcode"]=> string(8) "12345678" ["clearing_bankcountry"]=> string(2) "DE" ["clearing_bankname"]=> string(8) "Testbank" ["clearing_bankaccountholder"]=> string(11) "Test Nutzer" ["clearing_bankcity"]=> string(4) "Kiel" ["clearing_bankiban"]=> string(22) "DE00123456782599100003" ["clearing_bankbic"]=> string(8) "TESTTEST" } */ /* * PNT Sofortbanking (DE, AT, CH, NL) GPY giropay (DE) EPS eps – online transfer (AT) PFF PostFinance E-Finance (CH) PFC PostFinance Card (CH) IDL iDEAL (NL) P24 Przelewy24 (PL) BCT Bancontact*/ /* * iban * bic * bankcountry*/ /* * Card type V Visa M MasterCard A American Express D Diners / Discover J JCB O Maestro International */ }