Failed Conditions
Push — develop ( f0e449...041528 )
by Reüel
05:35
created

src/Client.php (1 issue)

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.0
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
		$this->error = null;
0 ignored issues
show
Bug Best Practice introduced by
The property error does not exist. Although not strictly required by PHP, it is generally a best practice to declare properties explicitly.
Loading history...
124
125
		$name = $document->getName();
126
127
		switch ( $name ) {
128
			case 'cancelreservationresponse':
129
				$reservation = ReservationParser::parse( $document->reservation );
130
131
				return $reservation;
132
			case 'checkmerchantresponse':
133
				$merchant = MerchantParser::parse( $document->merchant );
134
135
				return $merchant;
136
			case 'errorresponse':
137
				$sisow_error = ErrorParser::parse( $document->error );
138
139
				throw new \Exception( $sisow_error->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
	public function create_invoice( InvoiceRequest $request ) {
253
		// Request.
254
		$response = $this->send_request( RequestMethods::INVOICE_REQUEST, $request );
255
256
		if ( false === $response ) {
257
			return false;
258
		}
259
260
		// Parse.
261
		$message = $this->parse_document( $response );
262
263
		if ( $message instanceof Invoice ) {
264
			return $message;
265
		}
266
267
		return false;
268
	}
269
270
	/**
271
	 * Cancel reservation payment.
272
	 *
273
	 * @param CancelReservationRequest $request Reservation cancellation request.
274
	 *
275
	 * @return Reservation|false
276
	 */
277
	public function cancel_reservation( CancelReservationRequest $request ) {
278
		$request->set_parameter( 'shopid', null );
279
280
		// Request.
281
		$response = $this->send_request( RequestMethods::CANCEL_RESERVATION_REQUEST, $request );
282
283
		if ( false === $response ) {
284
			return false;
285
		}
286
287
		// Parse.
288
		$message = $this->parse_document( $response );
289
290
		if ( $message instanceof Reservation ) {
291
			return $message;
292
		}
293
294
		return false;
295
	}
296
297
	/**
298
	 * Get the status of the specified transaction ID.
299
	 *
300
	 * @param StatusRequest $request Status request object.
301
	 *
302
	 * @return Transaction|false
303
	 */
304
	public function get_status( StatusRequest $request ) {
305
		// Request.
306
		$response = $this->send_request( RequestMethods::STATUS_REQUEST, $request );
307
308
		if ( false === $response ) {
309
			return false;
310
		}
311
312
		// Parse.
313
		$message = $this->parse_document( $response );
314
315
		if ( $message instanceof Transaction ) {
316
			return $message;
317
		}
318
319
		return false;
320
	}
321
}
322