Chrome / Safari POST Проблемы - PullRequest
       15

Chrome / Safari POST Проблемы

1 голос
/ 27 августа 2011

Я написал небольшую корзину для покупок в .Net, которая отправляет кого-то в PayPal по завершении заказа для оплаты. Чтобы отправить их в PayPal, у меня есть следующая форма на общей странице paypal.aspx, на которой нет реальных пользовательских функций:

<form action="http://www.paypal.com/cgi-bin/webscr" method="post" id="paypal">
     <input type="hidden" name="cmd" value="_cart"/>
     <input type="hidden" name="upload" value="1"/>
     <input type="hidden" name="business" value="email@email.com"/>
     <input type="hidden" name="tax_cart" id="tax_cart" />
     <input type="hidden" name="handling_cart" id="handling_cart" />
     <input type="hidden" name="return" id="return" value='<%="http://" + Request.Url.Authority + "/" %>' />
     <input type="hidden" name="custom" id="custom" />
     <input type="hidden" name="first_name" id="first_name" />
     <input type="hidden" name="last_name" id="last_name" />
     <input type="hidden" name="address1" id="address1" />
     <input type="hidden" name="address2" id="address2" />
     <input type="hidden" name="city" id="city" />
     <input type="hidden" name="state" id="state" />
     <input type="hidden" name="zip" id="zip" />
     <input type="submit" id="paypalButton" value="PayPal" style="display: none; visibility: hidden;"/>
 </form>

Когда страница, содержащая эту форму, загружается, прямо под ней появляется другая форма со связкой скрытых полей, которые заполняются данными из фактического порядка (который извлекается на основе значения строки запроса Guid). JavaScript в этой форме заполняет значения, требуемые PayPal, следующим образом:

    <form runat="server">
<asp:ScriptManager runat="server" />
<div id="ppItems">
    <asp:Repeater runat="server" ID="rpItems">
        <ItemTemplate>
            <input type="hidden" id='<%#"hv_quantity_" + Container.ItemIndex %>' value='<%#Eval("Quantity") %>' />
            <input type="hidden" id='<%#"hv_item_" + Container.ItemIndex %>' value='<%#Eval("Color") + " Tactical Hat" %>' />
            <input type="hidden" id='<%#"hv_amount_" + Container.ItemIndex %>' value='<%#Eval("UnitCost", "{0:n2}") %>' />
        </ItemTemplate>
    </asp:Repeater>
</div>

<asp:HiddenField runat="server" ID="hvCustom" />
<asp:HiddenField runat="server" ID="hvTax" />
<asp:HiddenField runat="server" ID="hvShipping" />
<asp:HiddenField runat="server" ID="hvFirstName" />
<asp:HiddenField runat="server" ID="hvLastName" />
<asp:HiddenField runat="server" ID="hvAddress1" />
<asp:HiddenField runat="server" ID="hvAddress2" />
<asp:HiddenField runat="server" ID="hvCity" />
<asp:HiddenField runat="server" ID="hvState" />
<asp:HiddenField runat="server" ID="hvZip" />

<script type="text/javascript" language="javascript">
    var paypal = document.getElementById('paypal');

    function load() {
        Sys.Application.remove_load(load);

        //set the items
        var ppItems = document.getElementById('ppItems');
        var items = ppItems.getElementsByTagName('input');
        var itemsCount = items.length / 3;

        for (var i = 0; i < itemsCount; ++i) {
            var quantity = document.getElementById('hv_quantity_' + i).value;
            var item = document.getElementById('hv_item_' + i).value;
            var amount = document.getElementById('hv_amount_' + i).value;

            addFormItem('item_name_' + (i + 1), quantity + " " + item);
            addFormItem('amount_' + (i + 1), amount);
            addFormItem('quantity_' + (i + 1), quantity);
        }

        //set global items
        var custom = document.getElementById('<%=this.hvCustom.ClientID %>').value;
        document.getElementById('tax_cart').value = document.getElementById('<%=hvTax.ClientID %>').value;
        document.getElementById('handling_cart').value = document.getElementById('<%=this.hvShipping.ClientID %>').value;
        document.getElementById('return').value += 'thanks.aspx?p=' + custom;
        document.getElementById('custom').value = custom;
        document.getElementById('first_name').value = document.getElementById('<%=this.hvFirstName.ClientID %>').value;
        document.getElementById('last_name').value = document.getElementById('<%=this.hvLastName.ClientID %>').value;
        document.getElementById('address1').value = document.getElementById('<%=this.hvAddress1.ClientID %>').value;
        document.getElementById('address2').value = document.getElementById('<%=this.hvAddress2.ClientID %>').value;
        document.getElementById('city').value = document.getElementById('<%=this.hvCity.ClientID %>').value;
        document.getElementById('state').value = document.getElementById('<%=this.hvState.ClientID %>').value;
        document.getElementById('zip').value = document.getElementById('<%=this.hvZip.ClientID %>').value;

        //submit to paypal
        document.getElementById('paypalButton').click();
    }

    function addFormItem(name, value) {
        var item = document.createElement('input');
        item.setAttribute('type', 'hidden');
        item.setAttribute('name', name);
        item.setAttribute('id', name);
        item.setAttribute('value', value);

        paypal.appendChild(item);
    }

    Sys.Application.add_load(load);

