Paypal add to cart multiple items form with discount
Asked Answered
A

2

0

I'm trying to offer a discount based on the purchase amount of the buyer using a paypal Add to Cart form. Basically I'm giving out for discount codes Disc1, Disc2, Disc3, Disc4, which will discount $5, $10, $20, $50. But each can work only if the purchase amount exceeds the $25, $50, $100, $250 respectively.

I'm trying to do this by calling a Javascript file which will apply the discount if the minimum price conditions are met.

The PROBLEM is that the form is for multiple items. So the variable for "amount" is not there, but there's different amounts for each option, so option_amount0, option_amount1, option_amount2.... etc. I can make the code work if there was one "amount", but not like here with multiple items/prices.

The HTML code looks like this:

    <head>
<script language="JavaScript" type="text/javascript" src="coupon.js"></script>
</head>
        <form target="_blank" action="https://www.paypal.com/cgi-bin/webscr" method="post">
    <input type="hidden" name="cmd" value="_cart">
    <input type="hidden" name="business" value="[email protected]">
    <input type="hidden" name="lc" value="US">
    <input type="hidden" name="item_name" value="Products">
    <input type="hidden" name="button_subtype" value="">
    <input type="hidden" name="no_shipping" value="1">
    <input type="hidden" name="undefined_quantity" value="1">
    <input type="hidden" name="rm" value="1">
    <input type="hidden" name="return" value="www.website.com">
    <input type="hidden" name="cancel_return" value="www.website.com">
    <input type="hidden" name="currency_code" value="USD">
    <input type="hidden" name="tax_rate" value="0.000">
    <input type="hidden" name="shipping" value="0.00">
    <input type="hidden" name="add" value="1">
    <input type="hidden" name="bn" value="PP-ShopCartBF:btn_cart_LG.gif:NonHosted">
    <table>
    <tr><td><br /><h4>
    <center><input type="hidden" name="on0" value="Products">Choose a Product</center></h4></td></tr><tr><td><center>
    <select name="os0" style="width: 230px"></center>
        <option value="item1">Product 1 : $15</option>
            <option value="item2">Product 2 : $25</option>
        <option value="item3">Product 3 : $75</option>
        <option value="item4">Product 4 : $150</option>
        <option value="item5">Product 5 : $300</option>

    </select> </td></tr>
    </table>
    <input type="hidden" name="currency_code" value="USD">

    <input type="hidden" name="option_select0" value="item1">
    <input type="hidden" name="option_amount0" value="15.00">
    <input type="hidden" name="option_select1" value="item2">
    <input type="hidden" name="option_amount1" value="25.00">
    <input type="hidden" name="option_select2" value="item3">
    <input type="hidden" name="option_amount2" value="75.00">
    <input type="hidden" name="option_select3" value="item4">
    <input type="hidden" name="option_amount3" value="150.00">
    <input type="hidden" name="option_select4" value="item4">
    <input type="hidden" name="option_amount4" value="300.00">
    <input type="hidden" name="option_index" value="0">


    <input type="hidden" name="discount_amount">

    <br />
    <!--  Enter Coupon  --> 
    <center>Coupon Code:</span> <br />
    <input type="text" name="text1" /> </center>
    <br />
    <!--  End Coupon  --> 

    <input type="image" src="images/btn_cart.gif" border="0" onclick=CalculateOrder(this.form) name="submit" alt="PayPal - The safer, easier way to pay online!">
    <img alt="" border="0" src="images/btn_cart.gif" width="1" height="1">
    </form>

The Javascript file is:

var coup1="Disc1";
var coup2="Disc2";
var coup3="Disc3";
var coup4="Disc4";



function CalculateOrder(form) {

if (form.text1.value == coup1 && ((form.option_amount.value>=25)))

{

form.discount_amount.value = "5";

}

if (form.text1.value == coup2 && ((form.option_amount.value>=50)))

{

form.discount_amount.value = "10";

}



if (form.text1.value == coup3 && ((form.option_amount.value>=100)))

{

form.discount_amount.value = "20";

}


if (form.text1.value == coup4) && ((form.option_amount.value>=250)))

{

form.discount_amount.value = "50";

}

}

How can I make the script account for the option_amount from the HTML form? Any help would be greatly appreciated!

Anet answered 20/10, 2011 at 18:43 Comment(0)
C
2

I am using PayPalMerchantSDK for the cart integration.

For your answer, I take this scenario as I need to send the basket to paypal with express checkout button. Also my basket has a discount voucher that can apply for the total amount. I am using Asp.Net MVC solutions

Please follow the code and instructions for the paypal payment integration.

Step1 : Download and Refer the PayPal_Merchant_SDK.dll

Step2 : Add the required setting to your web.config file for the PayPal_Merchant_SDK Servicess

Step 3: In your basket controller Payment action add the following code

    [HttpPost]
    public ActionResult Payment()
    {
        var basketForPayment = GetBasket();
        if (basketForPayment.Order == null || basketForPayment.OrderItem.Count <= 0 || basketForPayment.Order.DVEcomOrderStatus.ID != (int)DvEcomOrderStatusEnum.Initiated) { return View("basket-empty", new DvClientViewModel(UrlBasketEmptyPage, Languages.English)); }


        //Paypal Expresscheckout Integration===============================

        // Step 1: Create the paypal request object
        var request = new SetExpressCheckoutRequestType();
        PopulatePaypalRequestObject(request, basketForPayment);

        // Step 2: Invoke the API
        SetExpressCheckoutReq getTockenWrapper = new SetExpressCheckoutReq();
        getTockenWrapper.SetExpressCheckoutRequest = request;
        PayPalAPIInterfaceServiceService service = new PayPalAPIInterfaceServiceService();
        SetExpressCheckoutResponseType setEcResponse = service.SetExpressCheckout(getTockenWrapper);

        // Step 3: Check for API return status and get the payment tocken
        HttpContext currContext = System.Web.HttpContext.Current;
        currContext.Items.Add("paymentDetails", request.SetExpressCheckoutRequestDetails.PaymentDetails);
        var currResponseContext = SetPayPalKeyResponseObjects(service, setEcResponse);

        var responseobject = (Dictionary<string, string>) currResponseContext.Items["Response_keyResponseObject"];
        if (responseobject["API Status"] != "SUCCESS")
        {
            return View("Invalid-basket", new DvClientViewModel(UrlBasketEmptyPage, Languages.English));
        }

        //Step 4: Make Payment with the tocken
        var tocken = responseobject["EC token"];
        string queryString = "https://www.sandbox.paypal.com/webscr?cmd=_express-checkout";
        if(!string.IsNullOrEmpty(tocken))
        {

            //Update Order with the transaction token
            _orderRepository.UpdateOrder(model.Order.OrderNumber, tocken);

            queryString += string.Format("&token={0}", tocken);
            Response.Redirect(queryString);
        }

        return RedirectToAction("Payment");
    }

Step 4: Your Payment response action

    public ActionResult PaymentResponse()
    {
        // If we have a SECURE_SECRET then validate the incoming data using the MD5 hash
        //included in the incoming data
        if (Request.QueryString["token"].Length > 0 && Request.QueryString["PayerID"].Length > 0 )
        {
            var token = Request.QueryString["token"];
            var payerId = Request.QueryString["PayerID"];
            var order = _orderRepository.GetOrderTransaction(token);

            if(order !=null)
            {
                //Update Order with the transaction token
                _orderRepository.UpdateOrderSuccess(order.OrderNumber, token, payerId);
            }

            PaymentResponseClearSessionAndCookie();
            Response.Redirect("/");

        }

        return View("Invalid-basket", new DvClientViewModel(UrlBasketEmptyPage, Languages.English));

    }

