2010-07-23 9 views
12

Ci sono tutorial su come ottenere le risposte da una transazione di Google Checkout quando si utilizza C# e l'API GCheckout. Tutti gli esempi che ho trovato erano per le versioni precedenti dell'API e non per quella attuale (2.5). Più specificamente, mi piacerebbe vedere un esempio di risposta di ciò che Google mi invierà di nuovo senza e connessione HTTPS. So che si tratta di dati minimi, ma mi piacerebbe ancora vederne un esempio e vedere come gli altri lo stanno analizzando.C# e Google Checkout - ottenere la risposta dal server?

risposta

2

Google invia una notifica internamente
Crea una pagina di notifica come questa:

<%@ Import Namespace="System.IO" %> 
<%@ Import Namespace="GCheckout" %> 
<%@ Import Namespace="GCheckout.AutoGen" %> 
<%@ Import Namespace="GCheckout.Util" %> 
<%@ Import Namespace="System.Data.SqlClient" %> 
<%@ Import Namespace="System.Text" %> 

<script runat="server" language="c#"> 

string serialnum = string.Empty; 
void Page_Load(Object sender, EventArgs e) 
{ 
    // Extract the XML from the request. 
    Stream RequestStream = Request.InputStream; 
    StreamReader RequestStreamReader = new StreamReader(RequestStream); 
    string RequestXml = RequestStreamReader.ReadToEnd(); 
    RequestStream.Close(); 
    // Act on the XML. 
    switch (EncodeHelper.GetTopElement(RequestXml)) 
    { 
     case "new-order-notification": 
      NewOrderNotification N1 = (NewOrderNotification)EncodeHelper.Deserialize(RequestXml, typeof(NewOrderNotification)); 

       string OrderNumber1 = N1.googleordernumber; 
       string ShipToName = N1.buyershippingaddress.contactname; 
       string ShipToAddress1 = N1.buyershippingaddress.address1; 
       string ShipToAddress2 = N1.buyershippingaddress.address2; 
       string ShipToCity = N1.buyershippingaddress.city; 
       string ShipToState = N1.buyershippingaddress.region; 
       string ShipToZip = N1.buyershippingaddress.postalcode; 
       System.Xml.XmlNode[] arr = N1.shoppingcart.merchantprivatedata.Any; 
       String PData = String.Empty; 
       try 
       { 
        PData = arr[0].InnerText; 
       } 
       catch { PData = "Error"; } 
       decimal TotalPrice = 0.0M; 
       foreach (Item ThisItem in N1.shoppingcart.items) 
       { 
        string Name = ThisItem.itemname; 
        int Quantity = ThisItem.quantity; 
        decimal Price = ThisItem.unitprice.Value; 
        TotalPrice += Price * Quantity; 
       } 
       serialnum = N1.serialnumber; 
       string Message = "Order No : " + OrderNumber1 + " Total Price = $" + TotalPrice + "\r\nP. Data:" + PData; 

      LogTransaction(OrderNumber1, serialnum, Message, PData); 
      SendGoogleAcknowledgement(); 
      break; 
     case "risk-information-notification": 
      RiskInformationNotification N2 = (RiskInformationNotification)EncodeHelper.Deserialize(RequestXml, typeof(RiskInformationNotification)); 
      // This notification tells us that Google has authorized the order and it has passed the fraud check. 
      // Use the data below to determine if you want to accept the order, then start processing it. 
      string OrderNumber2 = N2.googleordernumber; 
      string AVS = N2.riskinformation.avsresponse; 
      string CVN = N2.riskinformation.cvnresponse; 
      bool SellerProtection = N2.riskinformation.eligibleforprotection; 
      serialnum = N2.serialnumber; 
      break; 
     case "order-state-change-notification": 
      OrderStateChangeNotification N3 = (OrderStateChangeNotification)EncodeHelper.Deserialize(RequestXml, typeof(OrderStateChangeNotification)); 
      // The order has changed either financial or fulfillment state in Google's system. 
      string OrderNumber3 = N3.googleordernumber; 
      string NewFinanceState = N3.newfinancialorderstate.ToString(); 
      string NewFulfillmentState = N3.newfulfillmentorderstate.ToString(); 
      string PrevFinanceState = N3.previousfinancialorderstate.ToString(); 
      string PrevFulfillmentState = N3.previousfulfillmentorderstate.ToString(); 
      serialnum = N3.serialnumber; 
      break; 
     case "charge-amount-notification": 
      ChargeAmountNotification N4 = (ChargeAmountNotification)EncodeHelper.Deserialize(RequestXml, typeof(ChargeAmountNotification)); 
      // Google has successfully charged the customer's credit card. 
      string OrderNumber4 = N4.googleordernumber; 
      decimal ChargedAmount = N4.latestchargeamount.Value; 
      serialnum = N4.serialnumber; 
      break; 
     case "refund-amount-notification": 
      RefundAmountNotification N5 = (RefundAmountNotification)EncodeHelper.Deserialize(RequestXml, typeof(RefundAmountNotification)); 
      // Google has successfully refunded the customer's credit card. 
      string OrderNumber5 = N5.googleordernumber; 
      decimal RefundedAmount = N5.latestrefundamount.Value; 
      serialnum = N5.serialnumber; 
      break; 
     case "chargeback-amount-notification": 
      ChargebackAmountNotification N6 = (ChargebackAmountNotification)EncodeHelper.Deserialize(RequestXml, typeof(ChargebackAmountNotification)); 
      // A customer initiated a chargeback with his credit card company to get her money back. 
      string OrderNumber6 = N6.googleordernumber; 
      decimal ChargebackAmount = N6.latestchargebackamount.Value; 
      serialnum = N6.serialnumber; 
      break; 
     default: 
      break; 
    } 
} 

