Προς το περιεχόμενο

paypal express checkout


xristos05

Προτεινόμενες αναρτήσεις

Δημοσ.

καλησπερα η ερωτηση μου εχει να κανει με τον τροπο χρεωσης του buyer και την μεταφορα των χρηματων

στο λόγαριασμο του seller.

Χρησιμοποιω το API express checkout κανω κανονικα τα βηματα SetExpressCheckout κανω login στο paypal ... ok ...

επιστρεφω στο site μου διαβαζω τα δεδομενα GetExpressCheckout και εδω κολλησα ....

κανονικα θα πρεπει να καλεσω και την DoExpressCheckoutPayment για να γινει η χρεωση ...

αλλα δε βρηκα πουθενα πληροφοριες για αυτη τη φορμα <pay> εφτιαξα μια δικη μου που καλει το αρχειο 5 στην σειρα

οπως φαινεται και στη σελ του paypal https://www.paypal-labs.com/integrationwizard/ecpaypal/confirm.php που περιεχει την DoExpressCheckoutPayment

το θεμα ειναι οτι δε ξερω αν θελει καμια παραμετρο σε hidden input

 

στο αρχειο αυτο (με την DoExpressCheckoutPayment) δεν εκτελειται η συνθηκη if PaymentOption = "PayPal" {....}

οποτε δε κανει τπτ στην ουσια

αν σβησω την συνθηκη παρατηρω οτι εχει δεσμευσει στο λογαριασμο του buyer το ποσο αλλα ειναι σε αναμονη

και δε μου επιστρεφει κωδικο συναλλαγης..

επισης θα πρεπει να φτιαξω profile για Recurring Payments δε καταλαβα καθολου την λειτουργια του profile αυτου?

οποιος μπορει ας βοηθησει ευχαριστω

Δημοσ.

καλησπερα η ερωτηση μου εχει να κανει με τον τροπο χρεωσης του buyer και την μεταφορα των χρηματων

στο λόγαριασμο του seller.

Χρησιμοποιω το API express checkout κανω κανονικα τα βηματα SetExpressCheckout κανω login στο paypal ... ok ...

επιστρεφω στο site μου διαβαζω τα δεδομενα GetExpressCheckout και εδω κολλησα ....

κανονικα θα πρεπει να καλεσω και την DoExpressCheckoutPayment για να γινει η χρεωση ...

αλλα δε βρηκα πουθενα πληροφοριες για αυτη τη φορμα <pay> εφτιαξα μια δικη μου που καλει το αρχειο 5 στην σειρα

οπως φαινεται και στη σελ του paypal https://www.paypal-labs.com/integrationwizard/ecpaypal/confirm.php που περιεχει την DoExpressCheckoutPayment

το θεμα ειναι οτι δε ξερω αν θελει καμια παραμετρο σε hidden input

 

στο αρχειο αυτο (με την DoExpressCheckoutPayment) δεν εκτελειται η συνθηκη if PaymentOption = "PayPal" {....}

οποτε δε κανει τπτ στην ουσια

αν σβησω την συνθηκη παρατηρω οτι εχει δεσμευσει στο λογαριασμο του buyer το ποσο αλλα ειναι σε αναμονη

και δε μου επιστρεφει κωδικο συναλλαγης..

επισης θα πρεπει να φτιαξω profile για Recurring Payments δε καταλαβα καθολου την λειτουργια του profile αυτου?

οποιος μπορει ας βοηθησει ευχαριστω

 

Φίλε xristos05, καλημέρα σου ...

Έχω υλοποιήσει το Express Checkout του PayPal, και ΑΝ καταλαβαίνω καλά ουσιαστικά χρησιμοποιείς τις φόρμες πληρωμών του PayPal για να κάνεις τα transactions. Κατ'αρχήν, το πιο εύκολο και πιο σωστό (κατα τη γνώμη μου), είναι να παίξεις με δική σου φόρμα. Αν παίζεις Buy Now button, υπάρχουν hidden fields που συμπληρώνεις και το Post που κάνει το button, λαμβάνει τα πεδία αυτά ως παραμέτρους για την πραγματοποίηση των trasactions. Μέσα σε αυτά τα hidden fields, ορίζεις και τα postback urls στα οποια το PayPal στέλνει τα αποτελέσματα των συνδιαλλαγών. Δεν γράφω PHP, αλλά ASP.NET. Όμως νομίζω οτι τα παρακάτω links θα σου δώσουν τις απαραίτητες πληροφορίες για να ολοκληρώσεις το εγχείρημά σου:

 

PayPal Payment Provider

// PayPal Payment Example ....

Direct Payment

 

// Introduction to PayPal for C# - ASP.NET developers

Introduction to PayPal for ASP.NET Developers

 

// PayPal Payment Pro

PayPal Payment Pro

 

Και ένα τελευταίο: Βρες τα specifications των IPN messages, που επιστρέφει το PayPal. Περιέχει όλα τα πιθανά πεδία που επιδέχεται το PayPal όταν στέλνεις πληρωμές, ανά περίπτωση, Express Checkout κλπ κλπ. Ουσιαστικά είναι ένα encoded url με όλες τις πληροφορίες των συναλλαγών πάνω του το οποίο σπας με QueryString (τουλάχιστον σε ASP).

 

Καλή συνέχεια ...

Δημοσ.

καλησπέρα θα ηθελα να κανω μερικες ερωτησουλες ακομα..

καταρχας να εξηγησω οτι ειναι eshop οποτε τις φορμες που στελνουν το amount δε μπορω να τις χρησιμοποιησω για λογους ασφαλειας κυριως

 

ΑΝ καταλαβαίνω καλά ουσιαστικά χρησιμοποιείς τις φόρμες πληρωμών του PayPal για να κάνεις τα transactions.

χρησιμοποιησα τις φορμες του paypal αλλα οχι ολα τα βηματα...

 

(εχω παραλειψει το ενα... το οτι γυρναει ο χρηστης στο σιτε μου να επιλεξει τροπο πληρωμης ... *[βημα 3 billing οπως αναφερεται στη σελ του paypal] )

 

- Αρχικα πατωντας το paypal καλω την SetExpressCheckout

- με πηγαινει στο paypal

login

confirm

- επιστρεφω στο site μου

- καλω την GetExpressCheckout

- εμφανιζω τα στοιχεια του πελατη (που μου εστειλε το paypal)