</script>

Таким образом, когда эта общая страница загружается, детали заказа извлекаются из базы данных на основе значения guid строки запроса, множество скрытых полей заполняются необходимыми значениями из базы данных, а затем вышеуказанный сценарий запускается при загрузке, устанавливая PayPal. Значения формы и затем нажатие скрытой кнопки отправляет все в PayPal, чтобы конечный пользователь мог заплатить.

У меня проблема в том, что это прекрасно работает в IE7 + и FF3 +, но Safari и Chrome играют не очень хорошо. В Chrome меня перенаправляют на домашнюю страницу PayPal, а не просят заплатить. Safari еще более странен тем, что оба перенаправляют на экран платежей PayPal (например, IE7 + и FF3 +), но только в версии для Mac он не заполняет все поля (в частности, имя / адрес), но другие поля (например, сумма) , налог и т. д.) заселить.

Кто-нибудь может дать какие-либо предложения относительно того, почему Chrome и Safari (только для Mac) не работают должным образом, а все остальное, похоже, работает?

1 Ответ

0 голосов
/ 01 сентября 2011

Я, наконец, понял это, пройдя старый школьный маршрут и перенаправив вместо выполнения POST:

var order = (from o in data.Orders where o.PayPal == Request.QueryString["p"] select o).Single();

//build the generic PP detail
sb.Append("http://www.paypal.com/cgi-bin/webscr/?cmd=_cart");
sb.AppendValue("upload", "1", false);
sb.AppendValue("business", "email@domain.com", true);
sb.AppendValue("handling_cart", (this.CurrentCart.Tax.HasValue ? this.CurrentCart.Tax.ToString() : "0"), false);
sb.AppendValue("return", this.Request.Url.Authority, true);
sb.AppendValue("custom", order.PayPal, true);
sb.AppendValue("first_name", (order.Customer.Name.IndexOf(" ") > -1) ? order.Customer.Name.Split(' ')[0] : order.Customer.Name, true);
sb.AppendValue("last_name", (order.Customer.Name.IndexOf(" ") > -1) ? order.Customer.Name.Split(' ')[1] : order.Customer.Name, true);
sb.AppendValue("address1", order.Customer.Address1, true);
sb.AppendValue("address2", order.Customer.Address2, true);
sb.AppendValue("city", order.Customer.City, true);
sb.AppendValue("state", order.Customer.StateProvince, true);
sb.AppendValue("zip", order.Customer.PostalCode, true);

for (int i = 0; i < order.OrderItems.Count; ++i)
{
     string index = (i + 1).ToString();
     sb.AppendValue("item_name_" + index, order.OrderItems[i].ProductAttribute.Name, true);
     sb.AppendValue("amount_" + index, string.Format("{0:n2}", order.OrderItems[i].UnitCost), false);
     sb.AppendValue("quantity_" + index, order.OrderItems[i].Quantity.ToString(), true);
}

Response.Redirect(sb.ToString());

Метод AppendValue является методом расширения для StringBuilder и выглядит следующим образом:

public static void AppendValue(this StringBuilder sb, string name, string value, bool encode)
{
    sb.Append("&" + name + "=" + ((encode) ? HttpUtility.UrlEncode(value) : value));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...