. * * @link https://www.bspayone.com/ * * @copyright (C) BS PAYONE GmbH 2016, 2018 * @author Florian Bender * @author Timo Kuchel * @author Hannes Reinberger */ namespace App\Services; // require 'vendor/autoload.php'; use Exception; use GuzzleHttp\Client; use GuzzleHttp\Exception\BadResponseException; use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Exception\RequestException; use Psr\Http\Message\ResponseInterface; /** * Class Payone */ class Payone { /** * The URL of the Payone API */ const PAYONE_SERVER_API_URL = 'https://api.pay1.de/post-gateway/'; const PAYONE_CLIENT_API_URL = 'https://secure.pay1.de/client-api/'; /** * performing the HTTP POST request to the PAYONE platform * * @param array $request * @param string $responsetype * @param Client|null $client Optional Guzzle client (e.g. mocked in tests). * @return array|\Psr\Http\Message\StreamInterface Returns an array of response * parameters in "classic" mode, a Stream for any other mode. * * @throws Exception */ public static function sendRequest($request, $responsetype = '', ?Client $client = null) { if ($client === null) { if ($responsetype === 'json') { // appends the accept: application/json header to the request // This is used to retrieve structured JSON in the response // $client = new Client(['headers' => ['accept' => 'application/json', 'content-type' => 'text/plain;charset=UTF-8']]); $client = new Client(['headers' => ['accept' => 'application/json']]); } else { // if $responsetype is set to anything else than "json", use the standard request // $client = new Client(['headers' => ['content-type' => 'text/plain;charset=UTF-8']]); $client = new Client; } } // echo "Requesting..."; $begin = microtime(true); $userMessage = 'Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. Bitte versuchen Sie es später erneut. Fehlercode: 1002'; try { $response = $client->request('POST', self::PAYONE_SERVER_API_URL, ['form_params' => $request]); } catch (BadResponseException $e) { $error = $e->getResponse(); $responseBodyAsString = $error->getBody()->getContents(); MyLog::writeLog( 'payone', 'error', 'Error:1002 Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. App\Services\Payone::sendRequest HTTP-Fehlerantwort (4xx/5xx).', ['error' => $error, 'responseBodyAsString' => $responseBodyAsString, 'request' => $request] ); abort(403, $userMessage); } catch (ConnectException $e) { MyLog::writeLog( 'payone', 'error', 'Error:1002 Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. App\Services\Payone::sendRequest Netzwerk-/Transportfehler (keine HTTP-Antwort).', [ 'exception' => $e->getMessage(), 'request' => $request, ] ); abort(403, $userMessage); } catch (RequestException $e) { if ($e->hasResponse()) { $error = $e->getResponse(); $responseBodyAsString = $error !== null ? $error->getBody()->getContents() : ''; MyLog::writeLog( 'payone', 'error', 'Error:1002 Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. App\Services\Payone::sendRequest HTTP-Fehlerantwort.', ['error' => $error, 'responseBodyAsString' => $responseBodyAsString, 'request' => $request] ); } else { MyLog::writeLog( 'payone', 'error', 'Error:1002 Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. App\Services\Payone::sendRequest Transportfehler (RequestException ohne Antwort).', [ 'exception' => $e->getMessage(), 'request' => $request, ] ); } abort(403, $userMessage); } if (isset($response)) { if (implode($response->getHeader('Content-Type')) == 'text/plain;charset=UTF-8') { // if the content type is text/plain, parse response into array $return = self::parseResponse($response); // \Log::channel('payone')->error('App\Services\Payone::sendRequest content type is text/plain: '.$response); } else { // if the content type is anything else, just return the response body $return = json_decode($response->getBody(), true); MyLog::writeLog( 'payone', 'error', 'Error: App\Services\Payone::sendRequest content type is anything else', ['error' => $return, 'response' => $response, 'request' => $request] ); } } else { MyLog::writeLog( 'payone', 'error', 'Error: App\Services\Payone::sendRequest Something went wrong during the HTTP request', ['request' => $request] ); throw new Exception('Something went wrong during the HTTP request.'); } $end = microtime(true); $duration = $end - $begin; if (! is_array($return)) { MyLog::writeLog( 'payone', 'error', 'Error: 1003 App\Http\Controllers\Pay\PayoneController::ResponseData response is non array: return:', ['return' => $return, 'response' => $response, 'request' => $request] ); abort(403, 'Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. Bitte versuchen Sie es später erneut. Fehlercode: 1003'); } if (! isset($return['status'])) { MyLog::writeLog( 'payone', 'error', 'Error: 1004 App\Http\Controllers\Pay\PayoneController::ResponseData response has non status', ['return' => $return, 'response' => $response, 'request' => $request] ); abort(403, 'Der Zahlungsanbieter ist nicht erreichbar, die Zahlung konnte nicht durchgeführt werden. Bitte versuchen Sie es später erneut. Fehlercode: 1004'); } /* echo "done.\n"; echo "Request took " . $duration . " seconds.\n"; echo "
"; */ return $return; } /** * gets response string an puts it into an array * * @return array * * @throws Exception */ public static function parseResponse(ResponseInterface $response) { $responseArray = []; $explode = explode("\n", $response->getBody()); foreach ($explode as $e) { $keyValue = explode('=', $e); if (trim($keyValue[0]) != '') { if (count($keyValue) == 2) { $responseArray[$keyValue[0]] = trim($keyValue[1]); } else { $key = $keyValue[0]; unset($keyValue[0]); $value = implode('=', $keyValue); $responseArray[$key] = $value; } } } /*if ($responseArray['status'] == "ERROR") { $msg = "Payone returned an error:\n" . print_r($responseArray, true); throw new Exception($msg); }*/ return $responseArray; } }