- και μετα το επομενο βημα ειναι να τον χρεωσω καλωντας την DoExpressCheckout

 

Εγω βασικα εδω κολλησα ... γιατι το κουμπακι pay που πρεπει να βαλω θα εχει καποια φορμα απο πισω

και θα μου καλεσει το αρχειο 5 κατα σειρα οπως ειχα γραψει και παραπανω το οποιο περιεχει την κληση της DoExpressCheckout

 

Σε αυτα που μου εστειλες ειδα οτι το profile για Recurring Payments δεν ειναι απαραιτητο ...

αν και κανωντας δοκιμες παρατηρησα οτι:

- Αν ΔΕΝ εχω φτιαξει τετοιο prοfile θα δεσμευσει τα λεφτα .. στον αγοραστη ... αλλα δε θα τα δωσει στον πωλητη

βγαζει οτι ειναι σε αναμονη χωρις να δινει περετερω δυνατοτητες ...

- Αν εχω τετοιο profile μου τα βγαζει μια χαρα αλλα θα πρεπει να παω να πατησω accept σε καθε πληρωμη ....

Ο λογος που δεν μου εστελνε το transactionID στην σελ μου ηταν γιατι δεν ειχε ολοκληρωθει ακομα η συναλλαγη... αφου δεν την ειχα αποδεχτει

 

Οσο για τα υπολοιπα που ειχαν κωδικα σε .ΝΕΤ δεν καταλαβα και παρα πολλα ^_^

 

Αν σου ειναι ευκολο μπορεις να μου πεις εσυ πως χρησιμοποιησες το expresscheckout και στο τελικο βημα πως εκανες την χρεωση. Μπερδευτηκα με αυτο το profile γιατι δεν δουλευει χωρις αυτο αλλα και με αυτο δεν εκτελειται σωστα ...

 

Ευχαριστω για τις οποιες πληροφοριες - υποδειξεις

Δημοσ.

καλησπέρα θα ηθελα να κανω μερικες ερωτησουλες ακομα..

καταρχας να εξηγησω οτι ειναι eshop οποτε τις φορμες που στελνουν το amount δε μπορω να τις χρησιμοποιησω για λογους ασφαλειας κυριως

 

 

χρησιμοποιησα τις φορμες του paypal αλλα οχι ολα τα βηματα...

 

(εχω παραλειψει το ενα... το οτι γυρναει ο χρηστης στο σιτε μου να επιλεξει τροπο πληρωμης ... *[βημα 3 billing οπως αναφερεται στη σελ του paypal] )

 

- Αρχικα πατωντας το paypal καλω την SetExpressCheckout

- με πηγαινει στο paypal

[•] login

[•] confirm

- επιστρεφω στο site μου

- καλω την GetExpressCheckout

- εμφανιζω τα στοιχεια του πελατη (που μου εστειλε το paypal)

- και μετα το επομενο βημα ειναι να τον χρεωσω καλωντας την DoExpressCheckout

 

Εγω βασικα εδω κολλησα ... γιατι το κουμπακι pay που πρεπει να βαλω θα εχει καποια φορμα απο πισω

και θα μου καλεσει το αρχειο 5 κατα σειρα οπως ειχα γραψει και παραπανω το οποιο περιεχει την κληση της DoExpressCheckout

 

Σε αυτα που μου εστειλες ειδα οτι το profile για Recurring Payments δεν ειναι απαραιτητο ...

αν και κανωντας δοκιμες παρατηρησα οτι:

- Αν ΔΕΝ εχω φτιαξει τετοιο prοfile θα δεσμευσει τα λεφτα .. στον αγοραστη ... αλλα δε θα τα δωσει στον πωλητη

βγαζει οτι ειναι σε αναμονη χωρις να δινει περετερω δυνατοτητες ...

- Αν εχω τετοιο profile μου τα βγαζει μια χαρα αλλα θα πρεπει να παω να πατησω accept σε καθε πληρωμη ....

Ο λογος που δεν μου εστελνε το transactionID στην σελ μου ηταν γιατι δεν ειχε ολοκληρωθει ακομα η συναλλαγη... αφου δεν την ειχα αποδεχτει

 

Οσο για τα υπολοιπα που ειχαν κωδικα σε .ΝΕΤ δεν καταλαβα και παρα πολλα ^_^

 

Αν σου ειναι ευκολο μπορεις να μου πεις εσυ πως χρησιμοποιησες το expresscheckout και στο τελικο βημα πως εκανες την χρεωση. Μπερδευτηκα με αυτο το profile γιατι δεν δουλευει χωρις αυτο αλλα και με αυτο δεν εκτελειται σωστα ...

 

Ευχαριστω για τις οποιες πληροφοριες - υποδειξεις

 

Κοίταξε: Για μένα ήταν πιο απλό γιατί δεν έκανα χρήση καθόλου των φορμών του PayPal. To προτίμησα γιατί ούτως ή άλλως στο Direct Payment με το Buy Now button, ΗΔΗ γνωρίζεις τις χρεώσεις που πρέπει να γίνουν έτσι ώστε να ενημερώσεις το PayPal για τις χρεώσεις. Οπότε το μόνο που γίνεται στην δική μου περίπτωση είναι να γεμίσω τα κρυφά πεδία με τις πληροφορίες που χρειάζεται και τις τιμές των χρεώσεων/περιγραφών προϊόντος/ποσότητα/ΦΠΑ κλπ κλπ. To Buy Now button, βρίσκεται ήδη σε φόρμα, (αν το έχεις κάνει generate μέσω το PayPal). Για μένα αυτό δεν δούλεψε ιδιαίτερα μιας και δεν μπορώ να έχω 2 φόρμες nested στον ASP.NET. Οπότε αφού γέμισα τα hidden fields, άφησα το button να κάνει post, και όχι το form που δίνει εξορισμού το PayPal.

 

Το μόνο πράγμα που φαίνεται από το paypal είναι η οθόνη login, για τον buyer (όπου ήδη φορτώνεται σε https) και άλλη μια οθόνη που δίχνει το summary της αγοράς για αποδοχή από τον buyer.

 

