Created
February 11, 2021 10:05
-
-
Save MagedAhmad/8f18eb0049466b6d5aea183d4de00cde to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| namespace MagedAhmad\LaraPayment; | |
| use GuzzleHttp\Client; | |
| use MagedAhmad\LaraPayment\Paymob; | |
| use MagedAhmad\LaraPayment\Models\Balance_summary; | |
| class LaraPayment | |
| { | |
| use Paymob; | |
| public $request; | |
| public $method; | |
| public $amount; | |
| public $token; | |
| public $currency; | |
| public $sk_code; | |
| public $usdtoegp; | |
| public $PAYMOB_API_KEY; | |
| public $FAWRY_MERCHANT; | |
| public $FAWRY_SECRET; | |
| public $items; | |
| public $product; | |
| public $note; | |
| public $type; | |
| /** | |
| * Initiate payment helper class | |
| * | |
| * @param string $currency | |
| */ | |
| public function __construct($currency=null) | |
| { | |
| $this->request = new Client(); | |
| $this->currency=(null==$currency) ? "USD" : $currency; | |
| $this->PAYMOB_API_KEY= config('larapayment.paymob_api_key'); | |
| } | |
| public function make_payment($method, $amount, $items = null, $type = 'course',$product = null, $note = 0){ | |
| $this->method=$method; | |
| $this->amount=$this->clac_new_amount($method,$amount); | |
| $this->usdtoegp = 1; | |
| $this->items = $items; | |
| $this->type = $type; | |
| $this->product = $product; | |
| $this->amount_in_egp = $this->currency == 'USD' ? sprintf('%0.2f', ceil( $this->amount*$this->usdtoegp ) ) : sprintf('%0.2f', ceil( $this->amount ) ) ; | |
| $this->note = $note; | |
| if($this->method=="paymob"){ | |
| return $this->paymob_payment(); | |
| } | |
| } | |
| /** | |
| * Paymob payment workflow | |
| * This function go through the workflow of paymob integration | |
| * and return the ifram url used to make the payment | |
| * | |
| * @return array | |
| */ | |
| public function paymob_payment(){ | |
| $request = new Client(); | |
| // get auth token | |
| $token = $this->getPaymobAuthenticationToken(); | |
| // make order | |
| $order = $this->makePaymobOrder($token->token); | |
| // store payment in DB with bending status | |
| $store_payment= $this->store_payment( | |
| $payment_id=$order->id, | |
| $amount=$this->calc_amout_after_transaction("paymob",$this->amount), | |
| $source="credit", | |
| $process_data= json_encode($order), | |
| $currency_code=$this->currency, | |
| $status=strtoupper("PENDING"), | |
| $note= $this->note | |
| ); | |
| // create key token | |
| // used for iframe | |
| $paymentToken = $this->createPaymobPaymentToken($token->token, $order); | |
| return [ | |
| 'status'=>200, | |
| 'payment_token' => $paymentToken, | |
| 'redirect'=>"https://accept.paymobsolutions.com/api/acceptance/iframes/".config("larapayment.paymob_iframe_id")."?payment_token=" . $paymentToken, | |
| ]; | |
| } | |
| /** | |
| * Create payment token | |
| * | |
| * @param string $token | |
| * @param json $order | |
| * | |
| * @return string token | |
| */ | |
| public function createPaymobPaymentToken($token, $order) | |
| { | |
| $response = $this->request->post("https://accept.paymobsolutions.com/api/acceptance/payment_keys", [ | |
| "headers" => [ | |
| 'content-type' => 'application/json' | |
| ], | |
| "json" => [ | |
| "auth_token"=> $token, | |
| "expiration"=> 36000, | |
| "amount_cents"=>$order->amount_cents, | |
| "order_id"=>$order->id, | |
| "billing_data"=>[ | |
| "apartment"=> "NA", | |
| "email"=> \Auth::user()->email, | |
| "floor"=> "NA", | |
| "first_name"=> (null==\Auth::user()->first_name)?\Auth::user()->name:\Auth::user()->first_name, | |
| "street"=> "NA", | |
| "building"=> "NA", | |
| "phone_number"=> \Auth::user()->phone , | |
| "shipping_method"=> "NA", | |
| "postal_code"=> "NA", | |
| "city"=> "NA", | |
| "country"=> "NA", | |
| "last_name"=> (null==\Auth::user()->last_name)?\Auth::user()->name:\Auth::user()->last_name, | |
| "state"=> "NA" | |
| ], | |
| "currency"=>$this->currency, | |
| "integration_id"=> config('larapayment.paymob_mood') == "live" ? config('larapayment.paymob_live_integration_id') : config('larapayment.paymob_sandbox_integration_id') | |
| ] | |
| ]); | |
| return json_decode($response->getBody()->getContents())->token; | |
| } | |
| /** | |
| * Make Paymob Order | |
| * | |
| * @param string $token | |
| * | |
| * @return json | |
| */ | |
| public function makePaymobOrder($token) { | |
| $response = $this->request->post("https://accept.paymobsolutions.com/api/ecommerce/orders", [ | |
| "headers" => [ | |
| 'content-type' => 'application/json' | |
| ], | |
| "json" => [ | |
| "auth_token"=> $token, | |
| "delivery_needed"=>"false", | |
| "amount_cents"=> $this->amount_in_egp*100, | |
| "items"=> $this->items ? $this->items : [] | |
| ] | |
| ]); | |
| return json_decode($response->getBody()->getContents()); | |
| } | |
| /** | |
| * Paymob get authentication Token | |
| * | |
| * @return string token | |
| */ | |
| public function getPaymobAuthenticationToken() { | |
| $response = $this->request->post("https://accept.paymobsolutions.com/api/auth/tokens", [ | |
| "headers" => [ | |
| 'content-type' => 'application/json' | |
| ], | |
| "json" => [ | |
| "api_key" => $this->PAYMOB_API_KEY | |
| ] | |
| ]); | |
| return json_decode($response->getBody()->getContents()); | |
| } | |
| /** | |
| * Store payment information in DB | |
| * | |
| * @param integer $payment_id | |
| * @param integer $amount | |
| * @param string $source | |
| * @param array $process_data | |
| * @param string $currency_code | |
| * @param string $status | |
| * @param string $note | |
| * @return integer id | |
| */ | |
| public function store_payment( | |
| $payment_id, | |
| $amount, | |
| $source, | |
| $process_data, | |
| $currency_code, | |
| $status, | |
| $note = null | |
| ){ | |
| $payment = Balance_summary::where([ | |
| 'user_id'=>\Auth::user()->id, | |
| 'payment_id' => $payment_id, | |
| ])->first(); | |
| if($payment==null){ | |
| $payment = Balance_summary::create( | |
| [ | |
| "user_id"=> \Auth::user()->id , | |
| 'payment_id'=>$payment_id, | |
| "type"=> $this->type, | |
| "amount"=>$amount, | |
| "status"=>strtoupper($status), | |
| "source"=>$source, | |
| "currency_code"=>strtoupper($currency_code), | |
| "process_data"=>(string)$process_data, | |
| "note"=> $note, | |
| 'target_id' => $this->product, | |
| ] | |
| ); | |
| return $payment->id; | |
| }else{ | |
| return $payment->id; | |
| } | |
| } | |
| public function clac_new_amount($method,$amount){ | |
| if($method=='paymob'){ | |
| return floatval($amount+($amount*config('larapayment.paymob_percentage_fee'))+config('larapayment.paymob_fixed_fee')); | |
| } | |
| } | |
| public static function calc_amout_after_transaction($method,$amount){ | |
| if($method=='paymob'){ | |
| return floatval( ($amount-config('larapayment.paymob_fixed_fee'))/(1+config('larapayment.paymob_percentage_fee')) ); | |
| } | |
| } | |
| /** | |
| * Paymob verify transacation | |
| * | |
| * @param integer $paymentId | |
| * @param array $response | |
| * @return string status | |
| */ | |
| public function verify_paymob($paymentId, $response){ | |
| return $this->verify($paymentId, $response); | |
| } | |
| /** | |
| * Pay with vodafone cash and kiosk | |
| * | |
| * @return void | |
| */ | |
| public function pay($phone, $paymentToken) { | |
| $response = $this->request->post("https://accept.paymobsolutions.com/api/acceptance/payments/pay", [ | |
| "headers" => [ | |
| 'content-type' => 'application/json' | |
| ], | |
| "json" => [ | |
| "source" => [ | |
| "identifier" => $phone, | |
| "subtype" => "WALLET" | |
| ], | |
| "payment_token" => $paymentToken | |
| ] | |
| ]); | |
| return json_decode($response->getBody()->getContents()); | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment