Asp.net mvc 4 MVC4.0中的Paypal IPN和PDT
我是MVC的初学者,我正在尝试使用以下链接了解paypal支付流程 请引导我 如何实现Paypal IPN和PDT 以及如何从Paypal获得成功和交易id,并将其保存在数据库中 提前谢谢Asp.net mvc 4 MVC4.0中的Paypal IPN和PDT,asp.net-mvc-4,paypal,Asp.net Mvc 4,Paypal,我是MVC的初学者,我正在尝试使用以下链接了解paypal支付流程 请引导我 如何实现Paypal IPN和PDT 以及如何从Paypal获得成功和交易id,并将其保存在数据库中 提前谢谢 " 公共类签出控制器:控制器 { CartContext _CartContext=新的CartContext(); CartItemContext_CartItemContext=新的CartItemContext(); Tbl_OrderContext _OrderContext=新Tbl_Order
"
公共类签出控制器:控制器
{
CartContext _CartContext=新的CartContext();
CartItemContext_CartItemContext=新的CartItemContext();
Tbl_OrderContext _OrderContext=新Tbl_OrderContext();
OrderDetailContext_OrderDetailContext=新的OrderDetailContext();
ProductContext_ProductContext=新的ProductContext();
常量字符串PromoCode=“FREE”;
[HttpPost]
公共行动结果地址和付款(CheckoutViewModel值)
{
var cart=ShoppingCart.GetCart(this.HttpContext);
var_cartimes=会话[“cartimes”];
变量列表=(列表)会话[“CartItems”];
values.CartItems=列表;
变量顺序=新的CheckoutViewModel();
order.CartItems=列表;
TryUpdateModel(订单);
{
尝试
{
if(order.Tbl_order==null)
{
返回视图(订单);
}
其他的
{
order.Tbl_order.Username=User.Identity.Name;
order.Tbl_order.OrderDate=DateTime.Now;
order.Tbl_order.cartotal=order.cartotal;
会话[“carttotal”]=order.carttotal;
order.Tbl_order.Status=“待定”;
//保存订单
_OrderContext.OrderEntries.Add(order.Tbl_order);
_OrderContext.SaveChanges();
//处理订单
字符串username=User.Identity.Name;
ShoppingCart obj=新ShoppingCart();
int i=obj.CreateOrder(order.Tbl_order,order.CartItems,用户名);
//返回重定向操作(“完成”,
//新的{id=order.Tbl_order.OrderId});
返回重定向到操作(“PosttoPaypalShow”);
}
}
抓住
{
//无效-重新显示时出错
返回视图(订单);
}
}
}
[HttpGet]
公共行动结果PosttoPaypalShow()
{
sportstore.Models.Paypal Paypal=new Paypal();
payPal.cmd=“\u xclick”;
payPal.business=ConfigurationManager.AppSettings[“BusinessAccount”];
bool useSendBox=Convert.ToBoolean(ConfigurationManager.AppSettings[“useSendBox]”);
如果(使用发送框)
{
ViewBag.actionURL=”https://www.sandbox.paypal.com/cgi-bin/webscr";
}
其他的
{
ViewBag.actionURL=”https://www.paypal.com/cgi-bin/webscr";
}
payPal.cancel_return=System.Configuration.ConfigurationManager.AppSettings[“CancelUrl”];
payPal@return=ConfigurationManager.AppSettings[“ReturnURL”];
payPal.notify_url=ConfigurationManager.AppSettings[“NotifyURL”];
payPal.currency_code=ConfigurationManager.AppSettings[“currencycode”];
//payPal.item_Name=ProductName;
payPal.item_Name=“test1”;
payPal.Descriptions=“tes2”;
payPal.amount=String.Format(“{0:0.##}”,Session[“carttotal”]);//Convert.ToString(Session[“carttotal”].ToString(“0.00”);
返回视图(贝宝);
}
公共行动结果PaypalAddressAndPayment()
{
Tbl_订单=新Tbl_订单();
var cart=ShoppingCart.GetCart(this.HttpContext);
//设置ViewModel
var viewModel=新的CheckoutViewModel
{
CartItems=cart.GetCartItems(),
CartTotal=cart.GetTotal(),
Tbl_订单=订单
};
会话[“CartItems”]=viewModel.CartItems;
返回视图(viewModel);
//返回视图(订单);
}
字符串GetPayPalResponse(字典formVals、布尔使用沙盒)
{
字符串paypalUrl=useSandbox?“https://www.sandbox.paypal.com/cgi-bin/webscr"
: "https://www.paypal.com/cgi-bin/webscr";
HttpWebRequest req=(HttpWebRequest)WebRequest.Create(paypalUrl);
//设置请求返回的值
请求方法=“POST”;
req.ContentType=“应用程序/x-www-form-urlencoded”;
byte[]param=Request.BinaryRead(Request.ContentLength);
string strequest=Encoding.ASCII.GetString(param);
StringBuilder sb=新的StringBuilder();
某人追加(请求);
foreach(formVals.Keys中的字符串键)
{
sb.AppendFormat(&{0}={1}),key,formVals[key]);
}
strRequest+=sb.ToString();
请求内容长度=请求长度;
//代理
//WebProxy proxy=新的WebProxy(新的Uri(“http://urlort#");
//请求代理=代理;
//将请求发送到PayPal并获得响应
字符串响应=”;
使用(StreamWriter streamOut=newstreamwriter(req.GetRequestStream(),System.Text.Encoding.ASCII))
{
streamOut.Write(strRequest);
streamOut.Close();
使用(StreamReader streamIn=newstreamreader(req.GetResponse().GetResponseStream())
{
response=streamIn.ReadToEnd();
}
}
返回响应;
}
公共行动结果IPN()
{
var formVals=新字典();
formVals.Add(“cmd”和“notify-validate”);
字符串响应=GetPayPalResponse(formVals,true);
如果(响应=“已验证”)
{
字符串transactionID=请求[“txn_id”];
字符串sAmountPaid=Request[“mc_gross”];
字符串orderID=请求[“自定义”];
字符串pay_Status=请求[“pay_Status”];
//_logger.Info(“已验证订单的IPN”+订单ID);
public class CheckoutController : Controller
{
CartContext _CartCotext = new CartContext();
CartItemContext _CartItemContext = new CartItemContext();
Tbl_OrderContext _OrderContext = new Tbl_OrderContext();
OrderDetailContext _OrderDetailContext = new OrderDetailContext();
ProductContext _ProductContext = new ProductContext();
const string PromoCode = "FREE";
[HttpPost]
public ActionResult AddressAndPayment(CheckoutViewModel values)
{
var cart = ShoppingCart.GetCart(this.HttpContext);
var _CartItems = Session["CartItems"];
var list = (List<Cart>)Session["CartItems"];
values.CartItems = list;
var order = new CheckoutViewModel();
order.CartItems = list;
TryUpdateModel(order);
{
try
{
if (order.Tbl_Order == null)
{
return View(order);
}
else
{
order.Tbl_Order.Username = User.Identity.Name;
order.Tbl_Order.OrderDate = DateTime.Now;
order.Tbl_Order.CartTotal = order.CartTotal;
Session["carttotal"] = order.CartTotal;
order.Tbl_Order.Status = "Pending";
//Save Order
_OrderContext.OrderEntries.Add(order.Tbl_Order);
_OrderContext.SaveChanges();
//Process the order
string username = User.Identity.Name;
ShoppingCart obj = new ShoppingCart();
int i = obj.CreateOrder(order.Tbl_Order, order.CartItems, username);
//return RedirectToAction("Complete",
// new { id = order.Tbl_Order.OrderId });
return RedirectToAction("PosttoPaypalShow");
}
}
catch
{
//Invalid - redisplay with errors
return View(order);
}
}
}
[HttpGet]
public ActionResult PosttoPaypalShow()
{
SportsStore.Models.Paypal payPal = new Paypal();
payPal.cmd = "_xclick";
payPal.business = ConfigurationManager.AppSettings["BusinessAccount"];
bool useSendBox = Convert.ToBoolean(ConfigurationManager.AppSettings["useSendbox"]);
if (useSendBox)
{
ViewBag.actionURL = "https://www.sandbox.paypal.com/cgi-bin/webscr";
}
else
{
ViewBag.actionURL = "https://www.paypal.com/cgi-bin/webscr";
}
payPal.cancel_return = System.Configuration.ConfigurationManager.AppSettings["CancelUrl"];
payPal.@return = ConfigurationManager.AppSettings["ReturnURL"];
payPal.notify_url = ConfigurationManager.AppSettings["NotifyURL"];
payPal.currency_code = ConfigurationManager.AppSettings["currencycode"];
//payPal.item_Name = ProductName;
payPal.item_Name = "test1";
payPal.Descriptions = "tes2";
payPal.amount = String.Format("{0:0.##}", Session["carttotal"]); //Convert.ToString(Session["carttotal"].ToString("0.00"));
return View(payPal);
}
public ActionResult PaypalAddressAndPayment()
{
Tbl_Order order = new Tbl_Order();
var cart = ShoppingCart.GetCart(this.HttpContext);
// Set up the ViewModel
var viewModel = new CheckoutViewModel
{
CartItems = cart.GetCartItems(),
CartTotal = cart.GetTotal(),
Tbl_Order = order
};
Session["CartItems"] = viewModel.CartItems;
return View(viewModel);
//return View(order);
}
string GetPayPalResponse(Dictionary<string, string> formVals, bool useSandbox)
{
string paypalUrl = useSandbox ? "https://www.sandbox.paypal.com/cgi-bin/webscr"
: "https://www.paypal.com/cgi-bin/webscr";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(paypalUrl);
// Set values for the request back
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
byte[] param = Request.BinaryRead(Request.ContentLength);
string strRequest = Encoding.ASCII.GetString(param);
StringBuilder sb = new StringBuilder();
sb.Append(strRequest);
foreach (string key in formVals.Keys)
{
sb.AppendFormat("&{0}={1}", key, formVals[key]);
}
strRequest += sb.ToString();
req.ContentLength = strRequest.Length;
//for proxy
//WebProxy proxy = new WebProxy(new Uri("http://urlort#");
//req.Proxy = proxy;
//Send the request to PayPal and get the response
string response = "";
using (StreamWriter streamOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII))
{
streamOut.Write(strRequest);
streamOut.Close();
using (StreamReader streamIn = new StreamReader(req.GetResponse().GetResponseStream()))
{
response = streamIn.ReadToEnd();
}
}
return response;
}
public ActionResult IPN()
{
var formVals = new Dictionary<string, string>();
formVals.Add("cmd", "_notify-validate");
string response = GetPayPalResponse(formVals, true);
if (response == "VERIFIED")
{
string transactionID = Request["txn_id"];
string sAmountPaid = Request["mc_gross"];
string orderID = Request["custom"];
string pay_Status = Request["payment_status"];
//_logger.Info("IPN Verified for order " + orderID);
//validate the order
Decimal amountPaid = 0;
Decimal.TryParse(sAmountPaid, out amountPaid);
//Order order = _orderService.GetOrder(new Guid(orderID));
Tbl_Order order = null;
//check the amount paid
if (AmountPaidIsValid(order, amountPaid))
{
Tbl_Order add = new Tbl_Order();
add.Username = User.Identity.Name;
//add.FirstName = Request["first_name"];
//add.LastName = Request["last_name"];
//add.Email = Request["payer_email"];
//add.Address = Request["address_street"];
//add.City = Request["address_city"];
//add.State = Request["address_state"];
//add.Country = Request["address_country"];
//add.PostalCode = Request["address_zip"];
add.TransactionId = transactionID;
add.Status = pay_Status;
add.CartTotal = Convert.ToDecimal(sAmountPaid);
//process it
try
{
_OrderContext.OrderEntries.Add(add);
_OrderContext.SaveChanges();
//_pipeline.AcceptPalPayment(order, transactionID, amountPaid);
//_logger.Info("IPN Order successfully transacted: " + orderID);
//return RedirectToAction("Receipt", "Order", new { id = order.ID });
}
catch
{
//HandleProcessingError(order, x);
return View();
}
}
else
{
//let fail - this is the IPN so there is no viewer
}
}
return View();
}
bool AmountPaidIsValid(Tbl_Order order, decimal amountPaid)
{
//pull the order
bool result = true;
if (order != null)
{
if (order.CartTotal > amountPaid)
{
//_logger.Warn("Invalid order amount to PDT/IPN: " + order.ID + "; Actual: " + amountPaid.ToString("C") + "; Should be: " + order.Total.ToString("C") + "user IP is " + Request.UserHostAddress);
result = false;
}
}
else
{
//_logger.Warn("Invalid order ID passed to PDT/IPN; user IP is " + Request.UserHostAddress);
}
return result;
}
}
public class Address
{
public string FirstName { set; get; }
public string LastName { set; get; }
public string Email { set; get; }
public string Street1 { set; get; }
public string City { set; get; }
public string StateOrProvince { set; get; }
public string Country { set; get; }
public string Zip { set; get; }
}"
<add key="BusinessAccount" value="anilcs_1361585097_biz@gmail.com" />
<add key="useSendbox" value="true" />
<add key="currencycode" value="USD" />
<add key="ReturnURL" value="http://localhost:49424/Checkout/IPN" />
<add key="CancelUrl" value="http://localhost:49424/SportsStore/CancelFromPaypal" />
<add key="NotifyURL" value="http://localhost:49424/SportsStore/NotifyFromPaypal" />
<!--test MarchnatAccountId-->
<add key =" MerchantAccountID" value="RCERFF5KTC784"/>
@model SportsStore.Models.Paypal
@{
Layout = null;
}
<html>
<head>
<title>Index</title>
<script src="@Url.Content("~/Scripts/jquery-1.7.1.min.js")" type="text/javascript"></script>
</head>
</html>
<form id="frm" action="@ViewBag.Actionurl">
@Html.HiddenFor(Model => Model.cmd)
@Html.HiddenFor(Model => Model.business)
@Html.HiddenFor(Model => Model.no_shipping)
@Html.HiddenFor(Model => Model.@return)
@Html.HiddenFor(Model => Model.cancel_return)
@Html.HiddenFor(Model => Model.notify_url)
@Html.HiddenFor(Model => Model.currency_code)
@Html.HiddenFor(Model => Model.item_Name)
@Html.HiddenFor(Model => Model.amount)
</form>
<p style="text-align: center">
<h4>
Redirecting to Paypal</h4>
</p>
<script type="text/javascript" language="javascript">
$(this.document).ready(function () {
var frm = $("form");
frm.submit();
});
</script>
@model SportsStore.Models.CheckoutViewModel
@{
ViewBag.Title = "Address And Payment";
}
<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
@using (Html.BeginForm("AddressAndPayment", "Checkout"))
{
<table>
<thead>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.OrderId, "OrderId")
</th>
<td>
@Html.TextBoxFor(m => m.Tbl_Order.OrderId, new { disabled = "disabled", @readonly = "readonly" })
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.OrderDate, "OrderDate")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.OrderDate, "OrderDate")
@Html.EditorFor(m => m.CartItems, "CartItems")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.FirstName, "First Name")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.FirstName, "First Name")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.LastName, "Last Name")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.LastName, "Last Name")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.Address, "Address")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.Address, "Address")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.City, "City")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.City, "City")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.State, "State")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.State, "State")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.PostalCode, "PostalCode")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.PostalCode, "PostalCode")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.Country, "Country")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.Country, "Country")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.Phone, "Phone")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.Phone, "Phone")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.Tbl_Order.Email, "Email")
</th>
<td>
@Html.EditorFor(m => m.Tbl_Order.Email, "Email")
</td>
</tr>
<tr>
<th>
@Html.LabelFor(m => m.CartTotal, "Total")
</th>
<td>
@* @Html.EditorFor(m => m.CartTotal, "Total" ) *@ @* @Html.TextBoxFor(m => m.CartTotal, new { disabled = "disabled", @readonly = "readonly" })*@
@* @Html.DisplayTextFor(m => m.CartTotal)*@
@Html.TextBoxFor(m => m.CartTotal, new { @readonly = "readonly" })
</td>
</tr>
<tr>
<td>
</td>
Continoue with paypal
<td>
</td>
</tr>
<tr>
<td>
@* @Html.ActionLink("Sure to payment", "PosttoPaypalShow", "Checkout")*@
<input type="submit" value="Submit" />
</td>
</tr>
</thead>
</table>
}