简体   繁体   中英

Paypal add to cart multiple items form with discount

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@email.com">
    <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!

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.

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";

}

}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM