sábado, 21 de janeiro de 2017

Como fazer um sistema de pagamento para seu site usando o PayPal em PHP

Enviado em 15:39 - por Diguinho - Marcadores : , ,

Você está trabalhando em um projeto de comércio eletrônico? Então você deve ter um sistema de pagamento melhor e seguro. Este post irá explicar como criar um carrinho e sistema de ordem com processo de pagamento BrainTree PayPal usando PHP e MySQL.

Payment System with BrainTree PayPal using PHP


 Download    Demo

Database Design
Para criar o sistema de comércio eletrônico, você tem que criar quatro tabelas básicas, tais como Usuários, Produtos, ordens e carrinho. 

Tabela usuario
Tabela de usuário contém todos os detalhes de registro de usuários.
CREATE TABLE Users(
user_id INT  PRIMARY KEY AUTO_INCREMENT
username VARCHAR(50), 
password VARCHAR(100), 
email VARCHAR(100)
);

Payment System User Table

Tabela Produtos
Este contém todos os detalhes do produto.
CREATE TABLE Products(
product_id INT PRIMARY KEY AUTO_INCREMENT
product_name VARCHAR(200), 
product_desc TEXT, 
price FLOAT
);

Payment System Products Table

Tabela Orders
Ordens de sucesso de usuários armazenar aqui com código de status BrainTree.
CREATE TABLE Orders(
order_id INT PRIMARY KEY AUTO_INCREMENT
user_id_fk INT, 
created INT,
price FLOAT,
FOREIGN KEY(user_id_fk) REFERENCES Users(user_id)
);

Payment System Orders Table

Payment System with BrainTree PayPal User table design

Carrinho Table
Esta tabela contém todos os dados do carrinho de usuário. Carrinho order_id_fk é uma chave estrangeira, ele faz referência às Ordens order_id . Isso será atualizado uma vez que a ordem do usuário for bem-sucedida.
CREATE TABLE Cart(
cart_id INT PRIMARY KEY AUTO_INCREMENT,
product_id_fk INT, 
user_id_fk INT, 
order_id_fk INT, 
cart_status enum('0','1') DEFAULT '0',
FOREIGN KEY(product_id_fk) REFERENCES Products(product_id),
FOREIGN KEY(user_id_fk) REFERENCES Users(user_id),
FOREIGN KEY(order_id_fk) REFERENCES Orders(order_id)
);

Payment System Cart Table

Payment System with BrainTree PayPal cart database design

Formulário de pagamento e design do sistema
Este projeto contém três pastas chamadas js , inclui e uploads com arquivos PHP.

braintree
-- braintree.php //BrainTree arquivo da biblioteca
js
-- jquery.min.js
-- jquery.creditCardValidator.js
index.php
cardProcess.php 
functions.php 
db.php

O formulário de pagamento contém o número do cartão, nome do cartão, data de validade e CVV (número seguro).

Payment System with BrainTree PayPal cart database design

Código HTML5
código HTML5 Simples
<form method="post"  id="paymentForm">
Payment details
<ul>

<li>
<label>Card Number </label>
<input type="text" name="card_number" id="card_number"  maxlength="20" placeholder="1234 5678 9012 3456"/>
</li>
<li>
<label>Name on Card</label>
<input type="text" name="card_name" id="card_name" placeholder="Srinivas Tamada"/>
</li>
<li class="vertical">

<ul>
<li>
<label>Expires</label>
<input type="text" name="expiry_month" id="expiry_month" maxlength="2" placeholder="MM" />
<input type="text" name="expiry_year" id="expiry_year" maxlength="2" placeholder="YY" />
</li>
<li>
<label>CVV</label>
<input type="text" name="cvv" id="cvv" maxlength="3" placeholder="123" />
</li>
</ul>

</li>
<li>
<input type="submit" id="paymentButton" value="Proceed" disabled="true" class="disable">
</li>
</ul>
</form>
<div id="orderInfo"></div>

CSS Codigo
*{margin: 0px; padding:0px;}
ul {list-style: none;}
label{padding:8px 0px 8px 0px;}
#paymentForm label 
{
color: #555;
display: block;
font-size: 14px;
font-weight: 400;
}
#paymentForm input[type=text]
{
background-color: #FFFFFF;
border: 1px solid #E5E5E5;
color: #333333;
display: block;
font-size: 18px;
height: 32px;
padding: 0 5px;
width: 275px;
}
#paymentForm li {margin: 8px 0;}
#orderInfo{display:none}
.disable{opacity: 0.2}
.vertical li 
{
float: left;
width: 140px;
}

