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
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', ),
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(); } }
Github repo for this extension
Total 15 comments
@FcoKraken thanks a lot for your suggestion, it helped me to solve the issue! :)
you can use session vars. in actionBuy add this next to $paymentInfo['Order']['theTotal'] = 0.00
and in actionConfirm change $result['ORDERTOTAL'] = 0.00; to
Hi! Thanks for the extension, it's great!! but i have a doubt, the ORDERTOTAL on actionConfirm is hardcored $result['ORDERTOTAL'] = 0.00;
I guess this has to match with the $paymentInfo['Order']['theTotal'] which was set up on actionBuy, how can i get the $paymentInfo['Order']['theTotal'] in the actionConfirm??
Thanks!
In the sandbox enviroment everything works OK, but when i go live, i get the error "Security header is not valid".
I already: - Check the credentials and are ok (im using the credentials for production, not sandbox) - Change apiLive to true in config/main
I dont know what else to do, plz help me Thanks
SOLUTION! When you change apiLive to true in config/main, it doesnt work. You have to change it directly in PayPayl.php (line 32: change public $apiLive = false to public $apiLive = true)
the paypal api has changed.. for this code to work you should modify the $nvpstr in extensio/paypal.php to:
$nvpstr="&PAYMENTACTION=Sale&IPADDRESS=$ip&AMT=$amount&CREDITCARDTYPE=$creditCardType&ACCT=$creditCardNumber&EXPDATE=".$padDateMonth.$expDateYear."&CVV2=$cvv2Number&FIRSTNAME=$firstName&LASTNAME=$lastName&STREET=$address1&STREET2=$address2&CITY=$city&STATE=$state". "&ZIP=$zip&COUNTRYCODE=$country&CURRENCYCODE=$currencyCode";
There have been minor changes in naming of country, zip, state and city.. but important in that you will keep getting error msgs if you dont correct them.
thanks for this great extension
@skall - thanks for replying - it did solve the problem
@sanguina
I've got a similar issue when trying the extension. I only did a quick setup, and changed the actionBuy $paymentInfo['Order']['theTotal'] to something more (10.00).
You need to set the same amount in the actionConfirm, currently, it is hard coded to 0.00 which obviously won't match 10.00, hence the invalid data error.
Hope that helps.
thanks for this great extension.
while trying out the direct payment, i am getting an error: "This transaction cannot be processed." ["L_ERRORCODE0"]=> string(5) "10747" ["L_SHORTMESSAGE0"]=> string(12) "Invalid Data" ["L_LONGMESSAGE0"]=> string(37) "This transaction cannot be processed." ["L_SEVERITYCODE0"]=> string(5) "Error"
I suspect the error results from an invalid credit card type. What is the list of valid data for credit card type ?
some articles on web suggest it as an error of IP address format.. but the code seems to be OK for that.
the only place i see ip mentioned is in the Paypal.php $ip=$_SERVER['REMOTE_ADDR']; does this ip needs to be formatted ?
Any suggestions on how to correct this would be really appreciated thanks for replying
Hi skall,
We have made modifications you have suggested. Now configuration parameters only need the path to be specified.
Thanks!
Hi skall,
We have updated downloads section here it is also up to date now along with the Installation section.
Hi,
If you use the following in your init() function, I wouldn't have anything to change weither I use urlManager or not.
Hi STDev,
Great extension. But as I need CAD currency, I need to change the value in multiple place in components/Paypal.php. This could be overwritten when I upgrade the component. It should be a configuration option.
Thanks.
EDIT: forget it, zip is not up to date. I looked at the github source, and it is already configurable.
Hi PrplHaz4,
Unfortunately this extension does not support PayPal Person to Person Payments
It doesn't look like it, but I'll ask anyways - does this extension help with person to person payments?
Hi Maxxer,
Currently the component supports Direct Payment - in site credit card processing no PayPal account needed from the user and Express Checkout - 2 step PayPal authorization payment https://www.paypal.com/webapps/mpp/express-checkout
Hi. Does it work as a normal payment (non express) also? thanks
Leave a comment
Please login to leave your comment.