1KA_F2F/frontend/payments/classes/class.UserNarocilaStripe.php
2020-11-10 14:15:44 +01:00

375 lines
13 KiB
PHP

<?php
/**
*
* Class ki skrbi za placila s kreditno kartico (stripe) - TODO
*
*/
use \Stripe\Stripe;
use \Stripe\Customer;
use \Stripe\ApiOperations\Create;
use \Stripe\Charge;
use \Stripe\StripeClient;
class UserNarocilaStripe{
private $narocilo;
private $apiKey;
private $stripeService;
public function __construct($narocilo_id){
global $app_settings;
global $stripe_secret;
global $stripe_key;
$this->stripeService = new \Stripe\StripeClient($stripe_secret);
if($narocilo_id > 0){
// Dobimo podatke narocila
$sqlNarocilo = sisplet_query("SELECT un.*, u.name, u.surname, u.email, up.name AS package_name, up.description AS package_description, up.price AS package_price
FROM user_access_narocilo un, users u, user_access_paket up
WHERE un.id='".$narocilo_id."' AND un.usr_id=u.id AND un.package_id=up.id");
if(mysqli_num_rows($sqlNarocilo) > 0){
$this->narocilo = mysqli_fetch_array($sqlNarocilo);
}
else{
die("Napaka pri komunikaciji s stripe! Narocilo ne obstaja.");
}
}
else {
die("Napaka pri komunikaciji s stripe! Manjka ID naročila.");
}
}
// Ustvarimo session za placilo v stripe - V DELU
public function stripeCreateSession(){
global $site_url;
global $lang;
$response = array();
$UA = new UserNarocila();
$cena = $UA->getPrice($this->narocilo['package_name'], $this->narocilo['trajanje'], $this->narocilo['discount']);
if($this->narocilo['trajanje'] == 1)
$months_string = 'mesec';
elseif($this->narocilo['trajanje'] == 2)
$months_string = 'meseca';
elseif($this->narocilo['trajanje'] == 3 || $this->narocilo['trajanje'] == 4)
$months_string = 'mesece';
else
$months_string = 'mesecev';
// Zavezanec iz tujine ima racun/predracun brez ddv
if($UA->isWithoutDDV($this->narocilo['id'])){
$ddv = 0;
$cena_za_placilo = $cena['final_without_tax'];
}
else{
$ddv = 1;
$cena_za_placilo = $cena['final'];
}
// URL po potrditvi oz preklicu
if($lang['id'] == '2'){
$drupal_url_confirm = $site_url.'/d/en/stripe-purchase/success?narocilo_id='.$this->narocilo['id'];
$drupal_url_cancel = $site_url.'/d/en/stripe-purchase/cancel?narocilo_id='.$this->narocilo['id'];
}
else{
$drupal_url_confirm = $site_url.'/d/narocilo/stripe?narocilo_id='.$this->narocilo['id'];
$drupal_url_cancel = $site_url.'/d/narocilo/stripe-cancel?narocilo_id='.$this->narocilo['id'];
}
// Ustvarimo checkout session
try {
$stripe_response = $this->stripeService->checkout->sessions->create([
'success_url' => $drupal_url_confirm,
'cancel_url' => $drupal_url_cancel,
'payment_method_types' => ['card'],
'line_items' => [
[
'name' => '1KA naročnina (paket '.strtoupper($this->narocilo['package_name']). ' - '.$this->narocilo['trajanje'].' '.$months_string.')',
'price' => $cena_za_placilo,
'quantity' => 1,
'currency' => 'eur',
],
],
]);
// Dobimo id paypal narocila
$stripe_response['session_id'] = $stripe_response->session->id;
}
catch (HttpException $e) {
$response['error'] = $e->getMessage();
$response['success'] = false;
return $response;
}
// Vstavimo stripe charge v bazo
$sqlNarocilo = sisplet_query("INSERT INTO user_access_stripe_charge
(session_id, narocilo_id, price, time, status)
VALUES
('".$stripe_response['session_id']."', '".$this->narocilo['id']."', '".$cena_za_placilo."', NOW(), 'CREATED')
");
if (!$sqlNarocilo){
$response['error'] = 'ERROR! '.mysqli_error($GLOBALS['connect_db']);
$response['success'] = false;
return $response;
}
$response['session_id'] = $stripe_response['session_id'];
$response['success'] = true;
return $response;
}
// Zakljucimo placilo, ce je bilo placilo ok odobreno preko stripe s strani stranke - V DELU
public function stripeCheckoutSuccess(){
$response = array();
// Preverimo plačilo v bazo
$sqlNarociloStripe = sisplet_query("SELECT session_id
FROM user_access_stripe_charge
WHERE narocilo_id='".$this->narocilo['id']."'
");
if (!$sqlNarociloPaypal){
$response['error'] = 'ERROR! '.mysqli_error($GLOBALS['connect_db']);
$response['success'] = false;
return $response;
}
// Narocilo ne obstaja (ni v bazi paypal narocil)
if (mysqli_num_rows($sqlNarociloStripe) == 0){
$response['error'] = 'ERROR! Stripe order session does not exist.';
$response['success'] = false;
return $response;
}
$rowNarociloStripe = mysqli_fetch_array($sqlNarociloStripe);
// Preverimo, ce je bilo vse ok placano - POST request to /v2/checkout/orders
$request = new OrdersCaptureRequest($rowNarociloPaypal['transaction_id']);
try {
// Poklicemo paypal api kjer preverimo placilo narocila
$paypal_response = $this->paypal_client->execute($request);
}
catch (HttpException $e) {
$response['error'] = $e->getMessage();
$response['success'] = false;
return $response;
}
// Posodobimo status narocila
$sqlNarocilo = sisplet_query("UPDATE user_access_stripe_charge
SET status='".$paypal_response->result->status."'
WHERE transaction_id='".$paypal_response->result->id."'
");
if (!$sqlNarocilo){
$response['error'] = 'ERROR! '.mysqli_error($GLOBALS['connect_db']);
$response['success'] = false;
return $response;
}
// Nastavimo narocilo na placano, aktiviramo paket in vrnemo racun
$narocilo = new UserNarocila();
$payment_response = $narocilo->payNarocilo($this->narocilo['id']);
if($payment_response['success'] == true){
$response['racun'] = $payment_response['racun'];
$response['success'] = true;
}
else{
$response['error'] = $payment_response['error'];
$response['success'] = false;
}
$response['narocilo_id'] = $this->narocilo['id'];
$response['success'] = true;
return $response;
}
// Preklicemo placilo, ce je bilo placilo preklicano preko stripe s strani stranke
public function stripeCheckoutCancel(){
$response = array();
// Posodobimo status narocila
$sqlNarocilo = sisplet_query("UPDATE user_access_stripe_charge
SET status='CANCELLED'
WHERE narocilo_id='".$this->narocilo['id']."'
");
if (!$sqlNarocilo){
$response['error'] = 'ERROR! '.mysqli_error($GLOBALS['connect_db']);
$response['success'] = false;
return $response;
}
// Nastavimo status narocila na storniran
$sqlNarociloStatus = sisplet_query("UPDATE user_access_narocilo SET status='2' WHERE id='".$this->narocilo['id']."'");
if (!$sqlNarociloStatus){
$response['error'] = 'ERROR! '.mysqli_error($GLOBALS['connect_db']);
$response['success'] = false;
return $response;
}
$response['success'] = true;
return $response;
}
/*
// Placamo narocilo s kreditno kartico preko stripa
public function stripePayment($token){
$UA = new UserNarocila();
$cena = $UA->getPrice($this->narocilo['package_name'], $this->narocilo['trajanje'], $this->narocilo['discount']);
if($this->narocilo['trajanje'] == 1)
$months_string = 'mesec';
elseif($this->narocilo['trajanje'] == 2)
$months_string = 'meseca';
elseif($this->narocilo['trajanje'] == 3 || $this->narocilo['trajanje'] == 4)
$months_string = 'mesece';
else
$months_string = 'mesecev';
// Zavezanec iz tujine ima racun/predracun brez ddv
if($UA->isWithoutDDV($this->narocilo['id'])){
$ddv = 0;
$cena_za_placilo = $cena['final_without_tax'];
}
else{
$ddv = 1;
$cena_za_placilo = $cena['final'];
}
// Podatki za kartico potrebni za placilo
$cardDetails = array(
'email' => $this->narocilo['email'],
'token' => $token,
'amount' => $cena_za_placilo * 100,
'currency_code' => 'eur',
'item_name' => '1KA naročnina (paket '.strtoupper($this->narocilo['package_name']). ' - '.$this->narocilo['trajanje'].' '.$months_string.')',
'item_number' => $this->narocilo['id'],
);
// Izvedemo placilo - stripe response
try{
$stripeResponse = $this->chargeAmountFromCard($cardDetails);
}
catch (Exception $e){
$response['error'] = 'ERROR! '.$e->getMessage();
return $response;
}
// Vstavimo plačilo v bazo
$sqlNarocilo = sisplet_query("INSERT INTO user_access_stripe_charge
(narocilo_id, description, price, amount_paid, status, balance_transaction, time)
VALUES
('".$this->narocilo['id']."', '".$cardDetails['item_name']."', '".$cena_za_placilo."', '".($stripeResponse['amount'] / 100)."', '".$stripeResponse['status']."', '".$stripeResponse['balance_transaction']."', NOW())
");
if (!$sqlNarocilo){
$response['error'] = 'ERROR! '.mysqli_error($GLOBALS['connect_db']);
$response['success'] = false;
return $response;
}
$response = array();
// Placilo uspesno
if ($stripeResponse['amount_refunded'] == 0
&& empty($stripeResponse['failure_code'])
&& $stripeResponse['paid'] == 1
&& $stripeResponse['captured'] == 1
&& $stripeResponse['status'] == 'succeeded'
) {
$response['success'] = true;
$response['stripe_note'] = "Stripe payment is completed successfully. The TXN ID is " . $stripeResponse["balance_transaction"];
}
// Placilo ni uspelo
else{
$response['error'] = 'ERROR! Stripe payment failed. Failure code '.$stripeResponse['failure_code'];
$response['success'] = false;
}
return $response;
}
private function chargeAmountFromCard($cardDetails){
// Iz emaila in tokena ustvarimo stranko
$customerDetailsAry = array(
'email' => $cardDetails['email'],
'source' => $cardDetails['token']
);
$customerResult = $this->addCustomer($customerDetailsAry);
$charge = new Charge();
// Napolnimo podatke za placilo
$cardDetailsAry = array(
'customer' => $customerResult->id,
'amount' => $cardDetails['amount'],
'currency' => $cardDetails['currency_code'],
'description' => $cardDetails['item_name'],
'metadata' => array(
'order_id' => $cardDetails['item_number']
)
);
// Izvedemo "charge"
$result = $charge->create($cardDetailsAry);
return $result->jsonSerialize();
}
private function addCustomer($customerDetailsAry){
$customer = new Customer();
$customerDetails = $customer->create($customerDetailsAry);
return $customerDetails;
}
*/
}