Τέλος, μετά το πέρας της διαδικασίας το Paypal επιστρέφει τον έλεγχο στο site μου, με redirect (το URL είναι παράμετρος που περνάει στα κρυφά πεδία). Το μόνο που έχω να κάνω απο 'κει και μέτά είναι να περιμένω πότε το PayPal θα στείλει το IPN το οποίο χτυπάει το URL μιας σελίδας μου, που αναλαμβάνει να αναλύσει την κατάσταση της πληρωμής και να φτιάξει τα παραστατικά, τις εγγραφές, χρεώσεις, πιστώσεις λογαριασμών, και το λοιπό business logic της εφαρμογής μου.

 

Δυστυχώς τον τρόπο που υλοποιείς τη διαδικασία δεν τον έχω δει για να σου πω λεπτομέρειες εκτός των όσων σου περιγράφω παραπάνω. Πάντως νομίζω οτι πας από λίγο "δύσβατο" δρόμο για κάτι που μπορείς να κάνεις απλούστερα:

 

>

       <div style="width:100%;float:left;">
           <!-- PayPal Payment Fields -->
           <input type="hidden" name="cmd" value="_s-xclick">
           <input type="hidden" name="business" value="[email protected]">
           <input type="hidden" name="item_name" value="">
           <input type="hidden" name="currency_code" value="EUR">
           <input type="hidden" name="no_note" value="0">
           <input type="hidden" name="custom" value="invoice:#00001;VAT:0.23;Date:11/05/2011;Time:10:18:00;Customer:21">
           <input type="hidden" name="invoice" value="#00001">
           <input type="hidden" name="no_shipping" value="0">
           <input type="hidden" name="return" value="http://www.mysite.com">
           <input type="hidden" name="cancel_return" value="http://www.mysite.com/paymentcancelled.aspx">
           <input type="hidden" name="amount" value="100.00">
           <input type="hidden" name="discount_amount" value="0">
           <input type="hidden" name="item_number" value="1">
           <input type="hidden" name="quantity" value="1">
           <input type="hidden" name="shipping" value="0">
           <input type="hidden" name="tax" value="23">
           
           <img alt="" border="0" src="https://www.paypalobjects.com/WEBSCR-640-20110429-1/en_US/i/scr/pixel.gif" width="1" height="1">
           <asp:ImageButton runat="server" 
             ImageUrl="https://www.paypalobjects.com/WEBSCR-640-20110429-1/en_US/i/btn/btn_buynow_LG.gif" 
             border="0" name="submit" AlternateText="PayPal - The safer, easier way to pay online!" 
             PostBackUrl="https://www.sandbox.paypal.com/cgi-bin/webscr" />
       </div>


 

Με αυτόν τον τρόπο στέλνω την πληρωμή στο PayPal. Και το PayPal μου απαντάει σε σελίδα (όπως περιγράφω παραπάνω), με IPN που χτυπάει για την διαχείριση των αποτελεσμάτων της πληρωμής (δυστυχώς είναι σε C# αλλά δεν είναι δύσκολος κώδικας για να καταλάβεις τι γίνεται. Παρόλα ταύτα είναι ενδεικτικός ο κώδικας. Σε ενδιαφέρει η δομή του και όχι το αποτέλεσμά του. Οι έλεγχοι είναι πάγιοι.):

 

>

       protected void Page_Load(object sender, EventArgs e)
       {
           /*
           if (Request.QueryString["txn_type"] != null) // web_accept: Buy Now! button ... usually
               Response.Write("IPN transaction type: " + Request.QueryString["txn_type"].ToString());
           if ( Request.QueryString["auth_amount"] != null )
             Response.Write("Auth_amount : " + Request.QueryString["auth_amount"].ToString() + "<br/>");
           if ( Request.QueryString["auth_exp"] != null )
             Response.Write("Authorization expiration: " + Request.QueryString["auth_exp"].ToString() + "<br/>");
           if (Request.QueryString["auth_id"] != null)
               Response.Write("Authorization ID: " + Request.QueryString["auth_id"].ToString());
           if (Request.QueryString["exchange_rate"] != null)
               Response.Write("Exchange rate: " + Request.QueryString["exchange_rate"].ToString());
           if (Request.QueryString["invoice"] != null)
               Response.Write("Invoice: " + Request.QueryString["invoice"].ToString());
           if (Request.QueryString["mc_fee"] != null)
               Response.Write("Fees : " + Request.QueryString["mc_fee"].ToString());
           if (Request.QueryString["payer_status"] != null)
               Response.Write("Payer Status: " + Request.QueryString["payer_status"].ToString());
           if (Request.QueryString["payment_date"] != null)
               Response.Write("Payment Date: " + Request.QueryString["payment_date"].ToString());
           if (Request.QueryString["payment_status"] != null)
               Response.Write("Payment status: " + Request.QueryString["payment_status"].ToString());
           if (Request.QueryString["payment_type"] != null)
               Response.Write("Payment Type: " + Request.QueryString["payment_type"].ToString());
           if (Request.QueryString["pending_reason"] != null)
               Response.Write("Pending Reason: " + Request.QueryString["pending_reason"].ToString());
           if (Request.QueryString["quantity"] != null)
               Response.Write("Quantity: " + Request.QueryString["quantity"].ToString());
           */

           //Post back to either sandbox or live
           string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr";
           string strLive = "https://www.paypal.com/cgi-bin/webscr";
           HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox);

           //Set values for the request back
           req.Method = "POST";
           req.ContentType = "application/x-www-form-urlencoded";
           byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength);
           string strRequest = Encoding.ASCII.GetString(param);
           strRequest += "&cmd=_notify-validate";
           req.ContentLength = strRequest.Length;

           //for proxy
           //WebProxy proxy = new WebProxy(new Uri("http://url:port#"));
           //req.Proxy = proxy;

           //Send the request to PayPal and get the response
           StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII);
           streamOut.Write(strRequest);
           streamOut.Close();

           string IPN = strRequest; //Replicating IPN before sent ...

           StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream());
           string strResponse = streamIn.ReadToEnd();
           streamIn.Close();

           if (strResponse == "VERIFIED")
           {
               //1. check the payment_status is Completed
               //2. check that txn_id has not been previously processed
               //3. check that receiver_email is your Primary PayPal email
               //4. check that payment_amount/payment_currency are correct
               //process payment

               switch (HttpUtility.ParseQueryString(IPN)["payment_status"].ToString().ToLower())
               {
                   case "canceled_reversal":
                       // Won a dispute with the payer. Funds posted to account.
                       break;
                   case "completed":
                       // Funds posted to account due to successfull purchase.
                       break;
                   case "created":
                       // German ELV payment using Express Checkout
                       break;
                   case "denied":
                       // We have denied the payment.
                       break;
                   case "expired":
                       // Expired, and cannot be captured.
                       break;
                   case "failed":
                       // Payment failed.
                       break;
                   case "pending":
                       //Payment is pending check the pending_reason variable ...
                       Response.Write(HttpUtility.ParseQueryString(IPN)["pending_reason"].ToString());
                       break;
                   case "refunded":
                       //Successfull refund to the payer
                       break;
                   case "reversed":
                       //Funds returned to the buyer
                       break;
                   case "processed":
                       //payment has been accepted
                       break;
                   case "voided":
                       //Authorization was voided
                       break;
               }

               //2. txn_id has not been processed before ...



           }
           else if (strResponse == "INVALID")
           {
               //log for manual investigation
           }
           else
           {
               //log response/ipn data for manual investigation
           }


       }

 

 

