You are here

Client.php in Commerce Mollie 7

File

Mollie/API/Client.php
View source
<?php

/**
 * Copyright (c) 2013, Mollie B.V.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *
 * @license     Berkeley Software Distribution License (BSD-License 2) http://www.opensource.org/licenses/bsd-license.php
 * @author      Mollie B.V. <info@mollie.nl>
 * @copyright   Mollie B.V.
 * @link        https://www.mollie.nl
 */
class Mollie_API_Client {

  /**
   * Version of our client.
   */
  const CLIENT_VERSION = "1.1.1";

  /**
   * Endpoint of the remote API.
   */
  const API_ENDPOINT = "https://api.mollie.nl";

  /**
   * Version of the remote API.
   */
  const API_VERSION = "v1";
  const HTTP_GET = "GET";
  const HTTP_POST = "POST";
  const HTTP_DELETE = "DELETE";

  /**
   * @var string
   */
  protected $api_endpoint = self::API_ENDPOINT;

  /**
   * RESTful Payments resource.
   *
   * @var Mollie_API_Resource_Payments
   */
  public $payments;

  /**
   * RESTful Payments Refunds resource.
   *
   * @var Mollie_API_Resource_Payments_Refunds
   */
  public $payments_refunds;

  /**
   * RESTful Issuers resource.
   *
   * @var Mollie_API_Resource_Issuers
   */
  public $issuers;

  /**
   * RESTful Methods resource.
   *
   * @var Mollie_API_Resource_Methods
   */
  public $methods;

  /**
   * @var string
   */
  protected $api_key;

  /**
   * @var array
   */
  protected $versionStrings = array();
  public function __construct() {
    $this->payments = new Mollie_API_Resource_Payments($this);
    $this->payments_refunds = new Mollie_API_Resource_Payments_Refunds($this);
    $this->issuers = new Mollie_API_Resource_Issuers($this);
    $this->methods = new Mollie_API_Resource_Methods($this);
    $curl_version = curl_version();
    $this->versionStrings = array(
      "Mollie/" . self::CLIENT_VERSION,
      "PHP/" . phpversion(),
      "cURL/" . $curl_version["version"],
      $curl_version["ssl_version"],
    );
  }

  /**
   * @param string $url
   */
  public function setApiEndpoint($url) {
    $this->api_endpoint = rtrim($url, '/');
  }

  /**
   * @return string
   */
  public function getApiEndpoint() {
    return $this->api_endpoint;
  }

  /**
   * @param string $api_key The Mollie API key, starting with "test_" or "live_"
   * @throws Mollie_API_Exception
   */
  public function setApiKey($api_key) {
    if (!preg_match("!^(?:live|test)_\\w+\$!", $api_key)) {
      throw new Mollie_API_Exception("Invalid api key: \"{$api_key}\". An API key must start with \"test_\" or \"live_\".");
    }
    $this->api_key = $api_key;
  }

  /**
   * @param string $version_string
   */
  public function addVersionString($version_string) {
    $this->versionStrings[] = str_replace(array(
      " ",
      "\t",
      "\n",
      "\r",
    ), '-', $version_string);
  }

  /**
   * Perform an http call. This method is used by the resource specific classes. Please use the $payments property to
   * perform operations on payments.
   *
   * @see $payments
   * @see $isuers
   *
   * @param $http_method
   * @param $api_method
   * @param $http_body
   *
   * @return string
   * @throws Mollie_API_Exception
   *
   * @codeCoverageIgnore
   */
  public function performHttpCall($http_method, $api_method, $http_body = NULL) {
    if (empty($this->api_key)) {
      throw new Mollie_API_Exception("You have not set an api key. Please use setApiKey() to set the API key.");
    }
    $url = $this->api_endpoint . "/" . self::API_VERSION . "/" . $api_method;
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_ENCODING, "");
    curl_setopt($ch, CURLOPT_TIMEOUT, 10);
    $user_agent = join(' ', $this->versionStrings);
    $request_headers = array(
      "Accept: application/json",
      "Authorization: Bearer {$this->api_key}",
      "User-Agent: {$user_agent}",
      "X-Mollie-Client-Info: " . php_uname(),
    );
    if ($http_body !== NULL) {
      $request_headers[] = "Content-Type: application/json";
      if ($http_method == self::HTTP_POST) {
        curl_setopt($ch, CURLOPT_POST, 1);
      }
      else {
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $http_method);
      }
      curl_setopt($ch, CURLOPT_POSTFIELDS, $http_body);
    }
    curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE);
    $body = curl_exec($ch);
    if (curl_errno($ch) == CURLE_SSL_CACERT || curl_errno($ch) == CURLE_SSL_PEER_CERTIFICATE || curl_errno($ch) == 77) {

      /*
       * On some servers, the list of installed certificates is outdated or not present at all (the ca-bundle.crt
       * is not installed). So we tell cURL which certificates we trust. Then we retry the requests.
       */
      $request_headers[] = "X-Mollie-Debug: used shipped root certificates";
      curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
      curl_setopt($ch, CURLOPT_CAINFO, realpath(dirname(__FILE__) . "/cacert.pem"));
      $body = curl_exec($ch);
    }
    if (strpos(curl_error($ch), "certificate subject name 'mollie.nl' does not match target host") !== FALSE) {

      /*
       * On some servers, the wildcard SSL certificate is not processed correctly. This happens with OpenSSL 0.9.7
       * from 2003.
       */
      $request_headers[] = "X-Mollie-Debug: old OpenSSL found";
      curl_setopt($ch, CURLOPT_HTTPHEADER, $request_headers);
      curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
      $body = curl_exec($ch);
    }
    if (curl_errno($ch)) {
      throw new Mollie_API_Exception("Unable to communicate with Mollie (" . curl_errno($ch) . "): " . curl_error($ch));
    }
    return $body;
  }

}

Classes

Namesort descending Description
Mollie_API_Client Copyright (c) 2013, Mollie B.V. All rights reserved.