Description: This tutorial demonstrates how to integrate FraudLabs Pro fraud detection service into PayPal payment process. Below we show you the step-by-step instructions using the PHP language.
Using PHP
Create a new table to store the transaction value of FraudLabs Pro and PayPal payment processing. This table will be used during the settlement, void or refund process.
CREATE TABLE `fraudlabs_pro` ( `flp_transaction_id` CHAR(15) NOT NULL, `flp_status` VARCHAR(10) NOT NULL, `paypal_transaction_id` VARCHAR(30) NOT NULL, `paypal_amount` DECIMAL(12,2) NOT NULL, `paypal_captured_id` VARCHAR(30), PRIMARY KEY (`flp_transaction_id`) ) COLLATE='utf8_general_ci' ENGINE=MyISAM;
Download FraudLabs Pro PHP class from https://github.com/fraudlabspro/fraudlabspro-php/releases
Integrate FraudLabs Pro fraud detection logic with your PayPal code. This code will perform a simple validation check of one credit card purchase and perform the appropriate action based on the fraud validation result.
// Include FraudLabs Pro library require_once 'PATH_TO_FRAUDLABSPRO/lib/FraudLabsPro.php'; // Include PayPal library require __DIR__ . '/../bootstrap.php'; use PayPal\Api\Amount; use PayPal\Api\Payer; use PayPal\Api\Payment; use PayPal\Api\RedirectUrls; use PayPal\Api\Transaction; $apiContext = new \PayPal\Rest\ApiContext( new \PayPal\Auth\OAuthTokenCredential( 'your_client_id', // ClientID 'your_client_secret' // ClientSecret ) ); FraudLabsPro\Configuration::apiKey('your_fraudlabspro_api_key'); // Check this transaction for possible fraud. FraudLabs Pro support comprehensive validation check, // and for this example, we only perform the IP address, BIN and billing country validation. // For complete validation, please check our developer page at http://www.fraudlabspro.com/developer $orderDetails = [ 'order' => [ 'amount' => $_POST['amount'], ], 'billing' => [ 'country' => $_POST['country'], ], ]; // Sends the order details to FraudLabs Pro $fraudResult = FraudLabsPro\Order::validate($orderDetails); // This transaction is legitimate, let's submit to PayPal if ($fraudResult->fraudlabspro_status == 'APPROVE') { // Set Payer that funds a payment $payer = new Payer(); $payer->setPaymentMethod("paypal"); // Set payment amount $amount = new Amount(); $amount->setCurrency("USD"); $amount->setTotal($_POST['amount']); // Set transaction that defines the details of payment $transaction = new Transaction(); $transaction->setAmount($amount); $transaction->setInvoiceNumber(uniqid()); // Set the URLs that the buyer must be redirected to after payment approval/cancellation $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl("https://example.com/your_redirect_url.html"); $redirectUrls->setCancelUrl("https://example.com/your_cancel_url.html"); // Set payment resource $payment = new Payment(); $payment->setIntent("sale"); $payment->setPayer($payer); $payment->setRedirectUrls($redirectUrls); $payment->setTransactions(array($transaction)); // Create payment try { $payment->create($apiContext); // echo $payment; echo "\n\nRedirect user to approval_url: " . $payment->getApprovalLink() . "\n"; } catch (\PayPal\Exception\PayPalConnectionException $ex) { // This will print the detailed information on the exception. echo $ex->getData(); } } // Transaction has been rejected by FraudLabs Pro based on your custom validation rules. elseif ($fraudResult->fraudlabspro_status == 'REJECT') { /* Do something here, try contact the customer for verification */ } // Transaction is marked for a manual review by FraudLabs Pro based on your custom validation rules. elseif ($fraudResult->fraudlabspro_status == 'REVIEW') { // Set Payer that funds a payment $payer = new Payer(); $payer->setPaymentMethod("paypal"); // Set payment amount $amount = new Amount(); $amount->setCurrency("USD"); $amount->setTotal($_POST['amount']); // Set transaction that defines the details of payment $transaction = new Transaction(); $transaction->setAmount($amount); $transaction->setInvoiceNumber(uniqid()); // Set the URLs that the buyer must be redirected to after payment approval/cancellation $redirectUrls = new RedirectUrls(); $redirectUrls->setReturnUrl("https://example.com/your_redirect_url.html"); $redirectUrls->setCancelUrl("https://example.com/your_cancel_url.html"); // Set payment resource $payment = new Payment(); $payment->setIntent("authorize"); $payment->setPayer($payer); $payment->setRedirectUrls($redirectUrls); $payment->setTransactions(array($transaction)); // Create payment try { $payment->create($apiContext); echo "\n\nRedirect user to approval_url: " . $payment->getApprovalLink() . "\n"; $transactions = $payment->getTransactions(); $related_resources = $transactions[0]->getRelatedResources(); $txn_authorize = $related_resources[0]->getAuthorization(); $txn_authorize_id = $txn_authorize->getId(); try{ // Initial MySQL connection $db = new PDO('mysql:host=your_database_host;dbname=your_database_name;charset=utf8', 'your_database_user', 'your_database_password'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Store the transaction information for decision making $st = $db->prepare('INSERT INTO `fraudlabs_pro` (flp_transaction_id, flp_status, paypal_transaction_id, paypal_amount) VALUES (:flpId, :flpStatus, :paypalId, :paypalAmount)'); $st->execute(array( ':flpId'=>$fraudResult->fraudlabspro_id, ':flpStatus'=>$fraudResult->fraudlabspro_status, ':paypalId'=>$txn_authorize_id, ':paypalAmount'=>$_POST['amount'] )); } catch(PDOException $e){ // MySQL error die($e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage()); } } catch (\PayPal\Exception\PayPalConnectionException $ex) { // This will print the detailed information on the exception. echo $ex->getData(); } }
Now, we are going to create a callback page to receive the review action, APPROVE or REJECT, performed by the merchant.
Note: You need to configure the callback URL at the FraudLabs Pro merchant area->settings page. It has to be pointed to the location where you hosted this “fraudlabspro-callback.php” file. Below is the sample code for fraudlabspro-callback.php
// Include PayPal library require __DIR__ . '/../bootstrap.php'; use PayPal\Api\Amount; use PayPal\Api\Authorization; use PayPal\Api\Capture; $id = (isset($_POST['id'])) ? $_POST['id'] : ''; $action = (isset($_POST['action'])) ? $_POST['action'] : ''; if($id && in_array($action, array('APPROVE', 'REJECT'))){ try{ // Initial MySQL connection $db = new PDO('mysql:host=your_database_host;dbname=your_database_name;charset=utf8', 'your_database_user', 'your_database_password'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Get the PayPal Transaction ID $st = $db->prepare('SELECT * FROM `fraudlabs_pro` WHERE `flp_transaction_id`=:flpId AND `flp_status`=\'REVIEW\''); $st->execute(array( ':flpId'=>$id )); if($st->rowCount() == 1){ $row = $st->fetch(PDO::FETCH_ASSOC); $apiContext = new \PayPal\Rest\ApiContext( new \PayPal\Auth\OAuthTokenCredential( 'your_client_id', // ClientID 'your_client_secret' // ClientSecret ) ); $authorizationId = $row['paypal_transaction_id']; if($action == 'REJECT'){ // Merchant rejected the order. Void the transaction in PayPal try { // Lookup the authorization $authorization = Authorization::get($authorizationId, $apiContext); // Void the authorization $voidedAuth = $authorization->void($apiContext); // Update database $st = $db->prepare('UPDATE `fraudlabs_pro` SET `flp_status`=:action WHERE `flp_transaction_id`=:flpId'); $st->execute(array( ':flpId'=>$id, ':action'=>$action )); } catch (\PayPal\Exception\PayPalConnectionException $ex) { // This will print the detailed information on the exception. echo $ex->getData(); } } else{ // Merchant approved the order. Submit for settlement try { // Retrieve the authorization $authorization = Authorization::get($authorizationId, $apiContext); // Set payment amount $amount = new Amount(); $amount->setCurrency("USD"); $amount->setTotal($row['paypal_amount']); // Create a capture $capture = new Capture(); $capture->setAmount($amount); // Perform a capture $getCapture = $authorization->capture($capture, $apiContext); $captureID = $getCapture->getId(); // Update database $st = $db->prepare('UPDATE `fraudlabs_pro` SET `flp_status`=:action, `paypal_captured_id`=:captureId WHERE `flp_transaction_id`=:flpId'); $st->execute(array( ':flpId'=>$id, ':captureid'=>$captureID, ':action'=>$action )); } catch (\PayPal\Exception\PayPalConnectionException $ex) { // This will print the detailed information on the exception. echo $ex->getData(); } } } } catch(PDOException $e){ // MySQL error die($e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage()); } }
If there is a need to issue a refund of a settled transaction, below is the sample code of how to accomplish that.
// Include PayPal library require __DIR__ . '/../bootstrap.php'; use PayPal\Api\Capture; use PayPal\Api\Refund; use PayPal\Api\RefundRequest; try{ // Initial MySQL connection $db = new PDO('mysql:host=your_database_host;dbname=your_database_name;charset=utf8', 'your_database_user', 'your_database_password'); $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Get the PayPal transaction ID based on the FraudLabs Pro ID $st = $db->prepare('SELECT * FROM `fraudlabs_pro` WHERE `flp_transaction_id`=:flpId'); $st->execute(array( ':flpId'=>$_POST['flpId'] )); if($st->rowCount() == 1){ $row = $st->fetch(PDO::FETCH_ASSOC); $apiContext = new \PayPal\Rest\ApiContext( new \PayPal\Auth\OAuthTokenCredential( 'your_client_id', // ClientID 'your_client_secret' // ClientSecret ) ); $captureId = $row['paypal_captured_id']; // Set payment amount $amount = new Amount(); $amount->setCurrency("USD"); $amount->setTotal(20); // Set refund request $refundRequest = new RefundRequest(); $refundRequest->setAmount($amount); try { // Retrieve Capture details $capture = Capture::get($captureId, $apiContext); // Refund the Capture $captureRefund = $capture->refundCapturedPayment($refundRequest, $apiContext); // Update database $st = $db->prepare('UPDATE `fraudlabs_pro` SET `flp_status`=\'REFUNDED\' WHERE `flp_transaction_id`=:flpId'); $st->execute(array( ':flpId'=>$_POST['flpId'] )); } catch (\PayPal\Exception\PayPalConnectionException $ex) { // This will print the detailed information on the exception. echo $ex->getData(); } } } catch(PDOException $e){ // MySQL error die($e->getFile() . ':' . $e->getLine() . ' ' . $e->getMessage()); }