Tin tức

Thiết kế web ASP.NET 4.5 - Tích hợp với PayPal - Phần 6

08/03/2013

Tiếp theo bài viết Thiết kế web ASP.NET 4.5 - Tích hợp với PayPal - Phần 5,  phần này bạn sẽ thực hiện các công việc sau

Cập nhật số cổng LocalHost trong lớp PayPal trong việc thiết kế web ASP.NET 4.5

Ứng dụng mẫu mua sản phẩm bằng cách điều hướng đến các trang web thử nghiệm PayPal và trở lại ứng dụng mẫu. Theo thứ tự để trả lại URL PayPal chính xác, bạn cần phải xác định số cổng của các ứng dụng mẫu chạy trong mã PayPal đã đề cập ở trên.

1. Ở chế độ thiết kế web (Design) Bấm chuột phải lên tên dự án (WingtipToys) trong Solution Explorer và chọn Properties.
2. Trong cột bên trái, chọn, tab Web.
3. Nhận số cổng từ hộp Project Url .
4. Cập nhật returnURLcancelURL trong lớp PayPal (NVPAPICaller) trong tệp PayPalFunctions.cs để sử dụng số cổng cho ứng dụng web:

string returnURL = "http://localhost:<Your Port Number>/Checkout/CheckoutReview.aspx";
string cancelURL = "http://localhost:<Your Port Number>/Checkout/CheckoutCancel.aspx";

Bây giờ mã bạn đã thêm vào phù hợp với cổng mong muốn cho ứng dụng web cục bộ. PayPal sẽ trả về URL chính xác cho máy cục bộ của bạn.

Thêm nút PayPal Checkout

Bây giờ các chức năng chính PayPal đã được thêm vào ứng dụng mẫu, bạn có thể bắt đầu thêm các đánh dấu và mã cần thiết để gọi các chức năng này. Trước tiên, bạn phải thêm nút kiểm tra rằng người dùng sẽ nhìn thấy trên trang giỏ mua hàng.
1. Mở tệp ShoppingCart.aspx.
2. Cuộn xuống cuối của tệp và tìm chú thích <!--Checkout Placeholder -->.
3. Thay thế chú thích bằng điều khiển ImageButton do vậy mã đánh dấu như sau:

    <asp:ImageButton ID="CheckoutImageBtn" runat="server"
Width="145" AlternateText="Check out with PayPal"
OnClick="CheckoutBtn_Click"
BackColor="Transparent" BorderWidth="0" />

4. Trong tệp the ShoppingCart.aspx.cs sau sự kiện UpdateBtn_Click thêm sự kiện CheckOutBtn_Click:

protected void CheckoutBtn_Click(object sender, ImageClickEventArgs e)
{
    ShoppingCartActions usersShoppingCart = new ShoppingCartActions();
    Session["payment_amt"] = usersShoppingCart.GetTotal();
    Response.Redirect("Checkout/CheckoutStart.aspx");
}

5. Trong tệp ShoppingCart.aspx.cs, thêm tham chiếu cho nút CheckoutBtn, do vậy mã sẽ như sau:

    protected void Page_Load(object sender, EventArgs e)
{
    ShoppingCartActions usersShoppingCart = new ShoppingCartActions();
    decimal cartTotal = 0;
    cartTotal = usersShoppingCart.GetTotal();
    if (cartTotal > 0)
    {
        // Display Total.
        lblTotal.Text = String.Format("{0:c}", cartTotal);
    }
    else
    {
        LabelTotalText.Text = "";
        lblTotal.Text = "";
        ShoppingCartTitle.InnerText = "Shopping Cart is Empty";
        UpdateBtn.Visible = false;
        CheckoutImageBtn.Visible = false;
    }
}

6. Lưu các thay đổi cho cả tệp ShoppingCart.aspx file và the ShoppingCart.aspx.cs.
7. Từ thực đơn, chọn Build -> Build Wingtip Toys.
Dự án sẽ được biên dịch lại với điều khiển ImageButton được thêm.

Gửi chi tiết  mua hàng tới PayPal

Khi người dùng bấm vào nút Checkout  trên trang giỏ hàng (ShoppingCart.aspx), họ sẽ bắt đầu quá trình mua, dưới đây là mã gọi hàm đầu tiên cần mua một sản phẩm.

