Test Failed
Push — develop ( dcddf7...622792 )
by Remco
18:09 queued 14:00
created

Gateway::get_issuers()   A

Complexity

Conditions 5
Paths 5

Size

Total Lines 37
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 30

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 5
eloc 24
nc 5
nop 0
dl 0
loc 37
ccs 0
cts 29
cp 0
crap 30
rs 9.2248
c 1
b 0
f 0
1
<?php
2
3
namespace Pronamic\WordPress\Pay\Gateways\Icepay;
4
5
use Exception;
6
use Icepay_Api_Webservice;
7
use Icepay_Basicmode;
8
use Icepay_Paymentmethod_Creditcard;
9
use Icepay_Paymentmethod_Ddebit;
10
use Icepay_Paymentmethod_Ideal;
11
use Icepay_Paymentmethod_Mistercash;
12
use Icepay_PaymentObject;
13
use Icepay_Result;
14
use Icepay_StatusCode;
15
use Pronamic\WordPress\Pay\Core\Gateway as Core_Gateway;
16
use Pronamic\WordPress\Pay\Core\PaymentMethods;
17
use Pronamic\WordPress\Pay\Core\Statuses;
18
use Pronamic\WordPress\Pay\Payments\Payment;
19
use WP_Error;
20
21
/**
22
 * Title: ICEPAY gateway
23
 * Description:
24
 * Copyright: 2005-2019 Pronamic
25
 * Company: Pronamic
26
 *
27
 * @author Remco Tolsma
28
 * @version 2.0.1
29
 * @since 1.0.0
30
 */