ελπίζω να σε βοήθησα κάπως ...

 

και κάτι ακόμα που πιθανώς να μην έχεις καταλάβει ή να έχει ξεφύγει από την προσοχή σου: Προκειμένου να γίνει η χρέωση χρειάζεται η διαδικασία του validation από το PayPal!! Αυτό σημαίνει οτι,,, το response από το PayPal με το IPN αφού το λάβεις πρέπει να το ξαναστείλεις αφού κρατήσεις ένα αντίγραφό του(!!!). ΜΟΝΟ τότε σου γυρίζει VERIFIED και οτι έχει γίνει η χρέωση κανονικά και οτι όλα πήγαν κατ'ευχήν! Η παράθεση του κώδικα που σου έστειλα στο προηγούμενο μήνυμά μου, κάνει αυτό ακριβώς το πράγμα...

Δημοσ.

Αν σου ειναι ευκολο και μπορεις να μου κανεις μερικες διευκρινισεις ακομα ..

 

Αρχικα αυτο με το paypal form που εχεις παραθεσει ... που στελνεις καποια hidden input...

το ειχα υλοποιησει ... αλλα αλλαζα το πεδιο amount με το firebug ...

και πηγαινα στο paypal πληρωνα το αλλαγμένο ποσο... και γυριζα πισω ...

το οποιο paypal μου εστελνε παραμετρους με GET και μεσα σε αυτες τις παραμετρους ηταν και το ποσο ...παραδειγμα ...

st=Completed&tx=12345678&item_number=0&amt=50.00

 

εγω αποθηκευα το ποσο πριν την αποστολη στο paypal και συγκρινα το ποσο που πληρωσε μετα αλλα αφου δεν ειναι με post ... ο ελεγχος ειναι χαζος γιατι μπορει να γινει οποιαδηποτε αλλαγη ... αφου βλεπει ο χρηστης το url που επεστρεψε

 

χρησιμοποιησα το express checkout γιατι καποιος χρηστης του insomnia δε θυμαμαι name μου το προτεινε για να αποφευχθει η εμπλοκη της τιμης στις φορμες που αποστελει ο user

 

τωρα οσο για το IPN εσυ μου ανεφερες οτι "Αυτό σημαίνει οτι,,, το response από το PayPal με το IPN αφού το λάβεις πρέπει να το ξαναστείλεις αφού κρατήσεις ένα αντίγραφό του(!!!). ΜΟΝΟ τότε σου γυρίζει VERIFIED και οτι έχει γίνει η χρέωση κανονικά"

 

με ποιο τροπο το ξαναστελνω ? προφανως θα πρεπει να εκτελεστει καποιος κωδικας στο server που δε θα εκτελεστει με καποια ενεργεια του user απο τον υπολογιστη του ... αρα πως θα επικοινωνισει το paypal με καποια σελ μου χωρις να γινει καποιο event πριν ..

 

ο χρηστης θα βλεπει το μνμ ευχαριστουμε που πληρωσατε και απο πισω θα εκτελειται κωδικας που θα ελεγχει τα σχετικα της συναλλαγης ....

 

Στον κωδικα σου στελνεις τα σχετικα με την τιμη ... το url που θα επιστρεψει σε cancel και σε confim...

λαμβάνεις μετα απο το paypal ενα url στην σελ το οποιο ερχετε και με get ... ??? και αυτο το url ειναι το IPN το οποιο το τσεκαρεις για τα δεδομενα που περιεχει ... το στελνεις στο paypal για να το τσεκαρει και να απαντησει με verified ???

 