1. Từ  thư mục Checkout, mở tệp mã lệnh tên là CheckoutStart.aspx.cs.
2. Thay mã hiện tại với mã dưới đây:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace WingtipToys.Checkout
{
    public partial class CheckoutStart : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            NVPAPICaller payPalCaller = new NVPAPICaller();
            string retMsg = "";
            string token = "";
 
            if (Session["payment_amt"] != null)
            {
                string amt = Session["payment_amt"].ToString();
 
                bool ret = payPalCaller.ShortcutExpressCheckout(amt, ref token, ref retMsg);
                if (ret)
                {
                    Session["token"] = token;
                    Response.Redirect(retMsg);
                }
                else
                {
                    Response.Redirect("CheckoutError.aspx?" + retMsg);
                }
            }
            else
            {
                Response.Redirect("CheckoutError.aspx?ErrorCode=AmtMissing");
            }
        }
    }
}

Khi người sử dụng của ứng dụng nhấp chuột vào nút Checkout trên trang giỏ mua hàng, trình duyệt sẽ điều hướng đến trang CheckoutStart.aspx. Khi tải trang CheckoutStart.aspx, phương thức ShortcutExpressCheckout được gọi. Tại thời điểm này, người dùng được chuyển đến các trang web thử nghiệm PayPal. Trên trang web PayPal, người dùng nhập vào các thông tin PayPal của họ, đánh giá chi tiết mua hàng, chấp nhận thỏa thuận PayPal và trở về ứng dụng mẫu nơi mà các phương thức ShortcutExpressCheckout hoàn tất. Khi phương thức ShortcutExpressCheckout hoàn tất, nó sẽ chuyển hướng người dùng đến trang CheckoutReview.aspx quy định trong phương thức ShortcutExpressCheckout. Điều này cho phép người sử dụng để xem xét các chi tiết theo thứ tự từ bên trong ứng dụng

Xem xét chi tiết đơn hàng
Sau khi trở về từ PayPal, trang CheckoutReview.aspx của ứng dụng mẫu hiển thị các chi tiết lệnh. Trang này cho phép người sử dụng để xem xét các chi tiết đặt hàng trước khi mua sản phẩm. Trang TCheckoutReview.aspx phải được tạo ra như sau:

1. Trong thư mục Checkout, mở trang tên là CheckoutReview.aspx.
2. Thay thế mã đánh dấu hiện tại với mã sau:
<%@ Page Title="" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="CheckoutReview.aspx.cs" Inherits="WingtipToys.Checkout.CheckoutReview" %>
<asp:Content ID="Content1" ContentPlaceHolderID="HeadContent" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="FeaturedContent" runat="server">
    <h1>Order Review</h1>
    <p></p>
    <h3 style="padding-left: 33px">Products:</h3>
    <asp:GridView ID="OrderItemList" runat="server" AutoGenerateColumns="False" GridLines="Both" CellPadding="10" Width="500" BorderColor="#efeeef" BorderWidth="33">             
        <Columns>
            <asp:BoundField DataField="ProductId" HeaderText=" Product ID" />       
            <asp:BoundField DataField="Product.ProductName" HeaderText=" Product Name" />       
            <asp:BoundField DataField="Product.UnitPrice" HeaderText="Price (each)" DataFormatString="{0:c}"/>    
            <asp:BoundField DataField="Quantity" HeaderText="Quantity" />       
        </Columns>   
    </asp:GridView>
    <asp:DetailsView ID="ShipInfo" runat="server" AutoGenerateRows="false" GridLines="None" CellPadding="10" BorderStyle="None" CommandRowStyle-BorderStyle="None">
        <Fields>
        <asp:TemplateField>
            <ItemTemplate>
                <h3>Shipping Address:</h3>
                <br />
                <asp:Label ID="FirstName" runat="server" Text='<%#: Eval("FirstName") %>'></asp:Label
                <asp:Label ID="LastName" runat="server" Text='<%#: Eval("LastName") %>'></asp:Label>
                <br />
                <asp:Label ID="Address" runat="server" Text='<%#: Eval("Address") %>'></asp:Label>
                <br />
                <asp:Label ID="City" runat="server" Text='<%#: Eval("City") %>'></asp:Label>
                <asp:Label ID="State" runat="server" Text='<%#: Eval("State") %>'></asp:Label>
                <asp:Label ID="PostalCode" runat="server" Text='<%#: Eval("PostalCode") %>'></asp:Label>
                <p></p>
                <h3>Order Total:</h3>
                <br />
                <asp:Label ID="Total" runat="server" Text='<%#: Eval("Total", "{0:C}") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
          </Fields>
    </asp:DetailsView>
    <p></p>
    <hr />
    <asp:Button ID="CheckoutConfirm" runat="server" Text="Complete Order" OnClick="CheckoutConfirm_Click" />
 
</asp:Content>
<asp:Content ID="Content3" ContentPlaceHolderID="MainContent" runat="server">
</asp:Content>

3. Mở trang mã tên là CheckoutReview.aspx.cs và thay thế mã hiện tại với mã sau:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using WingtipToys.Models;
 
