$v) { // FIXME: this is an encapsulation violation if ($k[0] == '_') { continue; } if ($v instanceof StripeObject) { $results[$k] = $v->__toArray(true); } elseif (is_array($v)) { $results[$k] = self::convertStripeObjectToArray($v); } else { $results[$k] = $v; } } return $results; } /** * Converts a response from the Stripe API to the corresponding PHP object. * * @param array $resp The response from the Stripe API. * @param array $opts * @return StripeObject|array */ public static function convertToStripeObject($resp, $opts) { $types = array( 'account' => 'Stripe\\Account', 'alipay_account' => 'Stripe\\AlipayAccount', 'apple_pay_domain' => 'Stripe\\ApplePayDomain', 'bank_account' => 'Stripe\\BankAccount', 'balance_transaction' => 'Stripe\\BalanceTransaction', 'card' => 'Stripe\\Card', 'charge' => 'Stripe\\Charge', 'country_spec' => 'Stripe\\CountrySpec', 'coupon' => 'Stripe\\Coupon', 'customer' => 'Stripe\\Customer', 'dispute' => 'Stripe\\Dispute', 'ephemeral_key' => 'Stripe\\EphemeralKey', 'list' => 'Stripe\\Collection', 'login_link' => 'Stripe\\LoginLink', 'invoice' => 'Stripe\\Invoice', 'invoiceitem' => 'Stripe\\InvoiceItem', 'event' => 'Stripe\\Event', 'file' => 'Stripe\\FileUpload', 'token' => 'Stripe\\Token', 'transfer' => 'Stripe\\Transfer', 'transfer_reversal' => 'Stripe\\TransferReversal', 'order' => 'Stripe\\Order', 'order_return' => 'Stripe\\OrderReturn', 'payout' => 'Stripe\\Payout', 'plan' => 'Stripe\\Plan', 'product' => 'Stripe\\Product', 'recipient' => 'Stripe\\Recipient', 'recipient_transfer' => 'Stripe\\RecipientTransfer', 'refund' => 'Stripe\\Refund', 'sku' => 'Stripe\\SKU', 'source' => 'Stripe\\Source', 'subscription' => 'Stripe\\Subscription', 'subscription_item' => 'Stripe\\SubscriptionItem', 'three_d_secure' => 'Stripe\\ThreeDSecure', 'fee_refund' => 'Stripe\\ApplicationFeeRefund', 'bitcoin_receiver' => 'Stripe\\BitcoinReceiver', 'bitcoin_transaction' => 'Stripe\\BitcoinTransaction', ); if (self::isList($resp)) { $mapped = array(); foreach ($resp as $i) { array_push($mapped, self::convertToStripeObject($i, $opts)); } return $mapped; } elseif (is_array($resp)) { if (isset($resp['object']) && is_string($resp['object']) && isset($types[$resp['object']])) { $class = $types[$resp['object']]; } else { $class = 'Stripe\\StripeObject'; } return $class::constructFrom($resp, $opts); } else { return $resp; } } /** * @param string|mixed $value A string to UTF8-encode. * * @return string|mixed The UTF8-encoded string, or the object passed in if * it wasn't a string. */ public static function utf8($value) { if (self::$isMbstringAvailable === null) { self::$isMbstringAvailable = function_exists('mb_detect_encoding'); if (!self::$isMbstringAvailable) { trigger_error("It looks like the mbstring extension is not enabled. " . "UTF-8 strings will not properly be encoded. Ask your system " . "administrator to enable the mbstring extension, or write to " . "support@stripe.com if you have any questions.", E_USER_WARNING); } } if (is_string($value) && self::$isMbstringAvailable && mb_detect_encoding($value, "UTF-8", true) != "UTF-8") { return utf8_encode($value); } else { return $value; } } /** * Compares two strings for equality. The time taken is independent of the * number of characters that match. * * @param string $a one of the strings to compare. * @param string $b the other string to compare. * @return bool true if the strings are equal, false otherwise. */ public static function secureCompare($a, $b) { if (self::$isHashEqualsAvailable === null) { self::$isHashEqualsAvailable = function_exists('hash_equals'); } if (self::$isHashEqualsAvailable) { return hash_equals($a, $b); } else { if (strlen($a) != strlen($b)) { return false; } $result = 0; for ($i = 0; $i < strlen($a); $i++) { $result |= ord($a[$i]) ^ ord($b[$i]); } return ($result == 0); } } }