Skip to content

Instantly share code, notes, and snippets.

@paulinhowoox
Created July 3, 2019 21:48
Show Gist options
  • Save paulinhowoox/6994e82bb75994d5e102910313c81dca to your computer and use it in GitHub Desktop.
Save paulinhowoox/6994e82bb75994d5e102910313c81dca to your computer and use it in GitHub Desktop.
Pagamento simples com PagSeguro
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.2.5/vue.min.js"></script>
<!--<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.0.0-alpha.6/css/bootstrap.min.css">-->
<script src="pagseguro.js"></script>
</head>
<body style="padding:15px;">
<div id="app">
<div class="row">
<div class="col-xs-6">
<select v-model="post.paymentMethod">
<optgroup v-for="method in paymentMethods" :label="method.name">
<option :value="option.code" v-for="option in method.options" v-if="option.status=='AVAILABLE'">{{ option.displayName }}</option>
</optgroup>
</select>
<button @click="_pay('eft');">pay eft</button>
<button @click="_pay('boleto');">pay boleto</button>
<button @click="_pay('creditCard', {cardNumber:'4111 1111 1111 1111', brand:'visa', cvv:'123', expirationMonth:'12', expirationYear:'2030'});">pay creditCard</button>
</div>
<div class="col-xs-6">--</div>
</div>
<pre>{{ $data|json }}</pre>
</div>
<script>
var pagseguro;
var vue = new Vue({
el: "#app",
data: {
items: [],
total: 0,
post: {},
paymentMethod: {},
paymentMethods: {},
},
methods: {
_pay: function(mode, card) {
pagseguro.pay(mode, card, function(response) {
alert('Pagamento concluído: '+response.code);
});
},
},
mounted: function() {
var app = this;
pagseguro = new PagSeguro({
environment: "sandbox",
init: function() {
var me = this;
this.setPost({
"senderName": "João da Silva",
"senderCPF": "493.430.173-91",
"senderAreaCode": "31",
"senderPhone": "3154-8544",
"senderEmail": "joao.silva@sandbox.pagseguro.com.br",
"shippingAddressStreet": "Rua Teste",
"shippingAddressNumber": "123",
"shippingAddressComplement": "AP 101",
"shippingAddressDistrict": "Lorem Ipsum",
"shippingAddressPostalCode": "31540-550",
"shippingAddressCity": "Belo Horizonte",
"shippingAddressState": "MG",
"shippingAddressCountry": "BR",
"creditCardHolderName": "João da Silva",
"creditCardHolderCPF": "493.430.173-91",
"creditCardHolderBirthDate": "11/02/1986",
"creditCardHolderAreaCode": "31",
"creditCardHolderPhone": "3154-8544",
"billingAddressStreet": "Rua Teste",
"billingAddressNumber": "123",
"billingAddressComplement": "AP 101",
"billingAddressDistrict": "Lorem Ipsum",
"billingAddressPostalCode": "31540-550",
"billingAddressCity": "Belo Horizonte",
"billingAddressState": "MG",
"billingAddressCountry": "BR",
"bankName": "itau",
});
this.addItem("001", "Item 001", 19.90, 1);
this.addItem("002", "Item 002", 9.90, 1);
this.addItem("003", "Item 002", 29.90, 1);
app.items = this.getItems();
app.total = this.total();
app.post = this.getPost();
app.paymentMethods = this.getPaymentMethods();
},
});
},
});
</script>
</body>
</html>
function PagSeguro(config) {
var me = this;
config = typeof config=="object"? config: {};
config.environment = config.environment||"sandbox";
config.ajaxUrl = config.ajaxUrl||"pagseguro.php";
config.init = config.init||function() { console.log('Undefined config.init'); };
me.config = config;
this.getConfig = function() { return this.config; };
this.pagseguroUrl = config.environment=="sandbox"? "https://ws.sandbox.pagseguro.uol.com.br/v2": "https://ws.pagseguro.uol.com.br/v2";
this.pagseguroJs = config.environment=="sandbox"? "https://stc.sandbox.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.directpayment.js":
"https://stc.pagseguro.uol.com.br/pagseguro/api/v2/checkout/pagseguro.directpayment.js";
this.post = {
senderHash:false, paymentMode: "default", paymentMethod: "boleto", currency: "BRL", extraAmount: "0.00",
notificationURL:false,
// Items list
reference: "REF0001",
// Sender
senderName: "", senderCPF: "", senderAreaCode: "", senderPhone: "", senderEmail: "", shippingAddressStreet: "", shippingAddressNumber: "",
shippingAddressComplement: "", shippingAddressDistrict: "", shippingAddressPostalCode: "", shippingAddressCity: "", shippingAddressState: "",
shippingAddressCountry: "BR", shippingType: "3", shippingCost: "0.00",
// BOLETO
// ONLINE_DEBIT
bankName: "",
// BALANCE
// CREDIT_CARD
creditCardToken: "", installmentQuantity: "1", installmentValue: "0", noInterestInstallmentQuantity: "2", creditCardHolderName: "",
creditCardHolderCPF: "", creditCardHolderBirthDate: "", creditCardHolderAreaCode: "", creditCardHolderPhone: "", billingAddressStreet: "",
billingAddressNumber: "", billingAddressComplement: "", billingAddressDistrict: "", billingAddressPostalCode: "", billingAddressCity: "",
billingAddressState: "", billingAddressCountry: "BR",
// DEPOSIT
};
this.setPost = function(post) { for(var i in post) this.post[i] = post[i]; };
this.getPost = function() { return this.post; };
this.addItem = function(itemId,itemDescription,itemAmount,itemQuantity){for(var i=1;i<=99;i++){if(this.post['itemId'+i]===undefined){this.post['itemId'+i]=itemId;this.post['itemDescription'+i]=itemDescription;this.post['itemAmount'+i]=itemAmount;this.post['itemQuantity'+i]=itemQuantity;break;}}};
this.getItems = function(){var items=[];for(var i=1;i<=99;i++){if(this.post['itemId'+i]===undefined){break;} else{items.push({"itemId":this.post['itemId'+i],"itemDescription":this.post['itemDescription'+i],"itemAmount":this.post['itemAmount'+i],"itemQuantity":this.post['itemQuantity'+i],});}} return items;};
this.paymentMethods = [];
this.getPaymentMethods = function() { return this.paymentMethods; };
this.errorList = [];
this.addError = function(error) {
this.errorList.push(error);
};
this.getErrors = function() {
var errors = this.errorList;
this.errorList = [];
return errors;
};
/* method = creditCard|boleto|eft */
this.pay = function(method, card, callback) {
this.post.paymentMethod = method;
this.post.senderHash = PagSeguroDirectPayment.getSenderHash();
callback = typeof callback=="function"? callback: function() { console.log('Informe o callback do método pay();'); };
var _finalPay = function() {
$.post(config.ajaxUrl+"?pay="+method, me.getPost(), function(response) {
if (response.error) me.addError(response.error);
else callback.call(me, response);
}, "json");
};
console.log(method);
if (method=="creditCard") {
card = typeof card=="object"? card: {};
card.cardNumber = card.cardNumber||"";
card.brand = card.brand||"";
card.cvv = card.cvv||"";
card.expirationMonth = card.expirationMonth||"";
card.expirationYear = card.expirationYear||"";
card.success = function(response) {
me.post.creditCardToken = response.card.token;
_finalPay();
};
card.error = function(response) {
for(var i in response.errors) {
/*if (i=="10000") appPayment._flash("danger", "Bandeira de cartão inválida");
else if (i=="10001") appPayment._flash("danger", "Número de cartão de crédito "+ appPayment.paymentMethodOption.name +" inválido");
else if (i=="10002") appPayment._flash("danger", "Formato de data inválido");
else if (i=="10004") appPayment._flash("danger", "Informe o código de segurança");
else if (i=="30400") appPayment._flash("danger", "Dados de cartão inválidos");
else appPayment._flash("danger", (i+ ": "+ response.errors[i]));*/
}
};
PagSeguroDirectPayment.createCardToken(card);
}
else _finalPay();
};
this.addError = function(error) { console.log('error', error); };
this.getErrors = function() {};
this.total = function(){var total=parseFloat(this.post.extraAmount||0);total+=parseFloat(this.post.shippingCost||0);var items=this.getItems();for(var i in items){var item=items[i];total+=parseFloat(item.itemAmount||0)*parseFloat(item.itemQuantity||1);} return total;};
this.events = {events:[],on:function(name,callback){this.events.push({"name":name,"callback":callback});},trigger:function(name){for(var i in this.events){var evt=this.events[i];if(evt.name==name||evt.name=="any"){evt.callback.call(null,name);}}},};
me.events.trigger("before-load-session");
$.get(me.config.ajaxUrl+"?session", function(resp) {
me.events.trigger("after-load-session");
me.events.trigger("before-load-pagsegurojs");
$.getScript(me.pagseguroJs, function() {
me.events.trigger("after-load-pagsegurojs");
PagSeguroDirectPayment.setSessionId(resp.id);
me.events.trigger("before-load-payment-methods");
PagSeguroDirectPayment.getPaymentMethods({
amount: me.total(),
success: function(response) {
me.events.trigger("after-load-payment-methods");
for(var i in response.paymentMethods) {
if (!response.paymentMethod) { response.paymentMethod = response.paymentMethods[i]; }
for(var ii in response.paymentMethods[i].options||[]) {
response.paymentMethods[i].options[ii].image = null;
if (response.paymentMethods[i].options[ii].images||false) {
response.paymentMethods[i].options[ii].images['SMALL'].path = 'https://stc.pagseguro.uol.com.br'+ response.paymentMethods[i].options[ii].images['SMALL'].path;
response.paymentMethods[i].options[ii].images['MEDIUM'].path = 'https://stc.pagseguro.uol.com.br'+ response.paymentMethods[i].options[ii].images['MEDIUM'].path;
response.paymentMethods[i].options[ii].image = response.paymentMethods[i].options[ii].images['MEDIUM'].path;
}
}
}
me.paymentMethods = response.paymentMethods;
if (typeof config.init=="function") config.init.call(me);
},
error: function(response) {
me.addError(response.error);
}
});
});
}, "json");
return this;
}
<?php
define('EMAIL', 'weversonsoares@resconbrasil.com.br');
define('TOKEN_PRODUCTION', 'A7B54658EC8A4CDABA3049D539828989');
define('TOKEN_SANDBOX', 'A835CE30E3B540528843F4B10E426BA3');
define('ENVIRONMENT', 'sandbox');
define('NOTIFICATION_URL', '');
session_start();
date_default_timezone_set('America/Sao_Paulo');
class Pagseguro
{
/* Este evento é chamado quando a notificação de alteração de status
do PagSeguro é recebida. A constante NOTIFICATION_URL guarda uma URL de notificação, que pode não ser este
arquivo PHP, portanto esse evento só é executado quando NOTIFICATION_URL é falsa. */
static function onNotification($data)
{
/* $data : {
"date":"2017-02-26T15:24:24.000-03:00",
"code":"DCF5118B-86B2-4C35-BDB7-4891E235AB10",
"reference":"order-00001",
"type":"1",
"status":"1",
"lastEventDate":"2017-02-26T15:24:27.000-03:00",
"paymentMethod":{"type":"2","code":"202"},
"paymentLink":"https:\/\/sandbox.pagseguro.uol.com.br\/checkout\/payment\/booklet\/print.jhtml?c=14a75438c1636fbef16422f80fa174863c8f6572f934ae61d537655ef82917f68565396b25395875",
"grossAmount":"9.99",
"discountAmount":"0.00",
"feeAmount":"0.90",
"netAmount":"9.09",
"extraAmount":"0.00",
"installmentCount":"1",
"itemCount":"1",
"items":{"item":{"id":"0001","description":"Produto 01","quantity":"1","amount":"9.99"}},
"sender":{
"name":"Jos\u00c3\u00a9 comprador",
"email":"c92882914837401995559@sandbox.pagseguro.com.br",
"phone":{"areaCode":"31","number":"99112113"},
"documents":{"document":{"type":"CPF","value":"551.433.284-54"}}},
"shipping":{"address":{"street":"Av. Beira Mar","number":"322","complement":"AP 401","district":"Vila Nova","city":"Belo Horizonte","state":"MG","country":"BRA","postalCode":"31722648"},
"type":"3",
"cost":"0.00"
}
}*/
return "Status: {$data['status']}\nCode: {$data['code']}";
}
static function config() {
$base = str_replace(realpath($_SERVER['DOCUMENT_ROOT']), $_SERVER['HTTP_HOST'], __FILE__);
$base = str_replace('\\', '/', $base);
$base = ((isset($_SERVER['HTTPS']) and $_SERVER['HTTPS'] =='on')? 'https://': 'http://') .$base;
$config = array(
'email' => EMAIL,
'token' => TOKEN_SANDBOX,
'url' => 'https://ws.sandbox.pagseguro.uol.com.br/v2',
'notificationURL' => NOTIFICATION_URL? NOTIFICATION_URL: $base,
);
if (ENVIRONMENT=='production') {
$config['token'] = TOKEN_PRODUCTION;
$config['url'] = 'https://ws.pagseguro.uol.com.br/v2';
}
return $config;
}
static function pagseguroRest($url, $fields=array())
{
$config = self::config();
$url = "{$config['url']}{$url}";
$is_post = $fields===FALSE? FALSE: TRUE;
$fields_string = $is_post? http_build_query($fields): FALSE;
$ch = curl_init($url);
if ($is_post) {
curl_setopt($ch, CURLOPT_POST, count($fields));
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$xml = curl_exec($ch);
curl_close($ch);
if ($xml=='Unauthorized') {
return array('errors'=>array('Unauthorized'));
}
libxml_use_internal_errors(true);
$xml = (array) simplexml_load_string($xml);
if ($errors = libxml_get_errors()) {
$xml['errors'] = 'O servidor do PagSeguro está com problemas no momento. Por favor, novamente mais tarde.';
return false;
}
$xml = json_decode(json_encode($xml), TRUE);
if (isset($xml['error'])) {
/* Quando a API do PagSeguro só tem um erro, este erro é colocado diretamente na índice "error" em vez
de usar uma array. Aqui é forçado para que "error" sempre seja array. */
$xml['error'] = isset($xml['error']['code'])? array($xml['error']): $xml['error'];
/* Tentando traduzir errors */
foreach($xml['error'] as $i=>$error) {
if ($error['code']=='53004') $error['message'] = 'Quantidade de ítens inválidos';
else if ($error['code']=='30400') $error['message'] = 'Os dados do cartão de crédito são inválidos';
else if ($error['code']=='53010') $error['message'] = 'E-mail é inválido';
else if ($error['code']=='53013') $error['message'] = 'Nome do comprador é inválido';
else if ($error['code']=='53017') $error['message'] = "CPF inválido: {$_POST['senderCPF']}";
else if ($error['code']=='53018') $error['message'] = 'Código de área do telefone está incorreto';
else if ($error['code']=='53019') $error['message'] = 'Código de área do telefone é inválido';
else if ($error['code']=='53020') $error['message'] = 'Telefone está incorreto';
else if ($error['code']=='53022') $error['message'] = 'CEP do endereço inválido';
else if ($error['code']=='53024') $error['message'] = 'Nome da rua é inválido';
else if ($error['code']=='53026') $error['message'] = 'Número residencial do campo endereço é inválido';
else if ($error['code']=='53029') $error['message'] = 'Bairro é inválido';
else if ($error['code']=='53031') $error['message'] = 'Nome da cidade é um campo inválido';
else if ($error['code']=='53033') $error['message'] = 'Estado é um campo inválido';
else if ($error['code']=='53042') $error['message'] = 'Nome do titular do cartão de crédito é inválido';
else if ($error['code']=='53045') $error['message'] = 'CPF do titular do cartão de crédito é inválido';
else if ($error['code']=='53047') $error['message'] = 'Informe a data de nascimento do dono do cartão';
else if ($error['code']=='53049') $error['message'] = 'Código de área do telefone do titular do cartão é inválido';
else if ($error['code']=='53051') $error['message'] = 'Telefone do titular do cartão de crédito é inválido';
else if ($error['code']=='53053') $error['message'] = 'CEP do endereço de cobrança é inválido';
else if ($error['code']=='53055') $error['message'] = 'Endereço de cobrança inválido';
else if ($error['code']=='53057') $error['message'] = 'Número residencial de cobrança inválido';
else if ($error['code']=='53060') $error['message'] = 'Bairro do endereço de cobrança é inválido';
else if ($error['code']=='53062') $error['message'] = 'Cidade do endereço de cobrança é inválido';
else if ($error['code']=='53064') $error['message'] = 'Estado do endereço de cobrança é inválido';
else if ($error['code']=='53081') $error['message'] = 'O e-mail do comprador é o mesmo do dono da conta do PagSeguro. Por favor, utilize outro e-mail.';
else if ($error['code']=='53110') $error['message'] = 'Informe o banco para o pagamento via débito';
else if ($error['code']=='53111') $error['message'] = 'Banco não aceito para pagamento em débito';
else if ($error['code']=='53118') $error['message'] = 'CPF ou CNPJ é inválido';
else { $error['message'] = "#{$error['code']} - {$error['message']}"; }
$xml['error'][$i] = $error;
}
}
return $xml;
}
static function sessionId()
{
$config = self::config();
$session = self::pagseguroRest('/sessions', array(
'email' => $config['email'],
'token' => $config['token'],
));
return isset($session['id'])? $session['id']: FALSE;
}
static function listen()
{
// payment.php {"notificationCode":"sd321f3s2"}
if (isset($_POST['notificationCode'])) {
//header("access-control-allow-origin: https://sandbox.pagseguro.uol.com.br"); //Teste
header("access-control-allow-origin: https://pagseguro.uol.com.br"); //Produção
$config = self::config();
$data = self::pagseguroRest("/transactions/notifications/{$_POST['notificationCode']}?email={$config['email']}&token={$config['token']}", FALSE);
$notification = self::onNotification($data);
echo "STATUS: OK\n{$notification}"; die;
}
// payment.php?session
else if (isset($_GET['session'])) {
$config = self::config();
$session = self::pagseguroRest('/sessions', array(
'email' => $config['email'],
'token' => $config['token'],
));
echo json_encode($session); die;
}
// payment.php?pay
else if (isset($_GET['pay'])) {
$config = self::config();
$_POST = array_merge(array(
'email' => '', 'receiverEmail' => '', 'token' => '', 'paymentMode' => 'default', 'paymentMethod' => '',
'currency' => 'BRL', 'extraAmount' => '0.00', 'notificationURL' => '', 'senderHash' => '',
// Sender
'senderName' => '', 'senderCPF' => '', 'senderAreaCode' => '', 'senderPhone' => '', 'senderEmail' => '',
'shippingAddressStreet' => '', 'shippingAddressNumber' => '', 'shippingAddressComplement' => '', 'shippingAddressDistrict' => '',
'shippingAddressPostalCode' => '', 'shippingAddressCity' => '', 'shippingAddressState' => '', 'shippingAddressCountry' => 'BR',
'shippingType' => '', 'shippingCost' => '0.00',
// Deposit
'bankName' => '',
// Credit card
'creditCardToken' => '', 'installmentQuantity' => '', 'installmentValue' => '', 'noInterestInstallmentQuantity' => '',
'creditCardHolderName' => '', 'creditCardHolderCPF' => '', 'creditCardHolderBirthDate' => '',
'creditCardHolderAreaCode' => '', 'creditCardHolderPhone' => '', 'billingAddressStreet' => '', 'billingAddressNumber' => '',
'billingAddressComplement' => '', 'billingAddressDistrict' => '', 'billingAddressPostalCode' => '',
'billingAddressCity' => '', 'billingAddressState' => '', 'billingAddressCountry' => 'BR',
), $_POST);
$_POST['email'] = $config['email'];
$_POST['token'] = $config['token'];
$_POST['notificationURL'] = $config['notificationURL'];
$_POST['senderCPF'] = preg_replace('/[^0-9]/', '', $_POST['senderCPF']);
$_POST['senderPhone'] = preg_replace('/[^0-9]/', '', $_POST['senderPhone']);
$_POST['creditCardHolderCPF'] = preg_replace('/[^0-9]/', '', $_POST['creditCardHolderCPF']);
$_POST['creditCardHolderPhone'] = preg_replace('/[^0-9]/', '', $_POST['creditCardHolderPhone']);
// Trata valores numéricos e remove itens com valor zero
$installmentValue = 0;
for($i=0; $i<=99; $i++) {
if (isset($_POST["itemAmount{$i}"])) {
$amount = $_POST["itemAmount{$i}"];
$quantity = $_POST["itemQuantity{$i}"];
$installmentValue += ($amount * $quantity);
if ($amount==0) {
unset($_POST["itemId{$i}"]);
unset($_POST["itemDescription{$i}"]);
unset($_POST["itemAmount{$i}"]);
unset($_POST["itemQuantity{$i}"]);
continue;
}
$amount = number_format(preg_replace('/[^0-9]/', '', $amount)/100, 2, '.', '');
$_POST["itemAmount{$i}"] = $amount;
}
}
$_POST['extraAmount'] = number_format(preg_replace('/[^0-9]/', '', $_POST['extraAmount'])/100, 2, '.', '');
$_POST['shippingCost'] = number_format(preg_replace('/[^0-9]/', '', $_POST['shippingCost'])/100, 2, '.', '');
if (isset($_POST['installmentValue'])) {
$_POST['installmentValue'] = $_POST['installmentValue']? $_POST['installmentValue']: $installmentValue;
$_POST['installmentValue'] = number_format(preg_replace('/[^0-9]/', '', $_POST['installmentValue'])/100, 2, '.', '');
}
// payment.php?pay=BOLETO
if ($_GET['pay']=='BOLETO') {
$_POST['paymentMethod'] = 'boleto';
}
// payment.php?pay=CREDIT_CARD
else if ($_GET['pay']=='CREDIT_CARD') {
$_POST['paymentMethod'] = 'creditCard';
}
// payment.php?pay=ONLINE_DEBIT
else if ($_GET['pay']=='ONLINE_DEBIT') {
$_POST['paymentMethod'] = 'eft';
}
$response = self::pagseguroRest('/transactions', $_POST);
/* Em caso de sucesso, $responce recebe seguinte array:
{
"date":"2017-02-26T15:24:24.000-03:00",
"code":"DCF5118B-86B2-4C35-BDB7-4891E235AB10",
"reference":"order-00001",
"type":"1",
"status":"1",
"lastEventDate":"2017-02-26T15:24:27.000-03:00",
"paymentMethod":{"type":"2","code":"202"},
"paymentLink":"https:\/\/sandbox.pagseguro.uol.com.br\/checkout\/payment\/booklet\/print.jhtml?c=14a75438c1636fbef16422f80fa174863c8f6572f934ae61d537655ef82917f68565396b25395875",
"grossAmount":"9.99",
"discountAmount":"0.00",
"feeAmount":"0.90",
"netAmount":"9.09",
"extraAmount":"0.00",
"installmentCount":"1",
"itemCount":"1",
"items":{"item":{"id":"0001","description":"Produto 01","quantity":"1","amount":"9.99"}},
"sender":{
"name":"Jos\u00c3\u00a9 comprador",
"email":"c92882914837401995559@sandbox.pagseguro.com.br",
"phone":{"areaCode":"31","number":"99112113"},
"documents":{"document":{"type":"CPF","value":"551.433.284-54"}}},
"shipping":{"address":{"street":"Av. Beira Mar","number":"322","complement":"AP 401","district":"Vila Nova","city":"Belo Horizonte","state":"MG","country":"BRA","postalCode":"31722648"},
"type":"3",
"cost":"0.00"
}
}*/
echo json_encode($response); die;
}
}
}
Pagseguro::listen();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment