Darie-Watson_4681Front.fm Page i Thursday, September 22, 2005 5:26 AM Beginning ASP.NET 2.0 E-Commerce in C# 2005 From Novice to Professional ■ ■ ■ Cristian Darie and Karli Watson Darie-Watson_4681Front.fm Page ii Thursday, September 22, 2005 5:26 AM Beginning ASP.NET 2.0 E-Commerce in C# 2005: From Novice to Professional Copyright © 2006 by Cristian Darie and Karli Watson All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording, or by any information storage or retrieval system, without the prior written permission of the copyright owner and the publisher. ISBN (pbk): 1-59059-468-1 Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1 Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark owner, with no intention of infringement of the trademark. Lead Editor: Ewan Buckingham Technical Reviewer: Paul Sarknas Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore, Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser Project Manager: Kylie Johnston Copy Edit Manager: Nicole LeClerc Copy Editor: Julie McNamee Assistant Production Director: Kari Brooks-Copony Production Editor: Linda Marousek Compositor: Susan Glinert Stevens Proofreader: Nancy Sixsmith Indexer: Broccoli Information Management Artist: Kinetic Publishing Services, LLC Cover Designer: Kurt Krames Manufacturing Director: Tom Debolski Distributed to the book trade worldwide by Springer-Verlag New York, Inc., 233 Spring Street, 6th Floor, New York, NY 10013. Phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or visit http://www.springeronline.com. For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA 94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com. The information in this book is distributed on an “as is” basis, without warranty. Although every precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly or indirectly by the information contained in this work. The source code for this book is available to readers at http://www.apress.com in the Source Code section. Darie-Watson_4681Front.fm Page iii Thursday, September 22, 2005 5:26 AM Contents at a Glance About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xiii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii ■ CHAPTER 1 Starting an E-Commerce Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 ■ CHAPTER 2 Laying Out the Foundations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 ■ CHAPTER 3 Creating the Product Catalog: Part I . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 ■ CHAPTER 4 Creating the Product Catalog: Part II . . . . . . . . . . . . . . . . . . . . . . . . . 105 ■ CHAPTER 5 Searching the Catalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 ■ CHAPTER 6 Improving Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 ■ CHAPTER 7 Receiving Payments Using PayPal . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 ■ CHAPTER 8 Catalog Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 ■ CHAPTER 9 Creating a Custom Shopping Cart . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311 ■ CHAPTER 10 Dealing with Customer Orders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353 ■ CHAPTER 11 Making Product Recommendations . . . . . . . . . . . . . . . . . . . . . . . . . . 401 ■ CHAPTER 12 Adding Customer Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 ■ CHAPTER 13 Advanced Customer Orders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 ■ CHAPTER 14 Order Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517 ■ CHAPTER 15 Implementing the Pipeline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 ■ CHAPTER 16 Credit Card Transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 ■ CHAPTER 17 Integrating Amazon Web Services . . . . . . . . . . . . . . . . . . . . . . . . . . . 625 ■ APPENDIX A Installing the Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643 ■ APPENDIX B Project Management Considerations . . . . . . . . . . . . . . . . . . . . . . . . 651 ■ INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 661 iii Darie-Watson_4681Front.fm Page iv Thursday, September 22, 2005 5:26 AM Darie-Watson_4681Front.fm Page v Thursday, September 22, 2005 5:26 AM CCoonntteennttss About the Authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xiii About the Technical Reviewer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xv Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii ■ CHAPTER 1 Starting an E-Commerce Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Deciding Whether to Go Online . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Getting More Customers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Making Customers Spend More . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Reducing the Costs of Fulfilling Orders . . . . . . . . . . . . . . . . . . . . . . . . 3 Making Money . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Considering the Risks and Threats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Designing for Business . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Phase I: Getting a Site Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Phase II: Creating Your Own Shopping Cart. . . . . . . . . . . . . . . . . . . . . 6 Phase III: Processing Orders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 The Balloon Shop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 ■ CHAPTER 2 Laying Out the Foundations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Designing for Growth . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Meeting Long-Term Requirements with Minimal Effort. . . . . . . . . . 12 The Magic of the Three-Tier Architecture . . . . . . . . . . . . . . . . . . . . . . . . . 13 Choosing Technologies and Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 Using ASP.NET 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 Using C# and VB .NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Using Visual Studio 2005 and Visual Web Developer 2005 Express Edition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Using SQL Server 2005 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Following Coding Standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Creating the Visual Web Developer Project . . . . . . . . . . . . . . . . . . . . . . . . 27 v Darie-Watson_4681Front.fm Page vi Thursday, September 22, 2005 5:26 AM vi ■ CONTENTS Implementing the Site Skeleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 Building the First Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Adding the Header to the Main Page . . . . . . . . . . . . . . . . . . . . . . . . . 38 Creating the SQL Server Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Downloading the Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 ■ CHAPTER 3 Creating the Product Catalog: Part I . . . . . . . . . . . . . . . . . . . . . 45 Showing Your Visitor What You’ve Got . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 What Does a Product Catalog Look Like? . . . . . . . . . . . . . . . . . . . . . 46 Previewing the Product Catalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Roadmap for This Chapter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Storing Catalog Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Understanding Data Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Creating the Department Table. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Communicating with the Database . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Speaking the Database Language . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Creating Stored Procedures. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 Adding Logic to the Site . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Connecting to SQL Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Issuing Commands and Executing Stored Procedures. . . . . . . . . . . 74 Implementing Generic Data Access Code . . . . . . . . . . . . . . . . . . . . . 76 Catching and Handling Exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Sending Emails. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Writing the Business Tier Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Displaying the List of Departments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 Preparing the Field: Themes, Skins, and Styles . . . . . . . . . . . . . . . . 90 Displaying the Departments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Adding a Custom Error Page . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 ■ CHAPTER 4 Creating the Product Catalog: Part II . . . . . . . . . . . . . . . . . . . . 105 Storing the New Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 What Makes a Relational Database . . . . . . . . . . . . . . . . . . . . . . . . . 106 Enforcing Table Relationships with the FOREIGN KEY Constraint. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 Adding Categories. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Adding Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Darie-Watson_4681Front.fm Page vii Thursday, September 22, 2005 5:26 AM ■ CONTENTS vii Querying the New Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Retrieving Short Product Descriptions . . . . . . . . . . . . . . . . . . . . . . . 122 Joining Data Tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Showing Products Page by Page . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 Writing the New Stored Procedures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Using ADO.NET with Parameterized Stored Procedures . . . . . . . . . . . . 135 Using Input Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Using Output Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Stored Procedure Parameters Are Not Strongly Typed. . . . . . . . . . 136 Getting the Results Back from Output Parameters. . . . . . . . . . . . . 136 Completing the Business Tier Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Implementing the Presentation Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Displaying the List of Categories. . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Displaying Department and Category Details . . . . . . . . . . . . . . . . . 153 Displaying Product Lists. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Displaying Product Details. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 ■ CHAPTER 5 Searching the Catalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Choosing How to Search the Catalog . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Teaching the Database to Search Itself . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Implementing a Custom Search Engine. . . . . . . . . . . . . . . . . . . . . . 171 Introducing the SearchCatalog Stored Procedure. . . . . . . . . . . . . . 175 Implementing Paging. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Writing the Code. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Implementing the Business Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Implementing the Presentation Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Creating the Search Box . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Displaying the Search Results. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Searching Smarter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 ■ CHAPTER 6 Improving Performance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Handling Postback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Managing ViewState . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Using Output Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 8213592a117456a340854d18cee57603 Darie-Watson_4681Front.fm Page viii Thursday, September 22, 2005 5:26 AM viii ■ CONTENTS ■ CHAPTER 7 Receiving Payments Using PayPal . . . . . . . . . . . . . . . . . . . . . . 209 Considering Internet Payment Service Providers . . . . . . . . . . . . . . . . . . 210 Getting Started with PayPal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211 Integrating the PayPal Shopping Cart and Checkout . . . . . . . . . . . . . . . 212 Using the PayPal Single Item Purchases Feature . . . . . . . . . . . . . . . . . . 218 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 ■ CHAPTER 8 Catalog Administration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 Preparing to Create the Catalog Administration Page . . . . . . . . . . . . . . 221 Authenticating Administrators . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227 ASP.NET 2.0 and Using Declarative Security . . . . . . . . . . . . . . . . . 229 Implementing Security. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 230 Administering Departments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 Stored Procedures for Departments Administration. . . . . . . . . . . . 244 Middle-Tier Methods for Departments Administration. . . . . . . . . . 244 The DepartmentsAdmin User Control. . . . . . . . . . . . . . . . . . . . . . . . 249 Customizing the GridView with Template Columns . . . . . . . . . . . . 263 Administering Categories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Stored Procedures for Categories Administration. . . . . . . . . . . . . . 266 Middle-Tier Methods for Categories Administration. . . . . . . . . . . . 267 The CategoriesAdmin Web User Control . . . . . . . . . . . . . . . . . . . . . 270 Administering Products . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 Stored Procedures for Products Administration . . . . . . . . . . . . . . . 278 Middle-Tier Methods for Products Administration . . . . . . . . . . . . . 280 The ProductsAdmin Web User Control. . . . . . . . . . . . . . . . . . . . . . . 284 Administering Product Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Stored Procedures for Product Details Admin. . . . . . . . . . . . . . . . . 295 Middle-Tier Methods for Product Details Admin. . . . . . . . . . . . . . . 298 The ProductDetailsAdmin Web User Control . . . . . . . . . . . . . . . . . . 302 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309 ■ CHAPTER 9 Creating a Custom Shopping Cart . . . . . . . . . . . . . . . . . . . . . . . 311 Designing the Shopping Cart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Storing Shopping Cart Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 Implementing the Data Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317 Implementing the Business Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 Generating Shopping Cart IDs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 What If the Visitor Doesn’t Like Cookies? . . . . . . . . . . . . . . . . . . . . 325 Implementing the Shopping Cart Access Functionality . . . . . . . . . 325 Darie-Watson_4681Front.fm Page ix Thursday, September 22, 2005 5:26 AM ■ CONTENTS ix Implementing the Presentation Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Creating the Add to Cart Buttons . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 Showing the Shopping Cart Summary. . . . . . . . . . . . . . . . . . . . . . . 331 Displaying the Shopping Cart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 Editing Product Quantities. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Adding “Continue Shopping” Functionality . . . . . . . . . . . . . . . . . . . 343 Administering the Shopping Cart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Deleting Products that Exist in Shopping Carts. . . . . . . . . . . . . . . . 346 Removing Old Shopping Carts. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 ■ CHAPTER 10 Dealing with Customer Orders . . . . . . . . . . . . . . . . . . . . . . . . . . 353 Implementing an Order-Placing System . . . . . . . . . . . . . . . . . . . . . . . . . 353 Storing Orders in the Database. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 Updating the Business Layer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 Adding the Checkout Button . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Administering Orders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 Creating the OrdersAdmin Web Form. . . . . . . . . . . . . . . . . . . . . . . . 365 Displaying Existing Orders. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367 Administering Order Details. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399 ■ CHAPTER 11 Making Product Recommendations . . . . . . . . . . . . . . . . . . . . . 401 Increasing Sales with Dynamic Recommendations . . . . . . . . . . . . . . . . 402 Implementing the Data Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 403 Adding Product Recommendations. . . . . . . . . . . . . . . . . . . . . . . . . . 407 Adding Shopping Cart Recommendations. . . . . . . . . . . . . . . . . . . . 409 Implementing the Business Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410 Implementing the Presentation Tier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 412 Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 ■ CHAPTER 12 Adding Customer Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 Handling Customer Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 Creating a BalloonShop Customer Account Scheme . . . . . . . . . . . . . . . 418 The SecurityLib Classes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 Customer Logins. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448 Customer Details . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 The Checkout Page. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 474