mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-25 15:00:58 +01:00
cc586b0afa
Summary: various stripe stuff, including - external stripe library - payment form - test controller to play with payment form, sample business logic My main questions / discussion topics are... - is the stripe PHP library too big? (ie should I write something more simple just for phabricator?) -- if its cool, what is the best way to include the client? (ie should I make it a submodule rather than the flat copy here?) - is the JS I wrote (too) ridiculous? -- particularly unhappy with the error message stuff being in JS *but* it seemed the best choice given the most juicy error messages come from the stripe JS such that the overall code complexity is lowest this way. - how should the stripe JS be included? -- flat copy like I did here? -- some sort of external? -- can we just load it off stripe servers at request time? (I like that from the "if stripe is down, stripe is down" perspective) - wasn't sure if the date control was too silly and should just be baked into the form? -- for some reason I feel like its good to be prepared to walk away from Stripe / switch providers here, though I think this is on the wrong side of pragmatic Test Plan: - played around with sample client form Reviewers: epriestley Reviewed By: epriestley CC: aran Differential Revision: https://secure.phabricator.com/D2096
97 lines
3.4 KiB
PHP
97 lines
3.4 KiB
PHP
<?php
|
|
|
|
abstract class Stripe_ApiResource extends Stripe_Object
|
|
{
|
|
protected static function _scopedRetrieve($class, $id, $apiKey=null)
|
|
{
|
|
$instance = new $class($id, $apiKey);
|
|
$instance->refresh();
|
|
return $instance;
|
|
}
|
|
|
|
public function refresh()
|
|
{
|
|
$requestor = new Stripe_ApiRequestor($this->_apiKey);
|
|
$url = $this->instanceUrl();
|
|
list($response, $apiKey) = $requestor->request('get', $url);
|
|
$this->refreshFrom($response, $apiKey);
|
|
return $this;
|
|
}
|
|
|
|
public static function classUrl($class)
|
|
{
|
|
// Useful for namespaces: Foo\Stripe_Charge
|
|
if ($postfix = strrchr($class, '\\'))
|
|
$class = substr($postfix, 1);
|
|
if (substr($class, 0, strlen('Stripe')) == 'Stripe')
|
|
$class = substr($class, strlen('Stripe'));
|
|
$class = str_replace('_', '', $class);
|
|
$name = urlencode($class);
|
|
$name = strtolower($name);
|
|
return "/${name}s";
|
|
}
|
|
|
|
public function instanceUrl()
|
|
{
|
|
$id = $this['id'];
|
|
$class = get_class($this);
|
|
if (!$id) {
|
|
throw new Stripe_InvalidRequestError("Could not determine which URL to request: $class instance has invalid ID: $id");
|
|
}
|
|
$id = Stripe_ApiRequestor::utf8($id);
|
|
$base = self::classUrl($class);
|
|
$extn = urlencode($id);
|
|
return "$base/$extn";
|
|
}
|
|
|
|
private static function _validateCall($method, $params=null, $apiKey=null)
|
|
{
|
|
if ($params && !is_array($params))
|
|
throw new Stripe_Error("You must pass an array as the first argument to Stripe API method calls. (HINT: an example call to create a charge would be: \"StripeCharge::create(array('amount' => 100, 'currency' => 'usd', 'card' => array('number' => 4242424242424242, 'exp_month' => 5, 'exp_year' => 2015)))\")");
|
|
if ($apiKey && !is_string($apiKey))
|
|
throw new Stripe_Error('The second argument to Stripe API method calls is an optional per-request apiKey, which must be a string. (HINT: you can set a global apiKey by "Stripe::setApiKey(<apiKey>)")');
|
|
}
|
|
|
|
protected static function _scopedAll($class, $params=null, $apiKey=null)
|
|
{
|
|
self::_validateCall('all', $params, $apiKey);
|
|
$requestor = new Stripe_ApiRequestor($apiKey);
|
|
$url = self::classUrl($class);
|
|
list($response, $apiKey) = $requestor->request('get', $url, $params);
|
|
return Stripe_Util::convertToStripeObject($response, $apiKey);
|
|
}
|
|
|
|
protected static function _scopedCreate($class, $params=null, $apiKey=null)
|
|
{
|
|
self::_validateCall('create', $params, $apiKey);
|
|
$requestor = new Stripe_ApiRequestor($apiKey);
|
|
$url = self::classUrl($class);
|
|
list($response, $apiKey) = $requestor->request('post', $url, $params);
|
|
return Stripe_Util::convertToStripeObject($response, $apiKey);
|
|
}
|
|
|
|
protected function _scopedSave($class)
|
|
{
|
|
self::_validateCall('save');
|
|
if ($this->_unsavedValues) {
|
|
$requestor = new Stripe_ApiRequestor($this->_apiKey);
|
|
$params = array();
|
|
foreach ($this->_unsavedValues->toArray() as $k)
|
|
$params[$k] = $this->$k;
|
|
$url = $this->instanceUrl();
|
|
list($response, $apiKey) = $requestor->request('post', $url, $params);
|
|
$this->refreshFrom($response, $apiKey);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
protected function _scopedDelete($class, $params=null)
|
|
{
|
|
self::_validateCall('delete');
|
|
$requestor = new Stripe_ApiRequestor($this->_apiKey);
|
|
$url = $this->instanceUrl();
|
|
list($response, $apiKey) = $requestor->request('delete', $url, $params);
|
|
$this->refreshFrom($response, $apiKey);
|
|
return $this;
|
|
}
|
|
}
|