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
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;
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:
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.
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
}