2013-04-25 18:45:43 +02:00
|
|
|
<?php
|
|
|
|
|
2013-04-25 18:46:32 +02:00
|
|
|
/**
|
|
|
|
* @task addmethod Adding Payment Methods
|
|
|
|
*/
|
2013-04-25 18:45:43 +02:00
|
|
|
abstract class PhortunePaymentProvider {
|
|
|
|
|
2013-04-25 18:46:32 +02:00
|
|
|
|
|
|
|
/* -( Selecting Providers )------------------------------------------------ */
|
|
|
|
|
|
|
|
|
|
|
|
public static function getAllProviders() {
|
|
|
|
$objects = id(new PhutilSymbolLoader())
|
|
|
|
->setAncestorClass('PhortunePaymentProvider')
|
|
|
|
->loadObjects();
|
|
|
|
|
|
|
|
return mpull($objects, null, 'getProviderKey');
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function getEnabledProviders() {
|
|
|
|
$providers = self::getAllProviders();
|
|
|
|
foreach ($providers as $key => $provider) {
|
|
|
|
if (!$provider->isEnabled()) {
|
|
|
|
unset($providers[$key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $providers;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static function getProvidersForAddPaymentMethod() {
|
|
|
|
$providers = self::getEnabledProviders();
|
|
|
|
foreach ($providers as $key => $provider) {
|
|
|
|
if (!$provider->canCreatePaymentMethods()) {
|
|
|
|
unset($providers[$key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $providers;
|
|
|
|
}
|
|
|
|
|
|
|
|
abstract public function isEnabled();
|
|
|
|
|
|
|
|
final public function getProviderKey() {
|
|
|
|
return $this->getProviderType().'@'.$this->getProviderDomain();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return a short string which uniquely identifies this provider's protocol
|
|
|
|
* type, like "stripe", "paypal", or "balanced".
|
|
|
|
*/
|
|
|
|
abstract public function getProviderType();
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return a short string which uniquely identifies the domain for this
|
|
|
|
* provider, like "stripe.com" or "google.com".
|
|
|
|
*
|
|
|
|
* This is distinct from the provider type so that protocols are not bound
|
|
|
|
* to a single domain. This is probably not relevant for payments, but this
|
|
|
|
* assumption burned us pretty hard with authentication and it's easy enough
|
|
|
|
* to avoid.
|
|
|
|
*/
|
|
|
|
abstract public function getProviderDomain();
|
|
|
|
|
|
|
|
abstract public function getPaymentMethodDescription();
|
|
|
|
abstract public function getPaymentMethodIcon();
|
|
|
|
abstract public function getPaymentMethodProviderDescription();
|
|
|
|
|
|
|
|
|
2013-04-25 18:45:43 +02:00
|
|
|
/**
|
|
|
|
* Determine of a provider can handle a payment method.
|
|
|
|
*
|
|
|
|
* @return bool True if this provider can apply charges to the payment
|
|
|
|
* method.
|
|
|
|
*/
|
|
|
|
abstract public function canHandlePaymentMethod(
|
|
|
|
PhortunePaymentMethod $method);
|
|
|
|
|
|
|
|
abstract protected function executeCharge(
|
|
|
|
PhortunePaymentMethod $payment_method,
|
|
|
|
PhortuneCharge $charge);
|
|
|
|
|
2013-04-25 18:46:32 +02:00
|
|
|
|
|
|
|
/* -( Adding Payment Methods )--------------------------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @task addmethod
|
|
|
|
*/
|
|
|
|
public function canCreatePaymentMethods() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @task addmethod
|
|
|
|
*/
|
|
|
|
public function createPaymentMethodFromRequest(
|
|
|
|
AphrontRequest $request,
|
|
|
|
PhortunePaymentMethod $method) {
|
|
|
|
throw new PhortuneNotImplementedException($this);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @task addmethod
|
|
|
|
*/
|
|
|
|
public function renderCreatePaymentMethodForm(
|
|
|
|
AphrontRequest $request,
|
|
|
|
array $errors) {
|
|
|
|
throw new PhortuneNotImplementedException($this);
|
|
|
|
}
|
|
|
|
|
2013-04-25 18:46:59 +02:00
|
|
|
|
2013-04-25 18:45:43 +02:00
|
|
|
}
|