Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    Pulsante paypal webhook

    Salve come da titolo dovrei creare il pulsante per i pagamenti con paypal , ho sempre utilizzato ipn e quindi avevo un semplice form html con campi hidden , da quello che ho capito invece per il webhook i dati vanno inviati tramite pulsante . Qualcuno può spiegarmi o mostrare una guida da seguire per creare il pulsante ( e tutti i dati da inviare ) ?

  2. #2
    Utente di HTML.it L'avatar di andreacanton
    Registrato dal
    Dec 2020
    residenza
    Verona, Italy
    Messaggi
    9
    Salve a te!

    Fortunatamente Paypal ha una tonnellata di documentazione, dovresti riuscire a trovare tutto qui https://developer.paypal.com/docs/checkout/#home

  3. #3
    Quote Originariamente inviata da andreacanton Visualizza il messaggio
    Salve a te!

    Fortunatamente Paypal ha una tonnellata di documentazione, dovresti riuscire a trovare tutto qui https://developer.paypal.com/docs/checkout/#home

    Grazie , ho utilizzato questo pulsante :


    codice:
    <script>
    
    
      paypal.Buttons({
        createOrder: function(data, actions) {
          return actions.order.create({
             "purchase_units": [{
                "amount": {
                  "currency_code": "EUR",
                  "value": "100",
                  "breakdown": {
                    "item_total": {  /* Required when including the `items` array */
                      "currency_code": "EUR",
                      "value": "100"
                    }
                  }
                },
                "items": [
                  {
                    "name": "PROVA CREAZIONE ", /* Shows within upper-right dropdown during payment approval */
                    "description": "A|b|C", /* Item details will also be in the completed paypal.com transaction view */
                    "unit_amount": {
                      "currency_code": "EUR",
                      "value": "100"
                    },
                    "quantity": "1"
                  },
                ]
              }]
          });
        },
      }).render('#paypal-button-container');
    
    
    
    
    </script>
    Ma ho una doppia risposta nel webhook :

    codice:
    [14/03/2022 7:38 PM] - ########################## NEW PAYOUT LISTENER############################## 
    
    
    [14/03/2022 7:38 PM] - {"id":"WH-8Y260634BH969130U-4D860759C5630044F","event_version":"1.0","create_time":"2022-03-15T00:38:42.450Z","resource_type":"checkout-order","resource_version":"2.0","event_type":"CHECKOUT.ORDER.APPROVED","summary":"An order has been approved by buyer","resource":{"update_time":"2022-03-15T00:38:37Z","create_time":"2022-03-15T00:38:07Z","purchase_units":[{"reference_id":"default","amount":{"currency_code":"EUR","value":"100.00","breakdown":{"item_total":{"currency_code":"EUR","value":"100.00"}}},"payee":{"email_address":"topwebsite_ncc@info.it","merchant_id":"RCHWZPDVRSCT8"},"items":[{"name":"PROVA CREAZIONE ","unit_amount":{"currency_code":"EUR","value":"100.00"},"quantity":"1","description":"A|b|C"}],"shipping":{"name":{"full_name":"Stefano Banchelli"},"address":{"address_line_1":"Via Unit? d'Italia","admin_area_2":"Napoli","admin_area_1":"Napoli","postal_code":"80127","country_code":"IT"}},"payments":{"captures":[{"id":"3XK82210D17883106","status":"COMPLETED","amount":{"currency_code":"EUR","value":"100.00"},"final_capture":true,"seller_protection":{"status":"ELIGIBLE","dispute_categories":["ITEM_NOT_RECEIVED","UNAUTHORIZED_TRANSACTION"]},"seller_receivable_breakdown":{"gross_amount":{"currency_code":"EUR","value":"100.00"},"paypal_fee":{"currency_code":"EUR","value":"3.75"},"net_amount":{"currency_code":"EUR","value":"96.25"}},"links":[{"href":"https://api.sandbox.paypal.com/v2/payments/captures/3XK82210D17883106","rel":"self","method":"GET"},{"href":"https://api.sandbox.paypal.com/v2/payments/captures/3XK82210D17883106/refund","rel":"refund","method":"POST"},{"href":"https://api.sandbox.paypal.com/v2/checkout/orders/6MM148212F160372M","rel":"up","method":"GET"}],"create_time":"2022-03-15T00:38:37Z","update_time":"2022-03-15T00:38:37Z"}]}}],"links":[{"href":"https://api.sandbox.paypal.com/v2/checkout/orders/6MM148212F160372M","rel":"self","method":"GET"}],"id":"6MM148212F160372M","intent":"CAPTURE","payer":{"name":{"given_name":"Stefano","surname":"Banchelli"},"email_address":"utente_ncc@topwebsite.it","payer_id":"E9ZP8U9DLDL8U","address":{"country_code":"IT"}},"status":"COMPLETED"},"links":[{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-8Y260634BH969130U-4D860759C5630044F","rel":"self","method":"GET"},{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-8Y260634BH969130U-4D860759C5630044F/resend","rel":"resend","method":"POST"}]}
    
    
    [14/03/2022 7:38 PM] - JSON DECODE
    
    
    [14/03/2022 7:38 PM] - ########################## NEW PAYOUT LISTENER############################## 
    
    
    [14/03/2022 7:38 PM] - {"id":"WH-24H621511B133103T-77Y53377L7252372X","event_version":"1.0","create_time":"2022-03-15T00:38:40.713Z","resource_type":"capture","resource_version":"2.0","event_type":"PAYMENT.CAPTURE.COMPLETED","summary":"Payment completed for EUR 100.0 EUR","resource":{"amount":{"value":"100.00","currency_code":"EUR"},"seller_protection":{"dispute_categories":["ITEM_NOT_RECEIVED","UNAUTHORIZED_TRANSACTION"],"status":"ELIGIBLE"},"supplementary_data":{"related_ids":{"order_id":"6MM148212F160372M"}},"update_time":"2022-03-15T00:38:37Z","create_time":"2022-03-15T00:38:37Z","final_capture":true,"seller_receivable_breakdown":{"paypal_fee":{"value":"3.75","currency_code":"EUR"},"gross_amount":{"value":"100.00","currency_code":"EUR"},"net_amount":{"value":"96.25","currency_code":"EUR"}},"links":[{"method":"GET","rel":"self","href":"https://api.sandbox.paypal.com/v2/payments/captures/3XK82210D17883106"},{"method":"POST","rel":"refund","href":"https://api.sandbox.paypal.com/v2/payments/captures/3XK82210D17883106/refund"},{"method":"GET","rel":"up","href":"https://api.sandbox.paypal.com/v2/checkout/orders/6MM148212F160372M"}],"id":"3XK82210D17883106","status":"COMPLETED"},"links":[{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-24H621511B133103T-77Y53377L7252372X","rel":"self","method":"GET"},{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-24H621511B133103T-77Y53377L7252372X/resend","rel":"resend","method":"POST"}]}
    
    
    [14/03/2022 7:38 PM] - JSON DECODE

    , invece vorrei avere la stessa che nel simulator e mi interesserebbe un campo custom in cui inserire una stringa ( che qui appare nel primo response [description":"A|b|C"] ma vorrei apparisse nel pagamento effettuato per poi salvarmi i dati nel database perchè è inutile che ho dei dati se poi non li ritrovo alla canferma del pagamento che è querllo che a me serve in realtà.

  4. #4
    Come puoi vedere hai due risposte perchè sono due eventi diversi...
    Uno è la notifica che l'ordine è stato approvato, l'altro è la notifica che il pagamento è stato completato. (event_type)
    In ambo i casi il tuo codice di tracciamento è nella risposta...tramite i "link" che ti restituisce riesci a legare le due risposte o a recuperare le informazioni relative

  5. #5
    Quote Originariamente inviata da Dascos Visualizza il messaggio
    Come puoi vedere hai due risposte perchè sono due eventi diversi...
    Uno è la notifica che l'ordine è stato approvato, l'altro è la notifica che il pagamento è stato completato. (event_type)
    In ambo i casi il tuo codice di tracciamento è nella risposta...tramite i "link" che ti restituisce riesci a legare le due risposte o a recuperare le informazioni relative
    Vedo che paypal continua ad inviarmi notifiche , con ipn per bloccare l'invio ( dopo aver ricevuto i dati desiderati si usa :

    codice:
    header("HTTP/1.1 200 OK");
    nel webhook quale è il metodo ?posso usare lo stesso?

  6. #6
    Quote Originariamente inviata da andreacanton Visualizza il messaggio
    Salve a te!

    Fortunatamente Paypal ha una tonnellata di documentazione, dovresti riuscire a trovare tutto qui https://developer.paypal.com/docs/checkout/#home

    Rieccomi , continuo a pensare che nonostante la documentazione essendo un colosso , lavorino un pò con i piedi ...

    Sono riuscito a creare il pulsante il pagamento parte , quando analizzo le notifiche inviate al webhook ho :


    codice:
    [21/03/2022 12:39 PM] - ########################## NEW PAYOUT LISTENER WEBHOOK############################## 
    
    
    [21/03/2022 12:39 PM] - {"id":"WH-20J32225S3417372Y-5AP84659MH055094X","event_version":"1.0","create_time":"2022-03-21T11:39:12.893Z","resource_type":"checkout-order","resource_version":"2.0","event_type":"CHECKOUT.ORDER.APPROVED","summary":"An order has been approved by buyer","resource":{"update_time":"2022-03-21T11:39:04Z","create_time":"2022-03-21T11:38:48Z","purchase_units":[{"reference_id":"default","amount":{"currency_code":"EUR","value":"2.16","breakdown":{"item_total":{"currency_code":"EUR","value":"2.16"}}},"payee":{"email_address":"xxx@info.it","merchant_id":"RCHWZPDVRSCT8"},"custom_id":"35","items":[{"name":"35 ","unit_amount":{"currency_code":"EUR","value":"2.16"},"quantity":"1","description":"Acquisto tratta 35"}],"shipping":{"name":{"full_name":"Stefano xxx"},"address":{"address_line_1":"Via Unit? d'Italia","admin_area_2":"Napoli","admin_area_1":"Napoli","postal_code":"80127","country_code":"IT"}},"payments":{"captures":[{"id":"84V56815CD994871G","status":"COMPLETED","amount":{"currency_code":"EUR","value":"2.16"},"final_capture":true,"seller_protection":{"status":"ELIGIBLE","dispute_categories":["ITEM_NOT_RECEIVED","UNAUTHORIZED_TRANSACTION"]},"seller_receivable_breakdown":{"gross_amount":{"currency_code":"EUR","value":"2.16"},"paypal_fee":{"currency_code":"EUR","value":"0.42"},"net_amount":{"currency_code":"EUR","value":"1.74"}},"links":[{"href":"https://api.sandbox.paypal.com/v2/payments/captures/84V56815CD994871G","rel":"self","method":"GET"},{"href":"https://api.sandbox.paypal.com/v2/payments/captures/84V56815CD994871G/refund","rel":"refund","method":"POST"},{"href":"https://api.sandbox.paypal.com/v2/checkout/orders/7DA98695HD745122N","rel":"up","method":"GET"}],"create_time":"2022-03-21T11:39:04Z","update_time":"2022-03-21T11:39:04Z"}]}}],"links":[{"href":"https://api.sandbox.paypal.com/v2/checkout/orders/7DA98695HD745122N","rel":"self","method":"GET"}],"id":"7DA98695HD745122N","intent":"CAPTURE","payer":{"name":{"given_name":"Stefano","surname":"hhhhh"},"email_address":"utente@prova.it","payer_id":"E9ZP8U9DLDL8U","address":{"country_code":"IT"}},"status":"COMPLETED"},"links":[{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-20J32225S3417372Y-5AP84659MH055094X","rel":"self","method":"GET"},{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-20J32225S3417372Y-5AP84659MH055094X/resend","rel":"resend","method":"POST"}]}
    
    
    [21/03/2022 12:39 PM] - ########################## NEW PAYOUT LISTENER WEBHOOK############################## 
    
    
    [21/03/2022 12:39 PM] - {"id":"WH-2RV50120BS805074E-9V611821V1567411W","event_version":"1.0","create_time":"2022-03-21T11:39:09.449Z","resource_type":"capture","resource_version":"2.0","event_type":"PAYMENT.CAPTURE.COMPLETED","summary":"Payment completed for EUR 2.16 EUR","resource":{"amount":{"value":"2.16","currency_code":"EUR"},"seller_protection":{"dispute_categories":["ITEM_NOT_RECEIVED","UNAUTHORIZED_TRANSACTION"],"status":"ELIGIBLE"},"supplementary_data":{"related_ids":{"order_id":"7DA98695HD745122N"}},"update_time":"2022-03-21T11:39:04Z","create_time":"2022-03-21T11:39:04Z","final_capture":true,"seller_receivable_breakdown":{"paypal_fee":{"value":"0.42","currency_code":"EUR"},"gross_amount":{"value":"2.16","currency_code":"EUR"},"net_amount":{"value":"1.74","currency_code":"EUR"}},"custom_id":"35","links":[{"method":"GET","rel":"self","href":"https://api.sandbox.paypal.com/v2/payments/captures/84V56815CD994871G"},{"method":"POST","rel":"refund","href":"https://api.sandbox.paypal.com/v2/payments/captures/84V56815CD994871G/refund"},{"method":"GET","rel":"up","href":"https://api.sandbox.paypal.com/v2/checkout/orders/7DA98695HD745122N"}],"id":"84V56815CD994871G","status":"COMPLETED"},"links":[{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-2RV50120BS805074E-9V611821V1567411W","rel":"self","method":"GET"},{"href":"https://api.sandbox.paypal.com/v1/notifications/webhooks-events/WH-2RV50120BS805074E-9V611821V1567411W/resend","rel":"resend","method":"POST"}]}
    Nella prima notifica ho tutti i dati che mi servono ma non ho la certezza che il pagamento sia stato completato .

    Nella seconda notifica ho che il pagamento è stato completato ma non ho molte informazioni come ad esempio chi ha effettuato il pagamento ... Ma è una cosa normale ?

  7. #7
    Moderatore di Annunci siti web, Offro lavoro/collaborazione, Cerco lavoro L'avatar di cavicchiandrea
    Registrato dal
    Aug 2001
    Messaggi
    26,133
    PayPal è complesso, ma per esperienza personale quando che un problema l’errore è sempre dello sviluppatore non di PayPal. Io ricontrollerei tutto step by step e se dovesse persistere aprirei un ticket assistenza PayPal
    Cavicchi Andrea
    Problemi con javascript, jquery, ajax clicca qui

  8. #8
    Dunque.
    Il secondo messaggio ha il riferimento all'ordine (7DA98695HD745122N) nel "supplementary_data.
    In questo modo leghi i pezzi.

    Ad ogni modo, io farei in un altro modo....quando crei l'ordine lo dai come pagato e non aspetti l'ok del compratore, usando il paramentro "intent":
    codice:
    paypal.Buttons(
    		{
    			createOrder : function(data, actions) {
    				return actions.order.create({						
    					'intent' : 'CAPTURE',
    					'custom_id' : 'abc-ordine-abc-123',
    					'purchase_units' : [ {
    .....
    Quando paypal ti risponde, ovvero il compratore ha pagato, dovrai salvarti la transazione nel db, in modo da legarla al compratore e a successive verifiche/notifiche/interrogazioni ecc.
    Sicuramente ti conviene anche usare il "custom_id", che sempre ti salvi da qualche parte per legare ordine e compratore (ridondante ma utile).
    In questo modo ti basi solo sulla risposta Paypal a seguito del pagamento e non hai bisogno di intercettare i webhooks che diventano complicati da gestire.

    La documentazione Pp è complicata, ma completa. Io per fare correttamente una "banalità" come gli abbonamenti, ho dovuto studiarmi la documentazione per 2 giorni e fare test per 5... :-D

    Auguri e se serve una mano fischia

  9. #9
    Quote Originariamente inviata da Dascos Visualizza il messaggio
    Dunque.
    Il secondo messaggio ha il riferimento all'ordine (7DA98695HD745122N) nel "supplementary_data.
    In questo modo leghi i pezzi.

    Ad ogni modo, io farei in un altro modo....quando crei l'ordine lo dai come pagato e non aspetti l'ok del compratore, usando il paramentro "intent":
    codice:
    paypal.Buttons(
            {
                createOrder : function(data, actions) {
                    return actions.order.create({                        
                        'intent' : 'CAPTURE',
                        'custom_id' : 'abc-ordine-abc-123',
                        'purchase_units' : [ {
    .....
    Quando paypal ti risponde, ovvero il compratore ha pagato, dovrai salvarti la transazione nel db, in modo da legarla al compratore e a successive verifiche/notifiche/interrogazioni ecc.
    Sicuramente ti conviene anche usare il "custom_id", che sempre ti salvi da qualche parte per legare ordine e compratore (ridondante ma utile).
    In questo modo ti basi solo sulla risposta Paypal a seguito del pagamento e non hai bisogno di intercettare i webhooks che diventano complicati da gestire.

    La documentazione Pp è complicata, ma completa. Io per fare correttamente una "banalità" come gli abbonamenti, ho dovuto studiarmi la documentazione per 2 giorni e fare test per 5... :-D

    Auguri e se serve una mano fischia

    Allora io ho utilizzato questo metodo :

    praticamente controllo il request e con il primo invio mi salvo buona parte dei dati :

    codice:
     //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');
    
    
    
    
                    }
                    
                    
               }
    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 array
    Ultima modifica di pippuccio76; 30-03-2022 a 19:39

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.