private void SendGoogleAcknowledgement() 
{ 
    StringBuilder responseXml = new StringBuilder(); 
    responseXml.Append("<?xml version='1.0' encoding='UTF-8'?>"); 
    responseXml.Append("<notifiation-acknowledgment xmlns='http://checkout.google.com/schema/2' />"); 
    HttpResponse response = 
    System.Web.HttpContext.Current.Response; 
    response.StatusCode = 200; 
    response.ContentType = "text/xml"; 
    response.Write(responseXml.ToString()); 
    response.End(); 

} 

protected virtual void LogTransaction(string OrderNo, string SerialNo, string Message, String PData) 
{ 
    try 
    { 
     //Insert record in database 
     string sql = "Update GoogleOrder Set GoogleOrderNumber = @GoogleOrderNumber WHERE PrivateData = @PData"; 
     using (SqlConnection Conn = new SqlConnection(ConfigurationManager.ConnectionStrings["inCommandConnectionString"].ConnectionString)) 
     { 
      Conn.Open(); 
      SqlCommand Cmd = new SqlCommand(sql, Conn); 
      Cmd.Parameters.AddWithValue("@GoogleOrderNumber", OrderNo); 
      Cmd.Parameters.AddWithValue("@PData", PData); 
      Cmd.ExecuteNonQuery(); 
      Conn.Close(); 

     } 
    } 
    catch (Exception ex) 
    { 
     LogError("Error to Save The order No" + OrderNo); 
    } 
    //Insert record in text file 
    LogError(Message); 
} 
private void LogError(String Message) 
{ 
    String LogFile = ConfigurationManager.AppSettings.Get("LinkPointLogFile"); 
    if (LogFile != "") 
    { 
     byte[] binLogString = Encoding.Default.GetBytes(Message); 

     try 
     { 
      FileStream loFile = new FileStream(LogFile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write); 
      loFile.Seek(0, SeekOrigin.End); 
      loFile.Write(binLogString, 0, binLogString.Length); 
      loFile.Close(); 
     } 
     catch { ; } 
    } 
} 

`

nella pagina di impostazione di Google Checkout impostare il nome e il percorso della pagina di notifica e si otterrà la risposta su quella pagina. Per verificare se la pagina di notifica funziona o meno, provare a registrare la transazione in un file txt e una volta che tutto funziona senza problemi è possibile rimuovere quel codice.

In questo esempio PData è un numero che inviamo al checkout di Google per recuperare lo stesso numero nella notifica, l'ho usato per abbinare la transazione con un ordine particolare.

Spero che questo codice possa aiutarti;

1

Nota: Ho appena copiato la mia risposta da:

C# example for Google Checkout replies?

che è stato per qualche motivo chiuso come un duplicato da un moderatore (credo merging sarebbe stata data meglio che questa domanda non ha avuto una risposta e l'altra ha fatto).

-

ho voluto questa versione API di Google 2.5 NET codice di esempio per un lungo tempo e finalmente costruito io stesso:

http://www.capprime.com/software_development_weblog/2010/11/29/UsingTheGoogleCheckout25APIWithASPNETMVCTheMissingSample.aspx

Se avete bisogno di WebForms classici, invece di MVC, lascia conoscermi.

Non ho incluso esempi di come appaiono i pacchetti, perché onestamente, non importa (l'API dovrebbe avvolgere i pacchetti). Non è molto lavoro modificare l'esempio in un paio di punti e inviarlo via e-mail con quei dati.

1

Senza una connessione HTTPS, riceverai solo un numero di serie POST. Per sicurezza, è necessario assicurarsi che l'autorizzazione sia corretta (ci dovrebbe essere un'intestazione Authorization contenente <your mercahnt id>:<your merchant key> codificata utilizzando la codifica base64)

È quindi necessario effettuare una chiamata tramite l'API di Notification-History per richiedere i dettagli dell'aggiornamento, liberamente:

IList<string> ordersToGetUpdate = new List<string> { serialNumber }; 

NotificationHistoryRequest request = new NotificationHistoryRequest(ordersToGetUpdate); 
NotificationHistoryResponse resp = (NotificationHistoryResponse)request.Send(); 

foreach (object notification in resp.NotificationResponses) 
{ 
    // You'd now need to handle the response, which could be one of NewOrderNotification, OrderStateChangeNotification, RiskInformationNotification, AuthorizationAmountNotification or a ChargeAmountNotification 
    NewOrderNotification newOrder = notification as NewOrderNotification; 
    if(newOrder != null) 
    { 
     // Yay! New order, so do "something" with it 
    } 

    OrderStateChangeNotification orderUpdate = notification as OrderStateChangeNotification; 
    if (orderUpdate != null) 
    { 
     // Order updated (paid, shipped, etc), so do "something" with it 
    } 

    // you probably get the idea as to how to handle the other response types 
} 
Problemi correlati