Payment_Adaptive   A
last analyzed

Complexity

Total Complexity 18

Size/Duplication

Total Lines 123
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 3

Test Coverage

Coverage 73.58%

Importance

Changes 0
Metric Value
wmc 18
lcom 1
cbo 3
dl 0
loc 123
ccs 39
cts 53
cp 0.7358
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A webapps_url() 0 12 3
A ap_api_url() 0 13 2
A common_fields() 0 7 1
A _request() 0 17 1
C parse_response() 0 51 11
1
<?php
2
3
namespace OpenBuildings\PayPal;
4
5
/**
6
 * @author Haralan Dobrev <[email protected]>
7
 * @copyright 2013 OpenBuildings, Inc.
8
 * @license http://spdx.org/licenses/BSD-3-Clause
9
 */
10
abstract class Payment_Adaptive extends Payment {
11
	
12
	const AP_ENDPOINT_START = 'https://svcs.';
13
14
	const AP_ENDPOINT_END = 'paypal.com/AdaptivePayments';
15
16
	const WEBAPPS_ENDPOINT_END = 'paypal.com/webapps/adaptivepayment/flow/pay';
17
18
	const ERROR_LANGUAGE = 'en_US';
19
20
	const DETAIL_LEVEL = 'ReturnAll';
21
22 1
	public static function webapps_url(array $params = array(), $mobile = FALSE)
23
	{
24 1
		if ($mobile)
25
		{
26 1
			$params['expType'] = 'mini';
27
		}
28
29
		return Payment::ENDPOINT_START
30 1
			.Payment::environment()
31 1
			.self::WEBAPPS_ENDPOINT_END
32 1
			.($params ? '?'.http_build_query($params) : '');
33
	}
34
35
	/**
36
	 * API url for AdaptivePayments based on operation and environment
37
	 */
38 1
	public static function ap_api_url($operation = NULL)
39
	{
40 1
		$api_endpoint = self::AP_ENDPOINT_START
41 1
			.Payment::environment()
42 1
			.self::AP_ENDPOINT_END;
43
44 1
		if ($operation)
45
		{
46 1
			$api_endpoint .= '/'.$operation;
47
		}
48
49 1
		return $api_endpoint;
50
	}
51
52 4
	public static function parse_response($response_string, $url, $request_data)
53
	{
54 4
		$response = Util::parse_str($response_string);
55
56 4
		if (empty($response['responseEnvelope.ack'])
57 4
		 OR strpos($response['responseEnvelope.ack'], 'Success') === FALSE
58 4
		 OR (isset($response['paymentExecStatus']) AND ! in_array($response['paymentExecStatus'], array('CREATED', 'COMPLETED', 'INCOMPLETE', 'PROCESSING', 'PENDING'))))
59
		{
60 1
			if ( ! empty($response['error(0).message']))
61
			{
62
				$error_message = $response['error(0).message'];
63
			}
64 1
			elseif ( ! empty($response['payErrorList'])
65 1
			 OR ( ! empty($response['paymentExecStatus'])
66 1
			  AND in_array($response['paymentExecStatus'], array(
67 1
			 	'ERROR',
68
			 	'REVERSALERROR'
69
			 )))
70
			)
71
			{
72 1
				if (empty($response['payErrorList']))
73
				{
74 1
					$error_message = 'Status was '.$response['paymentExecStatus'];
75
				}
76
				else
77
				{
78 1
					$error_message = print_r($response['payErrorList'], TRUE);
79
				}
80
			}
81
			else
82
			{
83
				$error_message = 'Unknown error';
84
			}
85
86 1
			throw new Request_Exception(
87 1
				'PayPal API request did not succeed for :url failed: :error:code.',
88 1
				$url,
89 1
				$request_data,
90
				array(
91 1
					':url' => $url,
92 1
					':error' => $error_message,
93 1
					':code' => isset($response['error(0).errorId'])
94
						? ' ('.$response['error(0).errorId'].')'
95 1
						: '',
96
				),
97 1
				$response
98
			);
99
		}
100
101 3
		return $response;
102
	}
103
104
	/**
105
	 * NVP fields required for the Pay API operation
106
	 */
107 1
	public function common_fields()
108
	{
109
		return array(
110 1
			'requestEnvelope.errorLanguage' => self::ERROR_LANGUAGE,
111 1
			'requestEnvelope.detailLevel' => self::DETAIL_LEVEL,
112
		);
113
	}
114
115
	protected function _request($method, array $request_data = array())
116
	{
117
		$url = static::ap_api_url($method);
118
		$request_data = array_merge($request_data, $this->common_fields());
119
120
		$headers = array(
121
			'X-PAYPAL-REQUEST-DATA-FORMAT: NV',
122
			'X-PAYPAL-RESPONSE-DATA-FORMAT: NV',
123
			'X-PAYPAL-SECURITY-USERID: '.$this->config('username'),
124
			'X-PAYPAL-SECURITY-PASSWORD: '.$this->config('password'),
125
			'X-PAYPAL-SECURITY-SIGNATURE: '.$this->config('signature'),
126
			'X-PAYPAL-SERVICE-VERSION: 1.6.0',
127
			'X-PAYPAL-APPLICATION-ID: '.$this->config('app_id'),
128
		);
129
130
		return $this->request($url, $request_data, $headers);
131
	}
132
}
133