Вход Регистрация
Файл: Main Website Files/assets/libraries/stripe-php-2.2.0/lib/ApiRequestor.php
Строк: 159
<?php

namespace Stripe;

class 
ApiRequestor
{
    private 
$_apiKey;

    private 
$_apiBase;

    private static 
$_httpClient;

    public function 
__construct($apiKey = null, $apiBase = null)
    {
        
$this->_apiKey = $apiKey;
        if (!
$apiBase) {
            
$apiBase = Stripe::$apiBase;
        }
        
$this->_apiBase = $apiBase;
    }

    private static function 
_encodeObjects($d)
    {
        if (
$d instanceof ApiResource) {
            return 
UtilUtil::utf8($d->id);
        } elseif (
$d === true) {
            return 
'true';
        } elseif (
$d === false) {
            return 
'false';
        } elseif (
is_array($d)) {
            
$res = array();
            foreach (
$d as $k => $v) {
                
$res[$k] = self::_encodeObjects($v);
            }
            return 
$res;
        } else {
            return 
UtilUtil::utf8($d);
        }
    }

    
/**
     * @param string $method
     * @param string $url
     * @param array|null $params
     * @param array|null $headers
     *
     * @return array An array whose first element is the response and second
     *    element is the API key used to make the request.
     */
    
public function request($method, $url, $params = null, $headers = null)
    {
        if (!
$params) {
            
$params = array();
        }
        if (!
$headers) {
            
$headers = array();
        }
        list(
$rbody, $rcode, $myApiKey) =
        
$this->_requestRaw($method, $url, $params, $headers);
        
$resp = $this->_interpretResponse($rbody, $rcode);
        return array(
$resp, $myApiKey);
    }

    
/**
     * @param string $rbody A JSON string.
     * @param int $rcode
     * @param array $resp
     *
     * @throws ErrorInvalidRequest if the error is caused by the user.
     * @throws ErrorAuthentication if the error is caused by a lack of
     *    permissions.
     * @throws ErrorCard if the error is the error code is 402 (payment
     *    required)
     * @throws ErrorApi otherwise.
     */
    
public function handleApiError($rbody, $rcode, $resp)
    {
        if (!
is_array($resp) || !isset($resp['error'])) {
            
$msg = "Invalid response object from API: $rbody "
              
. "(HTTP response code was $rcode)";
            throw new 
ErrorApi($msg, $rcode, $rbody, $resp);
        }

        
$error = $resp['error'];
        
$msg = isset($error['message']) ? $error['message'] : null;
        
$param = isset($error['param']) ? $error['param'] : null;
        
$code = isset($error['code']) ? $error['code'] : null;

        switch (
$rcode) {
            case 
400:
                if (
$code == 'rate_limit') {
                    throw new 
ErrorRateLimit($msg, $param, $rcode, $rbody, $resp);
                }

                
// intentional fall-through
            
case 404:
                throw new 
ErrorInvalidRequest($msg, $param, $rcode, $rbody, $resp);
            case 
401:
                throw new 
ErrorAuthentication($msg, $rcode, $rbody, $resp);
            case 
402:
                throw new 
ErrorCard($msg, $param, $code, $rcode, $rbody, $resp);
            default:
                throw new 
ErrorApi($msg, $rcode, $rbody, $resp);
        }
    }

    private function 
_requestRaw($method, $url, $params, $headers)
    {
        
$myApiKey = $this->_apiKey;
        if (!
$myApiKey) {
            
$myApiKey = Stripe::$apiKey;
        }

        if (!
$myApiKey) {
            
$msg = 'No API key provided.  (HINT: set your API key using '
              
. '"Stripe::setApiKey(<API-KEY>)".  You can generate API keys from '
              
. 'the Stripe web interface.  See https://stripe.com/api for '
              
. 'details, or email support@stripe.com if you have any questions.';
            throw new 
ErrorAuthentication($msg);
        }

        
$absUrl = $this->_apiBase.$url;
        
$params = self::_encodeObjects($params);
        
$langVersion = phpversion();
        
$uname = php_uname();
        
$ua = array(
            
'bindings_version' => Stripe::VERSION,
            
'lang' => 'php',
            
'lang_version' => $langVersion,
            
'publisher' => 'stripe',
            
'uname' => $uname,
        );
        
$defaultHeaders = array(
            
'X-Stripe-Client-User-Agent' => json_encode($ua),
            
'User-Agent' => 'Stripe/v1 PhpBindings/' . Stripe::VERSION,
            
'Authorization' => 'Bearer ' . $myApiKey,
        );
        if (
Stripe::$apiVersion) {
            
$defaultHeaders['Stripe-Version'] = Stripe::$apiVersion;
        }
        
$hasFile = false;
        
$hasCurlFile = class_exists('CURLFile', false);
        foreach (
$params as $k => $v) {
            if (
is_resource($v)) {
                
$hasFile = true;
                
$params[$k] = self::_processResourceParam($v, $hasCurlFile);
            } elseif (
$hasCurlFile && $v instanceof CURLFile) {
                
$hasFile = true;
            }
        }

        if (
$hasFile) {
            
$defaultHeaders['Content-Type'] = 'multipart/form-data';
        } else {
            
$defaultHeaders['Content-Type'] = 'application/x-www-form-urlencoded';
        }

        
$combinedHeaders = array_merge($defaultHeaders, $headers);
        
$rawHeaders = array();

        foreach (
$combinedHeaders as $header => $value) {
            
$rawHeaders[] = $header . ': ' . $value;
        }

        list(
$rbody, $rcode) = $this->httpClient()->request(
            
$method,
            
$absUrl,
            
$rawHeaders,
            
$params,
            
$hasFile
        
);
        return array(
$rbody, $rcode, $myApiKey);
    }

    private function 
_processResourceParam($resource, $hasCurlFile)
    {
        if (
get_resource_type($resource) !== 'stream') {
            throw new 
ErrorApi(
                
'Attempted to upload a resource that is not a stream'
            
);
        }

        
$metaData = stream_get_meta_data($resource);
        if (
$metaData['wrapper_type'] !== 'plainfile') {
            throw new 
ErrorApi(
                
'Only plainfile resource streams are supported'
            
);
        }

        if (
$hasCurlFile) {
            
// We don't have the filename or mimetype, but the API doesn't care
            
return new CURLFile($metaData['uri']);
        } else {
            return 
'@'.$metaData['uri'];
        }
    }

    private function 
_interpretResponse($rbody, $rcode)
    {
        try {
            
$resp = json_decode($rbody, true);
        } catch (
Exception $e) {
            
$msg = "Invalid response body from API: $rbody "
              
. "(HTTP response code was $rcode)";
            throw new 
ErrorApi($msg, $rcode, $rbody);
        }

        if (
$rcode < 200 || $rcode >= 300) {
            
$this->handleApiError($rbody, $rcode, $resp);
        }
        return 
$resp;
    }

    public static function 
setHttpClient($client)
    {
        
self::$_httpClient = $client;
    }

    private function 
httpClient()
    {
        if (!
self::$_httpClient) {
            
self::$_httpClient = HttpClientCurlClient::instance();
        }
        return 
self::$_httpClient;
    }
}
Онлайн: 0
Реклама