Запрос на публикацию Cybersource всегда получает тайм-аут сеанса - PullRequest
2 голосов
/ 14 июля 2020

Я знаю, что Cybersource здесь не так уж и знакомо, но я действительно в чем-то застрял, и, возможно, кто-то может мне помочь. Центр поддержки Cybersource , но, очевидно, они не поддерживают тестовые учетные записи.

У меня есть следующий код, в котором я пытаюсь выполнить почтовый запрос в Cybersource:

private async void Confirm_Payment(object sender, EventArgs e)
{
    var randomGuid = Guid.NewGuid().ToString();
    var currentDateTime = GetUTCDateTime();
    var referenceNumber = "1594706148080";

    using (var client = new HttpClient())
    {
        using (var content = new MultipartFormDataContent())
        {
            var values = new Dictionary<string, string>
            {
                {"access_key", "ACCESS_KEY"},
                {"profile_id", "PROFILE_ID"},
                {"transaction_uuid", randomGuid},
                {"signed_field_names", "access_key,profile_id,transaction_uuid,signed_field_names,unsigned_field_names,signed_date_time,locale,transaction_type,reference_number,amount,currency"},
                {"unsigned_field_names", ""},
                {"signed_date_time", currentDateTime},
                {"locale", "en"},
                {"transaction_type", "authorization"},
                {"reference_number", referenceNumber},
                {"amount", "100.00"},
                {"currency", "USD"},
                {"submit", "Submit"}
            };
            var signature = Security.Sign(values);
            foreach (var keyValuePair in values)
            {
                content.Add(new StringContent(keyValuePair.Value), keyValuePair.Key);
            }

            content.Add(new StringContent(signature), "signature");
            var requestUri = "https://testsecureacceptance.cybersource.com/pay";
            var result = await client.PostAsync(requestUri, content);
            if (result.IsSuccessStatusCode)
            {
                var resp = await result.Content.ReadAsStringAsync();
                await Navigation.PushAsync(new WebScreen(requestUri));
            }
        }
    }
}

result.IsSuccessStatusCode это 200 OK, но всякий раз, когда я получаю await result.Content.ReadAsStringAsync();, я получаю Страница тайм-аута сеанса

Обратите внимание, что тот же код в NET работает нормально:

<form id="payment_confirmation" action="https://testsecureacceptance.cybersource.com/pay" method="post">
    <fieldset id="confirmation">
        <legend>Review Payment Details</legend>
        <div>
            <%
                foreach (var key in Request.Form.AllKeys)
                {
                    Response.Write("<div>");
                    Response.Write("<span class=\"fieldName\">" + key + ":</span><span class=\"fieldValue\">" + Request.Params[key] + "</span>");
                    Response.Write("</div>");
                }
    %>
        </div>
    </fieldset>
    <%
        IDictionary<string, string> parameters = new Dictionary<string, string>();
        foreach (var key in Request.Form.AllKeys)
        {
            Response.Write("<input type=\"hidden\" id=\"" + key + "\" name=\"" + key + "\" value=\"" + Request.Params[key] + "\"/>\n");
            parameters.Add(key, Request.Params[key]);
        }
        Response.Write("<input type=\"hidden\" id=\"signature\" name=\"signature\" value=\"" + secureacceptance.Security.Sign(parameters) + "\"/>\n");
%>
    <input type="submit" id="submit" value="Confirm" />
</form>

Я пытался взять тот же код и выполнить его в Xamarin Forms, но это не сработало.

Я думаю, проблема в том, что мы должны добавить определенные c заголовки, чтобы Cybersource Gateway не вызывает проблемы с тайм-аутом сеанса. Кто-нибудь знает, в чем может быть проблема?

1 Ответ

2 голосов
/ 16 июля 2020

Я не знаю, будет ли у кого-нибудь когда-нибудь эта проблема, но я решил ее, добавив повара ie в Webview

, хотя навигация в Webview вызывает то же самое ошибка ( Тайм-аут сеанса ). Но этот вопрос решается добавлением следующего кода:

var domain = new Uri(webSource.BaseUrl).Host;
var cookie = new Cookie
{
    Secure = true,
    Expired = false,
    HttpOnly = false,
    Name = "cookie",
    Expires = DateTime.Now.AddDays(10),
    Domain = domain,
    Path = "/"
};
cookies.Add(cookie);
paymentWebView.Cookies = cookies;
...