namespace WingtipToys.Checkout
{
    public partial class CheckoutReview : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                NVPAPICaller payPalCaller = new NVPAPICaller();
 
                string retMsg = "";
                string token = "";
                string PayerID = "";
                NVPCodec decoder = new NVPCodec();
                token = Session["token"].ToString();
 
                bool ret = payPalCaller.GetCheckoutDetails(token, ref PayerID, ref decoder, ref retMsg);
                if (ret)
                {
                    Session["payerId"] = PayerID;
 
                    var myOrder = new Order();
                    myOrder.OrderDate = Convert.ToDateTime(decoder["TIMESTAMP"].ToString());
                    myOrder.Username = User.Identity.Name;
                    myOrder.FirstName = decoder["FIRSTNAME"].ToString();
                    myOrder.LastName = decoder["LASTNAME"].ToString();
                    myOrder.Address = decoder["SHIPTOSTREET"].ToString();
                    myOrder.City = decoder["SHIPTOCITY"].ToString();
                    myOrder.State = decoder["SHIPTOSTATE"].ToString();
                    myOrder.PostalCode = decoder["SHIPTOZIP"].ToString();
                    myOrder.Country = decoder["SHIPTOCOUNTRYCODE"].ToString();
                    myOrder.Email = decoder["EMAIL"].ToString();
                    myOrder.Total = Convert.ToDecimal(decoder["AMT"].ToString());
 
                    // Verify total payment amount as set on CheckoutStart.aspx.
                    try
                    {
                        decimal paymentAmountOnCheckout = Convert.ToDecimal(Session["payment_amt"].ToString());
                        decimal paymentAmoutFromPayPal = Convert.ToDecimal(decoder["AMT"].ToString());
                        if (paymentAmountOnCheckout != paymentAmoutFromPayPal)
                        {
                            Response.Redirect("CheckoutError.aspx?" + "Desc=Amount%20total%20mismatch.");
                        }
                    }
                    catch (Exception ex)
                    {
                         Response.Redirect("CheckoutError.aspx?" + "Desc=Amount%20total%20mismatch.");
                    }
 
                    // Get DB context.
                    ProductContext _db = new ProductContext();
 
                    // Add order to DB.
                    _db.Orders.Add(myOrder);
                    _db.SaveChanges();
 
                    // Get the shopping cart items.
                    WingtipToys.Logic.ShoppingCartActions usersShoppingCart = new WingtipToys.Logic.ShoppingCartActions();
                    List<CartItem> myOrderList = usersShoppingCart.GetCartItems();
 
                    // Add OrderDetail information to the DB for each product purchased.
                    for (int i = 0; i < myOrderList.Count; i++)
                    {
                        // Create a new OrderDetail object.
                        var myOrderDetail = new OrderDetail();
                        myOrderDetail.OrderId = myOrder.OrderId;
                        myOrderDetail.Username = User.Identity.Name;
                        myOrderDetail.ProductId = myOrderList[i].ProductId;
                        myOrderDetail.Quantity = myOrderList[i].Quantity;
                        myOrderDetail.UnitPrice = myOrderList[i].Product.UnitPrice;
 
                        // Add OrderDetail to DB.
                        _db.OrderDetails.Add(myOrderDetail);
                        _db.SaveChanges();
                    }
 
                    // Set OrderId.
                    Session["currentOrderId"] = myOrder.OrderId;
 
                    // Display Order information.
                    List<Order> orderList = new List<Order>();
                    orderList.Add(myOrder);
                    ShipInfo.DataSource = orderList;
                    ShipInfo.DataBind();
 
                    // Display OrderDetails.
                    OrderItemList.DataSource = myOrderList;
                    OrderItemList.DataBind();
                }
                else
                {
                    Response.Redirect("CheckoutError.aspx?" + retMsg);
                }
            }
        }
 
        protected void CheckoutConfirm_Click(object sender, EventArgs e)
        {
            Session["userCheckoutCompleted"] = "true";
            Response.Redirect("~/Checkout/CheckoutComplete.aspx");
        }
    }
}

Điều khiển DetailsView được sử dụng hiển thị chi tiết đơn hàng được trả về từ PayPal. Ngoài ra, các mã lệnh lưu chi tiết đơn hàng vào cơ sở dữ liệu của ứng dụng mẫu với đối tượng OrderDetail. Khi người dùng nhấp vào nút Complete Order, họ được chuyển hướng đến trang CheckoutComplete.aspx.

Hết phần 6

Thiet ke web mien phi,  Hoc thiet ke web

ESVN- Nơi hội tụ giải pháp



Công ty cổ phần Eastern Sun Việt Nam