Με συγχωρεις που σε ζαλιζω απλα εχω χαθει και μπερδευτει απιστευτα με το paypal ενω δειχνει τοσο απλο στην αρχη :-(

 

βρηκα ενα κωδικα που κανει αυτη την δουλεια του να διαβαζει το url του paypal και να κανει το verify https://cms.paypal.com/cms_content/US/en_US/files/developer/IPN_PHP_41.txt

απλα δε ξερω {και σε ρωταω αν μπορεις να μου απαντησεις} κατα ποσο μπορει να πειραξει καποιος την τιμη που θα πληρωσει (με το firebug πχ) και αντι να πληρωσει 50 ευρο να πληρωσει 5 και αν το paypal θα το καταλαβει οτι δεν ηταν το σωστο ποσο που πληρωθηκε τελικα...

Δημοσ.

Αν σου ειναι ευκολο και μπορεις να μου κανεις μερικες διευκρινισεις ακομα ..

 

Αρχικα αυτο με το paypal form που εχεις παραθεσει ... που στελνεις καποια hidden input...

το ειχα υλοποιησει ... αλλα αλλαζα το πεδιο amount με το firebug ...

και πηγαινα στο paypal πληρωνα το αλλαγμένο ποσο... και γυριζα πισω ...

το οποιο paypal μου εστελνε παραμετρους με GET και μεσα σε αυτες τις παραμετρους ηταν και το ποσο ...

 

εγω αποθηκευα το ποσο πριν την αποστολη στο paypal και συγκρινα το ποσο που πληρωσε μετα αλλα αφου δεν ειναι με post ... ο ελεγχος ειναι χαζος γιατι μπορει να γινει οποιαδηποτε αλλαγη ... αφου βλεπει ο χρηστης το url που επεστρεψε

 

χρησιμοποιησα το express checkout γιατι καποιος χρηστης του insomnia δε θυμαμαι name μου το προτεινε για να αποφευχθει η εμπλοκη της τιμης στις φορμες που αποστελει ο user

 

τωρα οσο για το IPN εσυ μου ανεφερες οτι "Αυτό σημαίνει οτι,,, το response από το PayPal με το IPN αφού το λάβεις πρέπει να το ξαναστείλεις αφού κρατήσεις ένα αντίγραφό του(!!!). ΜΟΝΟ τότε σου γυρίζει VERIFIED και οτι έχει γίνει η χρέωση κανονικά"

 

με ποιο τροπο το ξαναστελνω ? προφανως θα πρεπει να εκτελεστει καποιος κωδικας στο server που δε θα εκτελεστει με καποια ενεργεια του user απο τον υπολογιστη του ... αρα πως θα επικοινωνισει το paypal με καποια σελ μου χωρις να γινει καποιο event πριν ..

 

ο χρηστης θα βλεπει το μνμ ευχαριστουμε που πληρωσατε και απο πισω θα εκτελειται κωδικας που θα ελεγχει τα σχετικα της συναλλαγης ....

 

Στον κωδικα σου στελνεις τα σχετικα με την τιμη ... το url που θα επιστρεψει σε cancel και σε confim...

λαμβάνεις μετα απο το paypal ενα url στην σελ το οποιο ερχετε και με get ... ??? και αυτο το url ειναι το IPN το οποιο το τσεκαρεις για τα δεδομενα που περιεχει ... το στελνεις στο paypal για να το τσεκαρει και να απαντησει με verified ???

 

Με συγχωρεις που σε ζαλιζω απλα εχω χαθει και μπερδευτει απιστευτα με το paypal ενω δειχνει τοσο απλο στην αρχη :-(

 

βρηκα ενα κωδικα που κανει αυτη την δουλεια του να διαβαζει το url του paypal και να κανει το verify https://cms.paypal.com/cms_content/US/en_US/files/developer/IPN_PHP_41.txt

απλα δε ξερω {και σε ρωταω αν μπορεις να μου απαντησεις} κατα ποσο μπορει να πειραξει καποιος την τιμη που θα πληρωσει (με το firebug πχ) και αντι να πληρωσει 50 ευρο να πληρωσει 5 και αν το paypal θα το καταλαβει οτι δεν ηταν το σωστο ποσο που πληρωθηκε τελικα...

 

Δεν με ζαλίζεις, μήν ανησυχείς γι'αυτό,, σκοπός είναι να βρείς το πρόβλημα και να το επιλύσεις. Το IPN γίνεται postback από το PayPal στο URL που το υποδεικνύεις. Δηλαδή του λες εσύ (μέσα από τα κρυφά πεδία) σε ποιό URL θα αποστείλει το IPN. Στη περίπτωσή μου, είχα στον τοπικό μου Web Server μια σελίδα κατά την ανάπτυξη πχ (http://localhost/MyWebSite/IPNHandler.aspx) η οποία δεχόταν το IPN και έκανε όλα αυτά που σου παρέθεσα παραπάνω (και ακόμα περισσότερα φυσικά, μιας και είναι από test project αυτό που σου έστειλα παρότι δουλεύει). Το PayPal σου ζητάει αυτό το "αλισβερίσι" προκειμένου να σιγουρευτεί οτι αυτός που ζητάει την πληρωμή είσαι εσύ και κανένας άλλος. Άρα σκέψου οτι αφού σταλεί το "πακέτο" με τις πληροφορίες στο PayPal, το PayPal κάνει process τις πληροφορίες και απαντάει με ένα IPN και στη συνέχεια μπαίνει σε κατάσταση αναμονής μέχρι την επαλήθευση. Αυτό το κομμάτι στο έχω ήδη δώσει στον κώδικα που σου παρέθεσα παραπάνω σε C#. Θα σου το κάνω λίγο break-down με σχόλια για να καταλάβεις:

 

>
protected void Page_Load(object sender, EventArgs e) 
       { 
           //Μέσω του QueryString["<ονομα παραμέτρου"] σπάνε οι τιμές του.
           //τα παρακάτω είναι σχόλια που σου δείχνουν πως σπάνε τα πεδία και πως
           //παίρνεις τις τιμές ...
           //Εδώ έχουμε ΗΔΗ πάρει το IPN αφού καλεί τη σελίδα το PayPal περνώντας τις 
           //παραμέτρους στο URL 
           /* 
           if (Request.QueryString["txn_type"] != null) // web_accept: Buy Now! button ... usually 
               Response.Write("IPN transaction type: " + Request.QueryString["txn_type"].ToString()); 
           if ( Request.QueryString["auth_amount"] != null ) 
             Response.Write("Auth_amount : " + Request.QueryString["auth_amount"].ToString() + "<br/>"); 
           if ( Request.QueryString["auth_exp"] != null ) 
             Response.Write("Authorization expiration: " + Request.QueryString["auth_exp"].ToString() + "<br/>"); 
           if (Request.QueryString["auth_id"] != null) 
               Response.Write("Authorization ID: " + Request.QueryString["auth_id"].ToString()); 
           if (Request.QueryString["exchange_rate"] != null) 
               Response.Write("Exchange rate: " + Request.QueryString["exchange_rate"].ToString()); 
           if (Request.QueryString["invoice"] != null) 
               Response.Write("Invoice: " + Request.QueryString["invoice"].ToString()); 
           if (Request.QueryString["mc_fee"] != null) 
               Response.Write("Fees : " + Request.QueryString["mc_fee"].ToString()); 
           if (Request.QueryString["payer_status"] != null) 
               Response.Write("Payer Status: " + Request.QueryString["payer_status"].ToString()); 
           if (Request.QueryString["payment_date"] != null) 
               Response.Write("Payment Date: " + Request.QueryString["payment_date"].ToString()); 
           if (Request.QueryString["payment_status"] != null) 
               Response.Write("Payment status: " + Request.QueryString["payment_status"].ToString()); 
           if (Request.QueryString["payment_type"] != null) 
               Response.Write("Payment Type: " + Request.QueryString["payment_type"].ToString()); 
           if (Request.QueryString["pending_reason"] != null) 
               Response.Write("Pending Reason: " + Request.QueryString["pending_reason"].ToString()); 
           if (Request.QueryString["quantity"] != null) 
               Response.Write("Quantity: " + Request.QueryString["quantity"].ToString()); 
           */ 
           // Εδώ ορίζεται αν θα χτυπήσουμε SandBox ή το Live Περιβάλλον αγορών ...
           //Post back to either sandbox or live 
           string strSandbox = "https://www.sandbox.paypal.com/cgi-bin/webscr"; 
           string strLive = "https://www.paypal.com/cgi-bin/webscr"; 
           HttpWebRequest req = (HttpWebRequest)WebRequest.Create(strSandbox); 

           //εδώ προετοιμαζόμαστε για να στείλουμε το IPN πίσω στο PayPal για
           //Verification, προσθέτοντας μια ακόμα παράμετρο στο IPN που λέει στο 
           //PayPal οτι το IPN θέλουμε να γίνει Verify ...
           //Set values for the request back 
           req.Method = "POST"; 
           req.ContentType = "application/x-www-form-urlencoded"; 
           byte[] param = Request.BinaryRead(HttpContext.Current.Request.ContentLength); 
           string strRequest = Encoding.ASCII.GetString(param); 
           strRequest += "&cmd=_notify-validate"; //ΑΥΤΟ ΠΡΟΣΘΕΤΟΥΜΕ
           req.ContentLength = strRequest.Length; 

           //for proxy 
           //WebProxy proxy = new WebProxy(new Uri("http://url:port#")); 
           //req.Proxy = proxy; 

           //Send the request to PayPal and get the response 
           StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
           streamOut.Write(strRequest); //ΑΠΟΣΤΟΛΗ ΠΑΛΙ ΠΙΣΩ ΣΤΟ PAYPAL
           streamOut.Close(); 

           //Κρατάω αντίγραφο του IPN που μου εστάλη αρχικά
           string IPN = strRequest; //Replicating IPN before sent ... 

           //ΚΑΙ ΔΙΑΒΑΖΩ ΠΑΛΙ ΠΙΣΩ ΤΗΝ ΑΠΑΝΤΗΣΗ ΤΟΥ PAYPAL ...
           StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()); 
           string strResponse = streamIn.ReadToEnd(); // ΕΔΩ ΕΧΟΥΜΕ ΤΗΝ ΑΠΑΝΤΗΣΗ
           streamIn.Close(); 
           
           //ΕΔΩ ΕΛΕΓΧΟΥΜΕ ΤΗΝ ΚΑΤΑΣΤΑΣΗ ΤΗΣ ΑΠΑΝΤΗΣΗΣ
           if (strResponse == "VERIFIED") 
           { 
               //1. check the payment_status is Completed 
               //2. check that txn_id has not been previously processed 
               //3. check that receiver_email is your Primary PayPal email 
               //4. check that payment_amount/payment_currency are correct 
               //process payment 

               switch (HttpUtility.ParseQueryString(IPN)["payment_status"].ToString().ToLower()) 
               { 
                   case "canceled_reversal": 
                       // Won a dispute with the payer. Funds posted to account. 
                       break; 
                   case "completed": 
                       // Funds posted to account due to successfull purchase. 
                       break; 
                   case "created": 
                       // German ELV payment using Express Checkout 
                       break; 
                   case "denied": 
                       // We have denied the payment. 
                       break; 
                   case "expired": 
                       // Expired, and cannot be captured. 
                       break; 
                   case "failed": 
                       // Payment failed. 
                       break; 
                   case "pending": 
                       //Payment is pending check the pending_reason variable ... 
                       Response.Write(HttpUtility.ParseQueryString(IPN)["pending_reason"].ToString()); 
                       break; 
                   case "refunded": 
                       //Successfull refund to the payer 
                       break; 
                   case "reversed": 
                       //Funds returned to the buyer 
                       break; 
                   case "processed": 
                       //payment has been accepted 
                       break; 
                   case "voided": 
                       //Authorization was voided 
                       break; 
               } 

               //2. txn_id has not been processed before ... 



           } 
           else if (strResponse == "INVALID") 
           { 
               //log for manual investigation 
           } 
           else 
           { 
               //log response/ipn data for manual investigation 
           } 

 

Αυτό γίνεται για κυρίως 3 λόγους:

1. Για να ξέρει το PayPal οτι εσύ, είσαι εσύ και δεν είσαι ελέφαντας

2. Για Fraud Detection

3. Για να είσαι και εσύ και το PayPal σίγουρο οτι δεν χάθηκε κάτι στη πορεία και οτι τα δεδομένα είναι σωστά προκειμένου να προχωρήσει σε processing.

 

Τώρα,, στο θέμα ακύρωσης ή αποτυχίας της συνδιαλλαγής,, υπάρχουν αντίστοιχα κρυφά πεδία που ορίζουν τα URLs που θα χτυπήσει το PayPal αν αποτύχει κάτι, παραθέτοντας και τις παραμέτρους των λαθών. Οπότε έχεις μια TransactionFailure.aspx πχ, που βαράει το PayPal ως postback, στο site σου. Αν διαβάσεις τις προδιαγραφές του IPN στο site του PayPal, όλα τα πεδία θα τα δείς. Googlaρε "PayPal IPN Fields" θα σου βγάλει τη σελίδα που υπάρχουν τα πεδία που μπορείς να χρησιμοποιήσεις. Και σου λέει και σε ποιές περιπτώσεις χρησιμοποιούνται. Είναι λίγο μεγάλη η λίστα βέβαια, αλλά αξίζει να την δείς.

 

Η διαδικασία είναι πολύ straight forward, και κάπου πρέπει να το έχεις χάσει λιγάκι.. Αλλά δεν μπορώ να καταλάβω που ακριβώς.. Δες το κομμάτι που σου παραθέτω εδώ με τα σχόλια που έχω βάλει. Είναι ΟΛΗ η διαδικασία με το αλισβερίσι και τα πέρα-δώθε.

 

Επίσης η διαδικασία είναι αρκετά secure μιας και σκέψου οτι το verification γίνεται κάτω από SSL και συγκρίνει το IPN που σου έστειλε, με το IPN που του έστειλες για να συνεχίσει το transaction.

 

Οποιαδήποτε άλλη πληροφορία χρειαστείς,, μου λες ;-)

Δημοσ.

Καταρχας σε ευχαριστω πολυ για το χρονο και την πολυτιμη βοηθεια σου.

καταδευτερον καταλαβα ... απλα εγω ειχα την εντυπωση οτι τα βηματα πανε ως εξης (στον απλο τροπο)

ο χρηστης στην σελ. με την φορμα και τα hidden input πατουσε pay ...

πηγαινε στο paypal και πληρωνε ... και γυριζε πισω στο url που ειχες υποδειξει στο hidden

και αυτο ηταν ... δεν ηξερα για τον περετερω ελεγγο που μπορεις να κανεις

 

η αληθεια ειναι οτι καταφερα τελικα το expresscheckout και δουλευει μια χαρα ... μοιαζει παρα πολυ σε αυτο που μου αναφερεις

αλλα η αληθεια ειναι οτι ειναι ποιο friendly ο τροπος που μου περιγραφεις ...

γιατι το expresscheckout σε βαζει να φερεις το χρηστη στη σελ. σου και απο εκει να πληρωσει

στην ουσια εχει ενα βημα παραπανω ... που ανετα καποιος μπορει να μετανιωσει να κανει :P

 

 

Επειδη με ενδιαφερει και θελω να το ψαξω παραπερα θα σου κανω μια ακομα ερωτηση

Επίσης η διαδικασία είναι αρκετά secure μιας και σκέψου οτι το verification γίνεται κάτω από SSL και συγκρίνει το IPN που σου έστειλε, με το IPN που του έστειλες για να συνεχίσει το transaction.

 

Το ΙΡΝ το δημιουργουμε με καποιο τροπο εμεις πριν κανουμε redirect το user στο paypal ?

 

για να ειναι ασφαλες δε θα πρεπει το πρωτο πραγμα που θα κανεις πριν παραχθει η φορμα για πληρωμη ... να επικοινωνισεις με το paypal οπως στο expresscheckout για να ξερει την τιμη πριν τη δει ο user και την αλλαξει** και να παει να πληρωσει .... και μετα με τον τροπο που υπεδειξες να τσεκαρει την πληρωμη .. ?

 

** το να αλλαξει την τιμη ενταξει δεν ειναι για το μεσο χρηστη ευκολο αλλα για ενα λιγο ποιο ψαγμενο που υπαρχουν πολλοι σημερα με ενα firebug το εκανε (και ολα αυτα στο site το δικο μου οχι το paypal μην διμηουργηθει λαθος εντυπωση)

δεν ειχα αμφιβολια για το οτι μπορει καποιος να ξεγελασει το paypal αλλα το δικο μου site.

Δημοσ.

Καταρχας σε ευχαριστω πολυ για το χρονο και την πολυτιμη βοηθεια σου.

καταδευτερον καταλαβα ... απλα εγω ειχα την εντυπωση οτι τα βηματα πανε ως εξης (στον απλο τροπο)

ο χρηστης στην σελ. με την φορμα και τα hidden input πατουσε pay ...

πηγαινε στο paypal και πληρωνε ... και γυριζε πισω στο url που ειχες υποδειξει στο hidden

και αυτο ηταν ... δεν ηξερα για τον περετερω ελεγγο που μπορεις να κανεις

 

η αληθεια ειναι οτι καταφερα τελικα το expresscheckout και δουλευει μια χαρα ... μοιαζει παρα πολυ σε αυτο που μου αναφερεις

αλλα η αληθεια ειναι οτι ειναι ποιο friendly ο τροπος που μου περιγραφεις ...

γιατι το expresscheckout σε βαζει να φερεις το χρηστη στη σελ. σου και απο εκει να πληρωσει

στην ουσια εχει ενα βημα παραπανω ... που ανετα καποιος μπορει να μετανιωσει να κανει :P

 

 

Επειδη με ενδιαφερει και θελω να το ψαξω παραπερα θα σου κανω μια ακομα ερωτηση

 

 

Το ΙΡΝ το δημιουργουμε με καποιο τροπο εμεις πριν κανουμε redirect το user στο paypal ?

 

για να ειναι ασφαλες δε θα πρεπει το πρωτο πραγμα που θα κανεις πριν παραχθει η φορμα για πληρωμη ... να επικοινωνισεις με το paypal οπως στο expresscheckout για να ξερει την τιμη πριν τη δει ο user και την αλλαξει** και να παει να πληρωσει .... και μετα με τον τροπο που υπεδειξες να τσεκαρει την πληρωμη .. ?

 

** το να αλλαξει την τιμη ενταξει δεν ειναι για το μεσο χρηστη ευκολο αλλα για ενα λιγο ποιο ψαγμενο που υπαρχουν πολλοι σημερα με ενα firebug το εκανε (και ολα αυτα στο site το δικο μου οχι το paypal μην διμηουργηθει λαθος εντυπωση)

δεν ειχα αμφιβολια για το οτι μπορει καποιος να ξεγελασει το paypal αλλα το δικο μου site.

 

Καλημέρα σου,

είναι ευχαριστησή μου,, να σε βοηθήσω, μιας και είναι κάτι που κι εγώ έμαθα με το δύσκολο τρόπο ;), τουλάχιστον ας μη χρειαστεί να το μάθει κάποιος μετά από ώρες ψαξίματος και διαβάσματος.

 