JavaScript
Validando a forma de pagamento usando expressões regulares.
<script src="js/jquery.min.js"></script>
<script src="js/jquery.creditCardValidator.js"></script>
<script>
$(document).ready(function()
{
/* Form Validation */
$("#paymentForm input[type=text]").on("keyup",function()
{
var cardValid=$("#card_number").attr('rel');
var C=$("#card_name").val();
var M=$("#expiry_month").val();
var Y=$("#expiry_year").val();
var CVV=$("#cvv").val();
var expName =/^[a-z ,.'-]+$/i;
var expMonth = /^01|02|03|04|05|06|07|08|09|10|11|12$/;
var expYear = /^16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31$/;
var expCVV=/^[0-9]{3,3}$/;

if(cardValid>0 && expName.test(C) && expMonth.test(M) && expYear.test(Y)
&& expCVV.test(CVV) && parseInt(cardCheck)>0)
{
$('#paymentButton').prop('disabled', false); 
$('#paymentButton').removeClass('disable');
}
else
{
$('#paymentButton').prop('disabled', true); 
$('#paymentButton').addClass('disable');
}
});

/* Card Validation */
cardValidate();

/*Payment Form */
$("#paymentForm").submit(function()
{
//.......
});

});
</script> 

Cartão de Validação
Cartão de Crédito e Validação usando jquery.validateCreditCard plugin.
/* Credit Card Type Check */
function cardValidate()
{
$('#card_number').validateCreditCard(function(result
{
var N=$(this).val();
var C=$(this).attr("class");
$(this).attr("class","");
if(result && N.length>0)
{
$(this).addClass(result.card_type.name);

if(result.valid && result.length_valid && result.luhn_valid)
{
$(this).addClass('valid'); 
$(this).attr("rel","1");
}
else
{
$(this).attr("rel","1");
}

}
else
{
$(this).removeClass(C);
}
});
}


Processo de pagamento Ajax
Processo Pagamento com jQuery Ajax, aqui $ (this) .serialize () obtem todos os valores de entrada de formulário e postagem para cardProcess.php. Quando a ordem for bem-sucedida, use obterá a mensagem de status do pedido.
/*Payment Form */
$("#paymentForm").submit(function()
{
var datastring = $(this).serialize();
$.ajax({
type: "POST",
url: "cardProcess.php",
data: datastring,
dataType: "json",
beforeSendfunction(){  $("#paymentButton").val('Processing..') },
successfunction(data)
{
$.each(data.OrderStatusfunction(i,data)
{
var HTML;
if(data)
{
$("#paymentGrid").slideUp("slow"); 
$("#orderInfo").fadeIn("slow");

if(data.status == '1')
{
HTML="Order <span>"+data.orderID+"</span> has been created successfully.";
}
else if(data.status == '2')
{
HTML="Transaction has been failed, please use other card.";
}
else
{
HTML="Card number is not valid, please use other card.";
}

$("#orderInfo").html(HTML);
}
});
},
errorfunction(){ alert('Network Error'); }
});
return false;
});

Integração BrainTree
Criar uma conta de sandbox no sandbox.braintreegateway.com para o processo de testes.

Payment System with BrainTree PayPal using PHP

Ir para a conta -> Meu usuário de rolagem para baixo você vai encontrar chaves de API.
Payment System with BrainTree PayPal using PHP

Você vai encontrar merchantId , publickey e PrivateKey
Payment System with BrainTree PayPal using PHP
cardProcess.php
Aqui você tem de modificar com seu BrainTree merchandID, pulicKey e PrivateKey. Esta é a tabela de Ordens de atualização, uma vez que a transação é bem-sucedida. Sempre manter / store carrinho preço total valor na sessão. Uma vez que o teste é feito, você pode modificar valor de ambiente de sandbox para a produção .
<?php
include 'db.php';
include 'functions.php';
$session_price =$_SESSION['session_price']; //Cart Total Price 
if($_SERVER["REQUEST_METHOD"] == "POST" )
{
$card_number=str_replace("+","",$_POST['card_number']); 
$card_name=$_POST['card_number'];
$expiry_month=$_POST['expiry_month'];
$expiry_year=$_POST['expiry_year'];
$cvv=$_POST['cvv'];
$expirationDate=$expiry_month.'/'.$expiry_year;

require_once 'braintree/Braintree.php';
Braintree_Configuration::environment('sandbox'); // Change to production
Braintree_Configuration::merchantId('Merchant_ID');
Braintree_Configuration::publicKey('Public_Key');
Braintree_Configuration::privateKey('Private_Key');
//BrainTree payment process
$result = Braintree_Transaction::sale(array(
'amount' => $price,
'creditCard' => array(
'number' => $card_number,
'cardholderName' => $card_name,
'expirationDate' => $expirationDate,
'cvv' => $cvv
)
));

if ($result->success)
{
if($result->transaction->id)
{
$braintreeCode=$result->transaction->id;
updateUserOrder($braintreeCode,$session_user_id,$session_price); //Order table update. 
}
}
else if ($result->transaction)
{
echo '{"OrderStatus": [{"status":"2"}]}';
}
else 
{
echo '{"OrderStatus": [{"status":"0"}]}';
}
}
?>

Atualização pedido de usuário
Isto irá atualizar a tabela encomendas, com base no código de status BrainTree. Carrinho status da tabela vai mudar 0 para 1 com id ordem.
<?php 
function updateUserOrder($braintreeCode,$session_user_id,$session_price) 
{
$db = getDB();
$sql = "INSERT INTO Orders(user_id_fk,created,braintreeCode)VALUES(:user_id,:created,:braintreeCode)";
$stmt = $db->prepare($sql);
$stmt->bindParam("user_id", $session_user_id);
$time=time();
$stmt->bindParam("created", $time);
$stmt->bindParam("braintreeCode", $braintreeCode);
$stmt->execute(); 

$sql1 = "SELECT order_id FROM Orders WHERE user_id_fk=:user_id ORDER BY order_id DESC LIMIT 1";
$stmt1 = $db-> prepare($sql1);
$stmt1-> bindParam("user_id", $session_user_id);
$stmt1-> execute(); 
$OrderDetails = $stmt1->fetchAll(PDO::FETCH_OBJ);
$order_id=$OrderDetails[0]->order_id;

$sql2 = "UPDATE Cart SET order_id_fk=:order_id,cart_status='1',price=:price WHERE cart_status='0' AND user_id_fk=:user_id";
$stmt2 = $db-> prepare($sql2);
$stmt2-> bindParam("user_id", $session_user_id);
$stmt2-> bindParam("order_id", $order_id);
$stmt2-> bindParam("price", $session_price);
$stmt2-> execute(); 
$db = null;
echo '{"OrderStatus": [{"status":"1", "orderID":"'.$order_id.'"}]}';
}
?>

Obtém os detalhes do Carrinho do Usuário
Obtem detalhes do cartão com base na identificação da sessão do usuário.
<?php 
function getUserCartDetails($session_user_id) 
{
$db = getDB();
$sql = "SELECT P.product_name,P.price FROM Users U, Cart C, Products P WHERE U.user_id=C.user_id_fk AND P.product_id = C.product_id_fk AND C.user_id_fk=:user_id AND C.cart_status='0'";
$stmt = $db->prepare($sql);
$stmt->bindParam("user_id", $session_user_id);
$stmt->execute(); 
$getUserCartDetails = $stmt->fetchAll(PDO::FETCH_OBJ);
$db = null;
return $getUserCartDetails;
}
?>

Demo ao vivo


db.php
Você tem que modificar os valores DATABASENAME nome de usuário, senha. Certifique-se de permitir DOP extensão no php.ini.
<?php
function getDB() {
$dbhost="localhost";
$dbuser="username";
$dbpass="password";
$dbname="databaseName";
$dbConnection = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass); 
$dbConnection->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
return $dbConnection;
}

/* User Sessions */
session_start();
$session_user_id=$_SESSION['user_id'];

Nota: Uma vez que seu teste é feito, crie uma conta de produção BrainTree e modifique os detalhes da chave.

Sobre o autor
Gabriel Medina é o autor deste blog, atualmente estuda eng. elétrica, ama jogar damas, assistir desenhos, filmes e séries, além de praticar esportes saudaveis.
Inscrever-se neste Blog via Email :

0 Comentários:

© 2017 Webzoon. Designed by Bloggertheme9
Powered by Blogger.
back to top