Asp.net mvc 4 MVC4.0中的Paypal IPN和PDT

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

我是MVC的初学者,我正在尝试使用以下链接了解paypal支付流程

请引导我 如何实现Paypal IPN和PDT

以及如何从Paypal获得成功和交易id,并将其保存在数据库中

提前谢谢


"

公共类签出控制器:控制器
{
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>





}