/** * @param array $apiParams * @param $mapper * @param string $type * @param bool $category * * @return array */ public static function formatAPIParams($apiParams, $mapper, $type = 'paypal', $category = TRUE) { $type = strtolower($type); if (!in_array($type, array('paypal', 'csv'))) { // return the params as is return $apiParams; } $params = $transaction = array(); if ($type == 'paypal') { foreach ($apiParams as $detail => $val) { if (isset($mapper['contact'][$detail])) { $params[$mapper['contact'][$detail]] = $val; } elseif (isset($mapper['location'][$detail])) { $params['address'][1][$mapper['location'][$detail]] = $val; } elseif (isset($mapper['transaction'][$detail])) { switch ($detail) { case 'l_period2': // Sadly, PayPal seems to send two distinct data elements in a single field, // so we break them out here. This is somewhat ugly and tragic. $freqUnits = array('D' => 'day', 'W' => 'week', 'M' => 'month', 'Y' => 'year'); list($frequency_interval, $frequency_unit) = explode(' ', $val); $transaction['frequency_interval'] = $frequency_interval; $transaction['frequency_unit'] = $freqUnits[$frequency_unit]; break; case 'subscriptiondate': case 'timestamp': // PayPal dates are in ISO-8601 format. We need a format that // MySQL likes $unix_timestamp = strtotime($val); $transaction[$mapper['transaction'][$detail]] = date('YmdHis', $unix_timestamp); break; case 'note': case 'custom': case 'l_number0': if ($val) { $val = "[PayPal_field:{$detail}] {$val}"; $transaction[$mapper['transaction'][$detail]] = !empty($transaction[$mapper['transaction'][$detail]]) ? $transaction[$mapper['transaction'][$detail]] . " <br/> " . $val : $val; } break; default: $transaction[$mapper['transaction'][$detail]] = $val; } } } if (!empty($transaction) && $category) { $params['transaction'] = $transaction; } else { $params += $transaction; } CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type); return $params; } if ($type == 'csv') { $header = $apiParams['header']; unset($apiParams['header']); foreach ($apiParams as $key => $val) { if (isset($mapper['contact'][$header[$key]])) { $params[$mapper['contact'][$header[$key]]] = $val; } elseif (isset($mapper['location'][$header[$key]])) { $params['address'][1][$mapper['location'][$header[$key]]] = $val; } elseif (isset($mapper['transaction'][$header[$key]])) { $transaction[$mapper['transaction'][$header[$key]]] = $val; } else { $params[$header[$key]] = $val; } } if (!empty($transaction) && $category) { $params['transaction'] = $transaction; } else { $params += $transaction; } CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type); return $params; } }
/** * @param array $apiParams * @param $mapper * @param string $type * @param bool $category * * @return array */ public static function formatAPIParams($apiParams, $mapper, $type = 'paypal', $category = TRUE) { $type = strtolower($type); if (!in_array($type, array('paypal', 'google', 'csv'))) { // return the params as is return $apiParams; } $params = $transaction = array(); if ($type == 'paypal') { foreach ($apiParams as $detail => $val) { if (isset($mapper['contact'][$detail])) { $params[$mapper['contact'][$detail]] = $val; } elseif (isset($mapper['location'][$detail])) { $params['address'][1][$mapper['location'][$detail]] = $val; } elseif (isset($mapper['transaction'][$detail])) { switch ($detail) { case 'l_period2': // Sadly, PayPal seems to send two distinct data elements in a single field, // so we break them out here. This is somewhat ugly and tragic. $freqUnits = array('D' => 'day', 'W' => 'week', 'M' => 'month', 'Y' => 'year'); list($frequency_interval, $frequency_unit) = explode(' ', $val); $transaction['frequency_interval'] = $frequency_interval; $transaction['frequency_unit'] = $freqUnits[$frequency_unit]; break; case 'subscriptiondate': case 'timestamp': // PayPal dates are in ISO-8601 format. We need a format that // MySQL likes $unix_timestamp = strtotime($val); $transaction[$mapper['transaction'][$detail]] = date('YmdHis', $unix_timestamp); break; case 'note': case 'custom': case 'l_number0': if ($val) { $val = "[PayPal_field:{$detail}] {$val}"; $transaction[$mapper['transaction'][$detail]] = !empty($transaction[$mapper['transaction'][$detail]]) ? $transaction[$mapper['transaction'][$detail]] . " <br/> " . $val : $val; } break; default: $transaction[$mapper['transaction'][$detail]] = $val; } } } if (!empty($transaction) && $category) { $params['transaction'] = $transaction; } else { $params += $transaction; } CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type); return $params; } if ($type == 'csv') { $header = $apiParams['header']; unset($apiParams['header']); foreach ($apiParams as $key => $val) { if (isset($mapper['contact'][$header[$key]])) { $params[$mapper['contact'][$header[$key]]] = $val; } elseif (isset($mapper['location'][$header[$key]])) { $params['address'][1][$mapper['location'][$header[$key]]] = $val; } elseif (isset($mapper['transaction'][$header[$key]])) { $transaction[$mapper['transaction'][$header[$key]]] = $val; } else { $params[$header[$key]] = $val; } } if (!empty($transaction) && $category) { $params['transaction'] = $transaction; } else { $params += $transaction; } CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type); return $params; } if ($type == 'google') { // return if response smell invalid if (!array_key_exists('risk-information-notification', $apiParams[1][$apiParams[0]]['notifications'])) { return FALSE; } $riskInfo =& $apiParams[1][$apiParams[0]]['notifications']['risk-information-notification']; if (array_key_exists('new-order-notification', $apiParams[1][$apiParams[0]]['notifications'])) { $newOrder =& $apiParams[1][$apiParams[0]]['notifications']['new-order-notification']; } if ($riskInfo['google-order-number']['VALUE'] == $apiParams[2]['google-order-number']['VALUE']) { foreach ($riskInfo['risk-information']['billing-address'] as $field => $info) { if (!empty($mapper['location'][$field])) { $params['address'][1][$mapper['location'][$field]] = $info['VALUE']; } elseif (!empty($mapper['contact'][$field])) { if ($newOrder && !empty($newOrder['buyer-billing-address']['structured-name'])) { foreach ($newOrder['buyer-billing-address']['structured-name'] as $namePart => $nameValue) { $params[$mapper['contact'][$namePart]] = $nameValue['VALUE']; } } else { $params[$mapper['contact'][$field]] = $info['VALUE']; } } elseif (!empty($mapper['transaction'][$field])) { $transaction[$mapper['transaction'][$field]] = $info['VALUE']; } } // Response is an huge array. Lets pickup only those which we ineterested in // using a local mapper, rather than traversing the entire array. $localMapper = array('google-order-number' => $riskInfo['google-order-number']['VALUE'], 'total-charge-amount' => $apiParams[2]['total-charge-amount']['VALUE'], 'currency' => $apiParams[2]['total-charge-amount']['currency'], 'item-name' => $newOrder['shopping-cart']['items']['item']['item-name']['VALUE'], 'timestamp' => $apiParams[2]['timestamp']['VALUE']); if (array_key_exists('latest-charge-fee', $apiParams[2])) { $localMapper['latest-charge-fee'] = $apiParams[2]['latest-charge-fee']['total']['VALUE']; $localMapper['net-amount'] = $localMapper['total-charge-amount'] - $localMapper['latest-charge-fee']; } // This is a subscription (recurring) donation. if (array_key_exists('subscription', $newOrder['shopping-cart']['items']['item'])) { $subscription = $newOrder['shopping-cart']['items']['item']['subscription']; $localMapper['amount'] = $newOrder['order-total']['VALUE']; $localMapper['times'] = $subscription['payments']['subscription-payment']['times']; // Convert Google's period to one compatible with the CiviCRM db field. $freqUnits = array('DAILY' => 'day', 'WEEKLY' => 'week', 'MONHTLY' => 'month', 'YEARLY' => 'year'); $localMapper['period'] = $freqUnits[$subscription['period']]; // Unlike PayPal, Google has no concept of freq. interval, it is always 1. $localMapper['frequency_interval'] = '1'; // Google Checkout dates are in ISO-8601 format. We need a format that // MySQL likes $unix_timestamp = strtotime($localMapper['timestamp']); $mysql_date = date('YmdHis', $unix_timestamp); $localMapper['modified_date'] = $mysql_date; $localMapper['start_date'] = $mysql_date; // This is PayPal's nomenclature, but just use it for Google as well since // we act on the value of trxn_type in processAPIContribution(). $localMapper['trxn_type'] = 'subscrpayment'; } foreach ($localMapper as $localKey => $localVal) { if (!empty($mapper['transaction'][$localKey])) { $transaction[$mapper['transaction'][$localKey]] = $localVal; } } if (empty($params) && empty($transaction)) { continue; } if (!empty($transaction) && $category) { $params['transaction'] = $transaction; } else { $params += $transaction; } CRM_Contribute_BAO_Contribution_Utils::_fillCommonParams($params, $type); } return $params; } }