问题
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!
回答1:
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.
回答2:
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";
}
}
来源:https://stackoverflow.com/questions/7840611/paypal-add-to-cart-multiple-items-form-with-discount