C # и Google Checkout - получить ответ с сервера? - PullRequest
12 голосов
/ 23 июля 2010

Существуют ли какие-либо учебные пособия о том, как получить ответы от транзакции Google Checkout при использовании C # и GCheckout API.Все примеры, которые я мог найти, были для предыдущих версий API, а не для текущей (2.5).Более конкретно, я хотел бы видеть пример ответа о том, что Google отправит мне обратно без и HTTPS-соединения.Я знаю, что это минимальные данные, но я все еще хотел бы увидеть пример этого и посмотреть, как его анализируют другие.

Ответы [ 3 ]

2 голосов
/ 26 февраля 2011

Google отправляет уведомление внутреннеСоздайте страницу уведомлений следующим образом:

<%@ 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 { ; }
    }
}

`

на странице настроек Google Checkout, задайте имя и путь к странице уведомления, и вы получите ответ на этой странице.Чтобы проверить, работает ли страница уведомлений, попробуйте записать транзакцию в текстовый файл, и после того, как все будет работать гладко, вы можете удалить этот код.

В этом примере PData - это число, которое я отправляю в Googleоформить заказ и вернуть тот же номер в уведомлении, я использовал его для сопоставления транзакции с конкретным заказом.

Надеюсь, этот код поможет вам;

1 голос
/ 12 февраля 2011

Без подключения HTTPS вы получите только серийный номер, отправленный вам.В целях безопасности вы должны убедиться в правильности авторизации (должен быть заголовок Authorization, содержащий <your mercahnt id>:<your merchant key>, закодированный с использованием кодировки base64)

Затем необходимо выполнить вызов через Notification-History-APIзапросить детали обновления, свободно:

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
}
1 голос
/ 11 февраля 2011

Примечание. Я только что скопировал свой ответ из:

C # примера для ответов Google Checkout?

, который по какой-то причине был закрыт как дубликат модератором (Я думаю, что слияние было бы лучше, учитывая, что на этот вопрос не было ответа, а на другой ответ был.)

-

Я хотел этот пример кода API Google версии 2.5 .NET длядолгое время и, наконец, построил его сам:

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

Если вам нужны классические веб-формы вместо MVC, дайте мне знать.

Я не включал образцыкак выглядят пакеты, потому что, честно говоря, это не имеет значения (API должен обернуть пакеты).Не так много работы, чтобы изменить образец в нескольких местах и ​​отправить его по электронной почте с этими данными.

...