Σκέψου το εξής: Όταν στείλεις την πληρωμή (γίνει η επιβεβαίωση με το ΙΡΝ κλπ κλπ), το PayPal σε κάνει redirect, στο λογαριασμό του χρήστη προκειμένου να κάνει login στο account του που έχει ήδη ανοίξει στο PayPal προκειμένου να κάνει αγορές. To login, του φέρνει μπροστά μια σελίδα με όλες τις πληροφορίες της χρέωσης (περιγραφή είδους/τιμή/τεμάχια-ποσότητα/ΦΠΑ/Τελικό ποσό, και του ζητάει να επιβεβαιώσει την αγορά προκειμένου να προχωρήσει το PayPal στην αποστολή της χρέωσης. Μέσα σε όλη αυτή τη διαδικασία σου αποστέλλεται IPN (message δηλαδή του PayPal για την κατάσταση της ολοκληρωσης της χρέωσης κλπ κλπ). Ο λόγος που σου πρότεινα να φτιάξεις έναν Handler για ΙΡΝ είναι γιατί, θεωρητικά είναι μια ασύγχρονη κατάσταση. Μπορεί ανα πάσσα στιγμή το PayPal να σου στείλει κατάσταση κάποιας πληρωμής. Η κατάσταση μπορεί να περιέχει και κάποιο dispute ή cancelation της αγοράς. Πράγματα που σε ενδιαφέρουν προκειμένου, είτε να ακυρώσεις την συνδιαλλαγή άρα και την αποστολή των ειδών, είτε για να προβείς στις απαραίτητες ενέργειες να κρατήσεις την αποστολή κάποιου είδους ή ειδών μέχρι να λυθεί το θέμα του dispute μεταξύ της τράπεζας και του πελάτη ή οτιδήποτε.

 

Αυτό συνεπάγεται και αποστολή δευτερεύοντος ΙΡΝ από το PayPal μετά το πέρας της διαδικασίας με νέο payment status.

 

Ουσιαστικά το redirect το κάνεις όταν δηλώνεις το https://www.paypal.com/.... ή https://sandbox.paypal.com/.... κλπ κλπ,, απο κεί γνωρίζει οτι πρέπει ο χρήστης να εισαχθεί στο λογαριασμό του και να επιβεβαιώσει την αγορά βάσει των πεδίων που έχεις περάσει στα κρυφά πεδία. Μετά την επιβεβαίωση το redirect με τη σελίδα που έχεις ορίσει στα κρυφά πεδία, μπορεί να γυρίσει το χρήστη πίσω στο site σου, ευχαριστώντας τον για την αγορά του, ή να τον ενημερώσεις με ένα mail ως αποδεικτικό αγοράς κοκ ... εξαρτάται με το πως διαχειρίζεσαι πλέον, εσύ τη διαδικασία.

 

ΙΡΝ με την ουσιασική έννοια του, δεν φτιάχνεις εσύ,, αλλά το PayPal. Εσύ διαχειρίζεσαι το μήνυμα βάσει των όσων είπαμε στα προηγούμενα μηνύματα που σου έστειλα. Παρόλα ταύτα σε ότι αφορά το ζήτημα του firebug, οι έλεγχοι και τα validations, από πλευράς σου και από την πλευρά του PayPal σε διασφαλίζουν (κατά την ταπεινή μου άποψη). Αν κρατάς τα ΙΡΝ σε επίπεδο πελάτη, έχεις τις πληροφορίες και τα αποδεικτικά που χρειάζεσαι ώστε να κάνεις κι εσύ από πλευράς σου dispute τη συναλλαγή αν ω μη γέννητο, συμβεί κάτι τέτοιο. Παρόλα ταύτα δεν νομίζω οτι θα σου δημιουργηθεί τέτοιο θέμα, καθόσων η διαδικασία γίνεται σε κάτω από SSL..

 

Και κάτι τελευταίο,, είναι προτιμώτερο, νομίζω, κάποιος να έχει ένα βήμα παραπάνω, και να έχει το περιθώριο να το μετανιώσει γνωρίζοντας οτι μπορεί να επανέλθει και στο τέλος να το αγοράσει, παρά να ξεκινήσει να βρίζει, και ξεκινήσει τα τηλέφωνα στην τράπεζα για να το ακυρώσει και να μη ξαναμπεί στο site ... ;)

 

