Failed Conditions
Push — master ( 779447...c9d3cc )
by Reüel
08:52 queued 11s
created

Client::get_error()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 1
dl 0
loc 2
ccs 0
cts 2
cp 0
rs 10
c 0
b 0
f 0
cc 1
nc 1
nop 0
crap 2
1
<?php
2
/**
3
 * Client
4
 *
5
 * @author    Pronamic <[email protected]>
6
 * @copyright 2005-2019 Pronamic
7
 * @license   GPL-3.0-or-later
8
 * @package   Pronamic\WordPress\Pay\Payments
9
 */
10
11
namespace Pronamic\WordPress\Pay\Gateways\Sisow;
12
13
use Pronamic\WordPress\Pay\Core\Util as Core_Util;
14
use Pronamic\WordPress\Pay\Gateways\Sisow\XML\ErrorParser;
15
use Pronamic\WordPress\Pay\Gateways\Sisow\XML\InvoiceParser;
16
use Pronamic\WordPress\Pay\Gateways\Sisow\XML\MerchantParser;
17
use Pronamic\WordPress\Pay\Gateways\Sisow\XML\ReservationParser;
18
use Pronamic\WordPress\Pay\Gateways\Sisow\XML\TransactionParser;
19
use SimpleXMLElement;
20
21
/**
22
 * Title: Sisow
23
 * Description:
24
 * Copyright: 2005-2019 Pronamic
25
 * Company: Pronamic
26
 *
27
 * @author  Remco Tolsma
28
 * @version 2.0.4
29
 * @since   1.0.0
30
 */
