A PayPal component for Yii framework to utilize Express Checkout and Direct Payment APIs. A simple component that will help you easily implement Express Checkout and Direct Payment APIs in your Yii applications
Requirements ¶
- The component is build for Yii framework version 1.1 or above
- You will need CURL PHP extension
- Paypal credentials (username, password, signature) are required
Installation ¶
Download the extension here or from the Github repo, extract the files to their appropriate folders. After place this code within your configuration file (main.php) inside the 'components' section
'Paypal' => array(
'class'=>'application.components.Paypal',
'apiUsername' => 'YOUR_API_USERNAME',
'apiPassword' => 'YOUR_API_PASSWORD',
'apiSignature' => 'YOUR_API_SIGNATURE',
'apiLive' => false,
'returnUrl' => 'paypal/confirm/', //regardless of url management component
'cancelUrl' => 'paypal/cancel/', //regardless of url management component
// Default currency to use, if not set USD is the default
'currency' => 'USD',
// Default description to use, defaults to an empty string
//'defaultDescription' => '',
// Default Quantity to use, defaults to 1
//'defaultQuantity' => '1',
//The version of the paypal api to use, defaults to '3.0' (review PayPal documentation to include a valid API version)
//'version' => '3.0',
),
Usage ¶
A sample controller to demonstrate the usage of the component
directpayment action demonstrates the Direct Payment API usage, the rest demonstrates Express Checkout API step by step implementation.
class PaypalController extends Controller
{
public function actionBuy(){
// set
$paymentInfo['Order']['theTotal'] = 0.00;
$paymentInfo['Order']['description'] = "Some payment description here";
$paymentInfo['Order']['quantity'] = '1';
// call paypal
$result = Yii::app()->Paypal->SetExpressCheckout($paymentInfo);
//Detect Errors
if(!Yii::app()->Paypal->isCallSucceeded($result)){
if(Yii::app()->Paypal->apiLive === true){
//Live mode basic error message
$error = 'We were unable to process your request. Please try again later';
}else{
//Sandbox output the actual error message to dive in.
$error = $result['L_LONGMESSAGE0'];
}
echo $error;
Yii::app()->end();
}else {
// send user to paypal
$token = urldecode($result["TOKEN"]);
$payPalURL = Yii::app()->Paypal->paypalUrl.$token;
$this->redirect($payPalURL);
}
}
public function actionConfirm()
{
$token = trim($_GET['token']);
$payerId = trim($_GET['PayerID']);
$result = Yii::app()->Paypal->GetExpressCheckoutDetails($token);
$result['PAYERID'] = $payerId;
$result['TOKEN'] = $token;
$result['ORDERTOTAL'] = 0.00;
//Detect errors
if(!Yii::app()->Paypal->isCallSucceeded($result)){
if(Yii::app()->Paypal->apiLive === true){
//Live mode basic error message
$error = 'We were unable to process your request. Please try again later';
}else{
//Sandbox output the actual error message to dive in.
$error = $result['L_LONGMESSAGE0'];
}
echo $error;
Yii::app()->end();
}else{
$paymentResult = Yii::app()->Paypal->DoExpressCheckoutPayment($result);
//Detect errors
if(!Yii::app()->Paypal->isCallSucceeded($paymentResult)){
if(Yii::app()->Paypal->apiLive === true){
//Live mode basic error message
$error = 'We were unable to process your request. Please try again later';
}else{
//Sandbox output the actual error message to dive in.
$error = $paymentResult['L_LONGMESSAGE0'];
}
echo $error;
Yii::app()->end();
}else{
//payment was completed successfully
$this->render('confirm');
}
}
}
public function actionCancel()
{
//The token of the cancelled payment typically used to cancel the payment within your application
$token = $_GET['token'];
$this->render('cancel');
}
public function actionDirectPayment(){
$paymentInfo = array('Member'=>
array(
'first_name'=>'name_here',
'last_name'=>'lastName_here',
'billing_address'=>'address_here',
'billing_address2'=>'address2_here',
'billing_country'=>'country_here',
'billing_city'=>'city_here',
'billing_state'=>'state_here',
'billing_zip'=>'zip_here'
),
'CreditCard'=>
array(
'card_number'=>'number_here',
'expiration_month'=>'month_here',
'expiration_year'=>'year_here',
'cv_code'=>'code_here'
),
'Order'=>
array('theTotal'=>1.00)
);
/*
* On Success, $result contains [AMT] [CURRENCYCODE] [AVSCODE] [CVV2MATCH]
* [TRANSACTIONID] [TIMESTAMP] [CORRELATIONID] [ACK] [VERSION] [BUILD]
*
* On Fail, $ result contains [AMT] [CURRENCYCODE] [TIMESTAMP] [CORRELATIONID]
* [ACK] [VERSION] [BUILD] [L_ERRORCODE0] [L_SHORTMESSAGE0] [L_LONGMESSAGE0]
* [L_SEVERITYCODE0]
*/
$result = Yii::app()->Paypal->DoDirectPayment($paymentInfo);
//Detect Errors
if(!Yii::app()->Paypal->isCallSucceeded($result)){
if(Yii::app()->Paypal->apiLive === true){
//Live mode basic error message
$error = 'We were unable to process your request. Please try again later';
}else{
//Sandbox output the actual error message to dive in.
$error = $result['L_LONGMESSAGE0'];
}
echo $error;
}else {
//Payment was completed successfully, do the rest of your stuff
}
Yii::app()->end();
}
}
Resources ¶
Github repo for this extension
re: actionConfirm ODERTOTAL Hard coded
you can use session vars.
in actionBuy add this next to $paymentInfo['Order']['theTotal'] = 0.00
Yii::app()->session['theTotal'] = 0.00
and in actionConfirm change $result['ORDERTOTAL'] = 0.00; to
$result['ORDERTOTAL'] = Yii::app()->session['theTotal'];
ORDERTOTAL
@FcoKraken thanks a lot for your suggestion, it helped me to solve the issue! :)
How to implement Recurring payment with this extension
I have used this extension and its very simple and amazing. i really appreciate your efforts. Now i want to implement recurring payment. Can you tell me how i can do this.
Error
Fatal error: Class 'PayPal\Common\PPApiContext' not found in ...\protected\extensions\paypal\lib\Rest\ApiContext.php on line 10
Help Please!
Tanks!
How to set a default sandbox error
Hi
When I was test a default error message get a error
Undefined index: L_LONGMESSAGE0
How this solved?please help
Test Mode
How do I set this to a Sandbox Mode (test mode)? How can I configure de main.php file? I have a bussiness account in PayPal whithin my credentials. Im testing this in Localhost. I got this error message: Security header is not valid!!! Can anybody help me, please?!
@marcoaurelio
Set 'apiLive' => false in your main config and username and pass of your sandbox account, like this:
'Paypal' => array( 'class'=>'application.components.Paypal', 'apiUsername' => 'USERNAME', 'apiPassword' => 'PASS', 'apiSignature' => 'SIG...', 'apiLive' => false, 'currency' => 'EUR', 'returnUrl' => 'payment/paypalConfirm/', 'cancelUrl' => 'payment/paypalCancel/', ),
Credit card payment / Demo
Hello,
is there demo available? Is the credit card payment also included?
Best regards,
Good
Thank you for the good extension.
Transactions
Good Extension
Does anybody know the steps to register a transaction ?
For example in actionBuy after of success buy (but before confirmation)
we can store the $result in the database (TOKEN,TRANSACTIONID etc)
In the confirmation I want to match the Tranaction (that generated in actionBuy) with succeded final confirmation and store all important data in the database
So, The admin could see all the tranaction of any user and tranaction status (succeeded,failure etc)
How can I make it in the right way ?
Thanks
Twice set the amount
I have another question
Why sould set twice the amount ?
In actionBuy
$paymentInfo['Order']['theTotal'] = xy.zw;
And In actionConfirm
$result['ORDERTOTAL'] = xy.zw;
If I set another amount in the actionConfirm all works properly (It shouldn't be)
for example $result['ORDERTOTAL'] = aa.bb;
The
of actionConfirm returns the aa.bb but the actionConfirm has set in the first time
xy.zw
so which price of the transaction has been considered ??
This transaction cannot be processed. The amount to be charged is zero.
Hello
I have a sandbox paypal business account and whenever I do a transaction with the extension, i get the error
Can I also make recurring payments ?
Do you have an example of it please?
DirectPayment method has no index name Token
I have tried to do the payment through credit card and it's response is as follows
array (size=10) 'TIMESTAMP' => string '2016-11-04T09:24:39Z' (length=20) 'CORRELATIONID' => string '95cac47e90002' (length=13) 'ACK' => string 'Success' (length=7) 'VERSION' => string '3.0' (length=3) 'BUILD' => string '24616352' (length=8) 'AMT' => string '1.00' (length=4) 'CURRENCYCODE' => string 'USD' (length=3) 'AVSCODE' => string 'X' (length=1) 'CVV2MATCH' => string 'M' (length=1) 'TRANSACTIONID' => string '17K81127HT973445E' (length=17)
But no TOKEN in this response please let me know if there is anything wrong with this
Why it's not returning the this index TOKEN.
Please anybody help me out..
I badly need the solution as soon as possible.
With my SandBox I am getting this error message, though I have enough ballance in sandBox account.
`
EnglishThis transaction cannot be processed. The amount to be charged is zero.
Neighter I can make it happen in real transaction also. There I am getting this error: ```English We were unable to process your request. Please try again later
Is this extension still valid for the actual PayPal API or needs update? In case it needs update are you available to upgrade it for a site I amanaging?
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.