Τέτοιες ευκολίες, κερδίζουν τους χρήστες :D

Δημοσ.

καλησπερα ..

 

Όταν στείλεις την πληρωμή (γίνει η επιβεβαίωση με το ΙΡΝ κλπ κλπ), το PayPal σε κάνει redirect, στο λογαριασμό του χρήστη προκειμένου να κάνει login στο account του που έχει ήδη ανοίξει στο PayPal

 

το επιασα ... αρα αυτο που εννοεις ειναι οτι πριν δημιουργησεις την φορμα για να παει να πληρωσει ο user εχεις επικοινωνισει ηδη με το paypal.

 

ευχαριστω και παλι .. το επομενο paypal που θα φτιαξω θα ειναι με αυτον τον τροπο ... οποτε μπορει να σε ξαναχρειαστω :rolleyes: για βοηθεια και αποσο εχω στο μυαλο μου εχω 2 στη σειρα :whistle: ακομα

Δημοσ.

καλησπερα ..

 

 

 

το επιασα ... αρα αυτο που εννοεις ειναι οτι πριν δημιουργησεις την φορμα για να παει να πληρωσει ο user εχεις επικοινωνισει ηδη με το paypal.

 

ευχαριστω και παλι .. το επομενο paypal που θα φτιαξω θα ειναι με αυτον τον τροπο ... οποτε μπορει να σε ξαναχρειαστω :rolleyes: για βοηθεια και αποσο εχω στο μυαλο μου εχω 2 στη σειρα :whistle: ακομα

 

