Mollie Payments for WooCommerce - Version 2.5.2

Version Description

Our plugin is now compatible with WooCommerce Subscriptions for recurring payments.

Download this release

Release Info

Developer ndijkstra
Plugin Icon wp plugin Mollie Payments for WooCommerce
Version 2.5.2
Comparing to
See all releases

Code changes from version 2.4.1 to 2.5.2

Files changed (31) hide show
  1. includes/mollie-api-php/README.mdown +2 -2
  2. includes/mollie-api-php/composer.json +0 -1
  3. includes/mollie-api-php/examples/19-update-profile.php +35 -0
  4. includes/mollie-api-php/examples/20-list-apikeys.php +31 -0
  5. includes/mollie-api-php/examples/21-reset-apikey.php +26 -0
  6. includes/mollie-api-php/examples/orders/.gitignore +1 -0
  7. includes/mollie-api-php/src/Mollie/API/Client.php +21 -1
  8. includes/mollie-api-php/src/Mollie/API/Object/Payment.php +15 -5
  9. includes/mollie-api-php/src/Mollie/API/Object/Profile/APIKey.php +73 -0
  10. includes/mollie-api-php/src/Mollie/API/Resource/Base.php +10 -0
  11. includes/mollie-api-php/src/Mollie/API/Resource/Customers/Mandates.php +2 -0
  12. includes/mollie-api-php/src/Mollie/API/Resource/Customers/Subscriptions.php +2 -0
  13. includes/mollie-api-php/src/Mollie/API/Resource/Payments/Refunds.php +4 -2
  14. includes/mollie-api-php/src/Mollie/API/Resource/Profiles.php +25 -1
  15. includes/mollie-api-php/src/Mollie/API/Resource/Profiles/APIKeys.php +63 -0
  16. includes/mollie-api-php/src/Mollie/API/Resource/Refunds.php +2 -2
  17. includes/mollie-api-php/src/Mollie/API/Resource/Settlements.php +1 -1
  18. includes/mollie-api-php/src/Mollie/API/cacert.pem +262 -89
  19. includes/mollie/wc/gateway/abstract.php +141 -67
  20. includes/mollie/wc/gateway/abstractseparecurring.php +207 -0
  21. includes/mollie/wc/gateway/abstractsubscription.php +495 -0
  22. includes/mollie/wc/gateway/belfius.php +1 -1
  23. includes/mollie/wc/gateway/creditcard.php +2 -2
  24. includes/mollie/wc/gateway/ideal.php +1 -1
  25. includes/mollie/wc/gateway/mistercash.php +1 -1
  26. includes/mollie/wc/gateway/sofort.php +1 -1
  27. includes/mollie/wc/helper/data.php +85 -12
  28. includes/mollie/wc/helper/settings.php +18 -1
  29. includes/mollie/wc/plugin.php +95 -1
  30. mollie-payments-for-woocommerce.php +6 -2
  31. readme.txt +13 -5
includes/mollie-api-php/README.mdown CHANGED
@@ -24,11 +24,11 @@ To use the Mollie API client, the following things are required:
24
 
25
  By far the easiest way to install the Mollie API client is to require it with [Composer](http://getcomposer.org/doc/00-intro.md).
26
 
27
- $ composer require mollie/mollie-api-php:1.7.*
28
 
29
  {
30
  "require": {
31
- "mollie/mollie-api-php": "1.7.*"
32
  }
33
  }
34
 
24
 
25
  By far the easiest way to install the Mollie API client is to require it with [Composer](http://getcomposer.org/doc/00-intro.md).
26
 
27
+ $ composer require mollie/mollie-api-php:1.9.*
28
 
29
  {
30
  "require": {
31
+ "mollie/mollie-api-php": "1.9.*"
32
  }
33
  }
34
 
includes/mollie-api-php/composer.json CHANGED
@@ -1,7 +1,6 @@
1
  {
2
  "name": "mollie/mollie-api-php",
3
  "description": "Mollie API client library for PHP",
4
- "version": "1.7.1",
5
  "homepage": "https://github.com/mollie/mollie-api-php",
6
  "license": "BSD-2-Clause",
7
  "authors": [
1
  {
2
  "name": "mollie/mollie-api-php",
3
  "description": "Mollie API client library for PHP",
 
4
  "homepage": "https://github.com/mollie/mollie-api-php",
5
  "license": "BSD-2-Clause",
6
  "authors": [
includes/mollie-api-php/examples/19-update-profile.php ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Example 19 - Updating an existing profile via the Mollie API.
4
+ */
5
+
6
+ try
7
+ {
8
+ /*
9
+ * Initialize the Mollie API library with your API key or OAuth access token.
10
+ */
11
+ include "initialize_with_oauth.php";
12
+
13
+ /*
14
+ * Retrieve an existing profile by his profileId
15
+ */
16
+ $profile = $mollie->profiles->get("pfl_eA4MSz7Bvy");
17
+
18
+ /**
19
+ * Profile fields that can be updated.
20
+ *
21
+ * @See https://www.mollie.com/en/docs/reference/profiles/update
22
+ */
23
+ $profile->name = "Mollie B.V.";
24
+ $profile->website = 'www.mollie.com';
25
+ $profile->email = 'info@mollie.com';
26
+ $profile->phone = '0612345670';
27
+ $profile->categoryCode = 5399;
28
+ $profile = $mollie->profiles->update($profile);
29
+
30
+ echo "<p>Profile updated: " . htmlspecialchars($profile->name) . "</p>";
31
+ }
32
+ catch (Mollie_API_Exception $e)
33
+ {
34
+ echo "<p>API call failed: " . htmlspecialchars($e->getMessage()) . "</p>";
35
+ }
includes/mollie-api-php/examples/20-list-apikeys.php ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Example 20 - How to get the API keys for a given profile
4
+ */
5
+
6
+ try
7
+ {
8
+ /*
9
+ * Initialize the Mollie API library with your OAuth access token.
10
+ */
11
+ include "initialize_with_oauth.php";
12
+
13
+ /*
14
+ * Retrieve an existing profile by his profileId
15
+ */
16
+ $profile = $mollie->profiles->get("pfl_eB5MZz7Cvy");
17
+
18
+ /*
19
+ * Get the API keys for this profile.
20
+ */
21
+ $api_keys = $mollie->profiles_apikeys->with($profile)->all();
22
+
23
+ foreach ($api_keys as $api_key)
24
+ {
25
+ echo htmlspecialchars($api_key->key) . "<br />";
26
+ }
27
+ }
28
+ catch (Mollie_API_Exception $e)
29
+ {
30
+ echo "API call failed: " . htmlspecialchars($e->getMessage());
31
+ }
includes/mollie-api-php/examples/21-reset-apikey.php ADDED
@@ -0,0 +1,26 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ * Example 21 - Reset a API key
4
+ */
5
+
6
+ try
7
+ {
8
+ /*
9
+ * Initialize the Mollie API library with a OAuth access token.
10
+ */
11
+ include "initialize_with_oauth.php";
12
+
13
+ /*
14
+ * Retrieve an existing profile by his profileId
15
+ */
16
+ $profile = $mollie->profiles->get("pfl_eA4MSz7Bvy");
17
+
18
+ /*
19
+ * Reset the live API key
20
+ */
21
+ $new_live_api_key = $mollie->profiles_apikeys->with($profile)->reset("live");
22
+ }
23
+ catch (Mollie_API_Exception $e)
24
+ {
25
+ echo "API call failed: " . htmlspecialchars($e->getMessage());
26
+ }
includes/mollie-api-php/examples/orders/.gitignore ADDED
@@ -0,0 +1 @@
 
1
+ *.txt
includes/mollie-api-php/src/Mollie/API/Client.php CHANGED
@@ -34,7 +34,7 @@ class Mollie_API_Client
34
  /**
35
  * Version of our client.
36
  */
37
- const CLIENT_VERSION = "1.7.1";
38
 
39
  /**
40
  * Endpoint of the remote API.
@@ -50,6 +50,8 @@ class Mollie_API_Client
50
  const HTTP_POST = "POST";
51
  const HTTP_DELETE = "DELETE";
52
 
 
 
53
  /**
54
  * @var string
55
  */
@@ -176,6 +178,11 @@ class Mollie_API_Client
176
  */
177
  protected $pem_path;
178
 
 
 
 
 
 
179
  /**
180
  * @throws Mollie_API_Exception_IncompatiblePlatform
181
  */
@@ -198,6 +205,7 @@ class Mollie_API_Client
198
  $this->organizations = new Mollie_API_Resource_Organizations($this);
199
  $this->refunds = new Mollie_API_Resource_Refunds($this);
200
  $this->profiles = new Mollie_API_Resource_Profiles($this);
 
201
  $this->settlements = new Mollie_API_Resource_Settlements($this);
202
 
203
  $curl_version = curl_version();
@@ -392,6 +400,8 @@ class Mollie_API_Client
392
  $body = curl_exec($this->ch);
393
  }
394
 
 
 
395
  if (curl_errno($this->ch))
396
  {
397
  $message = "Unable to communicate with Mollie (".curl_errno($this->ch)."): " . curl_error($this->ch) . ".";
@@ -440,4 +450,14 @@ class Mollie_API_Client
440
 
441
  return $checker;
442
  }
 
 
 
 
 
 
 
 
 
 
443
  }
34
  /**
35
  * Version of our client.
36
  */
37
+ const CLIENT_VERSION = "1.9.1";
38
 
39
  /**
40
  * Endpoint of the remote API.
50
  const HTTP_POST = "POST";
51
  const HTTP_DELETE = "DELETE";
52
 
53
+ const HTTP_STATUS_NO_CONTENT = 204;
54
+
55
  /**
56
  * @var string
57
  */
178
  */
179
  protected $pem_path;
180
 
181
+ /**
182
+ * @var int
183
+ */
184
+ protected $last_http_response_status_code;
185
+
186
  /**
187
  * @throws Mollie_API_Exception_IncompatiblePlatform
188
  */
205
  $this->organizations = new Mollie_API_Resource_Organizations($this);
206
  $this->refunds = new Mollie_API_Resource_Refunds($this);
207
  $this->profiles = new Mollie_API_Resource_Profiles($this);
208
+ $this->profiles_apikeys = new Mollie_API_Resource_Profiles_APIKeys($this);
209
  $this->settlements = new Mollie_API_Resource_Settlements($this);
210
 
211
  $curl_version = curl_version();
400
  $body = curl_exec($this->ch);
401
  }
402
 
403
+ $this->last_http_response_status_code = (int) curl_getinfo($this->ch, CURLINFO_HTTP_CODE);
404
+
405
  if (curl_errno($this->ch))
406
  {
407
  $message = "Unable to communicate with Mollie (".curl_errno($this->ch)."): " . curl_error($this->ch) . ".";
450
 
451
  return $checker;
452
  }
453
+
454
+ /**
455
+ * @deprecated Do not use this method, it should only be used internally
456
+ *
457
+ * @return int
458
+ */
459
+ public function getLastHttpResponseStatusCode ()
460
+ {
461
+ return $this->last_http_response_status_code;
462
+ }
463
  }
includes/mollie-api-php/src/Mollie/API/Object/Payment.php CHANGED
@@ -258,7 +258,6 @@ class Mollie_API_Object_Payment
258
  */
259
  public $links;
260
 
261
-
262
  /**
263
  * Is this payment cancelled?
264
  *
@@ -269,7 +268,6 @@ class Mollie_API_Object_Payment
269
  return $this->status == self::STATUS_CANCELLED;
270
  }
271
 
272
-
273
  /**
274
  * Is this payment expired?
275
  *
@@ -280,7 +278,6 @@ class Mollie_API_Object_Payment
280
  return $this->status == self::STATUS_EXPIRED;
281
  }
282
 
283
-
284
  /**
285
  * Is this payment still open / ongoing?
286
  *
@@ -311,6 +308,19 @@ class Mollie_API_Object_Payment
311
  return !empty($this->paidDatetime);
312
  }
313
 
 
 
 
 
 
 
 
 
 
 
 
 
 
314
  /**
315
  * Is this payment (partially) refunded?
316
  *
@@ -406,7 +416,7 @@ class Mollie_API_Object_Payment
406
  return floatval($this->amountRefunded);
407
  }
408
 
409
- return 0;
410
  }
411
 
412
  /**
@@ -422,6 +432,6 @@ class Mollie_API_Object_Payment
422
  return floatval($this->amountRemaining);
423
  }
424
 
425
- return 0;
426
  }
427
  }
258
  */
259
  public $links;
260
 
 
261
  /**
262
  * Is this payment cancelled?
263
  *
268
  return $this->status == self::STATUS_CANCELLED;
269
  }
270
 
 
271
  /**
272
  * Is this payment expired?
273
  *
278
  return $this->status == self::STATUS_EXPIRED;
279
  }
280
 
 
281
  /**
282
  * Is this payment still open / ongoing?
283
  *
308
  return !empty($this->paidDatetime);
309
  }
310
 
311
+ /**
312
+ * Has the money been transferred to the bank account of the merchant?
313
+ *
314
+ * Note: When a payment is refunded or charged back, the status 'refunded'/'charged_back' will
315
+ * overwrite the 'paidout' status.
316
+ *
317
+ * @return bool
318
+ */
319
+ public function isPaidOut ()
320
+ {
321
+ return $this->status == self::STATUS_PAIDOUT;
322
+ }
323
+
324
  /**
325
  * Is this payment (partially) refunded?
326
  *
416
  return floatval($this->amountRefunded);
417
  }
418
 
419
+ return 0.0;
420
  }
421
 
422
  /**
432
  return floatval($this->amountRemaining);
433
  }
434
 
435
+ return 0.0;
436
  }
437
  }
includes/mollie-api-php/src/Mollie/API/Object/Profile/APIKey.php ADDED
@@ -0,0 +1,73 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (c) 2013, Mollie B.V.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are met:
8
+ *
9
+ * - Redistributions of source code must retain the above copyright notice,
10
+ * this list of conditions and the following disclaimer.
11
+ * - Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ *
15
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
16
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
19
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
25
+ * DAMAGE.
26
+ *
27
+ * @license Berkeley Software Distribution License (BSD-License 2) http://www.opensource.org/licenses/bsd-license.php
28
+ * @author Mollie B.V. <info@mollie.com>
29
+ * @copyright Mollie B.V.
30
+ * @link https://www.mollie.com
31
+ */
32
+ class Mollie_API_Object_Profile_APIKey
33
+ {
34
+ const TEST_KEY = "test";
35
+ const LIVE_KEY = "live";
36
+
37
+ /**
38
+ * The mode ('live' or 'test') functions as the ID of the API key.
39
+ *
40
+ * @var string
41
+ */
42
+ public $id;
43
+
44
+ /**
45
+ * The API key (live_... or test_...)
46
+ *
47
+ * @var string
48
+ */
49
+ public $key;
50
+
51
+ /**
52
+ * The datetime at which the API key was created in ISO-8601 format.
53
+ *
54
+ * @var string
55
+ */
56
+ public $createdDatetime;
57
+
58
+ /**
59
+ * @return bool
60
+ */
61
+ public function isLiveKey ()
62
+ {
63
+ return $this->id == self::LIVE_KEY;
64
+ }
65
+
66
+ /**
67
+ * @return bool
68
+ */
69
+ public function isTestKey ()
70
+ {
71
+ return $this->id == self::TEST_KEY;
72
+ }
73
+ }
includes/mollie-api-php/src/Mollie/API/Resource/Base.php CHANGED
@@ -152,6 +152,11 @@ abstract class Mollie_API_Resource_Base
152
  "{$rest_resource}/{$id}"
153
  );
154
 
 
 
 
 
 
155
  return $this->copy($result, $this->getResourceObject());
156
  }
157
 
@@ -326,6 +331,11 @@ abstract class Mollie_API_Resource_Base
326
  {
327
  $body = $this->api->performHttpCall($http_method, $api_method, $http_body);
328
 
 
 
 
 
 
329
  if (empty($body))
330
  {
331
  throw new Mollie_API_Exception("Unable to decode Mollie response: '{$body}'.");
152
  "{$rest_resource}/{$id}"
153
  );
154
 
155
+ if ($result === NULL)
156
+ {
157
+ return NULL;
158
+ }
159
+
160
  return $this->copy($result, $this->getResourceObject());
161
  }
162
 
