2024-02-23 11:48:16 +03:00
< ? php
// https://github.com/bitcart/whmcs-plugin/blob/master/modules/gateways/bitcartcheckout.php
// https://github.com/bitcart/bitcart-fossbilling/blob/master/Bitcart/Bitcart.php
namespace App\Extensions\Gateways\BitCart ;
use App\Classes\Extensions\Gateway ;
use App\Helpers\ExtensionHelper ;
use Illuminate\Support\Facades\Http ;
2024-02-23 23:19:27 +03:00
use Illuminate\Http\Request ;
2024-02-23 11:48:16 +03:00
class BitCart extends Gateway
{
/**
* Get the extension metadata
*
* @ return array
*/
public function getMetadata ()
{
return [
'display_name' => 'BitCart' ,
'version' => '0.0.1' ,
'author' => '0ut0f.space' ,
'website' => 'https://0ut0f.space' ,
];
}
/**
* Get all the configuration for the extension
*
* @ return array
*/
public function getConfig ()
{
return [
[
'name' => 'api_endpoint' ,
'friendlyName' => 'BitCart API endpoint' ,
'type' => 'text' ,
'required' => true ,
],
[
'name' => 'store_id' ,
'friendlyName' => 'BitCart store id' ,
'type' => 'text' ,
'required' => true ,
],
[
'name' => 'admin_url' ,
'friendlyName' => 'BitCart admin URL' ,
'type' => 'text' ,
'required' => true ,
],
];
}
/**
* Get the URL to redirect to
*
* @ param int $total
* @ param array $products
* @ param int $invoiceId
2024-02-24 13:02:51 +03:00
* @ return string
2024-02-23 11:48:16 +03:00
*/
public function pay ( $total , $products , $invoiceId )
{
$payment_url = $this -> get_payment_url ( $invoiceId , $total );
return $payment_url ;
}
public function get_payment_url ( $invoiceId , $amount ) {
$api_domain = ExtensionHelper :: getConfig ( 'Bitcart' , 'api_endpoint' );
$admin_domain = ExtensionHelper :: getConfig ( 'Bitcart' , 'admin_url' );
$params = array (
'price' => number_format ( $amount , 2 , '.' , '' ),
'store_id' => ExtensionHelper :: getConfig ( 'Bitcart' , 'store_id' ),
'currency' => ExtensionHelper :: getCurrency (),
2024-02-23 23:19:27 +03:00
'buyer_email' => auth () -> user () -> email ,
2024-02-23 11:48:16 +03:00
'redirect_url' => route ( 'clients.invoice.show' , $invoiceId ),
2024-02-23 23:19:27 +03:00
'notification_url' => url ( '/extensions/bitcart/webhook' ),
2024-02-23 11:48:16 +03:00
'order_id' => $invoiceId ,
);
$invoice = $this -> send_request ( sprintf ( '%s/%s' , $api_domain , 'invoices/order_id/' . urlencode ( $invoiceId )), $params );
return $admin_domain . '/i/' . $invoice -> id ;
}
public function send_request ( $url , $data , $post = 1 )
{
$post_fields = json_encode ( $data );
$request_headers = array ();
$request_headers [] = 'Content-Type: application/json' ;
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_HTTPHEADER , $request_headers );
if ( $post ) {
curl_setopt ( $ch , CURLOPT_POST , $post );
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $post_fields );
}
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
$result = curl_exec ( $ch );
curl_close ( $ch );
return json_decode ( $result );
}
2024-02-23 23:19:27 +03:00
public function webhook ( Request $request )
{
$body = $request -> getContent ();
2024-02-24 13:02:51 +03:00
$api_domain = ExtensionHelper :: getConfig ( 'Bitcart' , 'api_endpoint' );
2024-02-23 23:19:27 +03:00
$data = json_decode ( $body , true );
2024-02-24 13:02:51 +03:00
$url_check = sprintf ( '%s/%s' , $api_domain , 'invoices/' . $data [ 'id' ]);
$checkData = $this -> send_request ( $url_check , array (), 0 );
2024-02-23 23:19:27 +03:00
$invoiceId = $data [ 'id' ];
$status = $data [ 'status' ];
2024-02-24 13:02:51 +03:00
if ( $invoiceId != $checkData -> id ) {
return response () -> json ([ 'success' => false ]);
2024-02-23 23:19:27 +03:00
}
2024-02-24 13:02:51 +03:00
if ( $status != 'complete' || $status != $checkData -> status ) {
return response () -> json ([ 'success' => false ]);
}
ExtensionHelper :: paymentDone ( $checkData -> order_id , 'BitCart' , null );
return response () -> json ([ 'success' => true ]);
2024-02-23 23:19:27 +03:00
}
2024-02-23 11:48:16 +03:00
}