πρόσεξε! Έχεις μια εγγραφή σε μια σελίδα σου, για ένα προϊόν που κάνει 5ευρώ. Και ένα κουμπί Buy Now δίπλα του. Μαζεύεις στα κρυφά πεδία όσα αφορούν αυτή την εγγραφή, (τιμή, ποσότητα, φπα, περιγραφή, διάφορα πεδία, το redirection site του PayPal (live ή sandbox)), και τα στέλνεις στο PayPal με το Post από το button. Όπως σου σου παρέθεσα στον κώδικα της σελίδας. To Post σε κάνει redirect (μαζί και τα κρυφά πεδία), στο PayPal.

 

Ο χρήστης κάνει login, (αφού περνάει ο έλεγχος πια στο PayPal και είναι πλέον στο site του PayPal), και το login, redirect σε εσωτερική σελίδα του PayPal, που αποτυπώνει τα στοιχεία από τα κρυφά πεδία που έχεις περάσει, με ένα κουμπί επιβεβαίωσης της αγοράς εφόσων συμφωνεί.

 

Επειδή του έχεις περάσει το URL επιστροφής, το PayPal, μετά την επιβεβαίωση του χρήστη, γυρίζει τον έλεγχο στο URL που του έχεις ορίσει. Άρα στο site σου. Και μετά ακολουθούν το ή τα, ΙΡΝ κλπ κλπ όπως είπαμε παραπάνω.

 

Αυτή είναι όλη η διαδικασία και το life cycle της διαδικασίας. Πάντως το documentation του PayPal είναι αρκετά αναλυτικό και κατατοπιστικό (όλως περιέργως ... anyway ...)

 

Όπου βρείς κόλλημα,, εδώ θα είμαι ;)

 

Happy coding mate! B)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...