2

我是 MVC 的初学者,我正在尝试使用以下链接进行贝宝付款流程

http://www.arunrana.net/2012/01/paypal-integration-in-mvc3-and-razor.html

请指导我如何实施 Paypal IPN 和 PDT

以及如何从我想保存在数据库中的 Paypal 获取成功和交易 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; }

}"

并按照 web.config 文件配置

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





}

1个问题-这是我做的正确方法吗?

2 问题 - 如何从 Paypal 返回自定义值

3 付款后还要查看 web.config 文件,我应该叫 PIN 吗?

请指导我......以及如何进行付款流程

4

1 回答 1

0

我最近也在寻找这方面的信息。paypal 网站上有示例代码,但我发现它非常简洁,很难将其放入应用程序的上下文中。我能找到的最好的是 Rob Conery 的视频和样本。

首先,看视频。它被称为“ASP.NET MVC Storefront 第 1 部分:架构讨论和概述”。目前可以在这里找到。跳到 15:21 进入 paypal 部分。

然后下载源代码。您正在寻找 'ASP.NET MVC Storefront 示例代码,目前可在此处找到。

提取代码后,搜索IPN()IPN 方法和PDT()PDT 方法。

于 2014-01-09T21:50:21.070 回答