31
class Client {
32
	/**
33
	 * Sisow REST API endpoint URL.
34
	 *
35
	 * @var string
36
	 */
37
	const API_URL = 'https://www.sisow.nl/Sisow/iDeal/RestHandler.ashx';
38
39
	/**
40
	 * Sisow merchant ID.
41
	 *
42
	 * @var string
43
	 */
44
	private $merchant_id;
45
46
	/**
47
	 * Sisow merchant key.
48
	 *
49
	 * @var string
50
	 */
51
	private $merchant_key;
52
53
	/**
54
	 * Indicator to use test mode or not.
55
	 *
56
	 * @var boolean
57
	 */
58
	private $test_mode;
59
60
	/**
61
	 * Constructs and initializes a Sisow client object.
62
	 *
63
	 * @param string $merchant_id  Merchant ID.
64
	 * @param string $merchant_key Merchant key.
65
	 */
66
	public function __construct( $merchant_id, $merchant_key ) {
67
		$this->merchant_id  = $merchant_id;
68
		$this->merchant_key = $merchant_key;
69
	}
70
71
	/**
72
	 * Set test mode.
73
	 *
74
	 * @param boolean $test_mode True if test mode, false otherwise.
75
	 */
76
	public function set_test_mode( $test_mode ) {
77
		$this->test_mode = $test_mode;
78
	}
79
80
	/**
81
	 * Send request with the specified action and parameters.
82
	 *
83
	 * @param string       $method  Method.
84
	 * @param Request|null $request Request.
85
	 *
86
	 * @return false|SimpleXMLElement
87
	 */
88
	private function send_request( $method, Request $request = null ) {
89
		$url = self::API_URL . '/' . $method;
90
91
		if ( null !== $request ) {
92
			$request->sign( $this->merchant_key );
93
		}
94
95
		$result = Core_Util::remote_get_body(
96
			$url,
97
			200,
98
			array(
99
				'method' => 'POST',
100
				'body'   => ( null === $request ) ? null : $request->get_parameters(),
101
			)
102
		);
103
104
		if ( ! is_string( $result ) ) {
105
			return false;
106
		}
107
108
		// XML.
109
		$xml = Core_Util::simplexml_load_string( $result );
110
111
		return $xml;
112
	}
113
114
	/**
115
	 * Parse the specified document and return parsed result.
116
	 *
117
	 * @param SimpleXMLElement $document Document.
118
	 *
119
	 * @return Invoice|Merchant|Reservation|Transaction|Error
120
	 * @throws \Exception Throws exception on unknown Sisow message.
121
	 */
122
	private function parse_document( SimpleXMLElement $document ) {
123
		$name = $document->getName();
124
125
		switch ( $name ) {
126
			case 'cancelreservationresponse':
127
				$reservation = ReservationParser::parse( $document->reservation );
128
129
				return $reservation;
130
			case 'checkmerchantresponse':
131
				$merchant = MerchantParser::parse( $document->merchant );
132
133
				return $merchant;
134
			case 'errorresponse':
135
				$sisow_error = ErrorParser::parse( $document->error );
136
137
				$message = sprintf( '%s: %s', $sisow_error->code, $sisow_error->message );
138
139
				throw new \Exception( $message );
140
			case 'invoiceresponse':
141
				$invoice = InvoiceParser::parse( $document->invoice );
142
143
				return $invoice;
144
			case 'statusresponse':
145
			case 'transactionrequest':
146
				$transaction = TransactionParser::parse( $document->transaction );
147
148
				return $transaction;
149
			default:
150
				throw new \Exception(
151
					/* translators: %s: XML document element name */
152
					sprintf( __( 'Unknwon Sisow message (%s)', 'pronamic_ideal' ), $name )
153
				);
154
		}
155
	}
156
157
	/**
158
	 * Get directory.
159
	 *
160
	 * @return array|false
161
	 */
162
	public function get_directory() {
163
		if ( $this->test_mode ) {
164
			return array(
165
				'99' => __( 'Sisow Bank (test)', 'pronamic_ideal' ),
166
			);
167
		}
168
169
		// Request.
170
		$result = $this->send_request( RequestMethods::DIRECTORY_REQUEST );
171
172
		if ( false === $result ) {
173
			return false;
174
		}
175
176
		// Parse.
177
		$directory = array();
178
179
		foreach ( $result->directory->issuer as $issuer ) {
180
			$id   = (string) $issuer->issuerid;
181
			$name = (string) $issuer->issuername;
182
183
			$directory[ $id ] = $name;
184
		}
185
186
		return $directory;
187
	}
188
189
	/**
190
	 * Get merchant.
191
	 *
192
	 * @param MerchantRequest $merchant_request Merchant request.
193
	 *
194
	 * @return Merchant|bool
195
	 */
196
	public function get_merchant( MerchantRequest $merchant_request ) {
197
		// Request.
198
		$response = $this->send_request( RequestMethods::CHECK_MERCHANT_REQUEST, $merchant_request );
199
200
		if ( false === $response ) {
201
			return false;
202
		}
203
204
		// Parse.
205
		try {
206
			$message = $this->parse_document( $response );
207
		} catch ( \Exception $e ) {
208
			return false;
209
		}
210
211
		if ( $message instanceof Merchant ) {
212
			return $message;
213
		}
214
215
		return false;
216
	}
217
218
	/**
219
	 * Create an transaction with the specified parameters.
220
	 *
221
	 * @param TransactionRequest $request Transaction request.
222
	 *
223
	 * @return Transaction|false
224
	 *
225
	 * @throws \Exception Throws exception on transaction error.
226
	 */
227
	public function create_transaction( TransactionRequest $request ) {
228
		// Request.
229
		$response = $this->send_request( RequestMethods::TRANSACTION_REQUEST, $request );
230
231
		if ( false === $response ) {
232
			return false;
233
		}
234
235
		// Parse.
236
		$message = $this->parse_document( $response );
237
238
		if ( $message instanceof Transaction ) {
239
			return $message;
240
		}
241
242
		return false;
243
	}
244
245
	/**
246
	 * Create invoice for reservation payment.
247
	 *
248
	 * @param InvoiceRequest $request Invoice request.
249
	 *
250
	 * @return Invoice|false
251
	 *
252
	 * @throws \Exception Throws exception on error.
253
	 */
254
	public function create_invoice( InvoiceRequest $request ) {
255
		// Request.
256
		$response = $this->send_request( RequestMethods::INVOICE_REQUEST, $request );
257
258
		if ( false === $response ) {
259
			return false;
260
		}
261
262
		// Parse.
263
		$message = $this->parse_document( $response );
264
265
		if ( $message instanceof Invoice ) {
266
			return $message;
267
		}
268
269
		return false;
270
	}
271
272
	/**
273
	 * Cancel reservation payment.
274
	 *
275
	 * @param CancelReservationRequest $request Reservation cancellation request.
276
	 *
277
	 * @return Reservation|false
278
	 *
279
	 * @throws \Exception Throws exception on error.
280
	 */
281
	public function cancel_reservation( CancelReservationRequest $request ) {
282
		$request->set_parameter( 'shopid', null );
283
284
		// Request.
285
		$response = $this->send_request( RequestMethods::CANCEL_RESERVATION_REQUEST, $request );
286
287
		if ( false === $response ) {
288
			return false;
289
		}
290
291
		// Parse.
292
		$message = $this->parse_document( $response );
293
294
		if ( $message instanceof Reservation ) {
295
			return $message;
296
		}
297
298
		return false;
299
	}
300
301
	/**
302
	 * Get the status of the specified transaction ID.
303
	 *
304
	 * @param StatusRequest $request Status request object.
305
	 *
306
	 * @return Transaction|false
307
	 *
308
	 * @throws \InvalidArgumentException Throws exception on invalid transaction ID.
309
	 */
310
	public function get_status( StatusRequest $request ) {
311
		$transaction_id = $request->get_parameter( 'trxid' );
312
313
		if ( empty( $transaction_id ) ) {
314
			throw new \InvalidArgumentException( 'Invalid transction ID.' );
315
		}
316
317
		// Request.
318
		$response = $this->send_request( RequestMethods::STATUS_REQUEST, $request );
319
320
		if ( false === $response ) {
321
			return false;
322
		}
323
324
		// Parse.
325
		$message = $this->parse_document( $response );
326
327
		if ( $message instanceof Transaction ) {
328
			return $message;
329
		}
330
331
		return false;
332
	}
333
}
334