如何解决向 Paypal Action 结果添加变量
我正在使用 C# 中的 Paypal 交易示例。这个例子有静态项目要发送。我添加了获取正确项目所需的内容,并且我正在使用我没有添加的 id
变量来执行此操作。 id 获取该订单的数据记录。所有这些似乎都运行良好。除了现在它不会重定向到贝宝付款页面。我假设这是因为我添加了 id
变量。
我的问题是如何解决这个问题?我是否需要更改某些内容以使其重定向或不允许添加此变量?它适用于静态项目,没有 id..
下面是我的控制器操作:
public ActionResult ProcessInvoice(int id,string Cancel = null )
{
//getting the apiContext
APIContext apiContext = PaypalConfiguration.GetAPIContext();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
try
{
//A resource representing a Payer that funds a payment Payment Method as paypal
//Payer Id will be returned when payment proceeds or click to pay
string payerId = Request.Params["PayerID"];
if (string.IsNullOrEmpty(payerId))
{
//this section will be executed first because PayerID doesn't exist
//it is returned by the create function call of the payment class
// Creating a payment
// baseURL is the url on which paypal sendsback the data.
string baseURI = Request.Url.Scheme + "://" + Request.Url.Authority + "/ProcessInvoice?";
//here we are generating guid for storing the paymentID received in session
//which will be used in the payment execution
var guid = Convert.ToString((new Random()).Next(100000));
//CreatePayment function gives us the payment approval url
//on which payer is redirected for paypal account payment
var createdPayment = this.CreatePayment(id,apiContext,baseURI + "guid=" + guid);
//get links returned from paypal in response to Create function call
var links = createdPayment.links.GetEnumerator();
string paypalRedirectUrl = null;
while (links.MoveNext())
{
Links lnk = links.Current;
if (lnk.rel.ToLower().Trim().Equals("approval_url"))
{
//saving the payapalredirect URL to which user will be redirected for payment
paypalRedirectUrl = lnk.href;
}
}
// saving the paymentID in the key guid
Session.Add(guid,createdPayment.id);
return Redirect(paypalRedirectUrl);
}
else
{
// This function exectues after receving all parameters for the payment
var guid = Request.Params["guid"];
var executedPayment = ExecutePayment(apiContext,payerId,Session[guid] as string);
//If executed payment failed then we will show payment failure message to user
if (executedPayment.state.ToLower() != "approved")
{
return View("FailureView");
}
}
}
catch (Exception ex)
{
sb.Append("Error :" + ex.Message);
//return View("FailureView");
}
//on successful payment,show success page to user.
return View("SuccessView");
}
private PayPal.Api.Payment payment;
private Payment ExecutePayment(APIContext apiContext,string payerId,string paymentId)
{
var paymentExecution = new PaymentExecution()
{
payer_id = payerId
};
this.payment = new Payment()
{
id = paymentId
};
return this.payment.Execute(apiContext,paymentExecution);
}
private Payment CreatePayment(int id,APIContext apiContext,string redirectUrl)
{
//create itemlist and add item objects to it
var order = db.Orders.Find(id);
var company = db.CompanyNames.Where(x => x.CompanyId == order.CompanyId).FirstOrDefault();
var shipping = db.ShippingOrBOL.Where(x => x.CompanyId == order.CompanyId).FirstOrDefault();
var cName = company.CompanyName;
var invNum = order.InvoiceNumber;
var desc = order.OrderDescription;
var price = order.TotalPrice.ToString();
var poNum = order.PONumber;
var shipCost = shipping.ShippingPrice.ToString();
decimal totalOrder = 0m;
string total = totalOrder.ToString();
decimal tax = .08m;
var detail = db.OrderDetails.Where(x => x.OrderId == id).ToList();
List<Item> items = new List<Item>();
foreach (var item in detail)
{
var part = db.ExtParts.Where(a => a.Material == item.Material).FirstOrDefault();
var prt = part.PartNumber;
var prc = item.UnitPrice.ToString();
var qty = item.Quantity.ToString();
items.Add(new Item()
{
name = part.Description,currency = "USD",price = prc,quantity = qty,sku = prt,});
totalOrder += (item.Quantity * item.UnitPrice);
}
ItemList theItemList = new ItemList
{
items = new List<Item>()
};
theItemList.items = items;
var payer = new Payer()
{
payment_method = "paypal"
};
// Configure Redirect Urls here with RedirectUrls object
var redirUrls = new RedirectUrls()
{
cancel_url = redirectUrl + "&Cancel=true",return_url = redirectUrl
};
// Adding Tax,shipping and Subtotal details
decimal totalTax = totalOrder * (tax);
var tt = totalTax.ToString();
var details = new Details()
{
tax = tt,shipping = shipCost,subtotal = total
};
//Final amount with details
var amount = new Amount()
{
currency = "USD",total = price,// Total must be equal to sum of tax,shipping and subtotal.
details = details
};
var transactionList = new List<Transaction>();
// Adding description about the transaction
transactionList.Add(new Transaction()
{
description = desc,invoice_number = invNum,//Generate an Invoice No
amount = amount,item_list = theItemList
});
this.payment = new Payment()
{
intent = "sale",payer = payer,transactions = transactionList,redirect_urls = redirUrls
};
// Create a payment using a APIContext
return this.payment.Create(apiContext);
}
它实际上转到了用于操作的页面,当然由于该视图不存在而出错。
更新: 问题实际上是总计为 0,Paypal 无法创建总计为零的值。我需要弄清楚为什么总数是 0。我怀疑这是我得到总数的方式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。