View source
<?php
class Braintree_CreditCard extends Braintree {
const AMEX = 'American Express';
const CARTE_BLANCHE = 'Carte Blanche';
const CHINA_UNION_PAY = 'China UnionPay';
const DINERS_CLUB_INTERNATIONAL = 'Diners Club';
const DISCOVER = 'Discover';
const JCB = 'JCB';
const LASER = 'Laser';
const MAESTRO = 'Maestro';
const MASTER_CARD = 'MasterCard';
const SOLO = 'Solo';
const SWITCH_TYPE = 'Switch';
const VISA = 'Visa';
const UNKNOWN = 'Unknown';
const INTERNATIONAL = "international";
const US = "us";
const PREPAID_YES = 'Yes';
const PREPAID_NO = 'No';
const PREPAID_UNKNOWN = 'Unknown';
const PAYROLL_YES = 'Yes';
const PAYROLL_NO = 'No';
const PAYROLL_UNKNOWN = 'Unknown';
const HEALTHCARE_YES = 'Yes';
const HEALTHCARE_NO = 'No';
const HEALTHCARE_UNKNOWN = 'Unknown';
const DURBIN_REGULATED_YES = 'Yes';
const DURBIN_REGULATED_NO = 'No';
const DURBIN_REGULATED_UNKNOWN = 'Unknown';
const DEBIT_YES = 'Yes';
const DEBIT_NO = 'No';
const DEBIT_UNKNOWN = 'Unknown';
const COMMERCIAL_YES = 'Yes';
const COMMERCIAL_NO = 'No';
const COMMERCIAL_UNKNOWN = 'Unknown';
public static function create($attribs) {
Braintree_Util::verifyKeys(self::createSignature(), $attribs);
return self::_doCreate('/payment_methods', array(
'credit_card' => $attribs,
));
}
public static function createNoValidate($attribs) {
$result = self::create($attribs);
return self::returnObjectOrThrowException(__CLASS__, $result);
}
public static function createFromTransparentRedirect($queryString) {
trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
$params = Braintree_TransparentRedirect::parseAndValidateQueryString($queryString);
return self::_doCreate('/payment_methods/all/confirm_transparent_redirect_request', array(
'id' => $params['id'],
));
}
public static function createCreditCardUrl() {
trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
return Braintree_Configuration::merchantUrl() . '/payment_methods/all/create_via_transparent_redirect_request';
}
public static function expired() {
$response = Braintree_Http::post("/payment_methods/all/expired_ids");
$pager = array(
'className' => __CLASS__,
'classMethod' => 'fetchExpired',
'methodArgs' => array(),
);
return new Braintree_ResourceCollection($response, $pager);
}
public static function fetchExpired($ids) {
$response = Braintree_Http::post("/payment_methods/all/expired", array(
'search' => array(
'ids' => $ids,
),
));
return braintree_util::extractattributeasarray($response['paymentMethods'], 'creditCard');
}
public static function expiringBetween($startDate, $endDate) {
$queryPath = '/payment_methods/all/expiring_ids?start=' . date('mY', $startDate) . '&end=' . date('mY', $endDate);
$response = Braintree_Http::post($queryPath);
$pager = array(
'className' => __CLASS__,
'classMethod' => 'fetchExpiring',
'methodArgs' => array(
$startDate,
$endDate,
),
);
return new Braintree_ResourceCollection($response, $pager);
}
public static function fetchExpiring($startDate, $endDate, $ids) {
$queryPath = '/payment_methods/all/expiring?start=' . date('mY', $startDate) . '&end=' . date('mY', $endDate);
$response = Braintree_Http::post($queryPath, array(
'search' => array(
'ids' => $ids,
),
));
return Braintree_Util::extractAttributeAsArray($response['paymentMethods'], 'creditCard');
}
public static function find($token) {
self::_validateId($token);
try {
$response = Braintree_Http::get('/payment_methods/' . $token);
return self::factory($response['creditCard']);
} catch (Braintree_Exception_NotFound $e) {
throw new Braintree_Exception_NotFound('credit card with token ' . $token . ' not found');
}
}
public static function credit($token, $transactionAttribs) {
self::_validateId($token);
return Braintree_Transaction::credit(array_merge($transactionAttribs, array(
'paymentMethodToken' => $token,
)));
}
public static function creditNoValidate($token, $transactionAttribs) {
$result = self::credit($token, $transactionAttribs);
return self::returnObjectOrThrowException('Transaction', $result);
}
public static function sale($token, $transactionAttribs) {
self::_validateId($token);
return Braintree_Transaction::sale(array_merge($transactionAttribs, array(
'paymentMethodToken' => $token,
)));
}
public static function saleNoValidate($token, $transactionAttribs) {
$result = self::sale($token, $transactionAttribs);
return self::returnObjectOrThrowException('Transaction', $result);
}
public static function update($token, $attributes) {
Braintree_Util::verifyKeys(self::updateSignature(), $attributes);
self::_validateId($token);
return self::_doUpdate('put', '/payment_methods/' . $token, array(
'creditCard' => $attributes,
));
}
public static function updateNoValidate($token, $attributes) {
$result = self::update($token, $attributes);
return self::returnObjectOrThrowException(__CLASS__, $result);
}
public static function updateCreditCardUrl() {
trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::url", E_USER_NOTICE);
return Braintree_Configuration::merchantUrl() . '/payment_methods/all/update_via_transparent_redirect_request';
}
public static function updateFromTransparentRedirect($queryString) {
trigger_error("DEPRECATED: Please use Braintree_TransparentRedirectRequest::confirm", E_USER_NOTICE);
$params = Braintree_TransparentRedirect::parseAndValidateQueryString($queryString);
return self::_doUpdate('post', '/payment_methods/all/confirm_transparent_redirect_request', array(
'id' => $params['id'],
));
}
public function isDefault() {
return $this->default;
}
public function isExpired() {
return $this->expired;
}
public static function delete($token) {
self::_validateId($token);
Braintree_Http::delete('/payment_methods/' . $token);
return new Braintree_Result_Successful();
}
protected function _initialize($creditCardAttribs) {
$this->_attributes = $creditCardAttribs;
$billingAddress = isset($creditCardAttribs['billingAddress']) ? Braintree_Address::factory($creditCardAttribs['billingAddress']) : null;
$subscriptionArray = array();
if (isset($creditCardAttribs['subscriptions'])) {
foreach ($creditCardAttribs['subscriptions'] as $subscription) {
$subscriptionArray[] = Braintree_Subscription::factory($subscription);
}
}
$this
->_set('subscriptions', $subscriptionArray);
$this
->_set('billingAddress', $billingAddress);
$this
->_set('expirationDate', $this->expirationMonth . '/' . $this->expirationYear);
$this
->_set('maskedNumber', $this->bin . '******' . $this->last4);
}
public function isEqual($otherCreditCard) {
return !$otherCreditCard instanceof Braintree_CreditCard ? false : $this->token === $otherCreditCard->token;
}
private static function baseOptions() {
return array(
'makeDefault',
'verificationMerchantAccountId',
'verifyCard',
);
}
private static function baseSignature($options) {
return array(
'billingAddressId',
'cardholderName',
'cvv',
'number',
'expirationDate',
'expirationMonth',
'expirationYear',
'token',
array(
'options' => $options,
),
array(
'billingAddress' => array(
'firstName',
'lastName',
'company',
'countryCodeAlpha2',
'countryCodeAlpha3',
'countryCodeNumeric',
'countryName',
'extendedAddress',
'locality',
'region',
'postalCode',
'streetAddress',
),
),
);
}
public static function createSignature() {
$options = self::baseOptions();
$options[] = "failOnDuplicatePaymentMethod";
$signature = self::baseSignature($options);
$signature[] = 'customerId';
return $signature;
}
public static function updateSignature() {
$signature = self::baseSignature(self::baseOptions());
$updateExistingBillingSignature = array(
array(
'options' => array(
'updateExisting',
),
),
);
foreach ($signature as $key => $value) {
if (is_array($value) and array_key_exists('billingAddress', $value)) {
$signature[$key]['billingAddress'] = array_merge_recursive($value['billingAddress'], $updateExistingBillingSignature);
}
}
return $signature;
}
public static function _doCreate($url, $params) {
$response = Braintree_Http::post($url, $params);
return self::_verifyGatewayResponse($response);
}
public function __toString() {
return __CLASS__ . '[' . Braintree_Util::attributesToString($this->_attributes) . ']';
}
private static function _validateId($token = null) {
if (empty($token)) {
throw new InvalidArgumentException('expected credit card id to be set');
}
if (!preg_match('/^[0-9A-Za-z_-]+$/', $token)) {
throw new InvalidArgumentException($token . ' is an invalid credit card id.');
}
}
private static function _doUpdate($httpVerb, $url, $params) {
$response = Braintree_Http::$httpVerb($url, $params);
return self::_verifyGatewayResponse($response);
}
private static function _verifyGatewayResponse($response) {
if (isset($response['creditCard'])) {
return new Braintree_Result_Successful(self::factory($response['creditCard']));
}
else {
if (isset($response['apiErrorResponse'])) {
return new Braintree_Result_Error($response['apiErrorResponse']);
}
else {
throw new Braintree_Exception_Unexpected("Expected address or apiErrorResponse");
}
}
}
public static function factory($attributes) {
$defaultAttributes = array(
'bin' => '',
'expirationMonth' => '',
'expirationYear' => '',
'last4' => '',
);
$instance = new self();
$instance
->_initialize(array_merge($defaultAttributes, $attributes));
return $instance;
}
}