Step 5: Prepare the basket for paypal

   private void PopulatePaypalRequestObject(SetExpressCheckoutRequestType request, DvEcomOrderViewModel basket)
    {
        var ecDetails = new SetExpressCheckoutRequestDetailsType();
        ecDetails.ReturnURL = ConfigurationManager.AppSettings["PayPalReturnUrl"];            ecDetails.CancelURL = ConfigurationManager.AppSettings["PayPalCancelUrl"];            ecDetails.BuyerEmail = basket.Order.CustomerEmailAddress;

        //Fix for release
        ecDetails.AddressOverride = "0";
        ecDetails.NoShipping = "1";

        /* Populate payment requestDetails. 
         * SetExpressCheckout allows parallel payments of upto 10 payments. 
         * This samples shows just one payment.
         */
        var paymentDetails = new PaymentDetailsType();
        ecDetails.PaymentDetails.Add(paymentDetails);
        double orderTotal = 0.0;
        double itemTotal = 0.0;
        var currency = (CurrencyCodeType)
            Enum.Parse(typeof(CurrencyCodeType), ConfigurationManager.AppSettings["PayPalCurrency"]);


        paymentDetails.OrderTotal = new BasicAmountType(currency, orderTotal.ToString(CultureInfo.InvariantCulture));
        orderTotal += Double.Parse(basket.Order.SubTotal.ToString(CultureInfo.InvariantCulture)); // Subtotal

        paymentDetails.ShippingTotal = new BasicAmountType(currency, basket.Order.DeliveryAmount.ToString(CultureInfo.InvariantCulture)); // Add delivery charge
        orderTotal += Double.Parse(basket.Order.DeliveryAmount.ToString(CultureInfo.InvariantCulture));

        paymentDetails.TaxTotal = new BasicAmountType(currency, basket.Order.VAT.ToString(CultureInfo.InvariantCulture)); //Add Vat Tax
        orderTotal += Double.Parse(basket.Order.VAT.ToString(CultureInfo.InvariantCulture));

        //paymentDetails.ShippingDiscount = new BasicAmountType(currency, basket.Order.DiscountAmount.ToString(CultureInfo.InvariantCulture)); // Subtract discount
        orderTotal -= Double.Parse(basket.Order.DiscountAmount.ToString(CultureInfo.InvariantCulture));


        paymentDetails.OrderDescription = string.Format("Payment for the basket order {0}", basket.Order.OrderNumber);

        paymentDetails.PaymentAction = (PaymentActionCodeType)
            Enum.Parse(typeof(PaymentActionCodeType), "SALE");


        AddressType shipAddress = new AddressType();
        shipAddress.Name = string.Format("{0} {1}", basket.Order.DeliveryFirstName, basket.Order.DeliverySurname);
        shipAddress.Street1 = basket.Order.BillingAddress1;
        shipAddress.Street2 = basket.Order.BillingAddress2 ?? "-";
        shipAddress.CityName = basket.Order.DeliveryTown ?? "-";
        shipAddress.StateOrProvince = basket.Order.DeliveryCounty;
        shipAddress.Country = (CountryCodeType)
            Enum.Parse(typeof(CountryCodeType), "GB");
        shipAddress.PostalCode = basket.Order.DeliveryPostcode;

        //Fix for release
        shipAddress.Phone = basket.Order.DeliveryTelePhone;

        ecDetails.PaymentDetails[0].ShipToAddress = shipAddress;


        // Each payment can include requestDetails about multiple items
        // This example shows just one payment item

        //ApplyDiscount
        if (basket.Order.DiscountAmount > 0)
        {
            decimal disAmt = basket.Order.DiscountAmount -
                             (basket.Order.DiscountAmount + basket.Order.DiscountAmount);
            PaymentDetailsItemType discount = new PaymentDetailsItemType();
            discount.Amount = new BasicAmountType(currency, disAmt.ToString(CultureInfo.InvariantCulture));
            discount.Description = "Discount Applied";
            discount.Name = "Voucher Code";
            paymentDetails.PaymentDetailsItem.Add(discount);
        }

        var itemDetails = new PaymentDetailsItemType();
        foreach (var item in basket.OrderItem)
        {                
            itemDetails.Name = item.ProductName;
            itemDetails.Amount = new BasicAmountType(currency, item.UnitPrice.ToString(CultureInfo.InvariantCulture));
            itemDetails.Quantity = Int32.Parse(item.Quantity.ToString(CultureInfo.InvariantCulture));
            itemDetails.ItemCategory = (ItemCategoryType)
            Enum.Parse(typeof(ItemCategoryType), "0");
            itemTotal += Double.Parse(item.UnitPrice.ToString(CultureInfo.InvariantCulture)) * itemDetails.Quantity.Value;

            itemDetails.Tax = new BasicAmountType(currency, item.VAT.ToString(CultureInfo.InvariantCulture));

            itemDetails.Description = item.ProductName;


            paymentDetails.PaymentDetailsItem.Add(itemDetails);
        }

        itemTotal -= Double.Parse(basket.Order.DiscountAmount.ToString(CultureInfo.InvariantCulture));
        paymentDetails.ItemTotal = new BasicAmountType(currency, itemTotal.ToString(CultureInfo.InvariantCulture));
        paymentDetails.OrderTotal = new BasicAmountType(currency, orderTotal.ToString(CultureInfo.InvariantCulture));

        request.SetExpressCheckoutRequestDetails = ecDetails;
    }

Step 6: Nothing more for you to start with...

Step 7 : The above steps will take you up to the paypal successfull transation. Next you need to authorise the real tansaction through another Paypal Authorise api function call through a Post method. The process is same as the above procedure.

Confucian answered 17/10, 2012 at 14:3 Comment(2)
i'm trying your method but i don't understand when "PaymentResponse()" and how the "PaymentResponse()" is called. Can you clarify? My flow is using Ajax to Payment method then get the Redirect_URL and at client side prompt the new payment window. But how do i ajax to know if the payment is done. Can user do the transaction without leaving the page? thanks.Structural
+1 Thank You for this code excerpt . Is this the same work flow that should be used in today's world (i.e. 2017), and/or Has any of this changed???Mineralogy
A
0

i found a solution, although a bit long, it still does the purpose.

I did to the js code, somthing like:

var coup1="Disc1";
var coup2="Disc2";
var coup3="Disc3";
var coup4="Disc4";



function CalculateOrder(form) {

if (form.text1.value == coup1 && (form.os0.value == "item2" || form.os0.value == "item3" || form.os0.value == "item4" || form.os0.value == "item5"))

{

form.discount_amount.value = "5";

}

if (form.text1.value == coup2 && (form.os0.value == "item3" || form.os0.value == "item4" || form.os0.value == "item5"))

{

form.discount_amount.value = "10";

}



if (form.text1.value == coup3 && (form.os0.value == "item4" || form.os0.value == "item5"))

{

form.discount_amount.value = "20";

}


if (form.text1.value == coup4 && (form.os0.value == "item5"))

{

form.discount_amount.value = "50";

}

}
Anet answered 29/10, 2011 at 18:25 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.