Not to criticize, just to understand (to consider using it or not):
The last 3 support topics, posted with 1 year and 3 months ago, have not been answered.
Could you please let me know if the plugin is still being supported and maintained?
]]>The issue:
PHP Fatal error: Call to undefined function get_option() in C:\xampp\htdocs\…\wp-content\plugins\paypal-framework\paypal-framework.php on line 160
When I call HashCall function to send data to PayPal the previous issue is showed.
It seems that the wordpress native functions have not been included for use.
Someone could help me?
Thanks
]]>A little help please!
OK, I get the fact that we have to create an Array, as the example clearly shows, however, what it doesn’t show is where to put it. Do I build it in PayPal or the plugin, in either case where?
after installing the plugin I have a menu link in Setting > PayPal where I can add the various credentials, nothing else.
Also, do I just create a PayPal button to use from within PayPal?
Thanks
]]>I created a second button for my website, https://www.fstchat but do not know how to add it to my existing site. Under installation it says use automatic installer but i can’t find this.
]]>We just began getting 403 errors back from PayPal IPN.. Presumably this is our IPN echo back to PayPal because I’m getting a validation failed debug email.
The response array shows it as a 403, but I got a receipt from PayPal that the transaction went through.
We rely on the IPN coming through successfully to trigger order confirmation and notification emails to the customer and the staff. Not sure if maybe this is related to the http 1.1 change that was pushed out in the latest version or what.. The host (site ground) supports http 1.1, so not sure if that’s it or not.
Last successful IPN hit on May 7 (it’s now the 11th).
First validation failed came through on May 9.
[Edit]: Looks like the plugin was updated on May 8… I’ll try rolling back to the previous version and see what happens.
]]>Hi,
I am using paypal framework more than a year. It as worked fine till January 12th. now its not validating. and its giving SSL Connection Error in debugging mail.
May i know the problem with this ssl connection suddenly
]]>Hey Aaron,
what are your thoughts on this? I am not savvy enough to know whether these changes affect your code – or not.
https://ppmts.custhelp.com/app/answers/detail/a_id/1236
Thanks for creating this in the first place!
Sven
]]>Has anyone got this plugin to work on WordPress 4.0?
]]>Hi Aaron,
This plugin has been an invaluable resource for me, so thank you so much! I noticed that sendToExpressCheckout(
) is not available as a helper function accessible outside of the wpPayPalFramework
class, and therefore cannot be used in other files or plugins.
Was this deliberate or an oversight? I ended up forking the plugin and adding one, and was going to submit a PR for it, but could not find this plugin on GitHub. The fork works, but I’d love to see this as part of the official plugin so I can stay up-to-date with any changes you make.
Let me know how best proceed. Happy to do the legwork on this if you’d like.
Thanks!
Chris
I am building a plugin to sell raffle tickets and I need to integrate paypal express checkout. I’ve not done this before, and I was hoping to use this plugin to simplify it. However, I’m not sure from the instructions how to proceed, as they seemed to be tailored for direct payments..
Is there anywhere I can look to get help with setting this up for express checkout?
]]>Hi Aaron
I’m making a donation plugin that uses the IPN listener feature of your plugin. A donate button uses PayPal ID or email address and I’m wanting to add a field on the PayPal options page of your plugin to store it.
Do you know how I might achieve this?
Cheers,
Brent
Hi,
I have been using the plugin to receive IPN from paypal. I was able to get it working in sandbox mode but when I move it to live and send an IPN call it fails. In the report from paypal it says there is a 406 error. I enabled debugging mode but I receive no message. I’m not sure if this is a problem specific to my instance. Does anyone know how I could fix this issue?
Thanks!
]]>Fatal error: Cannot use object of type WP_Error as array in …
this is in the line when i check if the response was ok just after the hashcall($params);
Any ideas what could be wrong?
]]>require_once ("paypalfunctions.php");
$PaymentOption = "PayPal";
if ( $PaymentOption == "PayPal")
{
// ==================================
// PayPal Express Checkout Module
// ==================================
//'------------------------------------
//' The paymentAmount is the total value of
//' the purchase.
//'
//' TODO: Enter the total Payment Amount within the quotes.
//' example : $paymentAmount = "15.00";
//'------------------------------------
$paymentAmount = "99";
//'------------------------------------
//' The currencyCodeType
//' is set to the selections made on the Integration Assistant
//'------------------------------------
$currencyCodeType = "USD";
$paymentType = "Sale";
//'------------------------------------
//' The returnURL is the location where buyers return to when a
//' payment has been succesfully authorized.
//'
//' This is set to the value entered on the Integration Assistant
//'------------------------------------
$returnURL = "https://127.0.0.1/digitalgoodsexample/orderconfirm.php";
//'------------------------------------
//' The cancelURL is the location buyers are sent to when they hit the
//' cancel button during authorization of payment during the PayPal flow
//'
//' This is set to the value entered on the Integration Assistant
//'------------------------------------
$cancelURL = "https://127.0.0.1/digitalgoodsexample/cancel.php";
//'------------------------------------
//' Calls the SetExpressCheckout API call
//'
//' The CallSetExpressCheckout function is defined in the file PayPalFunctions.php,
//' it is included at the top of this file.
//'-------------------------------------------------
$items = array();
$items[] = array('name' => 'PayPal Digital Goods Integration Guide', 'amt' => $paymentAmount, 'qty' => 1);
//::ITEMS::
// to add anothe item, uncomment the lines below and comment the line above
// $items[] = array('name' => 'Item Name1', 'amt' => $itemAmount1, 'qty' => 1);
// $items[] = array('name' => 'Item Name2', 'amt' => $itemAmount2, 'qty' => 1);
// $paymentAmount = $itemAmount1 + $itemAmount2;
// assign corresponding item amounts to "$itemAmount1" and "$itemAmount2"
// NOTE : sum of all the item amounts should be equal to payment amount
$resArray = SetExpressCheckoutDG( $paymentAmount, $currencyCodeType, $paymentType,
$returnURL, $cancelURL, $items );
$ack = strtoupper($resArray["ACK"]);
if($ack == "SUCCESS" || $ack == "SUCCESSWITHWARNING")
{
$token = urldecode($resArray["TOKEN"]);
RedirectToPayPalDG( $token );
}
else
{
//Display a user friendly Error on the page using any of the following error information returned by PayPal
$ErrorCode = urldecode($resArray["L_ERRORCODE0"]);
$ErrorShortMsg = urldecode($resArray["L_SHORTMESSAGE0"]);
$ErrorLongMsg = urldecode($resArray["L_LONGMESSAGE0"]);
$ErrorSeverityCode = urldecode($resArray["L_SEVERITYCODE0"]);
echo "SetExpressCheckout API call failed. ";
echo "Detailed Error Message: " . $ErrorLongMsg;
echo "Short Error Message: " . $ErrorShortMsg;
echo "Error Code: " . $ErrorCode;
echo "Error Severity Code: " . $ErrorSeverityCode;
}
}<code>I am using the above paypal function to send users to paypal for payment. However, I would like to automatically insert the product price on the line:</code>$paymentAmount = "99"<code>instead of numeric value using a meta value that is:</code>echo get_post_meta($post->ID, 'download_info_price', true)
I am have been perfectly able to make the paypal functions work, but only with numeric value by using it as a template page for my checkout page.
I believe that I need something that help me echo meta value outside of the loop and using:`global $wp_query;
$postid = $wp_query->post->ID;
echo get_post_meta($postid, ‘Your-Custom-Field’, true);`did not get me anywhere.
with the above, I tried calling /wp-load.php in the paypal functions, but no result.
The price/amount I want to automate is require by my paypal checkout file
that is called on the header of above codesrequire_once ("paypalfunctions.php")
the paypal checkout is:`/********************************************
PayPal API Module
Defines all the global variables and the wrapper functions
********************************************/
$PROXY_HOST = ‘127.0.0.1’;
$PROXY_PORT = ‘808’;
$SandboxFlag = true;
//’ TODO:
//’————————————
//’ PayPal API Credentials
//’ Replace <API_USERNAME> with your API Username
//’ Replace <API_PASSWORD> with your API Password
//’ Replace <API_SIGNATURE> with your Signature
//’————————————
$API_UserName=//this is hidden;
$API_Password=//this is hidden;
$API_Signature=//this is hidden;
// BN Code is only applicable for partners
$sBNCode = “PP-ECWizard”;
/*
‘ Define the PayPal Redirect URLs.
‘ This is the URL that the buyer is first sent to do authorize payment with their paypal account
‘ change the URL depending if you are testing on the sandbox or the live PayPal site
‘
‘ For the sandbox, the URL is https://www.sandbox.paypal.com/webscr&cmd=_express-checkout&token=
‘ For the live site, the URL is https://www.paypal.com/webscr&cmd=_express-checkout&token=
*/
if ($SandboxFlag == true)
{
$API_Endpoint = “https://api-3t.sandbox.paypal.com/nvp”;
$PAYPAL_URL = “https://www.sandbox.paypal.com/webscr?cmd=_express-checkout&token=”;
$PAYPAL_DG_URL = “https://www.sandbox.paypal.com/incontext?token=”;
}
else
{
$API_Endpoint = “https://api-3t.paypal.com/nvp”;
$PAYPAL_URL = “https://www.paypal.com/cgi-bin/webscr?cmd=_express-checkout&token=”;
$PAYPAL_DG_URL = “https://www.paypal.com/incontext?token=”;
}
$USE_PROXY = false;
$version = “84”;
/* An express checkout transaction starts with a token, that
identifies to PayPal your transaction
In this example, when the script sees a token, the script
knows that the buyer has already authorized payment through
paypal. If no token was found, the action is to send the buyer
to PayPal to first authorize payment
*/
/*
‘——————————————————————————————————————————————-
‘ Purpose: Prepares the parameters for the SetExpressCheckout API Call for a Digital Goods payment.
‘ Inputs:
‘ paymentAmount: Total value of the shopping cart
‘ currencyCodeType: Currency code value the PayPal API
‘ paymentType: paymentType has to be one of the following values: Sale or Order or Authorization
‘ returnURL: the page where buyers return to after they are done with the payment review on PayPal
‘ cancelURL: the page where buyers return to when they cancel the payment review on PayPal
‘——————————————————————————————————————————————–
*/
function SetExpressCheckoutDG( $paymentAmount, $currencyCodeType, $paymentType, $returnURL,
$cancelURL, $items)
{
//————————————————————————————————————————————
// Construct the parameter string that describes the SetExpressCheckout API call in the shortcut implementation
$nvpstr = “&PAYMENTREQUEST_0_AMT=”. $paymentAmount;
$nvpstr .= “&PAYMENTREQUEST_0_PAYMENTACTION=” . $paymentType;
$nvpstr .= “&RETURNURL=” . $returnURL;
$nvpstr .= “&CANCELURL=” . $cancelURL;
$nvpstr .= “&PAYMENTREQUEST_0_CURRENCYCODE=” . $currencyCodeType;
$nvpstr .= “&REQCONFIRMSHIPPING=0”;
$nvpstr .= “&NOSHIPPING=1”;
foreach($items as $index => $item) {
$nvpstr .= “&L_PAYMENTREQUEST_0_NAME” . $index . “=” . urlencode($item[“name”]);
$nvpstr .= “&L_PAYMENTREQUEST_0_AMT” . $index . “=” . urlencode($item[“amt”]);
$nvpstr .= “&L_PAYMENTREQUEST_0_QTY” . $index . “=” . urlencode($item[“qty”]);
$nvpstr .= “&L_PAYMENTREQUEST_0_ITEMCATEGORY” . $index . “=Digital”;
}
//’—————————————————————————————————————
//’ Make the API call to PayPal
//’ If the API call succeded, then redirect the buyer to PayPal to begin to authorize payment.
//’ If an error occured, show the resulting errors
//’—————————————————————————————————————
$resArray = hash_call(“SetExpressCheckout”, $nvpstr);
$ack = strtoupper($resArray[“ACK”]);
if($ack == “SUCCESS” || $ack == “SUCCESSWITHWARNING”)
{
$token = urldecode($resArray[“TOKEN”]);
$_SESSION[‘TOKEN’] = $token;
}
return $resArray;
}
/*
‘——————————————————————————————-
‘ Purpose: Prepares the parameters for the GetExpressCheckoutDetails API Call.
‘
‘ Inputs:
‘ None
‘ Returns:
‘ The NVP Collection object of the GetExpressCheckoutDetails Call Response.
‘——————————————————————————————-
*/
function GetExpressCheckoutDetails( $token )
{
//’————————————————————–
//’ At this point, the buyer has completed authorizing the payment
//’ at PayPal. The function will call PayPal to obtain the details
//’ of the authorization, incuding any shipping information of the
//’ buyer. Remember, the authorization is not a completed transaction
//’ at this state – the buyer still needs an additional step to finalize
//’ the transaction
//’————————————————————–
//’—————————————————————————
//’ Build a second API request to PayPal, using the token as the
//’ ID to get the details on the payment authorization
//’—————————————————————————
$nvpstr=”&TOKEN=” . $token;
//’—————————————————————————
//’ Make the API call and store the results in an array.
//’ If the call was a success, show the authorization details, and provide
//’ an action to complete the payment.
//’ If failed, show the error
//’—————————————————————————
$resArray=hash_call(“GetExpressCheckoutDetails”,$nvpstr);
$ack = strtoupper($resArray[“ACK”]);
if($ack == “SUCCESS” || $ack==”SUCCESSWITHWARNING”)
{
return $resArray;
}
else return false;
}
/*
‘——————————————————————————————————————————————-
‘ Purpose: Prepares the parameters for the GetExpressCheckoutDetails API Call.
‘
‘ Inputs:
‘ sBNCode: The BN code used by PayPal to track the transactions from a given shopping cart.
‘ Returns:
‘ The NVP Collection object of the GetExpressCheckoutDetails Call Response.
‘——————————————————————————————————————————————–
*/
function ConfirmPayment( $token, $paymentType, $currencyCodeType, $payerID, $FinalPaymentAmt, $items )
{
/* Gather the information to make the final call to
finalize the PayPal payment. The variable nvpstr
holds the name value pairs
*/
$token = urlencode($token);
$paymentType = urlencode($paymentType);
$currencyCodeType = urlencode($currencyCodeType);
$payerID = urlencode($payerID);
$serverName = urlencode($_SERVER[‘SERVER_NAME’]);
$nvpstr = ‘&TOKEN=’ . $token . ‘&PAYERID=’ . $payerID . ‘&PAYMENTREQUEST_0_PAYMENTACTION=’ . $paymentType . ‘&PAYMENTREQUEST_0_AMT=’ . $FinalPaymentAmt;
$nvpstr .= ‘&PAYMENTREQUEST_0_CURRENCYCODE=’ . $currencyCodeType . ‘&IPADDRESS=’ . $serverName;
foreach($items as $index => $item) {
$nvpstr .= “&L_PAYMENTREQUEST_0_NAME” . $index . “=” . urlencode($item[“name”]);
$nvpstr .= “&L_PAYMENTREQUEST_0_AMT” . $index . “=” . urlencode($item[“amt”]);
$nvpstr .= “&L_PAYMENTREQUEST_0_QTY” . $index . “=” . urlencode($item[“qty”]);
$nvpstr .= “&L_PAYMENTREQUEST_0_ITEMCATEGORY” . $index . “=Digital”;
}
/* Make the call to PayPal to finalize payment
If an error occured, show the resulting errors
*/
$resArray=hash_call(“DoExpressCheckoutPayment”,$nvpstr);
/* Display the API response back to the browser.
If the response from PayPal was a success, display the response parameters’
If the response was an error, display the errors received using APIError.php.
*/
$ack = strtoupper($resArray[“ACK”]);
return $resArray;
}
/**
‘——————————————————————————————————————————————-
* hash_call: Function to perform the API call to PayPal using API signature
* @methodName is name of API method.
* @nvpStr is nvp string.
* returns an associtive array containing the response from the server.
‘——————————————————————————————————————————————-
*/
function hash_call($methodName,$nvpStr)
{
//declaring of global variables
global $API_Endpoint, $version, $API_UserName, $API_Password, $API_Signature;
global $USE_PROXY, $PROXY_HOST, $PROXY_PORT;
global $gv_ApiErrorURL;
global $sBNCode;
//setting the curl parameters.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$API_Endpoint);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
//turning off the server and peer verification(TrustManager Concept).
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
//if USE_PROXY constant set to TRUE in Constants.php, then only proxy will be enabled.
//Set proxy name to PROXY_HOST and port number to PROXY_PORT in constants.php
if($USE_PROXY)
curl_setopt ($ch, CURLOPT_PROXY, $PROXY_HOST. “:” . $PROXY_PORT);
//NVPRequest for submitting to server
$nvpreq=”METHOD=” . urlencode($methodName) . “&VERSION=” . urlencode($version) . “&PWD=” . urlencode($API_Password) . “&USER=” . urlencode($API_UserName) . “&SIGNATURE=” . urlencode($API_Signature) . $nvpStr . “&BUTTONSOURCE=” . urlencode($sBNCode);
//setting the nvpreq as POST FIELD to curl
curl_setopt($ch, CURLOPT_POSTFIELDS, $nvpreq);
//getting response from server
$response = curl_exec($ch);
//convrting NVPResponse to an Associative Array
$nvpResArray=deformatNVP($response);
$nvpReqArray=deformatNVP($nvpreq);
$_SESSION[‘nvpReqArray’]=$nvpReqArray;
if (curl_errno($ch))
{
// moving to display page to display curl errors
$_SESSION[‘curl_error_no’]=curl_errno($ch) ;
$_SESSION[‘curl_error_msg’]=curl_error($ch);
//Execute the Error handling module to display errors.
}
else
{
//closing the curl
curl_close($ch);
}
return $nvpResArray;
}
/*’———————————————————————————-
Purpose: Redirects to PayPal.com site.
Inputs: NVP string.
Returns:
———————————————————————————-
*/
function RedirectToPayPal ( $token )
{
global $PAYPAL_URL;
// Redirect to paypal.com here
$payPalURL = $PAYPAL_URL . $token;
header(“Location: “.$payPalURL);
exit;
}
function RedirectToPayPalDG ( $token )
{
global $PAYPAL_DG_URL;
// Redirect to paypal.com here
$payPalURL = $PAYPAL_DG_URL . $token;
header(“Location: “.$payPalURL);
exit;
}
/*’———————————————————————————-
* This function will take NVPString and convert it to an Associative Array and it will decode the response.
* It is usefull to search for a particular key and displaying arrays.
* @nvpstr is NVPString.
* @nvpArray is Associative Array.
———————————————————————————-
*/
function deformatNVP($nvpstr)
{
$intial=0;
$nvpArray = array();
while(strlen($nvpstr))
{
//postion of Key
$keypos= strpos($nvpstr,’=’);
//position of value
$valuepos = strpos($nvpstr,’&’) ? strpos($nvpstr,’&’): strlen($nvpstr);
/*getting the Key and Value values and storing in a Associative Array*/
$keyval=substr($nvpstr,$intial,$keypos);
$valval=substr($nvpstr,$keypos+1,$valuepos-$keypos-1);
//decoding the respose
$nvpArray[urldecode($keyval)] =urldecode( $valval);
$nvpstr=substr($nvpstr,$valuepos+1,strlen($nvpstr));
}
return $nvpArray;
}`Thanks for helping. I have been dealing with this for 2 days now and I figure I might get better help here.
Hello,
I am trying to use the listener with the paypal IPN simulator. All I want to do is send a message from the IPN simulator on the PalPal developer site to the listener in your framework and dump the contents to the screen.
For the time being, I have commented out the call to validate the IPN because I just need to verify that data actually gets to the listener. Once I know that data is going to the listener, then I will reinstate the validation.
I have a developer account with paypal, and I have supplied the sandbox creditials in the plugin settings. (Are the credentials even used if all you want to do is listen? Rremember, I have commented out the call to your validation function for right now.)
I have added a “paypal-ipn” action just as your described in the FAQ. But, I cannot determine if I the listener is receiving the IPN messages. Either, the listener is not receiving messages, or it is receiving the messages but I don’t know where to look to see the message dump.
Can you help me here?
Thanks!
]]>Is there a tutorial to follow for someone who’s fairly new to the Paypal API?
For example, what do I do with the following=
$response = hashCall($ppParams);
I’m suppose to send that to Paypal, but how?
I am selling handmade soap online using a theme from Obox called ‘Handmade 2’ on my web site. I am hosted by BlueHost.
I am having an issue where some (but not all) of my orders are getting stuck in ‘On Hold’ status. They sit in ‘On Hold’ status until I manually go in and approve them.
I am not very computer literate so I asked the support people at Obox why this was happing. Their response was this:
The thing to look for is the net amount hitting Paypal vs the gross. Is PayPal adding a conversion fee or transaction fee? If so, when the gross is reported back to WooCommerce and the two totals are different, the order must be manually managed and the status changed from the Order page.
A few server-side issues can also cause IPN (the communication used between your site and paypal) to fail. See this:
https://docs.woothemes.com/document/paypal-standard/
You can send that link to your site host and ask them if any of those are a problem for you (such as the fsock open and firewall issues)
I think it is probably the first and not the second since you do have successful Paypal orders as processing.
The Obox support person also wrote me back another response that said:
If you go to WooCommerce> System status, you can check the IPN and fsock. They are currently both green:
fsockopen/cURL: Your server has fsockopen and cURL enabled.
SOAP Client: Your server has the SOAP Client class enabled.
WP Remote Post: wp_remote_post() was successful – PayPal IPN is working.The WooCommerce folks suggest that the issue can happen if any details on your Paypal setup page differ from your paypal account. Two things I noticed and adjusted:
1. Your receiver and paypal address were the same. You should not have a receiver address entered unless it is for some reason different from your paypal email
2. The paypal email had upper-case letters. URLS and email addresses are always lower-case.
3. Ensure the email listed there is the Primary and verified email on your paypal account.
4. Go to Paypal and make sure you have IPN setup correctly. please see their doc here: How to Activate IPN in your PayPal Account.
I have turned on the logging for now so you can monitor how these changes affect the issue – if it seems to continue at the same rate, see he Paypal FAQ here for valid reasons why the order may be stuck:
https://docs.woothemes.com/document/paypal-standard/#section-5
[Moderator Note: Please ensure that you are embedding links correctly in your posts.]
As I said, I am not that computer literate and I don’t understand 99% of what the oBox person was trying to explain to me. The only thing I did figure out is that it sounded like I needed to check with WordPress (or Bluehost?) about this issue.
Can you offer me any help as to why I am having this issue? Please use simple language as I really don’t know what I’m doing ??
Thank you,
Linda
https://www.theenchantedbath.com
Instead of downloading it as a plugin, can I just include it in the wordpress theme????
]]>Just a suggestion, it will look better if the button/input tag added a “class=”button button-primary” or class=”button”.
Thanks.
]]>Hello,
I have successfully installed and configured this plugin. I am collecting donations and I’d like to display live what has been collected so far, for a donations marathon.
How can I achieve that in an easy manner?
The IPN is set, and successfully picking up PayPal signals. Now I just have to figure out how to use that to display the total sum collected for a charity campaign.
Please assist ??
]]>Dear aaron,
this is a great plugin that unfortunately fails to work on my server. Here is the problem.
I have installed paypal framework and configured it. While testing the plug-in with sandbox, paypal framework sends transaction details to sandbox (I can see that from Paypal Sandbox website), but the listener does not receive the IPN message from sandbox or fails in checking if the IPN was correct (validation). Regardless I do not receive any messages and no actions are performed.
Two possible reasons:
1. Paypal framework is not configured based on the latest specs from Paypal (https://www.x.com/content/bulletin-ipn-and-pdt-scripts-and-http-1-1).
2. Plesk blocks the IPN (https://kb.parallels.com/en/112756).
But I do not know how to deal with these..
Thank you,
Andreas
]]>I’ve lost half a day on that problem: I was constantly receiving debug emails with this error message and didn’t get a clue.
I didn’t use the provided filter to change the sslverify param so I really didn’t know was the problem was… until I realized that sslverify doesn’t default to false in the _validateMessage() function!
After changing the $params line 590 to
$params = array(
'body' => $_POST,
'sslverify' => apply_filters( 'paypal_framework_sslverify', false ),
);
The error messages stopped and all IPNs were successfully verified \o/
I love this plugin by the way, great job!
]]>If one is a Paypal user but doesn’t have any card so can one pay through his Paypal ID?
I mean, won’t it redirect the user to Paypal screen? What if someone wants to pay using Paypal?
]]>I’ve invested over 30 hours of research and testing and cannot get IPN to complete a transaction in PayPal sandbox. There are inadequate resources for a reasonably tech-savvy person to pound this plugin into place. It simply should not be this hard.
gwb
]]>Should replace attribute_escape()
calls with esc_attr()
.