Allora io ho utilizzato questo metodo :
praticamente controllo il request e con il primo invio mi salvo buona parte dei dati :
Questo codice è per codeigniter 4 ma può essere adattato per qualsiasi cosa in custom_id ci può essere messo praticamente tutto quello che si vuole ad esempio i valori separati da | poi si fa un explode (in php) e si recupera tutto sotto forma di arraycodice://write on log file $request = file_get_contents('php://input'); $this->paypal_lib->log_ipn_test($request); if($request=json_decode($request)){ //SE IL PAGAMENTO E' APPROVATO MA NON COMPLETATO if($request->event_type=='CHECKOUT.ORDER.APPROVED'){ $custom = $request->resource->purchase_units[0]->custom_id; $order_id = $request->resource->id ; $capture_id = $request->resource->purchase_units[0]->payments->captures[0]->id ; $id_webhook_checkout_order_approved = $request->id; $paypal_fee = $request->resource->purchase_units[0]->payments->captures[0]->seller_receivable_breakdown->gross_amount->value; $gross_amount = $request->resource->purchase_units[0]->payments->captures[0]->seller_receivable_breakdown->paypal_fee->value; $net_amount = $request->resource->purchase_units[0]->payments->captures[0]->seller_receivable_breakdown->paypal_fee->value; $mc_currency = $request->resource->purchase_units[0]->payments->captures[0]->amount->currency_code; $payer_email = $request->resource->payer->email_address; $data_pagamento_first = str_replace('T',' ',$request->resource->create_time); $data_pagamento = str_replace('Z',' ',$data_pagamento_first); $this->paypal_lib->log_ipn_test('DENTRO CHECKOUT.ORDER.APPROVED'); $this->paypal_lib->log_ipn_test('id_webhook_checkout_order_approved :'.$id_webhook_checkout_order_approved); $this->paypal_lib->log_ipn_test(' order_id :'.$order_id); $this->paypal_lib->log_ipn_test(' capture_id :'.$capture_id); $this->paypal_lib->log_ipn_test(' custom_id:'.$custom_id); $this->paypal_lib->log_ipn_test(' payer_email :'.$request->resource->payer->email_address); $dati_inserimento = [ 'custom' => $custom, 'id_webhook_checkout_order_approved' => $id_webhook_checkout_order_approved, 'order_id' => $order_id, 'capture_id' => $capture_id, 'paypal_fee' => $paypal_fee, 'gross_amount' => $gross_amount, 'net_amount' => $net_amount, 'mc_currency' => $mc_currency, 'payer_email' => $payer_email, 'data_pagamento' => $data_pagamento, ]; if($pagamenti_paypal_model->insert($dati_inserimento)){ $this->paypal_lib->log_ipn_test(' CHECKOUT.ORDER.APPROVED inserito nel db'); }else{ $this->paypal_lib->log_ipn_test(' CHECKOUT.ORDER.APPROVED problemi INSERIMENTO nel db'); } } // se il pagamento è completato elseif($request->event_type=='PAYMENT.CAPTURE.COMPLETED'){ $id_webhook_payment_capture_completed = $request->id; $order_id = $request->resource->supplementary_data->related_ids->order_id; $capture_id = $request->resource->id; $custom_id = $request->resource->custom_id; $data_pagamento = $request->create_time; $paypal_fee = $request->resource->seller_receivable_breakdown->paypal_fee->value; //DEBUG $this->paypal_lib->log_ipn_test('DENTRO PAYMENT.CAPTURE.COMPLETED'); $this->paypal_lib->log_ipn_test('id_webhook_payment_capture_completed :'.$id_webhook_payment_capture_completed); $this->paypal_lib->log_ipn_test(' order_id :'. $order_id); $this->paypal_lib->log_ipn_test(' capture_id :'. $capture_id); $this->paypal_lib->log_ipn_test(' id_tratte_acquistate :'. $id_tratte_acquistate); //cerco il pagamento approvato $inserimento = $pagamenti_paypal_model->where('order_id',$order_id) ->where('capture_id',$capture_id) ->where('custom',$custom) ->first(); if(!$inserimento){ $this->paypal_lib->log_ipn_test(' CHECKOUT.ORDER.APPROVED non tovato nel db'); } $dati_update = [ 'id_webhook_payment_capture_completed' => $id_webhook_payment_capture_completed, ]; if($pagamenti_paypal_model->update($inserimento->id,$dati_update)){ $this->paypal_lib->log_ipn_test(' PAYMENT.CAPTURE.COMPLETED inserito nel db'); //fai tutto quello che vuoi il pagamento è inserito nel db //code }else{ $this->paypal_lib->log_ipn_test(' PAYMENT.CAPTURE.COMPLETED problemi INSERIMENTO nel db'); } }