*
* @package CRM
* @copyright CiviCRM LLC (c) 2004-2015
- * $Id$
- *
+ */
+
+/**
+ * Class CRM_Core_Payment_PayPalImpl for paypal pro, paypal standard & paypal express.
*/
class CRM_Core_Payment_PayPalImpl extends CRM_Core_Payment {
const CHARSET = 'iso-8859-1';
protected $_mode = NULL;
- /**
- * We only need one instance of this object. So we use the singleton
- * pattern and cache the instance in this variable
- *
- * @var object
- */
- static private $_singleton = NULL;
-
/**
* Constructor.
*
* @return bool
*/
protected function supportsPreApproval() {
- if ($this->_processorName == ts('PayPal_Express')) {
+ if ($this->_processorName == ts('PayPal Express')) {
return TRUE;
}
return FALSE;
* Billing mode button is basically synonymous with paypal express - this is probably a good example of 'odds & sods' code we
* need to find a way for the payment processor to assign. A tricky aspect is that the payment processor may need to set the order
*
- * @param $form
+ * @param CRM_Core_Form $form
*/
protected function addPaypalExpressCode(&$form) {
if (empty($form->isBackOffice)) {
}
}
+ /**
+ * Can recurring contributions be set against pledges.
+ *
+ * In practice all processors that use the baseIPN function to finish transactions or
+ * call the completetransaction api support this by looking up previous contributions in the
+ * series and, if there is a prior contribution against a pledge, and the pledge is not complete,
+ * adding the new payment to the pledge.
+ *
+ * However, only enabling for processors it has been tested against.
+ *
+ * @return bool
+ */
+ protected function supportsRecurContributionsForPledges() {
+ return TRUE;
+ }
+
+ /**
+ * Default payment instrument validation.
+ *
+ * Implement the usual Luhn algorithm via a static function in the CRM_Core_Payment_Form if it's a credit card
+ * Not a static function, because I need to check for payment_type.
+ *
+ * @param array $values
+ * @param array $errors
+ */
+ public function validatePaymentInstrument($values, &$errors) {
+ if ($this->_paymentProcessor['payment_processor_type'] == 'PayPal_Pro') {
+ CRM_Core_Payment_Form::validateCreditCard($values, $errors);
+ }
+ }
+
/**
* Express checkout code. Check PayPal documentation for more information
*
}
/* Success */
-
- $params = array();
- $params['token'] = $result['token'];
- $params['payer_id'] = $result['payerid'];
- $params['payer_status'] = $result['payerstatus'];
- $params['first_name'] = $result['firstname'];
- $params['middle_name'] = CRM_Utils_Array::value('middlename', $result);
- $params['last_name'] = $result['lastname'];
- $params['street_address'] = $result['shiptostreet'];
- $params['supplemental_address_1'] = CRM_Utils_Array::value('shiptostreet2', $result);
- $params['city'] = $result['shiptocity'];
- $params['state_province'] = $result['shiptostate'];
- $params['postal_code'] = $result['shiptozip'];
- $params['country'] = $result['shiptocountrycode'];
-
- return $params;
+ $fieldMap = array(
+ 'token' => 'token',
+ 'payer_status' => 'payerstatus',
+ 'payer_id' => 'payerid',
+ 'first_name' => 'firstname',
+ 'middle_name' => 'middlename',
+ 'last_name' => 'lastname',
+ 'street_address' => 'shiptostreet',
+ 'supplemental_address_1' => 'shiptostreet2',
+ 'city' => 'shiptocity',
+ 'postal_code' => 'shiptozip',
+ 'state_province' => 'shiptostate',
+ 'country' => 'shiptocountrycode',
+ );
+ return $this->mapPaypalParamsToCivicrmParams($fieldMap, $result);
}
/**
* the result in an nice formatted array (or an error object)
*/
public function doExpressCheckout(&$params) {
+
+ if (!empty($params['is_recur'])) {
+ return $this->createRecurringPayments($params);
+ }
$args = array();
$this->initialize($args, 'DoExpressCheckoutPayment');
*/
public function createRecurringPayments(&$params) {
$args = array();
-
+ // @todo this function is riddled with enotices - perhaps use $this->mapPaypalParamsToCivicrmParams($fieldMap, $result)
$this->initialize($args, 'CreateRecurringPaymentsProfile');
$start_time = strtotime(date('m/d/Y'));
$args['totalbillingcycles'] = $params['installments'];
$args['version'] = '56.0';
$args['profilereference'] = "i={$params['invoiceID']}" .
- "&m=$component" .
+ "&m=" .
"&c={$params['contactID']}" .
"&r={$params['contributionRecurID']}" .
"&b={$params['contributionID']}" .
* - redirect_url (if set the browser will be redirected to this.
*/
public function doPreApproval(&$params) {
+ $this->_component = $params['component'];
$token = $this->setExpressCheckOut($params);
return array(
'pre_approval_parameters' => array('token' => $token),
return $result;
}
+ /**
+ * Get array of fields that should be displayed on the payment form.
+ *
+ * @return array
+ * @throws CiviCRM_API3_Exception
+ */
+ public function getPaymentFormFields() {
+ if ($this->_processorName == ts('PayPal Pro')) {
+ return $this->getCreditCardFormFields();
+ }
+ else {
+ return array();
+ }
+ }
+
+ /**
+ * Map the paypal params to CiviCRM params using a field map.
+ *
+ * @param array $fieldMap
+ * @param array $paypalParams
+ *
+ * @return array
+ */
+ protected function mapPaypalParamsToCivicrmParams($fieldMap, $paypalParams) {
+ $params = array();
+ foreach ($fieldMap as $civicrmField => $paypalField) {
+ $params[$civicrmField] = isset($paypalParams[$paypalField]) ? $paypalParams[$paypalField] : NULL;
+ }
+ return $params;
+ }
+
}