31
class Gateway extends Core_Gateway {
32
	/**
33
	 * Constructs and intializes an ICEPAY gateway
34
	 *
35
	 * @param Config $config Config.
36
	 */
37
	public function __construct( Config $config ) {
38
		parent::__construct( $config );
39
40
		// Default properties for this gateway.
41
		$this->set_method( self::METHOD_HTTP_REDIRECT );
42
43
		// Supported features.
44
		$this->supports = array();
45
	}
46
47
	/**
48
	 * Filter iDEAL
49
	 *
50
	 * @param array $method Payment method.
51
	 *
52
	 * @return bool
53
	 */
54
	private function filter_ideal( $method ) {
55
		return is_array( $method ) && isset( $method['PaymentMethodCode'] ) && 'IDEAL' === $method['PaymentMethodCode'];
56
	}
57
58
	/**
59
	 * Get issuers
60
	 *
61
	 * @see Pronamic_WP_Pay_Gateway::get_issuers()
62
	 */
63
	public function get_issuers() {
64
		$groups  = array();
65
		$issuers = array();
66
67
		try {
68
			$methods = Icepay_Api_Webservice::getInstance()
69
						->paymentmethodService()
70
						->setMerchantID( $this->config->merchant_id )
71
						->setSecretCode( $this->config->secret_code )
72
						->retrieveAllPaymentmethods()
73
						->asArray();
74
		} catch ( Exception $e ) {
75
			return $groups;
76
		}
77
78
		$ideal_methods = array_filter( $methods, array( $this, 'filter_ideal' ) );
79
80
		if ( ! empty( $ideal_methods ) ) {
81
			$issuers = Icepay_Api_Webservice::getInstance()->singleMethod()
82
						->loadFromArray( $methods )
83
						->selectPaymentMethodByCode( 'IDEAL' )
84
						->getIssuers();
85
		}
86
87
		if ( $issuers ) {
88
			$options = array();
89
90
			foreach ( $issuers as $issuer ) {
91
				$options[ $issuer['IssuerKeyword'] ] = $issuer['Description'];
92
			}
93
94
			$groups[] = array(
95
				'options' => $options,
96
			);
97
		}
98
99
		return $groups;
100
	}
101
102
	/**
103
	 * Get issuers
104
	 *
105
	 * @see Pronamic_WP_Pay_Gateway::get_issuers()
106
	 */
107
	public function get_credit_card_issuers() {
108
		$groups  = array();
109
		$issuers = array();
110
111
		$method = new Icepay_Paymentmethod_Creditcard();
112
113
		if ( isset( $method->_issuer ) ) {
114
			$issuers = $method->_issuer;
115
		}
116
117
		if ( $issuers ) {
118
			$options = array();
119
120
			foreach ( $issuers as $issuer ) {
121
				switch ( $issuer ) {
122
					case 'AMEX':
123
						$name = _x( 'AMEX', 'Payment method name', 'pronamic_ideal' );
124
125
						break;
126
					case 'MASTER':
127
						$name = _x( 'MASTER', 'Payment method name', 'pronamic_ideal' );
128
129
						break;
130
					case 'VISA':
131
						$name = _x( 'VISA', 'Payment method name', 'pronamic_ideal' );
132
133
						break;
134
					default:
135
						$name = $issuer;
136
137
						break;
138
				}
139
140
				$options[ $issuer ] = $name;
141
			}
142
143
			$groups[] = array(
144
				'options' => $options,
145
			);
146
		}
147
148
		return $groups;
149
	}
150
151
	/**
152
	 * Get supported payment methods
153
	 *
154
	 * @see Pronamic_WP_Pay_Gateway::get_supported_payment_methods()
155
	 */
156
	public function get_supported_payment_methods() {
157
		return array(
158
			PaymentMethods::IDEAL,
159
			PaymentMethods::CREDIT_CARD,
160
			PaymentMethods::DIRECT_DEBIT,
161
			PaymentMethods::BANCONTACT,
162
		);
163
	}
164
165
	/**
166
	 * Start an transaction
167
	 *
168
	 * @see Core_Gateway::start()
169
	 *
170
	 * @param Payment $payment Payment.
171
	 */
172
	public function start( Payment $payment ) {
173
		try {
174
			/*
175
			 * Order ID
176
			 * Your unique order number.
177
			 * This can be auto incremental number from your payments table
178
			 *
179
			 * Data type  = String
180
			 * Max length = 10
181
			 * Required   = Yes
182
			 */
183
184
			// Locale, country and language.
185
			$locale   = get_locale();
186
			$language = substr( $locale, 0, 2 );
187
188
			if ( null !== $payment->get_customer() ) {
189
				$locale = $payment->get_customer()->get_locale();
190
191
				$language = strtoupper( $payment->get_customer()->get_language() );
192
			}
193
194
			$country = strtoupper( substr( $locale, 3, 2 ) );
195
196
			// Set country from billing address.
197
			if ( null !== $payment->get_billing_address() ) {
198
				$country_code = $payment->get_billing_address()->get_country_code();
199
200
				if ( ! empty( $country_code ) ) {
201
					$country = $country_code;
202
				}
203
			}
204
205
			// Payment object.
206
			$payment_object = new Icepay_PaymentObject();
207
			$payment_object
208
				->setAmount( $payment->get_total_amount()->get_cents() )
0 ignored issues
show
Deprecated Code introduced by
The function Pronamic\WordPress\Money\Money::get_cents() has been deprecated: 1.2.2 Use `Money::get_minor_units()` instead. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

208
				->setAmount( /** @scrutinizer ignore-deprecated */ $payment->get_total_amount()->get_cents() )

This function has been deprecated. The supplier of the function has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the function will be removed and what other function to use instead.

Loading history...
Bug introduced by
$payment->get_total_amount()->get_cents() of type double is incompatible with the type integer expected by parameter $amount of Icepay_PaymentObject::setAmount(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

208
				->setAmount( /** @scrutinizer ignore-type */ $payment->get_total_amount()->get_cents() )
Loading history...
209
				->setCountry( $country )
210
				->setLanguage( $language )
211
				->setReference( $payment->get_order_id() )
212
				->setDescription( $payment->get_description() )
213
				->setCurrency( $payment->get_total_amount()->get_currency()->get_alphabetic_code() )
214
				->setIssuer( $payment->get_issuer() )
215
				->setOrderID( $payment->format_string( $this->config->order_id ) );
216
217
			/*
218
			 * Payment method
219
			 * @since 1.2.0
220
			 */
221
			$icepay_method = null;
222
223
			switch ( $payment->get_method() ) {
224
				case PaymentMethods::CREDIT_CARD:
225
					// @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/creditcard.php
226
					$icepay_method = new Icepay_Paymentmethod_Creditcard();
227
228
					break;
229
				case PaymentMethods::DIRECT_DEBIT:
230
					// @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/ddebit.php
231
					$icepay_method = new Icepay_Paymentmethod_Ddebit();
232
233
					break;
234
				case PaymentMethods::IDEAL:
235
					// @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/ideal.php
236
					$icepay_method = new Icepay_Paymentmethod_Ideal();
237
238
					break;
239
				case PaymentMethods::BANCONTACT:
240
				case PaymentMethods::MISTER_CASH:
0 ignored issues
show
Deprecated Code introduced by
The constant Pronamic\WordPress\Pay\C...entMethods::MISTER_CASH has been deprecated: "Bancontact/Mister Cash" was renamed to just "Bancontact". ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-deprecated  annotation

240
				case /** @scrutinizer ignore-deprecated */ PaymentMethods::MISTER_CASH:

This class constant has been deprecated. The supplier of the class has supplied an explanatory message.

The explanatory message should give you some clue as to whether and when the constant will be removed from the class and what other constant to use instead.

Loading history...
241
					// @link https://github.com/icepay/icepay/blob/2.4.0/api/paymentmethods/mistercash.php
242
					$icepay_method = new Icepay_Paymentmethod_Mistercash();
243
244
					break;
245
			}
246
247
			if ( isset( $icepay_method ) ) {
248
				// @link https://github.com/icepay/icepay/blob/2.4.0/api/icepay_api_base.php#L342-L353
249
				$payment_object->setPaymentMethod( $icepay_method->getCode() );
250
251
				// Force language 'NL' for unsupported languages (i.e. 'EN' for iDEAL).
252
				if ( ! in_array( $language, $icepay_method->getSupportedLanguages(), true ) ) {
253
					$payment_object->setLanguage( 'NL' );
254
				}
255
			}
256
257
			// Protocol.
258
			$protocol = is_ssl() ? 'https' : 'http';
259
260
			// Basic mode.
261
			$basicmode = Icepay_Basicmode::getInstance();
262
			$basicmode
263
				->setMerchantID( $this->config->merchant_id )
264
				->setSecretCode( $this->config->secret_code )
265
				->setProtocol( $protocol )
266
				->setSuccessURL( $payment->get_return_url() )
267
				->setErrorURL( $payment->get_return_url() )
268
				->validatePayment( $payment_object );
269
270
			// Action URL.
271
			$payment->set_action_url( $basicmode->getURL() );
272
		} catch ( Exception $exception ) {
273
			$this->error = new WP_Error( 'icepay_error', $exception->getMessage(), $exception );
274
		}
275
	}
276
277
	/**
278
	 * Update the status of the specified payment
279
	 *
280
	 * @param Payment $payment Payment.
281
	 *
282
	 * @throws Exception
283
	 */
284
	public function update_status( Payment $payment ) {
285
		// Get the Icepay Result and set the required fields.
286
		$result = new Icepay_Result();
287
		$result
288
			->setMerchantID( $this->config->merchant_id )
289
			->setSecretCode( $this->config->secret_code );
290
291
		try {
292
			// Determine if the result can be validated.
293
			if ( $result->validate() ) {
294
				// What was the status response.
295
				switch ( $result->getStatus() ) {
296
					case Icepay_StatusCode::SUCCESS:
297
						$payment->set_status( Statuses::SUCCESS );
298
299
						break;
300
					case Icepay_StatusCode::OPEN:
301
						$payment->set_status( Statuses::OPEN );
302
303
						break;
304
					case Icepay_StatusCode::ERROR:
305
						$payment->set_status( Statuses::FAILURE );
306
307
						break;
308
				}
309
			}
310
		} catch ( Exception $exception ) {
311
			$this->error = new WP_Error( 'icepay_error', $exception->getMessage(), $exception );
312
		}
313
	}
314
}
315