331
  {
332
  $body = $this->api->performHttpCall($http_method, $api_method, $http_body);
333
 
334
+ if ($this->api->getLastHttpResponseStatusCode() == Mollie_API_Client::HTTP_STATUS_NO_CONTENT)
335
+ {
336
+ return NULL;
337
+ }
338
+
339
  if (empty($body))
340
  {
341
  throw new Mollie_API_Exception("Unable to decode Mollie response: '{$body}'.");
includes/mollie-api-php/src/Mollie/API/Resource/Customers/Mandates.php CHANGED
@@ -31,6 +31,8 @@
31
  *
32
  * @method Mollie_API_Object_Customer_Mandate[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
  * @method Mollie_API_Object_Customer_Mandate get($mandate_id, array $filters = array())
 
 
34
  */
35
  class Mollie_API_Resource_Customers_Mandates extends Mollie_API_Resource_Base
36
  {
31
  *
32
  * @method Mollie_API_Object_Customer_Mandate[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
  * @method Mollie_API_Object_Customer_Mandate get($mandate_id, array $filters = array())
34
+ * @method Mollie_API_Object_Customer_Mandate create(array $data, array $filters = array())
35
+ * @method Mollie_API_Object_Customer_Mandate delete($mandate_id)
36
  */
37
  class Mollie_API_Resource_Customers_Mandates extends Mollie_API_Resource_Base
38
  {
includes/mollie-api-php/src/Mollie/API/Resource/Customers/Subscriptions.php CHANGED
@@ -31,6 +31,8 @@
31
  *
32
  * @method Mollie_API_Object_Customer_Subscription[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
  * @method Mollie_API_Object_Customer_Subscription get($subscription_id, array $filters = array())
 
 
34
  */
35
  class Mollie_API_Resource_Customers_Subscriptions extends Mollie_API_Resource_Base
36
  {
31
  *
32
  * @method Mollie_API_Object_Customer_Subscription[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
  * @method Mollie_API_Object_Customer_Subscription get($subscription_id, array $filters = array())
34
+ * @method Mollie_API_Object_Customer_Subscription create(array $data = array(), array $filters = array())
35
+ * @method Mollie_API_Object_Customer_Subscription delete($subscription_id)
36
  */
37
  class Mollie_API_Resource_Customers_Subscriptions extends Mollie_API_Resource_Base
38
  {
includes/mollie-api-php/src/Mollie/API/Resource/Payments/Refunds.php CHANGED
@@ -30,7 +30,9 @@
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Payment_Refund[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
- * @method Mollie_API_Object_Payment_Refund get($resource_id, array $filters = array())
 
 
34
  */
35
  class Mollie_API_Resource_Payments_Refunds extends Mollie_API_Resource_Base
36
  {
@@ -40,7 +42,7 @@ class Mollie_API_Resource_Payments_Refunds extends Mollie_API_Resource_Base
40
  protected $resource_path = "payments_refunds";
41
 
42
  /**
43
- * @return Mollie_API_Object_Method
44
  */
45
  protected function getResourceObject ()
46
  {
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Payment_Refund[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
+ * @method Mollie_API_Object_Payment_Refund get($refund_id, array $filters = array())
34
+ * @method Mollie_API_Object_Payment_Refund create(array $data = array(), array $filters = array())
35
+ * @method Mollie_API_Object_Payment_Refund delete($refund_id)
36
  */
37
  class Mollie_API_Resource_Payments_Refunds extends Mollie_API_Resource_Base
38
  {
42
  protected $resource_path = "payments_refunds";
43
 
44
  /**
45
+ * @return Mollie_API_Object_Payment_Refund
46
  */
47
  protected function getResourceObject ()
48
  {
includes/mollie-api-php/src/Mollie/API/Resource/Profiles.php CHANGED
@@ -30,7 +30,9 @@
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Profile[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
- * @method Mollie_API_Object_Profile get($id, array $filters = array())
 
 
34
  */
35
  class Mollie_API_Resource_Profiles extends Mollie_API_Resource_Base
36
  {
@@ -41,4 +43,26 @@ class Mollie_API_Resource_Profiles extends Mollie_API_Resource_Base
41
  {
42
  return new Mollie_API_Object_Profile;
43
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  }
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Profile[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
+ * @method Mollie_API_Object_Profile get($profile_id, array $filters = array())
34
+ * @method Mollie_API_Object_Profile create(array $data = array(), array $filters = array())
35
+ * @method Mollie_API_Object_Profile delete($profile_id0)
36
  */
37
  class Mollie_API_Resource_Profiles extends Mollie_API_Resource_Base
38
  {
43
  {
44
  return new Mollie_API_Object_Profile;
45
  }
46
+
47
+ /**
48
+ * @param Mollie_API_Object_Profile $profile
49
+ *
50
+ * @return Mollie_API_Object_Profile
51
+ */
52
+ public function update (Mollie_API_Object_Profile $profile)
53
+ {
54
+ $body = json_encode(array(
55
+ "name" => $profile->name,
56
+ "website" => $profile->website,
57
+ "email" => $profile->email,
58
+ "phone" => $profile->phone,
59
+ "categoryCode" => $profile->categoryCode,
60
+ "mode" => $profile->mode
61
+ ));
62
+
63
+ /** @var Mollie_API_Object_Profile $updated_profile */
64
+ $updated_profile = $this->rest_update($this->getResourcePath(), $profile->id, $body);
65
+
66
+ return $updated_profile;
67
+ }
68
  }
includes/mollie-api-php/src/Mollie/API/Resource/Profiles/APIKeys.php ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Copyright (c) 2016, Mollie B.V.
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are met:
8
+ *
9
+ * - Redistributions of source code must retain the above copyright notice,
10
+ * this list of conditions and the following disclaimer.
11
+ * - Redistributions in binary form must reproduce the above copyright
12
+ * notice, this list of conditions and the following disclaimer in the
13
+ * documentation and/or other materials provided with the distribution.
14
+ *
15
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
16
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
19
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
25
+ * DAMAGE.
26
+ *
27
+ * @license Berkeley Software Distribution License (BSD-License 2) http://www.opensource.org/licenses/bsd-license.php
28
+ * @author Mollie B.V. <info@mollie.com>
29
+ * @copyright Mollie B.V.
30
+ * @link https://www.mollie.com
31
+ *
32
+ * @method Mollie_API_Object_Profile_APIKey[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
+ * @method Mollie_API_Object_Profile_APIKey get($mode, array $filters = array())
34
+ */
35
+ class Mollie_API_Resource_Profiles_APIKeys extends Mollie_API_Resource_Base
36
+ {
37
+ /**
38
+ * @var string
39
+ */
40
+ protected $resource_path = "profiles_apikeys";
41
+
42
+ /**
43
+ * @return Mollie_API_Object_Profile_APIKey
44
+ */
45
+ protected function getResourceObject ()
46
+ {
47
+ return new Mollie_API_Object_Profile_APIKey;
48
+ }
49
+
50
+ /**
51
+ * @param string $mode
52
+ *
53
+ * @return Mollie_API_Object_Profile_APIKey
54
+ */
55
+ public function reset ($mode)
56
+ {
57
+ /** @var Mollie_API_Object_Profile_APIKey $updated_api_key */
58
+ $updated_api_key = $this->rest_update($this->getResourcePath(), $mode, '');
59
+
60
+ return $updated_api_key;
61
+ }
62
+
63
+ }
includes/mollie-api-php/src/Mollie/API/Resource/Refunds.php CHANGED
@@ -30,7 +30,7 @@
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Payment_Refund[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
- * @method Mollie_API_Object_Payment_Refund get($resource_id, array $filters = array())
34
  */
35
  class Mollie_API_Resource_Refunds extends Mollie_API_Resource_Base
36
  {
@@ -40,7 +40,7 @@ class Mollie_API_Resource_Refunds extends Mollie_API_Resource_Base
40
  protected $resource_path = "refunds";
41
 
42
  /**
43
- * @return Mollie_API_Object_Method
44
  */
45
  protected function getResourceObject ()
46
  {
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Payment_Refund[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
+ * @method Mollie_API_Object_Payment_Refund get($refund_id, array $filters = array())
34
  */
35
  class Mollie_API_Resource_Refunds extends Mollie_API_Resource_Base
36
  {
40
  protected $resource_path = "refunds";
41
 
42
  /**
43
+ * @return Mollie_API_Object_Payment_Refund
44
  */
45
  protected function getResourceObject ()
46
  {
includes/mollie-api-php/src/Mollie/API/Resource/Settlements.php CHANGED
@@ -30,7 +30,7 @@
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Settlement[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
- * @method Mollie_API_Object_Settlement get($id, array $filters = array())
34
  */
35
  class Mollie_API_Resource_Settlements extends Mollie_API_Resource_Base
36
  {
30
  * @link https://www.mollie.com
31
  *
32
  * @method Mollie_API_Object_Settlement[]|Mollie_API_Object_List all($offset = 0, $limit = 0, array $filters = array())
33
+ * @method Mollie_API_Object_Settlement get($settlement_id, array $filters = array())
34
  */
35
  class Mollie_API_Resource_Settlements extends Mollie_API_Resource_Base
36
  {
includes/mollie-api-php/src/Mollie/API/cacert.pem CHANGED
@@ -1,20 +1,20 @@
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
- ## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
8
  ## file (certdata.txt). This file can be found in the mozilla source tree:
9
- ## http://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
  ##
11
  ## It contains the certificates in PEM format and therefore
12
  ## can be directly used with curl / libcurl / php_curl, or with
13
  ## an Apache+mod_ssl webserver for SSL client authentication.
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
- ## Conversion done with mk-ca-bundle.pl version 1.25.
17
- ## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e
18
  ##
19
 
20
 
@@ -629,28 +629,6 @@ EtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLH
629
  llpwrN9M
630
  -----END CERTIFICATE-----
631
 
632
- Staat der Nederlanden Root CA
633
- =============================
634
- -----BEGIN CERTIFICATE-----
635
- MIIDujCCAqKgAwIBAgIEAJiWijANBgkqhkiG9w0BAQUFADBVMQswCQYDVQQGEwJOTDEeMBwGA1UE
636
- ChMVU3RhYXQgZGVyIE5lZGVybGFuZGVuMSYwJAYDVQQDEx1TdGFhdCBkZXIgTmVkZXJsYW5kZW4g
637
- Um9vdCBDQTAeFw0wMjEyMTcwOTIzNDlaFw0xNTEyMTYwOTE1MzhaMFUxCzAJBgNVBAYTAk5MMR4w
638
- HAYDVQQKExVTdGFhdCBkZXIgTmVkZXJsYW5kZW4xJjAkBgNVBAMTHVN0YWF0IGRlciBOZWRlcmxh
639
- bmRlbiBSb290IENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmNK1URF6gaYUmHFt
640
- vsznExvWJw56s2oYHLZhWtVhCb/ekBPHZ+7d89rFDBKeNVU+LCeIQGv33N0iYfXCxw719tV2U02P
641
- jLwYdjeFnejKScfST5gTCaI+Ioicf9byEGW07l8Y1Rfj+MX94p2i71MOhXeiD+EwR+4A5zN9RGca
642
- C1Hoi6CeUJhoNFIfLm0B8mBF8jHrqTFoKbt6QZ7GGX+UtFE5A3+y3qcym7RHjm+0Sq7lr7HcsBth
643
- vJly3uSJt3omXdozSVtSnA71iq3DuD3oBmrC1SoLbHuEvVYFy4ZlkuxEK7COudxwC0barbxjiDn6
644
- 22r+I/q85Ej0ZytqERAhSQIDAQABo4GRMIGOMAwGA1UdEwQFMAMBAf8wTwYDVR0gBEgwRjBEBgRV
645
- HSAAMDwwOgYIKwYBBQUHAgEWLmh0dHA6Ly93d3cucGtpb3ZlcmhlaWQubmwvcG9saWNpZXMvcm9v
646
- dC1wb2xpY3kwDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBSofeu8Y6R0E3QA7Jbg0zTBLL9s+DAN
647
- BgkqhkiG9w0BAQUFAAOCAQEABYSHVXQ2YcG70dTGFagTtJ+k/rvuFbQvBgwp8qiSpGEN/KtcCFtR
648
- EytNwiphyPgJWPwtArI5fZlmgb9uXJVFIGzmeafR2Bwp/MIgJ1HI8XxdNGdphREwxgDS1/PTfLbw
649
- MVcoEoJz6TMvplW0C5GUR5z6u3pCMuiufi3IvKwUv9kP2Vv8wfl6leF9fpb8cbDCTMjfRTTJzg3y
650
- nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
651
- iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
652
- -----END CERTIFICATE-----
653
-
654
  UTN USERFirst Hardware Root CA
655
  ==============================
656
  -----BEGIN CERTIFICATE-----
@@ -731,41 +709,6 @@ IBHNfTIzSJRUTN3cecQwn+uOuFW114hcxWokPbLTBQNRxgfvzBRydD1ucs4YKIxKoHflCStFREes
731
  t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
732
  -----END CERTIFICATE-----
733
 
734
- NetLock Notary (Class A) Root
735
- =============================
736
- -----BEGIN CERTIFICATE-----
737
- MIIGfTCCBWWgAwIBAgICAQMwDQYJKoZIhvcNAQEEBQAwga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQI
738
- EwdIdW5nYXJ5MREwDwYDVQQHEwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6
739
- dG9uc2FnaSBLZnQuMRowGAYDVQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9j
740
- ayBLb3pqZWd5em9pIChDbGFzcyBBKSBUYW51c2l0dmFueWtpYWRvMB4XDTk5MDIyNDIzMTQ0N1oX
741
- DTE5MDIxOTIzMTQ0N1owga8xCzAJBgNVBAYTAkhVMRAwDgYDVQQIEwdIdW5nYXJ5MREwDwYDVQQH
742
- EwhCdWRhcGVzdDEnMCUGA1UEChMeTmV0TG9jayBIYWxvemF0Yml6dG9uc2FnaSBLZnQuMRowGAYD
743
- VQQLExFUYW51c2l0dmFueWtpYWRvazE2MDQGA1UEAxMtTmV0TG9jayBLb3pqZWd5em9pIChDbGFz
744
- cyBBKSBUYW51c2l0dmFueWtpYWRvMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvHSM
745
- D7tM9DceqQWC2ObhbHDqeLVu0ThEDaiDzl3S1tWBxdRL51uUcCbbO51qTGL3cfNk1mE7PetzozfZ
746
- z+qMkjvN9wfcZnSX9EUi3fRc4L9t875lM+QVOr/bmJBVOMTtplVjC7B4BPTjbsE/jvxReB+SnoPC
747
- /tmwqcm8WgD/qaiYdPv2LD4VOQ22BFWoDpggQrOxJa1+mm9dU7GrDPzr4PN6s6iz/0b2Y6LYOph7
748
- tqyF/7AlT3Rj5xMHpQqPBffAZG9+pyeAlt7ULoZgx2srXnN7F+eRP2QM2EsiNCubMvJIH5+hCoR6
749
- 4sKtlz2O1cH5VqNQ6ca0+pii7pXmKgOM3wIDAQABo4ICnzCCApswDgYDVR0PAQH/BAQDAgAGMBIG
750
- A1UdEwEB/wQIMAYBAf8CAQQwEQYJYIZIAYb4QgEBBAQDAgAHMIICYAYJYIZIAYb4QgENBIICURaC
751
- Ak1GSUdZRUxFTSEgRXplbiB0YW51c2l0dmFueSBhIE5ldExvY2sgS2Z0LiBBbHRhbGFub3MgU3pv
752
- bGdhbHRhdGFzaSBGZWx0ZXRlbGVpYmVuIGxlaXJ0IGVsamFyYXNvayBhbGFwamFuIGtlc3p1bHQu
753
- IEEgaGl0ZWxlc2l0ZXMgZm9seWFtYXRhdCBhIE5ldExvY2sgS2Z0LiB0ZXJtZWtmZWxlbG9zc2Vn
754
- LWJpenRvc2l0YXNhIHZlZGkuIEEgZGlnaXRhbGlzIGFsYWlyYXMgZWxmb2dhZGFzYW5hayBmZWx0
755
- ZXRlbGUgYXogZWxvaXJ0IGVsbGVub3J6ZXNpIGVsamFyYXMgbWVndGV0ZWxlLiBBeiBlbGphcmFz
756
- IGxlaXJhc2EgbWVndGFsYWxoYXRvIGEgTmV0TG9jayBLZnQuIEludGVybmV0IGhvbmxhcGphbiBh
757
- IGh0dHBzOi8vd3d3Lm5ldGxvY2submV0L2RvY3MgY2ltZW4gdmFneSBrZXJoZXRvIGF6IGVsbGVu
758
- b3J6ZXNAbmV0bG9jay5uZXQgZS1tYWlsIGNpbWVuLiBJTVBPUlRBTlQhIFRoZSBpc3N1YW5jZSBh
759
- bmQgdGhlIHVzZSBvZiB0aGlzIGNlcnRpZmljYXRlIGlzIHN1YmplY3QgdG8gdGhlIE5ldExvY2sg
760
- Q1BTIGF2YWlsYWJsZSBhdCBodHRwczovL3d3dy5uZXRsb2NrLm5ldC9kb2NzIG9yIGJ5IGUtbWFp
761
- bCBhdCBjcHNAbmV0bG9jay5uZXQuMA0GCSqGSIb3DQEBBAUAA4IBAQBIJEb3ulZv+sgoA0BO5TE5
762
- ayZrU3/b39/zcT0mwBQOxmd7I6gMc90Bu8bKbjc5VdXHjFYgDigKDtIqpLBJUsY4B/6+CgmM0ZjP
763
- ytoUMaFP0jn8DxEsQ8Pdq5PHVT5HfBgaANzze9jyf1JsIPQLX2lS9O74silg6+NJMSEN1rUQQeJB
764
- CWziGppWS3cC9qCbmieH6FUpccKQn0V4GuEVZD3QDtigdp+uxdAu6tYPVuxkf1qbFFgBJ34TUMdr
765
- KuZoPL9coAob4Q566eKAw+np9v1sEZ7Q5SgnK1QyQhSCdeZK8CtmdWOMovsEPoMOmzbwGOQmIMOM
766
- 8CgHrTwXZoi1/baI
767
- -----END CERTIFICATE-----
768
-
769
  XRamp Global CA Root
770
  ====================
771
  -----BEGIN CERTIFICATE-----
@@ -1821,7 +1764,7 @@ AJw9SDkjOVgaFRJZap7v1VmyHVIsmXHNxynfGyphe3HR3vPA5Q06Sqotp9iGKt0uEA==
1821
  -----END CERTIFICATE-----
1822
 
1823
  NetLock Arany (Class Gold) FÅ‘tanúsítvány
1824
- ============================================
1825
  -----BEGIN CERTIFICATE-----
1826
  MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1827
  A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
@@ -1876,30 +1819,6 @@ IPVVYpbtbZNQvOSqeK3Zywplh6ZmwcSBo3c6WB4L7oOLnR7SUqTMHW+wmG2UMbX4cQrcufx9MmDm
1876
  66+KAQ==
1877
  -----END CERTIFICATE-----
1878
 
1879
- CA Disig
1880
- ========
1881
- -----BEGIN CERTIFICATE-----
1882
- MIIEDzCCAvegAwIBAgIBATANBgkqhkiG9w0BAQUFADBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMK
1883
- QnJhdGlzbGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwHhcNMDYw
1884
- MzIyMDEzOTM0WhcNMTYwMzIyMDEzOTM0WjBKMQswCQYDVQQGEwJTSzETMBEGA1UEBxMKQnJhdGlz
1885
- bGF2YTETMBEGA1UEChMKRGlzaWcgYS5zLjERMA8GA1UEAxMIQ0EgRGlzaWcwggEiMA0GCSqGSIb3
1886
- DQEBAQUAA4IBDwAwggEKAoIBAQCS9jHBfYj9mQGp2HvycXXxMcbzdWb6UShGhJd4NLxs/LxFWYgm
1887
- GErENx+hSkS943EE9UQX4j/8SFhvXJ56CbpRNyIjZkMhsDxkovhqFQ4/61HhVKndBpnXmjxUizkD
1888
- Pw/Fzsbrg3ICqB9x8y34dQjbYkzo+s7552oftms1grrijxaSfQUMbEYDXcDtab86wYqg6I7ZuUUo
1889
- hwjstMoVvoLdtUSLLa2GDGhibYVW8qwUYzrG0ZmsNHhWS8+2rT+MitcE5eN4TPWGqvWP+j1scaMt
1890
- ymfraHtuM6kMgiioTGohQBUgDCZbg8KpFhXAJIJdKxatymP2dACw30PEEGBWZ2NFAgMBAAGjgf8w
1891
- gfwwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUjbJJaJ1yCCW5wCf1UJNWSEZx+Y8wDgYDVR0P
1892
- AQH/BAQDAgEGMDYGA1UdEQQvMC2BE2Nhb3BlcmF0b3JAZGlzaWcuc2uGFmh0dHA6Ly93d3cuZGlz
1893
- aWcuc2svY2EwZgYDVR0fBF8wXTAtoCugKYYnaHR0cDovL3d3dy5kaXNpZy5zay9jYS9jcmwvY2Ff
1894
- ZGlzaWcuY3JsMCygKqAohiZodHRwOi8vY2EuZGlzaWcuc2svY2EvY3JsL2NhX2Rpc2lnLmNybDAa
1895
- BgNVHSAEEzARMA8GDSuBHpGT5goAAAABAQEwDQYJKoZIhvcNAQEFBQADggEBAF00dGFMrzvY/59t
1896
- WDYcPQuBDRIrRhCA/ec8J9B6yKm2fnQwM6M6int0wHl5QpNt/7EpFIKrIYwvF/k/Ji/1WcbvgAa3
1897
- mkkp7M5+cTxqEEHA9tOasnxakZzArFvITV734VP/Q3f8nktnbNfzg9Gg4H8l37iYC5oyOGwwoPP/
1898
- CBUz91BKez6jPiCp3C9WgArtQVCwyfTssuMmRAAOb54GvCKWU3BlxFAKRmukLyeBEicTXxChds6K
1899
- ezfqwzlhA5WYOudsiCUI/HloDYd9Yvi0X/vF2Ey9WLw/Q1vUHgFNPGO+I++MzVpQuGhU+QqZMxEA
1900
- 4Z7CRneC9VkGjCFMhwnN5ag=
1901
- -----END CERTIFICATE-----
1902
-
1903
  Juur-SK
1904
  =======
1905
  -----BEGIN CERTIFICATE-----
@@ -2361,7 +2280,7 @@ Zt3hrvJBW8qYVoNzcOSGGtIxQbovvi0TWnZvTuhOgQ4/WwMioBK+ZlgRSssDxLQqKi2WF+A5VLxI
2361
  -----END CERTIFICATE-----
2362
 
2363
  Certinomis - Autorité Racine
2364
- =============================
2365
  -----BEGIN CERTIFICATE-----
2366
  MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
2367
  Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
@@ -3756,7 +3675,7 @@ ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
3756
  -----END CERTIFICATE-----
3757
 
3758
  TÃœRKTRUST Elektronik Sertifika Hizmet SaÄŸlayıcısı H5
3759
- =========================================================
3760
  -----BEGIN CERTIFICATE-----
3761
  MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3762
  BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
@@ -3780,7 +3699,7 @@ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3780
  -----END CERTIFICATE-----
3781
 
3782
  TÃœRKTRUST Elektronik Sertifika Hizmet SaÄŸlayıcısı H6
3783
- =========================================================
3784
  -----BEGIN CERTIFICATE-----
3785
  MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
3786
  A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
@@ -3891,3 +3810,257 @@ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3891
  Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3892
  a/GRspBl9JrmkO5K
3893
  -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
+ ## Certificate data from Mozilla as of: Wed Nov 2 04:12:05 2016 GMT
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
8
  ## file (certdata.txt). This file can be found in the mozilla source tree:
9
+ ## https://hg.mozilla.org/releases/mozilla-release/raw-file/default/security/nss/lib/ckfw/builtins/certdata.txt
10
  ##
11
  ## It contains the certificates in PEM format and therefore
12
  ## can be directly used with curl / libcurl / php_curl, or with
13
  ## an Apache+mod_ssl webserver for SSL client authentication.
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
+ ## Conversion done with mk-ca-bundle.pl version 1.27.
17
+ ## SHA256: 17e2a90c8a5cfd6a675b3475d3d467e1ab1fe0d5397e907b08206182389caa08
18
  ##
19
 
20
 
629
  llpwrN9M
630
  -----END CERTIFICATE-----
631
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
632
  UTN USERFirst Hardware Root CA
633
  ==============================
634
  -----BEGIN CERTIFICATE-----
709
  t2d/AYoFWpO+ocH/+OcOZ6RHSXZddZAa9SaP8A==
710
  -----END CERTIFICATE-----
711
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
712
  XRamp Global CA Root
713
  ====================
714
  -----BEGIN CERTIFICATE-----
1764
  -----END CERTIFICATE-----
1765
 
1766
  NetLock Arany (Class Gold) FÅ‘tanúsítvány
1767
+ ========================================
1768
  -----BEGIN CERTIFICATE-----
1769
  MIIEFTCCAv2gAwIBAgIGSUEs5AAQMA0GCSqGSIb3DQEBCwUAMIGnMQswCQYDVQQGEwJIVTERMA8G
1770
  A1UEBwwIQnVkYXBlc3QxFTATBgNVBAoMDE5ldExvY2sgS2Z0LjE3MDUGA1UECwwuVGFuw7pzw610
1819
  66+KAQ==
1820
  -----END CERTIFICATE-----
1821
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1822
  Juur-SK
1823
  =======
1824
  -----BEGIN CERTIFICATE-----
2280
  -----END CERTIFICATE-----
2281
 
2282
  Certinomis - Autorité Racine
2283
+ ============================
2284
  -----BEGIN CERTIFICATE-----
2285
  MIIFnDCCA4SgAwIBAgIBATANBgkqhkiG9w0BAQUFADBjMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
2286
  Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxJjAkBgNVBAMMHUNlcnRpbm9taXMg
3675
  -----END CERTIFICATE-----
3676
 
3677
  TÃœRKTRUST Elektronik Sertifika Hizmet SaÄŸlayıcısı H5
3678
+ ====================================================
3679
  -----BEGIN CERTIFICATE-----
3680
  MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3681
  BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3699
  -----END CERTIFICATE-----
3700
 
3701
  TÃœRKTRUST Elektronik Sertifika Hizmet SaÄŸlayıcısı H6
3702
+ ====================================================
3703
  -----BEGIN CERTIFICATE-----
3704
  MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
3705
  A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
3810
  Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3811
  a/GRspBl9JrmkO5K
3812
  -----END CERTIFICATE-----
3813
+
3814
+ SZAFIR ROOT CA2
3815
+ ===============
3816
+ -----BEGIN CERTIFICATE-----
3817
+ MIIDcjCCAlqgAwIBAgIUPopdB+xV0jLVt+O2XwHrLdzk1uQwDQYJKoZIhvcNAQELBQAwUTELMAkG
3818
+ A1UEBhMCUEwxKDAmBgNVBAoMH0tyYWpvd2EgSXpiYSBSb3psaWN6ZW5pb3dhIFMuQS4xGDAWBgNV
3819
+ BAMMD1NaQUZJUiBST09UIENBMjAeFw0xNTEwMTkwNzQzMzBaFw0zNTEwMTkwNzQzMzBaMFExCzAJ
3820
+ BgNVBAYTAlBMMSgwJgYDVQQKDB9LcmFqb3dhIEl6YmEgUm96bGljemVuaW93YSBTLkEuMRgwFgYD
3821
+ VQQDDA9TWkFGSVIgUk9PVCBDQTIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC3vD5Q
3822
+ qEvNQLXOYeeWyrSh2gwisPq1e3YAd4wLz32ohswmUeQgPYUM1ljj5/QqGJ3a0a4m7utT3PSQ1hNK
3823
+ DJA8w/Ta0o4NkjrcsbH/ON7Dui1fgLkCvUqdGw+0w8LBZwPd3BucPbOw3gAeqDRHu5rr/gsUvTaE
3824
+ 2g0gv/pby6kWIK05YO4vdbbnl5z5Pv1+TW9NL++IDWr63fE9biCloBK0TXC5ztdyO4mTp4CEHCdJ
3825
+ ckm1/zuVnsHMyAHs6A6KCpbns6aH5db5BSsNl0BwPLqsdVqc1U2dAgrSS5tmS0YHF2Wtn2yIANwi
3826
+ ieDhZNRnvDF5YTy7ykHNXGoAyDw4jlivAgMBAAGjQjBAMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0P
3827
+ AQH/BAQDAgEGMB0GA1UdDgQWBBQuFqlKGLXLzPVvUPMjX/hd56zwyDANBgkqhkiG9w0BAQsFAAOC
3828
+ AQEAtXP4A9xZWx126aMqe5Aosk3AM0+qmrHUuOQn/6mWmc5G4G18TKI4pAZw8PRBEew/R40/cof5
3829
+ O/2kbytTAOD/OblqBw7rHRz2onKQy4I9EYKL0rufKq8h5mOGnXkZ7/e7DDWQw4rtTw/1zBLZpD67
3830
+ oPwglV9PJi8RI4NOdQcPv5vRtB3pEAT+ymCPoky4rc/hkA/NrgrHXXu3UNLUYfrVFdvXn4dRVOul
3831
+ 4+vJhaAlIDf7js4MNIThPIGyd05DpYhfhmehPea0XGG2Ptv+tyjFogeutcrKjSoS75ftwjCkySp6
3832
+ +/NNIxuZMzSgLvWpCz/UXeHPhJ/iGcJfitYgHuNztw==
3833
+ -----END CERTIFICATE-----
3834
+
3835
+ Certum Trusted Network CA 2
3836
+ ===========================
3837
+ -----BEGIN CERTIFICATE-----
3838
+ MIIF0jCCA7qgAwIBAgIQIdbQSk8lD8kyN/yqXhKN6TANBgkqhkiG9w0BAQ0FADCBgDELMAkGA1UE
3839
+ BhMCUEwxIjAgBgNVBAoTGVVuaXpldG8gVGVjaG5vbG9naWVzIFMuQS4xJzAlBgNVBAsTHkNlcnR1
3840
+ bSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEkMCIGA1UEAxMbQ2VydHVtIFRydXN0ZWQgTmV0d29y
3841
+ ayBDQSAyMCIYDzIwMTExMDA2MDgzOTU2WhgPMjA0NjEwMDYwODM5NTZaMIGAMQswCQYDVQQGEwJQ
3842
+ TDEiMCAGA1UEChMZVW5pemV0byBUZWNobm9sb2dpZXMgUy5BLjEnMCUGA1UECxMeQ2VydHVtIENl
3843
+ cnRpZmljYXRpb24gQXV0aG9yaXR5MSQwIgYDVQQDExtDZXJ0dW0gVHJ1c3RlZCBOZXR3b3JrIENB
3844
+ IDIwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC9+Xj45tWADGSdhhuWZGc/IjoedQF9
3845
+ 7/tcZ4zJzFxrqZHmuULlIEub2pt7uZld2ZuAS9eEQCsn0+i6MLs+CRqnSZXvK0AkwpfHp+6bJe+o
3846
+ CgCXhVqqndwpyeI1B+twTUrWwbNWuKFBOJvR+zF/j+Bf4bE/D44WSWDXBo0Y+aomEKsq09DRZ40b
3847
+ Rr5HMNUuctHFY9rnY3lEfktjJImGLjQ/KUxSiyqnwOKRKIm5wFv5HdnnJ63/mgKXwcZQkpsCLL2p
3848
+ uTRZCr+ESv/f/rOf69me4Jgj7KZrdxYq28ytOxykh9xGc14ZYmhFV+SQgkK7QtbwYeDBoz1mo130
3849
+ GO6IyY0XRSmZMnUCMe4pJshrAua1YkV/NxVaI2iJ1D7eTiew8EAMvE0Xy02isx7QBlrd9pPPV3WZ
3850
+ 9fqGGmd4s7+W/jTcvedSVuWz5XV710GRBdxdaeOVDUO5/IOWOZV7bIBaTxNyxtd9KXpEulKkKtVB
3851
+ Rgkg/iKgtlswjbyJDNXXcPiHUv3a76xRLgezTv7QCdpw75j6VuZt27VXS9zlLCUVyJ4ueE742pye
3852
+ hizKV/Ma5ciSixqClnrDvFASadgOWkaLOusm+iPJtrCBvkIApPjW/jAux9JG9uWOdf3yzLnQh1vM
3853
+ BhBgu4M1t15n3kfsmUjxpKEV/q2MYo45VU85FrmxY53/twIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3854
+ AQH/MB0GA1UdDgQWBBS2oVQ5AsOgP46KvPrU+Bym0ToO/TAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZI
3855
+ hvcNAQENBQADggIBAHGlDs7k6b8/ONWJWsQCYftMxRQXLYtPU2sQF/xlhMcQSZDe28cmk4gmb3DW
3856
+ Al45oPePq5a1pRNcgRRtDoGCERuKTsZPpd1iHkTfCVn0W3cLN+mLIMb4Ck4uWBzrM9DPhmDJ2vuA
3857
+ L55MYIR4PSFk1vtBHxgP58l1cb29XN40hz5BsA72udY/CROWFC/emh1auVbONTqwX3BNXuMp8SMo
3858
+ clm2q8KMZiYcdywmdjWLKKdpoPk79SPdhRB0yZADVpHnr7pH1BKXESLjokmUbOe3lEu6LaTaM4tM
3859
+ pkT/WjzGHWTYtTHkpjx6qFcL2+1hGsvxznN3Y6SHb0xRONbkX8eftoEq5IVIeVheO/jbAoJnwTnb
3860
+ w3RLPTYe+SmTiGhbqEQZIfCn6IENLOiTNrQ3ssqwGyZ6miUfmpqAnksqP/ujmv5zMnHCnsZy4Ypo
3861
+ J/HkD7TETKVhk/iXEAcqMCWpuchxuO9ozC1+9eB+D4Kob7a6bINDd82Kkhehnlt4Fj1F4jNy3eFm
3862
+ ypnTycUm/Q1oBEauttmbjL4ZvrHG8hnjXALKLNhvSgfZyTXaQHXyxKcZb55CEJh15pWLYLztxRLX
3863
+ is7VmFxWlgPF7ncGNf/P5O4/E2Hu29othfDNrp2yGAlFw5Khchf8R7agCyzxxN5DaAhqXzvwdmP7
3864
+ zAYspsbiDrW5viSP
3865
+ -----END CERTIFICATE-----
3866
+
3867
+ Hellenic Academic and Research Institutions RootCA 2015
3868
+ =======================================================
3869
+ -----BEGIN CERTIFICATE-----
3870
+ MIIGCzCCA/OgAwIBAgIBADANBgkqhkiG9w0BAQsFADCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcT
3871
+ BkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0
3872
+ aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNVBAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNl
3873
+ YXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIwMTUwHhcNMTUwNzA3MTAxMTIxWhcNNDAwNjMwMTAx
3874
+ MTIxWjCBpjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0aGVuczFEMEIGA1UEChM7SGVsbGVuaWMg
3875
+ QWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9ucyBDZXJ0LiBBdXRob3JpdHkxQDA+BgNV
3876
+ BAMTN0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgUm9vdENBIDIw
3877
+ MTUwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDC+Kk/G4n8PDwEXT2QNrCROnk8Zlrv
3878
+ bTkBSRq0t89/TSNTt5AA4xMqKKYx8ZEA4yjsriFBzh/a/X0SWwGDD7mwX5nh8hKDgE0GPt+sr+eh
3879
+ iGsxr/CL0BgzuNtFajT0AoAkKAoCFZVedioNmToUW/bLy1O8E00BiDeUJRtCvCLYjqOWXjrZMts+
3880
+ 6PAQZe104S+nfK8nNLspfZu2zwnI5dMK/IhlZXQK3HMcXM1AsRzUtoSMTFDPaI6oWa7CJ06CojXd
3881
+ FPQf/7J31Ycvqm59JCfnxssm5uX+Zwdj2EUN3TpZZTlYepKZcj2chF6IIbjV9Cz82XBST3i4vTwr
3882
+ i5WY9bPRaM8gFH5MXF/ni+X1NYEZN9cRCLdmvtNKzoNXADrDgfgXy5I2XdGj2HUb4Ysn6npIQf1F
3883
+ GQatJ5lOwXBH3bWfgVMS5bGMSF0xQxfjjMZ6Y5ZLKTBOhE5iGV48zpeQpX8B653g+IuJ3SWYPZK2
3884
+ fu/Z8VFRfS0myGlZYeCsargqNhEEelC9MoS+L9xy1dcdFkfkR2YgP/SWxa+OAXqlD3pk9Q0Yh9mu
3885
+ iNX6hME6wGkoLfINaFGq46V3xqSQDqE3izEjR8EJCOtu93ib14L8hCCZSRm2Ekax+0VVFqmjZayc
3886
+ Bw/qa9wfLgZy7IaIEuQt218FL+TwA9MmM+eAws1CoRc0CwIDAQABo0IwQDAPBgNVHRMBAf8EBTAD
3887
+ AQH/MA4GA1UdDwEB/wQEAwIBBjAdBgNVHQ4EFgQUcRVnyMjJvXVdctA4GGqd83EkVAswDQYJKoZI
3888
+ hvcNAQELBQADggIBAHW7bVRLqhBYRjTyYtcWNl0IXtVsyIe9tC5G8jH4fOpCtZMWVdyhDBKg2mF+
3889
+ D1hYc2Ryx+hFjtyp8iY/xnmMsVMIM4GwVhO+5lFc2JsKT0ucVlMC6U/2DWDqTUJV6HwbISHTGzrM
3890
+ d/K4kPFox/la/vot9L/J9UUbzjgQKjeKeaO04wlshYaT/4mWJ3iBj2fjRnRUjtkNaeJK9E10A/+y
3891
+ d+2VZ5fkscWrv2oj6NSU4kQoYsRL4vDY4ilrGnB+JGGTe08DMiUNRSQrlrRGar9KC/eaj8GsGsVn
3892
+ 82800vpzY4zvFrCopEYq+OsS7HK07/grfoxSwIuEVPkvPuNVqNxmsdnhX9izjFk0WaSrT2y7Hxjb
3893
+ davYy5LNlDhhDgcGH0tGEPEVvo2FXDtKK4F5D7Rpn0lQl033DlZdwJVqwjbDG2jJ9SrcR5q+ss7F
3894
+ Jej6A7na+RZukYT1HCjI/CbM1xyQVqdfbzoEvM14iQuODy+jqk+iGxI9FghAD/FGTNeqewjBCvVt
3895
+ J94Cj8rDtSvK6evIIVM4pcw72Hc3MKJP2W/R8kCtQXoXxdZKNYm3QdV8hn9VTYNKpXMgwDqvkPGa
3896
+ JI7ZjnHKe7iG2rKPmT4dEw0SEe7Uq/DpFXYC5ODfqiAeW2GFZECpkJcNrVPSWh2HagCXZWK0vm9q
3897
+ p/UsQu0yrbYhnr68
3898
+ -----END CERTIFICATE-----
3899
+
3900
+ Hellenic Academic and Research Institutions ECC RootCA 2015
3901
+ ===========================================================
3902
+ -----BEGIN CERTIFICATE-----
3903
+ MIICwzCCAkqgAwIBAgIBADAKBggqhkjOPQQDAjCBqjELMAkGA1UEBhMCR1IxDzANBgNVBAcTBkF0
3904
+ aGVuczFEMEIGA1UEChM7SGVsbGVuaWMgQWNhZGVtaWMgYW5kIFJlc2VhcmNoIEluc3RpdHV0aW9u
3905
+ cyBDZXJ0LiBBdXRob3JpdHkxRDBCBgNVBAMTO0hlbGxlbmljIEFjYWRlbWljIGFuZCBSZXNlYXJj
3906
+ aCBJbnN0aXR1dGlvbnMgRUNDIFJvb3RDQSAyMDE1MB4XDTE1MDcwNzEwMzcxMloXDTQwMDYzMDEw
3907
+ MzcxMlowgaoxCzAJBgNVBAYTAkdSMQ8wDQYDVQQHEwZBdGhlbnMxRDBCBgNVBAoTO0hlbGxlbmlj
3908
+ IEFjYWRlbWljIGFuZCBSZXNlYXJjaCBJbnN0aXR1dGlvbnMgQ2VydC4gQXV0aG9yaXR5MUQwQgYD
3909
+ VQQDEztIZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIEVDQyBSb290
3910
+ Q0EgMjAxNTB2MBAGByqGSM49AgEGBSuBBAAiA2IABJKgQehLgoRc4vgxEZmGZE4JJS+dQS8KrjVP
3911
+ dJWyUWRrjWvmP3CV8AVER6ZyOFB2lQJajq4onvktTpnvLEhvTCUp6NFxW98dwXU3tNf6e3pCnGoK
3912
+ Vlp8aQuqgAkkbH7BRqNCMEAwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0O
3913
+ BBYEFLQiC4KZJAEOnLvkDv2/+5cgk5kqMAoGCCqGSM49BAMCA2cAMGQCMGfOFmI4oqxiRaeplSTA
3914
+ GiecMjvAwNW6qef4BENThe5SId6d9SWDPp5YSy/XZxMOIQIwBeF1Ad5o7SofTUwJCA3sS61kFyjn
3915
+ dc5FZXIhF8siQQ6ME5g4mlRtm8rifOoCWCKR
3916
+ -----END CERTIFICATE-----
3917
+
3918
+ Certplus Root CA G1
3919
+ ===================
3920
+ -----BEGIN CERTIFICATE-----
3921
+ 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
3945
+ qsOR0C5CB8AMTVPNJLFMWx5R9N/pkvo=
3946
+ -----END CERTIFICATE-----
3947
+
3948
+ Certplus Root CA G2
3949
+ ===================
3950
+ -----BEGIN CERTIFICATE-----
3951
+ MIICHDCCAaKgAwIBAgISESDZkc6uo+jF5//pAq/Pc7xVMAoGCCqGSM49BAMDMD4xCzAJBgNVBAYT
3952
+ AkZSMREwDwYDVQQKDAhDZXJ0cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjAeFw0x
3953
+ NDA1MjYwMDAwMDBaFw0zODAxMTUwMDAwMDBaMD4xCzAJBgNVBAYTAkZSMREwDwYDVQQKDAhDZXJ0
3954
+ cGx1czEcMBoGA1UEAwwTQ2VydHBsdXMgUm9vdCBDQSBHMjB2MBAGByqGSM49AgEGBSuBBAAiA2IA
3955
+ BM0PW1aC3/BFGtat93nwHcmsltaeTpwftEIRyoa/bfuFo8XlGVzX7qY/aWfYeOKmycTbLXku54uN
3956
+ Am8xIk0G42ByRZ0OQneezs/lf4WbGOT8zC5y0xaTTsqZY1yhBSpsBqNjMGEwDgYDVR0PAQH/BAQD
3957
+ AgEGMA8GA1UdEwEB/wQFMAMBAf8wHQYDVR0OBBYEFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMB8GA1Ud
3958
+ IwQYMBaAFNqDYwJ5jtpMxjwjFNiPwyCrKGBZMAoGCCqGSM49BAMDA2gAMGUCMHD+sAvZ94OX7PNV
3959
+ HdTcswYO/jOYnYs5kGuUIe22113WTNchp+e/IQ8rzfcq3IUHnQIxAIYUFuXcsGXCwI4Un78kFmjl
3960
+ vPl5adytRSv3tjFzzAalU5ORGpOucGpnutee5WEaXw==
3961
+ -----END CERTIFICATE-----
3962
+
3963
+ OpenTrust Root CA G1
3964
+ ====================
3965
+ -----BEGIN CERTIFICATE-----
3966
+ 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
3990
+ OXXUc0ECd97N4EOH1uS6SsNsEn/+KuYj1oxx
3991
+ -----END CERTIFICATE-----
3992
+
3993
+ OpenTrust Root CA G2
3994
+ ====================
3995
+ -----BEGIN CERTIFICATE-----
3996
+ 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
4020
+ u7JwqkwR3v98KzfUetF3NI/n+UL3PIEMS1IK
4021
+ -----END CERTIFICATE-----
4022
+
4023
+ OpenTrust Root CA G3
4024
+ ====================
4025
+ -----BEGIN CERTIFICATE-----
4026
+ MIICITCCAaagAwIBAgISESDm+Ez8JLC+BUCs2oMbNGA/MAoGCCqGSM49BAMDMEAxCzAJBgNVBAYT
4027
+ AkZSMRIwEAYDVQQKDAlPcGVuVHJ1c3QxHTAbBgNVBAMMFE9wZW5UcnVzdCBSb290IENBIEczMB4X
4028
+ DTE0MDUyNjAwMDAwMFoXDTM4MDExNTAwMDAwMFowQDELMAkGA1UEBhMCRlIxEjAQBgNVBAoMCU9w
4029
+ ZW5UcnVzdDEdMBsGA1UEAwwUT3BlblRydXN0IFJvb3QgQ0EgRzMwdjAQBgcqhkjOPQIBBgUrgQQA
4030
+ IgNiAARK7liuTcpm3gY6oxH84Bjwbhy6LTAMidnW7ptzg6kjFYwvWYpa3RTqnVkrQ7cG7DK2uu5B
4031
+ ta1doYXM6h0UZqNnfkbilPPntlahFVmhTzeXuSIevRHr9LIfXsMUmuXZl5mjYzBhMA4GA1UdDwEB
4032
+ /wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAf
4033
+ BgNVHSMEGDAWgBRHd8MUi2I5DMlv4VBN0BBY3JWIbTAKBggqhkjOPQQDAwNpADBmAjEAj6jcnboM
4034
+ BBf6Fek9LykBl7+BFjNAk2z8+e2AcG+qj9uEwov1NcoG3GRvaBbhj5G5AjEA2Euly8LQCGzpGPta
4035
+ 3U1fJAuwACEl74+nBCZx4nxp5V2a+EEfOzmTk51V6s2N8fvB
4036
+ -----END CERTIFICATE-----
4037
+
4038
+ ISRG Root X1
4039
+ ============
4040
+ -----BEGIN CERTIFICATE-----
4041
+ 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
4065
+ m+kXQ99b21/+jh5Xos1AnX5iItreGCc=
4066
+ -----END CERTIFICATE-----
includes/mollie/wc/gateway/abstract.php CHANGED
@@ -61,9 +61,12 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
61
  $this->_initIcon();
62
  $this->_initMinMaxAmount();
63
 
 
 
 
 
64
  add_action('woocommerce_api_' . $this->id, array($this, 'webhookAction'));
65
  add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
66
- add_action('woocommerce_thankyou_' . $this->id, array($this, 'thankyou_page'));
67
  add_action('woocommerce_email_after_order_table', array($this, 'displayInstructions'), 10, 3);
68
 
69
  if (!$this->isValidForUse())
@@ -146,14 +149,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
146
 
147
  protected function _initDescription ()
148
  {
149
- $description = '';
150
-
151
- if (Mollie_WC_Plugin::getSettingsHelper()->isTestModeEnabled())
152
- {
153
- $description .= '<strong>' . __('Test mode enabled.', 'mollie-payments-for-woocommerce') . '</strong><br/>';
154
- }
155
-
156
- $description .= $this->get_option('description');
157
 
158
  $this->description = $description;
159
  }
@@ -304,44 +300,11 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
304
  $settings_helper = Mollie_WC_Plugin::getSettingsHelper();
305
 
306
  // Is test mode enabled?
307
- $test_mode = $settings_helper->isTestModeEnabled();
308
-
309
- $payment_description = $settings_helper->getPaymentDescription();
310
- $payment_locale = $settings_helper->getPaymentLocale();
311
- $mollie_method = $this->getMollieMethodId();
312
- $selected_issuer = $this->getSelectedIssuer();
313
- $return_url = $this->getReturnUrl($order);
314
- $webhook_url = $this->getWebhookUrl($order);
315
- $customer_id = Mollie_WC_Plugin::getDataHelper()->getUserMollieCustomerId($order->customer_user, $test_mode);
316
 
317
- $payment_description = strtr($payment_description, array(
318
- '{order_number}' => $order->get_order_number(),
319
- '{order_date}' => date_i18n(wc_date_format(), strtotime($order->order_date)),
320
- ));
321
-
322
- $data = array_filter(array(
323
- 'amount' => $order->get_total(),
324
- 'description' => $payment_description,
325
- 'redirectUrl' => $return_url,
326
- 'webhookUrl' => $webhook_url,
327
- 'method' => $mollie_method,
328
- 'issuer' => $selected_issuer,
329
- 'locale' => $payment_locale,
330
- 'billingAddress' => $order->billing_address_1,
331
- 'billingCity' => $order->billing_city,
332
- 'billingRegion' => $order->billing_state,
333
- 'billingPostal' => $order->billing_postcode,
334
- 'billingCountry' => $order->billing_country,
335
- 'shippingAddress' => $order->shipping_address_1,
336
- 'shippingCity' => $order->shipping_city,
337
- 'shippingRegion' => $order->shipping_state,
338
- 'shippingPostal' => $order->shipping_postcode,
339
- 'shippingCountry' => $order->shipping_country,
340
- 'metadata' => array(
341
- 'order_id' => $order->id,
342
- ),
343
- 'customerId' => $customer_id,
344
- ));
345
 
346
  $data = apply_filters('woocommerce_' . $this->id . '_args', $data, $order);
347
 
@@ -368,11 +331,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
368
  $payment = Mollie_WC_Plugin::getApiHelper()->getApiClient($test_mode)->payments->create($data);
369
  }
370
 
371
- // Set active Mollie payment
372
- Mollie_WC_Plugin::getDataHelper()->setActiveMolliePayment($order->id, $payment);
373
-
374
- // Set Mollie customer
375
- Mollie_WC_Plugin::getDataHelper()->setUserMollieCustomerId($order->customer_user, $payment->customerId);
376
 
377
  do_action(Mollie_WC_Plugin::PLUGIN_ID . '_payment_created', $payment, $order);
378
 
@@ -393,10 +352,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
393
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
394
  ));
395
 
396
- // Empty cart
397
- WC()->cart->empty_cart();
398
-
399
- Mollie_WC_Plugin::debug("Cart emptied, redirect user to payment URL: {$payment->getPaymentUrl()}");
400
 
401
  return array(
402
  'result' => 'success',
@@ -421,6 +377,78 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
421
  return array('result' => 'failure');
422
  }
423
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
424
  /**
425
  * Redirect location after successfully completing process_payment
426
  *
@@ -474,6 +502,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
474
  }
475
  }
476
 
 
477
  public function webhookAction ()
478
  {
479
  // Webhook test by Mollie
@@ -540,7 +569,8 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
540
  }
541
 
542
  // Payment requires different gateway, payment method changed on Mollie platform?
543
- if ($payment->method != $this->getMollieMethodId())
 
544
  {
545
  Mollie_WC_Plugin::setHttpResponseCode(400);
546
  Mollie_WC_Plugin::debug($this->id . ": Invalid gateway. This gateways can process Mollie " . $this->getMollieMethodId() . " payments. This payment has payment method " . $payment->method, true);
@@ -550,9 +580,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
550
  // Order does not need a payment
551
  if (!$this->orderNeedsPayment($order))
552
  {
553
- // Duplicate webhook call
554
- Mollie_WC_Plugin::setHttpResponseCode(204);
555
- Mollie_WC_Plugin::debug($this->id . ": Order $order_id does not need a payment (payment webhook {$payment->id}).", true);
556
  return;
557
  }
558
 
@@ -578,11 +606,33 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
578
  // Status 200
579
  }
580
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
581
  /**
582
  * @param Wc_Order $order
583
  * @param Mollie_API_Object_Payment $payment
584
  */
585
- protected function onWebhookPaid (Wc_Order $order, Mollie_API_Object_Payment $payment)
586
  {
587
  Mollie_WC_Plugin::debug(__METHOD__ . ' called.');
588
 
@@ -598,19 +648,34 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
598
  $order->payment_complete();
599
  }
600
 
 
601
  $order->add_order_note(sprintf(
602
  /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
603
  __('Order completed using %s payment (%s).', 'mollie-payments-for-woocommerce'),
604
- $this->method_title,
605
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
606
  ));
607
  }
608
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
609
  /**
610
  * @param Wc_Order $order
611
  * @param Mollie_API_Object_Payment $payment
612
  */
613
- protected function onWebhookCancelled (Wc_Order $order, Mollie_API_Object_Payment $payment)
614
  {
615
  Mollie_WC_Plugin::debug(__METHOD__ . ' called.');
616
 
@@ -631,11 +696,13 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
631
  // Reset state
632
  $this->updateOrderStatus($order, $new_order_status);
633
 
 
 
634
  // User cancelled payment on Mollie or issuer page, add a cancel note.. do not cancel order.
635
  $order->add_order_note(sprintf(
636
  /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
637
  __('%s payment cancelled (%s).', 'mollie-payments-for-woocommerce'),
638
- $this->method_title,
639
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
640
  ));
641
  }
@@ -644,7 +711,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
644
  * @param Wc_Order $order
645
  * @param Mollie_API_Object_Payment $payment
646
  */
647
- protected function onWebhookExpired (Wc_Order $order, Mollie_API_Object_Payment $payment)
648
  {
649
  Mollie_WC_Plugin::debug(__METHOD__ . ' called.');
650
 
@@ -660,10 +727,12 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
660
  // Cancel order
661
  $this->updateOrderStatus($order, $new_order_status);
662
 
 
 
663
  $order->add_order_note(sprintf(
664
  /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
665
  __('%s payment expired (%s).', 'mollie-payments-for-woocommerce'),
666
- $this->method_title,
667
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
668
  ));
669
  }
@@ -672,7 +741,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
672
  * @param WC_Order $order
673
  * @return string
674
  */
675
- public function getReturnRedirectUrlForOrder (WC_Order $order)
676
  {
677
  $data_helper = Mollie_WC_Plugin::getDataHelper();
678
 
@@ -784,6 +853,11 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
784
  return;
785
  }
786
 
 
 
 
 
 
787
  // Same as email instructions, just run that
788
  $this->displayInstructions($order, $admin_instructions = false, $plain_text = false);
789
  }
@@ -888,7 +962,7 @@ abstract class Mollie_WC_Gateway_Abstract extends WC_Payment_Gateway
888
  /**
889
  * @return Mollie_API_Object_Method|null
890
  */
891
- public function getMollieMethod ()
892
  {
893
  try
894
  {
61
  $this->_initIcon();
62
  $this->_initMinMaxAmount();
63
 
64
+ if(!has_action('woocommerce_thankyou_' . $this->id)) {
65
+ add_action('woocommerce_thankyou_' . $this->id, array($this, 'thankyou_page'));
66
+ }
67
+
68
  add_action('woocommerce_api_' . $this->id, array($this, 'webhookAction'));
69
  add_action('woocommerce_update_options_payment_gateways_' . $this->id, array($this, 'process_admin_options'));
 
70
  add_action('woocommerce_email_after_order_table', array($this, 'displayInstructions'), 10, 3);
71
 
72
  if (!$this->isValidForUse())
149
 
150
  protected function _initDescription ()
151
  {
152
+ $description = $this->get_option('description', '');
 
 
 
 
 
 
 
153
 
154
  $this->description = $description;
155
  }
300
  $settings_helper = Mollie_WC_Plugin::getSettingsHelper();
301
 
302
  // Is test mode enabled?
303
+ $test_mode = $settings_helper->isTestModeEnabled();
304
+ $customer_id = $this->getUserMollieCustomerId($order,$test_mode);
305
+ $paymentRequestData = $this->getPaymentRequestData($order, $customer_id);
 
 
 
 
 
 
306
 
307
+ $data = array_filter($paymentRequestData);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
308
 
309
  $data = apply_filters('woocommerce_' . $this->id . '_args', $data, $order);
310
 
331
  $payment = Mollie_WC_Plugin::getApiHelper()->getApiClient($test_mode)->payments->create($data);
332
  }
333
 
334
+ $this->saveMollieInfo($order, $payment);
 
 
 
 
335
 
336
  do_action(Mollie_WC_Plugin::PLUGIN_ID . '_payment_created', $payment, $order);
337
 
352
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
353
  ));
354
 
355
+ Mollie_WC_Plugin::debug("Redirect user to payment URL: {$payment->getPaymentUrl()}");
 
 
 
356
 
357
  return array(
358
  'result' => 'success',
377
  return array('result' => 'failure');
378
  }
379
 
380
+ /**
381
+ * @param $order
382
+ * @param $payment
383
+ */
384
+ protected function saveMollieInfo($order, $payment)
385
+ {
386
+ // Set active Mollie payment
387
+ Mollie_WC_Plugin::getDataHelper()->setActiveMolliePayment($order->id, $payment);
388
+
389
+ // Set Mollie customer
390
+ Mollie_WC_Plugin::getDataHelper()->setUserMollieCustomerId($order->customer_user, $payment->customerId);
391
+ }
392
+
393
+ /**
394
+ * @param $order
395
+ * @param $customer_id
396
+ * @return array
397
+ */
398
+ protected function getPaymentRequestData($order, $customer_id)
399
+ {
400
+ $settings_helper = Mollie_WC_Plugin::getSettingsHelper();
401
+ $payment_description = $settings_helper->getPaymentDescription();
402
+ $payment_locale = $settings_helper->getPaymentLocale();
403
+ $mollie_method = $this->getMollieMethodId();
404
+ $selected_issuer = $this->getSelectedIssuer();
405
+ $return_url = $this->getReturnUrl($order);
406
+ $webhook_url = $this->getWebhookUrl($order);
407
+
408
+
409
+ $payment_description = strtr($payment_description, array(
410
+ '{order_number}' => $order->get_order_number(),
411
+ '{order_date}' => date_i18n(wc_date_format(), strtotime($order->order_date)),
412
+ ));
413
+
414
+ $paymentRequestData = array(
415
+ 'amount' => $order->get_total(),
416
+ 'description' => $payment_description,
417
+ 'redirectUrl' => $return_url,
418
+ 'webhookUrl' => $webhook_url,
419
+ 'method' => $mollie_method,
420
+ 'issuer' => $selected_issuer,
421
+ 'locale' => $payment_locale,
422
+ 'billingAddress' => $order->billing_address_1,
423
+ 'billingCity' => $order->billing_city,
424
+ 'billingRegion' => $order->billing_state,
425
+ 'billingPostal' => $order->billing_postcode,
426
+ 'billingCountry' => $order->billing_country,
427
+ 'shippingAddress' => $order->shipping_address_1,
428
+ 'shippingCity' => $order->shipping_city,
429
+ 'shippingRegion' => $order->shipping_state,
430
+ 'shippingPostal' => $order->shipping_postcode,
431
+ 'shippingCountry' => $order->shipping_country,
432
+ 'metadata' => array(
433
+ 'order_id' => $order->id,
434
+ ),
435
+ 'customerId' => $customer_id,
436
+ );
437
+
438
+ return $paymentRequestData;
439
+
440
+ }
441
+
442
+ /**
443
+ * @param $order
444
+ * @param $test_mode
445
+ * @return null|string
446
+ */
447
+ protected function getUserMollieCustomerId($order, $test_mode)
448
+ {
449
+ return Mollie_WC_Plugin::getDataHelper()->getUserMollieCustomerId($order->customer_user, $test_mode);
450
+ }
451
+
452
  /**
453
  * Redirect location after successfully completing process_payment
454
  *
502
  }
503
  }
504
 
505
+
506
  public function webhookAction ()
507
  {
508
  // Webhook test by Mollie
569
  }
570
 
571
  // Payment requires different gateway, payment method changed on Mollie platform?
572
+ $isValidPaymentMethod = $this->isValidPaymentMethod($payment);
573
+ if (!$isValidPaymentMethod)
574
  {
575
  Mollie_WC_Plugin::setHttpResponseCode(400);
576
  Mollie_WC_Plugin::debug($this->id . ": Invalid gateway. This gateways can process Mollie " . $this->getMollieMethodId() . " payments. This payment has payment method " . $payment->method, true);
580
  // Order does not need a payment
581
  if (!$this->orderNeedsPayment($order))
582
  {
583
+ $this->handlePayedOrderWebhook($order, $payment);
 
 
584
  return;
585
  }
586
 
606
  // Status 200
607
  }
608
 
609
+ /**
610
+ * @param $order
611
+ * @param $payment
612
+ */
613
+ protected function handlePayedOrderWebhook($order, $payment)
614
+ {
615
+ // Duplicate webhook call
616
+ Mollie_WC_Plugin::setHttpResponseCode(204);
617
+ Mollie_WC_Plugin::debug($this->id . ": Order $order->id does not need a payment (payment webhook {$payment->id}).", true);
618
+
619
+ }
620
+
621
+ /**
622
+ * @param $payment
623
+ * @return bool
624
+ */
625
+ protected function isValidPaymentMethod($payment)
626
+ {
627
+ $isValidPaymentMethod = $payment->method == $this->getMollieMethodId();
628
+ return $isValidPaymentMethod;
629
+ }
630
+
631
  /**
632
  * @param Wc_Order $order
633
  * @param Mollie_API_Object_Payment $payment
634
  */
635
+ protected function onWebhookPaid(Wc_Order $order, Mollie_API_Object_Payment $payment)
636
  {
637
  Mollie_WC_Plugin::debug(__METHOD__ . ' called.');
638
 
648
  $order->payment_complete();
649
  }
650
 
651
+ $paymentMethodTitle = $this->getPaymentMethodTitle($payment);
652
  $order->add_order_note(sprintf(
653
  /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
654
  __('Order completed using %s payment (%s).', 'mollie-payments-for-woocommerce'),
655
+ $paymentMethodTitle,
656
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
657
  ));
658
  }
659
 
660
+ /**
661
+ * @param $payment
662
+ * @return string
663
+ */
664
+ protected function getPaymentMethodTitle($payment)
665
+ {
666
+ $paymentMethodTitle = '';
667
+ if ($payment->method == $this->getMollieMethodId()){
668
+ $paymentMethodTitle = $this->method_title;
669
+ }
670
+ return $paymentMethodTitle;
671
+ }
672
+
673
+
674
  /**
675
  * @param Wc_Order $order
676
  * @param Mollie_API_Object_Payment $payment
677
  */
678
+ protected function onWebhookCancelled(Wc_Order $order, Mollie_API_Object_Payment $payment)
679
  {
680
  Mollie_WC_Plugin::debug(__METHOD__ . ' called.');
681
 
696
  // Reset state
697
  $this->updateOrderStatus($order, $new_order_status);
698
 
699
+ $paymentMethodTitle = $this->getPaymentMethodTitle($payment);
700
+
701
  // User cancelled payment on Mollie or issuer page, add a cancel note.. do not cancel order.
702
  $order->add_order_note(sprintf(
703
  /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
704
  __('%s payment cancelled (%s).', 'mollie-payments-for-woocommerce'),
705
+ $paymentMethodTitle,
706
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
707
  ));
708
  }
711
  * @param Wc_Order $order
712
  * @param Mollie_API_Object_Payment $payment
713
  */
714
+ protected function onWebhookExpired(Wc_Order $order, Mollie_API_Object_Payment $payment)
715
  {
716
  Mollie_WC_Plugin::debug(__METHOD__ . ' called.');
717
 
727
  // Cancel order
728
  $this->updateOrderStatus($order, $new_order_status);
729
 
730
+ $paymentMethodTitle = $this->getPaymentMethodTitle($payment);
731
+
732
  $order->add_order_note(sprintf(
733
  /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
734
  __('%s payment expired (%s).', 'mollie-payments-for-woocommerce'),
735
+ $paymentMethodTitle,
736
  $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
737
  ));
738
  }
741
  * @param WC_Order $order
742
  * @return string
743
  */
744
+ public function getReturnRedirectUrlForOrder(WC_Order $order)
745
  {
746
  $data_helper = Mollie_WC_Plugin::getDataHelper();
747
 
853
  return;
854
  }
855
 
856
+ // Empty cart
857
+ if (WC()->cart) {
858
+ WC()->cart->empty_cart();
859
+ }
860
+
861
  // Same as email instructions, just run that
862
  $this->displayInstructions($order, $admin_instructions = false, $plain_text = false);
863
  }
962
  /**
963
  * @return Mollie_API_Object_Method|null
964
  */
965
+ public function getMollieMethod()
966
  {
967
  try
968
  {
includes/mollie/wc/gateway/abstractseparecurring.php ADDED
@@ -0,0 +1,207 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ abstract class Mollie_WC_Gateway_AbstractSepaRecurring extends Mollie_WC_Gateway_AbstractSubscription
3
+ {
4
+
5
+ const WAITING_CONFIRMATION_PERIOD_DAYS = '15';
6
+
7
+ protected $recurringMollieMethod = null;
8
+
9
+
10
+ /**
11
+ * Mollie_WC_Gateway_AbstractSepaRecurring constructor.
12
+ */
13
+ public function __construct ()
14
+ {
15
+ parent::__construct();
16
+ $directDebit = new Mollie_WC_Gateway_DirectDebit();
17
+ if ($directDebit->is_available()) {
18
+ $this->initSubscriptionSupport();
19
+ $this->recurringMollieMethod = $directDebit;
20
+ }
21
+ return $this;
22
+ }
23
+
24
+ /**
25
+ * @return string
26
+ */
27
+ protected function getRecurringMollieMethodId()
28
+ {
29
+ $result = null;
30
+ if ($this->recurringMollieMethod){
31
+ $result = $this->recurringMollieMethod->getMollieMethodId();
32
+ }
33
+
34
+ return $result;
35
+ }
36
+
37
+ /**
38
+ * @return string
39
+ */
40
+ protected function getRecurringMollieMethodTitle()
41
+ {
42
+ $result = null;
43
+ if ($this->recurringMollieMethod){
44
+ $result = $this->recurringMollieMethod->getDefaultTitle();
45
+ }
46
+
47
+ return $result;
48
+ }
49
+
50
+ /**
51
+ * @param $renewal_order
52
+ * @param $initial_order_status
53
+ * @param $payment
54
+ */
55
+ protected function _updateScheduledPaymentOrder($renewal_order, $initial_order_status, $payment)
56
+ {
57
+ $this->updateOrderStatus(
58
+ $renewal_order,
59
+ self::STATUS_COMPLETED,
60
+ __("Awaiting payment confirmation. For %s Days", 'mollie-payments-for-woocommerce') . "\n",
61
+ self::WAITING_CONFIRMATION_PERIOD_DAYS
62
+ );
63
+
64
+ $paymentMethodTitle = $this->getPaymentMethodTitle($payment);
65
+
66
+ $renewal_order->add_order_note(sprintf(
67
+ /* translators: Placeholder 1: Payment method title, placeholder 2: payment ID */
68
+ __('%s payment started (%s).', 'mollie-payments-for-woocommerce'),
69
+ $paymentMethodTitle,
70
+ $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
71
+ ));
72
+
73
+ $this->addPendingPaymentOrder($renewal_order);
74
+ }
75
+
76
+ /**
77
+ * @param $renewal_order
78
+ */
79
+ protected function addPendingPaymentOrder($renewal_order)
80
+ {
81
+ global $wpdb;
82
+
83
+ $confirmationDate = new DateTime();
84
+ $period = 'P'.self::WAITING_CONFIRMATION_PERIOD_DAYS . 'D';
85
+ $confirmationDate->add(new DateInterval($period));
86
+
87
+ $wpdb->insert(
88
+ $wpdb->mollie_pending_payment,
89
+ array(
90
+ 'post_id' => $renewal_order->id,
91
+ 'expired_time' => $confirmationDate->getTimestamp(),
92
+ )
93
+ );
94
+ }
95
+
96
+ /**
97
+ * @param $order
98
+ */
99
+ protected function deleteOrderFromPendingPaymentQueue($order)
100
+ {
101
+ global $wpdb;
102
+ $wpdb->delete(
103
+ $wpdb->mollie_pending_payment,
104
+ array(
105
+ 'post_id' => $order->id,
106
+ )
107
+ );
108
+ }
109
+
110
+ /**
111
+ * @param WC_Order $order
112
+ * @param Mollie_API_Object_Payment $payment
113
+ */
114
+ protected function onWebhookPaid(WC_Order $order, Mollie_API_Object_Payment $payment)
115
+ {
116
+ parent::onWebhookPaid($order, $payment);
117
+ if ($this->is_subscription($order->id)) {
118
+ $this->deleteOrderFromPendingPaymentQueue($order);
119
+ }
120
+ }
121
+
122
+ /**
123
+ * @param WC_Order $order
124
+ * @param Mollie_API_Object_Payment $payment
125
+ */
126
+ protected function onWebhookCancelled(WC_Order $order, Mollie_API_Object_Payment $payment)
127
+ {
128
+ parent::onWebhookCancelled($order, $payment);
129
+
130
+ if ($this->is_subscription($order->id)) {
131
+ $this->deleteOrderFromPendingPaymentQueue($order);
132
+ }
133
+ }
134
+
135
+ /**
136
+ * @param WC_Order $order
137
+ * @param Mollie_API_Object_Payment $payment
138
+ */
139
+ protected function onWebhookExpired(WC_Order $order, Mollie_API_Object_Payment $payment)
140
+ {
141
+ parent::onWebhookExpired($order, $payment);
142
+
143
+ if ($this->is_subscription($order->id)) {
144
+ $this->deleteOrderFromPendingPaymentQueue($order);
145
+ }
146
+ }
147
+
148
+ /**
149
+ * @param null $payment
150
+ * @return string
151
+ */
152
+ protected function getPaymentMethodTitle($payment)
153
+ {
154
+ $paymentMethodTitle = parent::getPaymentMethodTitle($payment);
155
+ $orderId = $payment->metadata->order_id;
156
+ if ($orderId && $this->is_subscription($orderId) && $payment->method == $this->getRecurringMollieMethodId()){
157
+ $paymentMethodTitle = $this->getRecurringMollieMethodTitle();
158
+ }
159
+
160
+ return $paymentMethodTitle;
161
+ }
162
+
163
+ /**
164
+ * @param $order
165
+ * @param $payment
166
+ */
167
+ protected function handlePayedOrderWebhook($order, $payment)
168
+ {
169
+ // Duplicate webhook call
170
+ if ($this->is_subscription($order->id) && isset($payment->recurringType) && $payment->recurringType == 'recurring') {
171
+ $paymentMethodTitle = $this->getPaymentMethodTitle($payment);
172
+
173
+ $order->add_order_note(sprintf(
174
+ /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
175
+ __('Order completed using %s payment (%s).', 'mollie-payments-for-woocommerce'),
176
+ $paymentMethodTitle,
177
+ $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
178
+ ));
179
+
180
+ $this->deleteOrderFromPendingPaymentQueue($order);
181
+ return;
182
+ }
183
+
184
+ parent::handlePayedOrderWebhook($order, $payment);
185
+
186
+ }
187
+
188
+ /**
189
+ * @param $payment
190
+ * @return bool
191
+ */
192
+ protected function isValidPaymentMethod($payment)
193
+ {
194
+ $isValidPaymentMethod = parent::isValidPaymentMethod($payment);
195
+ $orderId = $payment->metadata->order_id;
196
+
197
+ // First payment was made by one gateway, and the next from another.
198
+ // For Example Recurring First with IDEAL, the second With Sepa Direct Debit
199
+ if ($orderId && $this->is_subscription($orderId)){
200
+ $isValidPaymentMethod = in_array($payment->method, array($this->getMollieMethodId(),$this->getRecurringMollieMethodId()));
201
+ }
202
+
203
+ return $isValidPaymentMethod;
204
+ }
205
+
206
+
207
+ }
includes/mollie/wc/gateway/abstractsubscription.php ADDED
@@ -0,0 +1,495 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ abstract class Mollie_WC_Gateway_AbstractSubscription extends Mollie_WC_Gateway_Abstract
3
+ {
4
+
5
+ const PAYMENT_TEST_MODE = 'test';
6
+
7
+ protected $isSubscriptionPayment = false;
8
+ /**
9
+ * Mollie_WC_Gateway_AbstractSubscription constructor.
10
+ */
11
+ public function __construct ()
12
+ {
13
+ parent::__construct();
14
+
15
+
16
+ if ( class_exists( 'WC_Subscriptions_Order' ) ) {
17
+ add_action( 'woocommerce_scheduled_subscription_payment_' . $this->id, array( $this, 'scheduled_subscription_payment' ), 10, 2 );
18
+ add_action( 'wcs_resubscribe_order_created', array( $this, 'delete_resubscribe_meta' ), 10 );
19
+ add_action( 'wcs_renewal_order_created', array( $this, 'delete_renewal_meta' ), 10 );
20
+ add_action( 'woocommerce_subscription_failing_payment_method_updated_mollie', array( $this, 'update_failing_payment_method' ), 10, 2 );
21
+
22
+ add_filter( 'woocommerce_subscription_payment_meta', array( $this, 'add_subscription_payment_meta' ), 10, 2 );
23
+ add_filter( 'woocommerce_subscription_validate_payment_meta', array( $this, 'validate_subscription_payment_meta' ), 10, 2 );
24
+ }
25
+ }
26
+
27
+ /**
28
+ *
29
+ */
30
+ protected function initSubscriptionSupport()
31
+ {
32
+ $supportSubscriptions = array(
33
+ 'subscriptions',
34
+ 'subscription_suspension',
35
+ 'subscription_reactivation',
36
+ 'subscription_cancellation',
37
+ 'subscription_date_changes',
38
+ 'multiple_subscriptions',
39
+ );
40
+
41
+ $this->supports = array_merge($this->supports,$supportSubscriptions);
42
+ }
43
+
44
+
45
+ /**
46
+ * @param $order_id
47
+ * @return array
48
+ * @throws Mollie_WC_Exception_InvalidApiKey
49
+ */
50
+ public function process_subscription_payment( $order_id ) {
51
+ $this->isSubscriptionPayment = true;
52
+ return parent::process_payment($order_id);
53
+ }
54
+
55
+ /**
56
+ * @param $order
57
+ * @param $customer_id
58
+ * @return array
59
+ */
60
+ protected function getPaymentRequestData($order, $customer_id)
61
+ {
62
+ $paymentRequestData = parent::getPaymentRequestData($order, $customer_id);
63
+ if ($this->isSubscriptionPayment){
64
+ $paymentRequestData['recurringType'] = 'first';
65
+ }
66
+ return $paymentRequestData;
67
+ }
68
+
69
+ /**
70
+ * @param $order
71
+ * @param $customer_id
72
+ * @return array
73
+ */
74
+ protected function getRecurringPaymentRequestData($order, $customer_id)
75
+ {
76
+ $settings_helper = Mollie_WC_Plugin::getSettingsHelper();
77
+ $payment_description = $settings_helper->getPaymentDescription();
78
+ $payment_locale = $settings_helper->getPaymentLocale();
79
+ $mollie_method = $this->getMollieMethodId();
80
+ $selected_issuer = $this->getSelectedIssuer();
81
+ $return_url = $this->getReturnUrl($order);
82
+ $webhook_url = $this->getWebhookUrl($order);
83
+
84
+ $payment_description = strtr($payment_description, array(
85
+ '{order_number}' => $order->get_order_number(),
86
+ '{order_date}' => date_i18n(wc_date_format(), strtotime($order->order_date)),
87
+ ));
88
+
89
+ $data = array_filter(array(
90
+ 'amount' => $order->get_total(),
91
+ 'description' => $payment_description,
92
+ 'redirectUrl' => $return_url,
93
+ 'webhookUrl' => $webhook_url,
94
+ 'method' => $mollie_method,
95
+ 'issuer' => $selected_issuer,
96
+ 'locale' => $payment_locale,
97
+ 'metadata' => array(
98
+ 'order_id' => $order->id,
99
+ ),
100
+ 'recurringType' => 'recurring',
101
+ 'customerId' => $customer_id,
102
+ ));
103
+ return $data;
104
+ }
105
+
106
+ /**
107
+ * @param $order
108
+ * @param $payment
109
+ */
110
+ protected function saveMollieInfo($order, $payment)
111
+ {
112
+
113
+ if (!$this->is_subscription($order->id)){
114
+ parent::saveMollieInfo($order,$payment);
115
+ return;
116
+ }
117
+ // Set active Mollie payment
118
+ $this->setActiveMolliePayment($order->id, $payment);
119
+
120
+ // Set Mollie customer
121
+ $this->setUserMollieCustomerId($order->id, $payment->customerId);
122
+ }
123
+
124
+ /**
125
+ * @param $amount_to_charge
126
+ * @param $renewal_order
127
+ * @return array
128
+ * @throws Mollie_WC_Exception_InvalidApiKey
129
+ */
130
+ public function scheduled_subscription_payment( $amount_to_charge, $renewal_order )
131
+ {
132
+ if (!$renewal_order)
133
+ {
134
+ Mollie_WC_Plugin::debug($this->id . ': Could not process payment, order ' . $renewal_order->id . ' not found.');
135
+
136
+ Mollie_WC_Plugin::addNotice(sprintf(__('Could not load order %s', 'mollie-payments-for-woocommerce'), $renewal_order->id), 'error');
137
+
138
+ return array('result' => 'failure');
139
+ }
140
+
141
+ Mollie_WC_Plugin::debug($this->id . ': Try to create payment for order ' . $renewal_order->id);
142
+ $initial_order_status = $this->getInitialOrderStatus();
143
+
144
+ // Overwrite plugin-wide
145
+ $initial_order_status = apply_filters(Mollie_WC_Plugin::PLUGIN_ID . '_initial_order_status', $initial_order_status);
146
+
147
+ // Overwrite gateway-wide
148
+ $initial_order_status = apply_filters(Mollie_WC_Plugin::PLUGIN_ID . '_initial_order_status_' . $this->id, $initial_order_status);
149
+
150
+ $customer_id = $this->getOrderMollieCustomerId($renewal_order);
151
+
152
+ $data = $this->getRecurringPaymentRequestData($renewal_order, $customer_id);
153
+
154
+ $data = apply_filters('woocommerce_' . $this->id . '_args', $data, $renewal_order);
155
+
156
+
157
+ // Is test mode enabled?
158
+ $test_mode = $this->isTestModeEnabledForRenewalOrder($renewal_order);
159
+ try
160
+ {
161
+ Mollie_WC_Plugin::debug($this->id . ': Create payment for order ' . $renewal_order->id);
162
+
163
+ do_action(Mollie_WC_Plugin::PLUGIN_ID . '_create_payment', $data, $renewal_order);
164
+ $payment = null;
165
+ // Create Mollie payment with customer id.
166
+ try
167
+ {
168
+ Mollie_WC_Plugin::debug($this->id . ': Fetch mandate' . $renewal_order->id);
169
+ $mandates = Mollie_WC_Plugin::getApiHelper()->getApiClient($test_mode)->customers_mandates->withParentId($customer_id)->all();
170
+ $validMandate = false;
171
+ foreach ($mandates as $mandate) {
172
+ if ($mandate->status == 'valid') {
173
+ $validMandate = true;
174
+ $data['method'] = $mandate->method;
175
+ break;
176
+ }
177
+ }
178
+ if ($validMandate){
179
+ Mollie_WC_Plugin::debug($this->id . ': Valid mandate ' . $renewal_order->id);
180
+ $payment = Mollie_WC_Plugin::getApiHelper()->getApiClient($test_mode)->payments->create($data);
181
+ } else {
182
+ Mollie_WC_Plugin::debug($this->id . 'Payment problem ' . $renewal_order->id);
183
+ throw new Mollie_API_Exception(__('Payment cannot be processed.', 'mollie-payments-for-woocommerce-mandate-problem'));
184
+ }
185
+ }
186
+ catch (Mollie_API_Exception $e)
187
+ {
188
+ if ($e->getField() !== 'customerId')
189
+ {
190
+ throw $e;
191
+ }
192
+
193
+ // Retry without customer id.
194
+ unset($data['customerId']);
195
+ $payment = Mollie_WC_Plugin::getApiHelper()->getApiClient($test_mode)->payments->create($data);
196
+ }
197
+ Mollie_WC_Plugin::debug($this->id . ': Created payment for order ' . $renewal_order->id. ' payment json response '.json_encode($payment));
198
+ Mollie_WC_Plugin::getDataHelper()->unsetActiveMolliePayment($renewal_order->id);
199
+ // Set active Mollie payment
200
+ Mollie_WC_Plugin::getDataHelper()->setActiveMolliePayment($renewal_order->id, $payment);
201
+
202
+ // Set Mollie customer
203
+ $this->setUserMollieCustomerId($renewal_order->id, $payment->customerId);
204
+
205
+ do_action(Mollie_WC_Plugin::PLUGIN_ID . '_payment_created', $payment, $renewal_order);
206
+
207
+ Mollie_WC_Plugin::debug($this->id . ': Payment ' . $payment->id . ' (' . $payment->mode . ') created for order ' . $renewal_order->id);
208
+
209
+ // Set initial status
210
+ // Status is only updated if the new status is not the same as the default order status (pending)
211
+ $this->_updateScheduledPaymentOrder($renewal_order, $initial_order_status, $payment);
212
+
213
+
214
+ return array(
215
+ 'result' => 'success',
216
+ );
217
+ }
218
+ catch (Mollie_API_Exception $e)
219
+ {
220
+ Mollie_WC_Plugin::debug($this->id . ': Failed to create payment for order ' . $renewal_order->id . ': ' . $e->getMessage());
221
+
222
+ /* translators: Placeholder 1: Payment method title */
223
+ $message = sprintf(__('Could not create %s payment.', 'mollie-payments-for-woocommerce'), $this->title);
224
+
225
+ if (defined('WP_DEBUG') && WP_DEBUG)
226
+ {
227
+ $message .= ' ' . $e->getMessage();
228
+ }
229
+ $renewal_order->update_status( 'failed',$message );
230
+
231
+ }
232
+
233
+ return array('result' => 'failure');
234
+ }
235
+
236
+ public function isTestModeEnabledForRenewalOrder($order)
237
+ {
238
+ $result = false;
239
+ $subscriptions = array();
240
+ if ( wcs_order_contains_renewal( $order->id) ) {
241
+ $subscriptions = wcs_get_subscriptions_for_renewal_order( $order->id );
242
+ }
243
+
244
+ foreach( $subscriptions as $subscription ) {
245
+ $paymentMode = get_post_meta( $subscription->id, '_mollie_payment_mode', true );
246
+ if ($paymentMode == self::PAYMENT_TEST_MODE){
247
+ $result = true;
248
+ break;
249
+ }
250
+ }
251
+ return $result;
252
+ }
253
+ /**
254
+ * @param $order_id
255
+ * @param Mollie_API_Object_Payment $payment
256
+ * @return $this
257
+ */
258
+ public function setActiveMolliePayment ($order_id, Mollie_API_Object_Payment $payment)
259
+ {
260
+ add_post_meta($order_id, '_mollie_payment_id', $payment->id, $single = true);
261
+ add_post_meta($order_id, '_mollie_payment_mode', $payment->mode, $single = true);
262
+
263
+ delete_post_meta($order_id, '_mollie_cancelled_payment_id');
264
+
265
+ if ($payment->customerId)
266
+ {
267
+ add_post_meta($order_id, '_mollie_customer_id', $payment->customerId, $single = true);
268
+ }
269
+
270
+ // Also store it on the subscriptions being purchased or paid for in the order
271
+ if ( wcs_order_contains_subscription( $order_id) ) {
272
+ $subscriptions = wcs_get_subscriptions_for_order( $order_id);
273
+ } elseif ( wcs_order_contains_renewal( $order_id) ) {
274
+ $subscriptions = wcs_get_subscriptions_for_renewal_order( $order_id );
275
+ } else {
276
+ $subscriptions = array();
277
+ }
278
+
279
+ foreach( $subscriptions as $subscription ) {
280
+ $this->unsetActiveMolliePayment($subscription->id);
281
+ delete_post_meta($subscription->id, '_mollie_customer_id');
282
+ add_post_meta( $subscription->id, '_mollie_payment_id', $payment->id, $single = true );
283
+ add_post_meta( $subscription->id, '_mollie_payment_mode', $payment->mode, $single = true );
284
+ delete_post_meta($subscription->id, '_mollie_cancelled_payment_id');
285
+ if ($payment->customerId)
286
+ {
287
+ add_post_meta($subscription->id, '_mollie_customer_id', $payment->customerId, $single = true);
288
+ }
289
+ }
290
+
291
+ return $this;
292
+ }
293
+
294
+ /**
295
+ * @param $order_id
296
+ * @return $this
297
+ */
298
+ public function unsetActiveMolliePayment ($order_id)
299
+ {
300
+ delete_post_meta($order_id, '_mollie_payment_id');
301
+ delete_post_meta($order_id, '_mollie_payment_mode');
302
+
303
+ return $this;
304
+ }
305
+
306
+ /**
307
+ * @param $orderId
308
+ * @param $customer_id
309
+ * @return $this
310
+ */
311
+ public function setUserMollieCustomerId ($orderId, $customer_id)
312
+ {
313
+ if (!empty($customer_id))
314
+ {
315
+ update_post_meta($orderId, '_mollie_customer_id', $customer_id);
316
+ }
317
+
318
+ return $this;
319
+ }
320
+
321
+ /**
322
+ * @param $order
323
+ * @param bool|false $test_mode
324
+ * @return null|string
325
+ */
326
+ protected function getUserMollieCustomerId($order, $test_mode = false)
327
+ {
328
+ $user_id = $order->customer_user;
329
+ if (empty($user_id)){
330
+ return null;
331
+ }
332
+
333
+ $customer_id = null;
334
+ try
335
+ {
336
+ $userdata = get_userdata($user_id);
337
+
338
+ $customer = Mollie_WC_Plugin::getApiHelper()->getApiClient($test_mode)->customers->create(array(
339
+ 'name' => trim($userdata->user_nicename),
340
+ 'email' => trim($userdata->user_email),
341
+ 'locale' => trim($this->getCurrentLocale()),
342
+ 'metadata' => array('user_id' => $user_id),
343
+ ));
344
+
345
+
346
+ $customer_id = $customer->id;
347
+ }
348
+ catch (Exception $e)
349
+ {
350
+ Mollie_WC_Plugin::debug(
351
+ __FUNCTION__ . ": Could not create customer $user_id (" . ($test_mode ? 'test' : 'live') . "): " . $e->getMessage() . ' (' . get_class($e) . ')'
352
+ );
353
+ }
354
+
355
+ return $customer_id;
356
+ }
357
+
358
+ /**
359
+ * @return mixed
360
+ */
361
+ protected function getCurrentLocale()
362
+ {
363
+ return apply_filters('wpml_current_language', get_locale());
364
+ }
365
+
366
+ /**
367
+ * @param $order
368
+ * @return mixed
369
+ */
370
+ public function getOrderMollieCustomerId($order)
371
+ {
372
+ $customerId = get_post_meta( $order->id, '_mollie_customer_id', true );
373
+ return $customerId;
374
+ }
375
+
376
+ /**
377
+ * @param $renewal_order
378
+ * @param $initial_order_status
379
+ * @param $payment
380
+ */
381
+ protected function _updateScheduledPaymentOrder($renewal_order, $initial_order_status, $payment)
382
+ {
383
+ $this->updateOrderStatus(
384
+ $renewal_order,
385
+ $initial_order_status,
386
+ __('Awaiting payment confirmation.', 'mollie-payments-for-woocommerce') . "\n"
387
+ );
388
+
389
+ $renewal_order->add_order_note(sprintf(
390
+ /* translators: Placeholder 1: Payment method title, placeholder 2: payment ID */
391
+ __('%s payment started (%s).', 'mollie-payments-for-woocommerce'),
392
+ $this->method_title,
393
+ $payment->id . ($payment->mode == 'test' ? (' - ' . __('test mode', 'mollie-payments-for-woocommerce')) : '')
394
+ ));
395
+ }
396
+
397
+ /**
398
+ * @param $resubscribe_order
399
+ */
400
+ public function delete_resubscribe_meta( $resubscribe_order )
401
+ {
402
+ $this->delete_renewal_meta( $resubscribe_order );
403
+ }
404
+
405
+ /**
406
+ * @param $renewal_order
407
+ * @return mixed
408
+ */
409
+ public function delete_renewal_meta( $renewal_order )
410
+ {
411
+ delete_post_meta( $renewal_order->id, '_mollie_card_4_digits' );
412
+ delete_post_meta( $renewal_order->id, '_mollie_payment_id' );
413
+ delete_post_meta( $renewal_order->id, '_mollie_payment_mode' );
414
+ delete_post_meta( $renewal_order->id, '_mollie_cancelled_payment_id' );
415
+ return $renewal_order;
416
+ }
417
+
418
+ /**
419
+ * @param $payment_meta
420
+ * @param $subscription
421
+ * @return mixed
422
+ */
423
+ public function add_subscription_payment_meta( $payment_meta, $subscription )
424
+ {
425
+ $payment_meta[ $this->id ] = array(
426
+ 'post_meta' => array(
427
+ '_mollie_payment_id' => array(
428
+ 'value' => get_post_meta( $subscription->id, '_mollie_payment_id', true ),
429
+ 'label' => 'Mollie Payment ID',
430
+ ),
431
+ '_mollie_payment_mode' => array(
432
+ 'value' => get_post_meta( $subscription->id, '_mollie_payment_mode', true ),
433
+ 'label' => 'Mollie Payment Mode',
434
+ ),
435
+ '_mollie_customer_id' => array(
436
+ 'value' => get_post_meta( $subscription->id, '_mollie_customer_id', true ),
437
+ 'label' => 'Mollie Customer ID',
438
+ ),
439
+ ),
440
+ );
441
+ return $payment_meta;
442
+ }
443
+
444
+ /**
445
+ * @param $payment_method_id
446
+ * @param $payment_meta
447
+ * @throws Exception
448
+ */
449
+ public function validate_subscription_payment_meta( $payment_method_id, $payment_meta )
450
+ {
451
+ if ( $this->id === $payment_method_id ) {
452
+
453
+ if ( ! isset( $payment_meta['post_meta']['_mollie_customer_id']['value'] ) || empty( $payment_meta['post_meta']['_mollie_customer_id']['value'] ) ) {
454
+ throw new Exception( 'A "_mollie_customer_id" value is required.' );
455
+ }
456
+ }
457
+ }
458
+
459
+ /**
460
+ * @param $subscription
461
+ * @param $renewal_order
462
+ */
463
+ public function update_failing_payment_method( $subscription, $renewal_order )
464
+ {
465
+ update_post_meta( $subscription->id, '_mollie_customer_id', $renewal_order->mollie_customer_id );
466
+ update_post_meta( $subscription->id, '_mollie_payment_id', $renewal_order->mollie_payment_id );
467
+ }
468
+
469
+ /**
470
+ * @param int $order_id
471
+ * @return array
472
+ */
473
+ public function process_payment ($order_id)
474
+ {
475
+ $isSubscription = $this->is_subscription($order_id);
476
+ if ($isSubscription){
477
+ $result = $this->process_subscription_payment($order_id);
478
+ return $result;
479
+ }
480
+
481
+ $result = parent::process_payment($order_id);
482
+ return $result;
483
+
484
+ }
485
+
486
+ /**
487
+ * @param $order_id
488
+ * @return bool
489
+ */
490
+ protected function is_subscription( $order_id )
491
+ {
492
+ return ( function_exists( 'wcs_order_contains_subscription' ) && ( wcs_order_contains_subscription( $order_id ) || wcs_is_subscription( $order_id ) || wcs_order_contains_renewal( $order_id ) ) );
493
+ }
494
+
495
+ }
includes/mollie/wc/gateway/belfius.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- class Mollie_WC_Gateway_Belfius extends Mollie_WC_Gateway_Abstract
3
  {
4
  /**
5
  *
1
  <?php
2
+ class Mollie_WC_Gateway_Belfius extends Mollie_WC_Gateway_AbstractSepaRecurring
3
  {
4
  /**
5
  *
includes/mollie/wc/gateway/creditcard.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- class Mollie_WC_Gateway_Creditcard extends Mollie_WC_Gateway_Abstract
3
  {
4
  /**
5
  *
@@ -10,7 +10,7 @@ class Mollie_WC_Gateway_Creditcard extends Mollie_WC_Gateway_Abstract
10
  'products',
11
  'refunds',
12
  );
13
-
14
  parent::__construct();
15
  }
16
 
1
  <?php
2
+ class Mollie_WC_Gateway_Creditcard extends Mollie_WC_Gateway_AbstractSubscription
3
  {
4
  /**
5
  *
10
  'products',
11
  'refunds',
12
  );
13
+ $this->initSubscriptionSupport();
14
  parent::__construct();
15
  }
16
 
includes/mollie/wc/gateway/ideal.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- class Mollie_WC_Gateway_Ideal extends Mollie_WC_Gateway_Abstract
3
  {
4
  /**
5
  *
1
  <?php
2
+ class Mollie_WC_Gateway_Ideal extends Mollie_WC_Gateway_AbstractSepaRecurring
3
  {
4
  /**
5
  *
includes/mollie/wc/gateway/mistercash.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- class Mollie_WC_Gateway_MisterCash extends Mollie_WC_Gateway_Abstract
3
  {
4
  /**
5
  *
1
  <?php
2
+ class Mollie_WC_Gateway_MisterCash extends Mollie_WC_Gateway_AbstractSepaRecurring
3
  {
4
  /**
5
  *
includes/mollie/wc/gateway/sofort.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- class Mollie_WC_Gateway_Sofort extends Mollie_WC_Gateway_Abstract
3
  {
4
  /**
5
  *
1
  <?php
2
+ class Mollie_WC_Gateway_Sofort extends Mollie_WC_Gateway_AbstractSepaRecurring
3
  {
4
  /**
5
  *
includes/mollie/wc/helper/data.php CHANGED
@@ -12,7 +12,12 @@ class Mollie_WC_Helper_Data
12
  /**
13
  * @var Mollie_API_Object_Method[]|Mollie_API_Object_List|array
14
  */
15
- protected static $api_methods;
 
 
 
 
 
16
 
17
  /**
18
  * @var Mollie_API_Object_Issuer[]|Mollie_API_Object_List|array
@@ -239,24 +244,77 @@ class Mollie_WC_Helper_Data
239
  return NULL;
240
  }
241
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
242
  /**
243
  * @param bool $test_mode (default: false)
244
  * @param bool $use_cache (default: true)
245
  * @return array|Mollie_API_Object_List|Mollie_API_Object_Method[]
246
  */
247
- public function getPaymentMethods ($test_mode = false, $use_cache = true)
248
  {
249
  // Already initialized
250
- if ($use_cache && !empty(self::$api_methods))
251
  {
252
- return self::$api_methods;
253
  }
254
 
255
- $locale = $this->getCurrentLocale();
256
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
  try
258
  {
259
- $transient_id = $this->getTransientId('api_methods_' . ($test_mode ? 'test' : 'live') . "_$locale");
 
260
 
261
  if ($use_cache)
262
  {
@@ -264,22 +322,37 @@ class Mollie_WC_Helper_Data
264
 
265
  if ($cached && $cached instanceof Mollie_API_Object_List)
266
  {
267
- return (self::$api_methods = $cached);
268
  }
269
  }
270
 
271
- self::$api_methods = $this->api_helper->getApiClient($test_mode)->methods->all();
272
 
273
- set_transient($transient_id, self::$api_methods, MINUTE_IN_SECONDS * 5);
274
 
275
- return self::$api_methods;
276
  }
277
  catch (Mollie_API_Exception $e)
278
  {
279
  Mollie_WC_Plugin::debug(__FUNCTION__ . ": Could not load Mollie methods (" . ($test_mode ? 'test' : 'live') . "): " . $e->getMessage() . ' (' . get_class($e) . ')');
280
  }
281
 
282
- return array();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  }
284
 
285
  /**
@@ -289,7 +362,7 @@ class Mollie_WC_Helper_Data
289
  */
290
  public function getPaymentMethod ($test_mode = false, $method)
291
  {
292
- $payment_methods = $this->getPaymentMethods($test_mode);
293
 
294
  foreach ($payment_methods as $payment_method)
295
  {
12
  /**
13
  * @var Mollie_API_Object_Method[]|Mollie_API_Object_List|array
14
  */
15
+ protected static $regular_api_methods = array();
16
+
17
+ /**
18
+ * @var Mollie_API_Object_Method[]|Mollie_API_Object_List|array
19
+ */
20
+ protected static $recurring_api_methods = array();
21
 
22
  /**
23
  * @var Mollie_API_Object_Issuer[]|Mollie_API_Object_List|array
244
  return NULL;
245
  }
246
 
247
+
248
+ /**
249
+ * @param bool|false $test_mode
250
+ * @param bool|true $use_cache
251
+ * @return array|Mollie_API_Object_Method[]
252
+ */
253
+ public function getAllPaymentMethods($test_mode = false, $use_cache = true)
254
+ {
255
+ $result = $this->getRegularPaymentMethods($test_mode, $use_cache);
256
+ $recurringPaymentMethods = $this->getRecurringPaymentMethods($test_mode, $use_cache);
257
+ foreach ($recurringPaymentMethods as $recurringItem){
258
+ $notFound = true;
259
+ foreach ($result as $item){
260
+ if ($item->id == $recurringItem->id){
261
+ $notFound = false;
262
+ break;
263
+ }
264
+ }
265
+ if ($notFound){
266
+ $result[] = $recurringItem;
267
+ }
268
+ }
269
+
270
+
271
+ return $result;
272
+ }
273
+
274
  /**
275
  * @param bool $test_mode (default: false)
276
  * @param bool $use_cache (default: true)
277
  * @return array|Mollie_API_Object_List|Mollie_API_Object_Method[]
278
  */
279
+ public function getRegularPaymentMethods ($test_mode = false, $use_cache = true)
280
  {
281
  // Already initialized
282
+ if ($use_cache && !empty(self::$regular_api_methods))
283
  {
284
+ return self::$regular_api_methods;
285
  }
286
 
 
287
 
288
+ self::$regular_api_methods = $this->getApiPaymentMethods($test_mode, $use_cache);
289
+
290
+ return self::$regular_api_methods;
291
+ }
292
+
293
+
294
+
295
+ public function getRecurringPaymentMethods($test_mode = false, $use_cache = true)
296
+ {
297
+ // Already initialized
298
+ if ($use_cache && !empty(self::$recurring_api_methods))
299
+ {
300
+ return self::$recurring_api_methods;
301
+ }
302
+
303
+
304
+ self::$recurring_api_methods = $this->getApiPaymentMethods($test_mode, $use_cache,['recurringType'=>'recurring']);
305
+
306
+ return self::$recurring_api_methods;
307
+ }
308
+
309
+ protected function getApiPaymentMethods($test_mode = false, $use_cache = true, $filters = array())
310
+ {
311
+ $result = array();
312
+
313
+ $locale = $this->getCurrentLocale();
314
  try
315
  {
316
+ $filtersKey = implode('_',array_keys($filters));
317
+ $transient_id = $this->getTransientId('api_methods_' . ($test_mode ? 'test' : 'live') . "_$locale". $filtersKey);
318
 
319
  if ($use_cache)
320
  {
322
 
323
  if ($cached && $cached instanceof Mollie_API_Object_List)
324
  {
325
+ return $cached;
326
  }
327
  }
328
 
329
+ $result = $this->api_helper->getApiClient($test_mode)->methods->all(0,0,$filters);
330
 
331
+ set_transient($transient_id, $result, MINUTE_IN_SECONDS * 5);
332
 
333
+ return $result;
334
  }
335
  catch (Mollie_API_Exception $e)
336
  {
337
  Mollie_WC_Plugin::debug(__FUNCTION__ . ": Could not load Mollie methods (" . ($test_mode ? 'test' : 'live') . "): " . $e->getMessage() . ' (' . get_class($e) . ')');
338
  }
339
 
340
+ return $result;
341
+ }
342
+
343
+ public function isRecurringPaymentMethodAvailable($methodId, $test_mode = false)
344
+ {
345
+ $result = false;
346
+
347
+ $recurringPaymentMethods = $this->getRecurringPaymentMethods($test_mode);
348
+ foreach ($recurringPaymentMethods as $paymentMethod){
349
+ if ($paymentMethod->id == $methodId){
350
+ $result = true;
351
+ break;
352
+ }
353
+ }
354
+
355
+ return $result;
356
  }
357
 
358
  /**
362
  */
363
  public function getPaymentMethod ($test_mode = false, $method)
364
  {
365
+ $payment_methods = $this->getAllPaymentMethods($test_mode);
366
 
367
  foreach ($payment_methods as $payment_method)
368
  {
includes/mollie/wc/helper/settings.php CHANGED
@@ -1,6 +1,7 @@
1
  <?php
2
  class Mollie_WC_Helper_Settings
3
  {
 
4
  /**
5
  * @return bool
6
  */
@@ -184,7 +185,7 @@ class Mollie_WC_Helper_Settings
184
  if (isset($_GET['refresh-methods']) && check_admin_referer('refresh-methods'))
185
  {
186
  /* Reload active Mollie methods */
187
- $data_helper->getPaymentMethods($test_mode, $use_cache = false);
188
  }
189
 
190
  $icon_available = ' <span style="color: green; cursor: help;" title="' . __('Gateway enabled', 'mollie-payments-for-woocommerce'). '">' . strtolower(__('Enabled', 'mollie-payments-for-woocommerce')) . '</span>';
@@ -378,6 +379,22 @@ class Mollie_WC_Helper_Settings
378
  return $this->mergeSettings($settings, $mollie_settings);
379
  }
380
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
381
  /**
382
  * @param string $setting
383
  * @return string
1
  <?php
2
  class Mollie_WC_Helper_Settings
3
  {
4
+ const DEFAULT_TIME_PAYMENT_CONFIRMATION_CHECK = '3:00';
5
  /**
6
  * @return bool
7
  */
185
  if (isset($_GET['refresh-methods']) && check_admin_referer('refresh-methods'))
186
  {
187
  /* Reload active Mollie methods */
188
+ $data_helper->getAllPaymentMethods($test_mode, $use_cache = false);
189
  }
190
 
191
  $icon_available = ' <span style="color: green; cursor: help;" title="' . __('Gateway enabled', 'mollie-payments-for-woocommerce'). '">' . strtolower(__('Enabled', 'mollie-payments-for-woocommerce')) . '</span>';
379
  return $this->mergeSettings($settings, $mollie_settings);
380
  }
381
 
382
+ public function getPaymentConfirmationCheckTime()
383
+ {
384
+ $time = strtotime(self::DEFAULT_TIME_PAYMENT_CONFIRMATION_CHECK);
385
+ $date = new DateTime();
386
+
387
+ if ($date->getTimestamp() > $time){
388
+ $date->setTimestamp($time);
389
+ $date->add(new DateInterval('P1D'));
390
+ } else {
391
+ $date->setTimestamp($time);
392
+ }
393
+
394
+
395
+ return $date->getTimestamp();
396
+ }
397
+
398
  /**
399
  * @param string $setting
400
  * @return string
includes/mollie/wc/plugin.php CHANGED
@@ -6,7 +6,11 @@ class Mollie_WC_Plugin
6
  {
7
  const PLUGIN_ID = 'mollie-payments-for-woocommerce';
8
  const PLUGIN_TITLE = 'Mollie Payments for WooCommerce';
9
- const PLUGIN_VERSION = '2.4.1';
 
 
 
 
10
 
11
  /**
12
  * @var bool
@@ -32,6 +36,92 @@ class Mollie_WC_Plugin
32
 
33
  private function __construct () {}
34
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
  /**
36
  * Initialize plugin
37
  */
@@ -62,6 +152,9 @@ class Mollie_WC_Plugin
62
  // On order details
63
  add_action('woocommerce_order_details_after_order_table', array(__CLASS__, 'onOrderDetails'), 10, 1);
64
 
 
 
 
65
  // Mark plugin initiated
66
  self::$initiated = true;
67
  }
@@ -351,3 +444,4 @@ class Mollie_WC_Plugin
351
  return $status_helper;
352
  }
353
  }
 
6
  {
7
  const PLUGIN_ID = 'mollie-payments-for-woocommerce';
8
  const PLUGIN_TITLE = 'Mollie Payments for WooCommerce';
9
+ const PLUGIN_VERSION = '2.5.2';
10
+
11
+ const DB_VERSION = '1.0';
12
+ const DB_VERSION_PARAM_NAME = 'mollie-db-version';
13
+ const PENDING_PAYMENT_DB_TABLE_NAME = 'mollie_pending_payment';
14
 
15
  /**
16
  * @var bool
36
 
37
  private function __construct () {}
38
 
39
+ /**
40
+ *
41
+ */
42
+ public static function schedulePendingPaymentOrdersExpirationCheck()
43
+ {
44
+ if ( class_exists( 'WC_Subscriptions_Order' ) ) {
45
+ $settings_helper = self::getSettingsHelper();
46
+ $time = $settings_helper->getPaymentConfirmationCheckTime();
47
+ $nextScheduledTime = wp_next_scheduled('pending_payment_confirmation_check');
48
+ if (!$nextScheduledTime) {
49
+ wp_schedule_event($time, 'daily', 'pending_payment_confirmation_check');
50
+ }
51
+
52
+ add_action('pending_payment_confirmation_check', array(__CLASS__, 'checkPendingPaymentOrdersExpiration'));
53
+ }
54
+
55
+ }
56
+
57
+ /**
58
+ *
59
+ */
60
+ public static function initDb()
61
+ {
62
+ global $wpdb;
63
+ $wpdb->mollie_pending_payment = $wpdb->prefix . self::PENDING_PAYMENT_DB_TABLE_NAME;
64
+ if(get_option(self::DB_VERSION_PARAM_NAME, '') != self::DB_VERSION){
65
+
66
+ global $wpdb;
67
+ $pendingPaymentConfirmTable = $wpdb->prefix . self::PENDING_PAYMENT_DB_TABLE_NAME;
68
+ require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
69
+ if($wpdb->get_var("show tables like '$pendingPaymentConfirmTable'") != $pendingPaymentConfirmTable) {
70
+ $sql = "CREATE TABLE " . $pendingPaymentConfirmTable . " (
71
+ `id` int(11) NOT NULL AUTO_INCREMENT,
72
+ `post_id` bigint NOT NULL,
73
+ `expired_time` int NOT NULL,
74
+ UNIQUE KEY id (id)
75
+ );";
76
+ dbDelta($sql);
77
+ }
78
+ update_option(self::DB_VERSION_PARAM_NAME, self::DB_VERSION);
79
+ }
80
+
81
+ }
82
+
83
+ /**
84
+ *
85
+ */
86
+ public static function checkPendingPaymentOrdersExpiration()
87
+ {
88
+ global $wpdb;
89
+ $currentDate = new DateTime();
90
+ $items = $wpdb->get_results("SELECT * FROM {$wpdb->mollie_pending_payment} WHERE expired_time < {$currentDate->getTimestamp()};");
91
+ foreach ($items as $item){
92
+ $order = wc_get_order( $item->post_id );
93
+ if ($order->get_status() == Mollie_WC_Gateway_Abstract::STATUS_COMPLETED){
94
+
95
+ $new_order_status = Mollie_WC_Gateway_Abstract::STATUS_FAILED;
96
+ $paymentMethodId = get_post_meta( $order->id, '_payment_method_title', true );
97
+ $molliePaymentId = get_post_meta( $order->id, '_mollie_payment_id', true );
98
+
99
+ $order->add_order_note(sprintf(
100
+ /* translators: Placeholder 1: payment method title, placeholder 2: payment ID */
101
+ __('%s payment failed (%s).', 'mollie-payments-for-woocommerce'),
102
+ $paymentMethodId,$molliePaymentId
103
+ ));
104
+
105
+ $order->update_status($new_order_status, '');
106
+
107
+ if (get_post_meta($order->id, '_order_stock_reduced', $single = true)) {
108
+ // Restore order stock
109
+ Mollie_WC_Plugin::getDataHelper()->restoreOrderStock($order);
110
+
111
+ Mollie_WC_Plugin::debug(__METHOD__ . " Stock for order {$order->id} restored.");
112
+ }
113
+
114
+ $wpdb->delete(
115
+ $wpdb->mollie_pending_payment,
116
+ array(
117
+ 'post_id' => $order->id,
118
+ )
119
+ );
120
+ }
121
+ }
122
+
123
+ }
124
+
125
  /**
126
  * Initialize plugin
127
  */
152
  // On order details
153
  add_action('woocommerce_order_details_after_order_table', array(__CLASS__, 'onOrderDetails'), 10, 1);
154
 
155
+
156
+ self::initDb();
157
+ self::schedulePendingPaymentOrdersExpirationCheck();
158
  // Mark plugin initiated
159
  self::$initiated = true;
160
  }
444
  return $status_helper;
445
  }
446
  }
447
+
mollie-payments-for-woocommerce.php CHANGED
@@ -3,11 +3,11 @@
3
  * Plugin Name: Mollie Payments for WooCommerce
4
  * Plugin URI: https://github.com/mollie/WooCommerce
5
  * Description: Accept payments in WooCommerce with the official Mollie plugin
6
- * Version: 2.4.1
7
  * Author: Mollie
8
  * Author URI: https://www.mollie.com
9
  * Requires at least: 3.8
10
- * Tested up to: 4.6.1
11
  * Text Domain: mollie-payments-for-woocommerce
12
  * Domain Path: /i18n/languages/
13
  * License: GPLv2 or later
@@ -90,6 +90,10 @@ function mollie_wc_plugin_admin_init ()
90
 
91
  function mollie_wc_plugin_deactivated ()
92
  {
 
 
 
 
93
  echo '<div class="error"><p>' . sprintf(__('%s deactivated because it depends on WooCommerce.', 'mollie-payments-for-woocommerce'), Mollie_WC_Plugin::PLUGIN_TITLE) . '</p></div>';
94
  }
95
 
3
  * Plugin Name: Mollie Payments for WooCommerce
4
  * Plugin URI: https://github.com/mollie/WooCommerce
5
  * Description: Accept payments in WooCommerce with the official Mollie plugin
6
+ * Version: 2.5.2
7
  * Author: Mollie
8
  * Author URI: https://www.mollie.com
9
  * Requires at least: 3.8
10
+ * Tested up to: 4.7.2
11
  * Text Domain: mollie-payments-for-woocommerce
12
  * Domain Path: /i18n/languages/
13
  * License: GPLv2 or later
90
 
91
  function mollie_wc_plugin_deactivated ()
92
  {
93
+ $nextScheduledTime = wp_next_scheduled( 'pending_payment_confirmation_check' ) ;
94
+ if ($nextScheduledTime) {
95
+ wp_unschedule_event( $nextScheduledTime, 'pending_payment_confirmation_check' );
96
+ }
97
  echo '<div class="error"><p>' . sprintf(__('%s deactivated because it depends on WooCommerce.', 'mollie-payments-for-woocommerce'), Mollie_WC_Plugin::PLUGIN_TITLE) . '</p></div>';
98
  }
99
 
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
  === Mollie Payments for WooCommerce ===
2
  Contributors: l.vangunst, daanvm, ndijkstra, robin-mollie
3
- Tags: mollie, payments, woocommerce, e-commerce, webshop, psp, ideal, sofort, credit card, creditcard, visa, mastercard, mistercash, bancontact, bitcoin, paysafecard, direct debit, incasso, sepa, banktransfer, overboeking, betalingen
4
  Requires at least: 3.8
5
- Tested up to: 4.6.1
6
- Stable tag: 2.4.1
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
@@ -14,10 +14,9 @@ Accept payments in WooCommerce with the official Mollie plugin
14
  This plugin will add support for the following Mollie payments methods to your WooCommerce webshop:
15
 
16
  * iDEAL
17
- * Banktransfer
18
  * Credit card
19
  * Bancontact / Mister Cash
20
- * SEPA Direct Debit
21
  * PayPal
22
  * SOFORT banking
23
  * Belfius Direct Net
@@ -30,6 +29,7 @@ Please go to the [signup page](https://www.mollie.com/nl/signup) to create a new
30
  = Features =
31
 
32
  * Support for all available Mollie payment methods
 
33
  * Edit order, title, description for every payment method
34
  * Refunds (WooCommerce 2.2+)
35
  * Multiple translations: English, Dutch, German and French
@@ -113,6 +113,11 @@ Automatic updates should work like a charm; as always though, ensure you backup
113
 
114
  == Changelog ==
115
 
 
 
 
 
 
116
  = 2.4.1 - 10/10/2016 =
117
  * Fix 2.4.0 release (https://wordpress.org/support/topic/error-500-after-updating)
118
 
@@ -164,6 +169,9 @@ WooCommerce -> Settings -> Checkout -> Mollie - Bank Transfer.
164
 
165
  == Upgrade Notice ==
166
 
 
 
 
167
  = 2.0.0 =
168
  * The 2.x version of the plugin uses a different plugin name. You can still run version 1.x of our plugin if you want to temporary
169
  keep support for payments created using version 1.x. Hide the old payment gateways by disabling the old 'Mollie Payment Module' payment gateway in WooCommerce -> Settings -> Checkout.
1
  === Mollie Payments for WooCommerce ===
2
  Contributors: l.vangunst, daanvm, ndijkstra, robin-mollie
3
+ Tags: mollie, payments, woocommerce, e-commerce, webshop, psp, ideal, sofort, credit card, creditcard, visa, mastercard, mistercash, bancontact, bitcoin, paysafecard, direct debit, incasso, sepa, banktransfer, overboeking, betalingen, recurring, subscriptions
4
  Requires at least: 3.8
5
+ Tested up to: 4.7.2
6
+ Stable tag: 2.5.2
7
  License: GPLv2 or later
8
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
9
 
14
  This plugin will add support for the following Mollie payments methods to your WooCommerce webshop:
15
 
16
  * iDEAL
17
+ * Bank transfer
18
  * Credit card
19
  * Bancontact / Mister Cash
 
20
  * PayPal
21
  * SOFORT banking
22
  * Belfius Direct Net
29
  = Features =
30
 
31
  * Support for all available Mollie payment methods
32
+ * Compatible with WooCommerce Subscriptions for recurring payments
33
  * Edit order, title, description for every payment method
34
  * Refunds (WooCommerce 2.2+)
35
  * Multiple translations: English, Dutch, German and French
113
 
114
  == Changelog ==
115
 
116
+ = 2.5.2 - 28/02/2017 =
117
+ * The plugin is now compatible with WooCommerce Subscriptions for recurring payments
118
+ * Removed 'test mode enabled' description, which causes problems when using WPML
119
+ * Empty the cart when the order is finished, rather than when the payment is created
120
+
121
  = 2.4.1 - 10/10/2016 =
122
  * Fix 2.4.0 release (https://wordpress.org/support/topic/error-500-after-updating)
123
 
169
 
170
  == Upgrade Notice ==
171
 
172
+ = 2.5.2 =
173
+ Our plugin is now compatible with WooCommerce Subscriptions for recurring payments.
174
+
175
  = 2.0.0 =
176
  * The 2.x version of the plugin uses a different plugin name. You can still run version 1.x of our plugin if you want to temporary
177
  keep support for payments created using version 1.x. Hide the old payment gateways by disabling the old 'Mollie Payment Module' payment gateway in WooCommerce -> Settings -> Checkout.