Error message

  • Warning: Cannot modify header information - headers already sent by (output started at /home/adam/sites/adamyoung.net/index.php:2) in drupal_send_headers() (line 1043 of /home/adam/sites/adamyoung.net/includes/bootstrap.inc).
  • Warning: Cannot modify header information - headers already sent by (output started at /home/adam/sites/adamyoung.net/index.php:2) in drupal_send_headers() (line 1043 of /home/adam/sites/adamyoung.net/includes/bootstrap.inc).
  • Warning: Cannot modify header information - headers already sent by (output started at /home/adam/sites/adamyoung.net/index.php:2) in drupal_send_headers() (line 1043 of /home/adam/sites/adamyoung.net/includes/bootstrap.inc).
  • Warning: Cannot modify header information - headers already sent by (output started at /home/adam/sites/adamyoung.net/index.php:2) in drupal_send_headers() (line 1043 of /home/adam/sites/adamyoung.net/includes/bootstrap.inc).
  • Warning: Cannot modify header information - headers already sent by (output started at /home/adam/sites/adamyoung.net/index.php:2) in drupal_send_headers() (line 1043 of /home/adam/sites/adamyoung.net/includes/bootstrap.inc).

PayFlow Pro POST Fields Encoding

I was editing the PayFlow Pro example API by Radu Manole (can't find link right now - check PDN forums) to add more fields to the authorization function and decided to redo this part:

// body of the POST
$plist = 'USER=' . $this->user . '&';
$plist .= 'VENDOR=' . $this->vendor . '&';
$plist .= 'PARTNER=' . $this->partner . '&';
$plist .= 'PWD=' . $this->password . '&';           
$plist .= 'TENDER=' . 'C' . '&'; 
$plist .= 'TRXTYPE=' . 'A' . '&';                       
$plist .= 'ACCT=' . $card_number . '&';
$plist .= 'EXPDATE=' . $card_expire . '&'; 
$plist .= 'NAME=' . $card_holder_name . '&';
$plist .= 'AMT=' . $amount . '&';  // amount
$plist .= 'CURRENCY=' . $currency . '&';
$plist .= 'VERBOSITY=MEDIUM';

to something a little nicer with max field sizes and the rest of the fields I needed:

$plist = array(
	'USER' => $this->user,
	'VENDOR' => $this->vendor,
	'PARTNER' => $this->partner,
	'PWD' => $this->password,
	'TENDER' => 'C',
	'TRXTYPE' => 'A',
	'ACCT' => $card_number,
	'EXPDATE' => $card_expire,
	'AMT' => $amount,
	'CURRENCY' => $currency,
	'VERBOSITY' => 'MEDIUM',
	'CVV2' => substr($cvv2,0,4),
	'FIRSTNAME' => substr($first_name,0,25),
	'LASTNAME' => substr($last_name,0,25),
	'STREET' => substr($street,0,100),
	'STREET2' => substr($street2,0,100),
	'CITY' => substr($city,0,40),
	'STATE' => substr($state,0,40),
	'COUNTRYCODE' => substr($country_code,0,2),
	'ZIP' => substr($zip,0,20),
	'PHONENUM' => substr($phone_num,0,20),
	'SHIPTONAME' => substr($ship_name,0,32),
	'SHIPTOSTREET' => substr($ship_street,0,100),
	'SHIPTOSTREET2' => substr($ship_street2,0,40),
	'SHIPTOCITY' => substr($ship_city,0,40),
	'SHIPTOSTATE' => substr($ship_state,0,40),
	'SHIPTOZIP' => substr($ship_zip,0,20),
	'SHIPTOCOUNTRYCODE' => substr($ship_country_code,0,2),
	'IPADDRESS' => $ip_address,
	'DESC' => $order_id
);

I figured this was the only change I needed to make because CURLOPT_POSTFIELDS can take a name=>value pair. However, PayPal started returning blank responses. While double checking that I could use an array, I saw this post: PHP curl_setopt comment To summarize in case the post disappears,

using CURLOPT_POSTFIELDS with array encoding is: multipart/form-data
using CURLOPT_POSTFIELDS with string encoding is: application/x-www-form-urlencoded

That turned out to be the problem so I used http_build_query($plist) for the CURLOPT_POSTFIELDS.