利用微信公眾號實現商品的展示和支付(1)

来源:https://www.cnblogs.com/wuhuacong/archive/2020/04/22/12751050.html
-Advertisement-
Play Games

在較早隨筆《微信小程式結合後臺數據管理實現商品數據的動態展示、維護》中介紹過使用小程式實現商品的展示,其實基於對應的介面,我們使用H5頁面來開發基於公眾號的商品展示和支付,也是產不多的原理,不過H5頁面和小程式的界面處理代碼有一些差異吧了,整體的實現思路倒是差不多的。本篇隨筆介紹基於H5頁面的開發,... ...


在較早隨筆《微信小程式結合後臺數據管理實現商品數據的動態展示、維護》中介紹過使用小程式實現商品的展示,其實基於對應的介面,我們使用H5頁面來開發基於公眾號的商品展示和支付,也是產不多的原理,不過H5頁面和小程式的界面處理代碼有一些差異吧了,整體的實現思路倒是差不多的。本篇隨筆介紹基於H5頁面的開發,參照一些微店的展示頁面,實現商品的展示和支付等操作。

1、商品的列表展示

和小程式一樣的處理,我們首先需要利用微信開發框架的後臺,對商品數據進行統一的錄入和管理。並提供對應的介面讓我們獲取數據,就可以在前端獲取進行展示了。我們可以都是基於一個Web API進行數據的處理操作,不管是小程式,還是公眾號的H5頁面,或者其他Web展示平臺,我們都可以以一個統一的Web API介面來處理。

我們先來回顧瞭解下整體性的功能展示(小程式版本)。

以上界面效果是之前使用小程式開發的,我們這次利用公眾號H5頁面做,也希望做成類似的佈局和界面,可以稍作調整。

我們後臺對商品數據進行維護,以便能夠在實際應用中通過API來獲取對應的商品數據。

商品編輯界麵包括對基礎信息的修改、封面和Banner圖片的維護、以及商品多個展示圖片、商品詳細介紹的內容維護,如下界面所示。

以上包括商品基礎信息,輪播的展示圖片,以及明細內容的維護,這些數據我們最終會通過JSON方式返回前端使用。

下圖是小程式的商品展示首圖,其中包括了頂部Banner欄目、中間的商品分類、底部的商品信息展示幾部分。

 

我們使用公眾號H5的開發場景的時候,也希望大概做成類似的頁面展示效果。

我們公眾號處理一般使用一個對應的控制器來處理對應的頁面視圖或者數據介面,例如我這裡使用H5Controller頁面控制器。

我們先來定義一些常用到的視圖入口頁面。

    /// <summary>
    /// H5頁面的處理操作控制(產品信息部分)
    /// </summary>
    public partial class H5Controller
    {
        /// <summary>
        /// 產品列表頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult ProductList()
        {
            return View("ProductList");
        }

        /// <summary>
        /// 產品詳細頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult ProductDetail()
        {
            //JSSDK參數
            RefreshTicket();
            return View("ProductDetail");
        }

        /// <summary>
        /// 購物車頁面
        /// </summary>
        /// <returns></returns>
        public ActionResult ShopCart()
        {
            //JSSDK參數
            RefreshTicket();
            return View("Shopcart");
        }

從上面的視圖控制器代碼,我們定義了ProductList.cshtml視圖用來展示商品列表大類和商品列表的。

商品列表最終的界面效果如下所示。

頂部的圖片輪播,我們也是根據產品的屬性來獲取推薦產品的列表,然後展示對應的圖片。

頂部輪播部分的頁面代碼如下所示

@{
    Layout = null;
}

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
    <title>產品列表</title>
    <link rel="stylesheet" href="~/Content/wechat/web/lib/weui.min.css">
    <link rel="stylesheet" href="~/Content/wechat/web/css/jquery-weui.css">
    <link rel="stylesheet" href="~/Content/wechat/web/css/style.css" />
</head>
<body ontouchstart>
    <div class='weui-content'>
        <!--頂部輪播-->
        <div class="swiper-container swiper-banner">
            <div class="swiper-wrapper" id="slide">
                @*<div class="swiper-slide"><a href="pro_info.html"><img src="~/Content/wechat/web/upload/ban1.jpg" /></a></div>
                <div class="swiper-slide"><a href="pro_list.html"><img src="~/Content/wechat/web/upload/ban2.jpg" /></a></div>*@
            </div>
            <div class="swiper-pagination"></div>
        </div>

其中高亮部分,就是我們需要動態構建的輪播圖片代碼,這裡使用了註釋,方便參考生成而已。

我們來看看輪播圖片的非同步載入代碼。

//綁定Banner圖片輪換
function BindBanners() {
    var url = "/H5/GetProductList";
    var data = {
        status: 1, //推薦
        pageindex: 1,
        pagesize: 10
    }
    //獲取數據並綁定界面
    $.getJSON(url, data, function (result) {
        $("#slide").html("");
        var html = "";
        $.each(result.list, function (i, item) {
            html += `<div class="swiper-slide"><a href="/h5/ProductDetail?id=${item.ID}"><img src="${item.Banner}" style="width:100%;height:auto" /></a></div>`;
        });
        $("#slide").html(html);

        //設置迴圈時間
        $(".swiper-banner").swiper({
            loop: true,
            autoplay: 3000
        });
    });
}

可以看到,主要就是構建一個getJSON的請求處理,然後返回產品的JSON數據,對數據遍歷進行生成HTML,然後給界面的元素賦值即可,後面大多數處理都是如此的做法。

由於是輪播處理,我們需要對對應的控制項進行初始化,如下就是輪播的JS初始化設置。

//設置迴圈時間
$(".swiper-banner").swiper({
    loop: true,
    autoplay: 3000
});

對於產品列表,我們的頁面視圖代碼如下所示。

<div class="weui-tab">
    <div class="weui-navbar" style="left:0; right:0; height:44px; background:#fff;">
        <a class="weui-navbar__item proinfo-tab-tit font-14 weui-bar__item--on" href="#tab1">全部</a>
        <a class="weui-navbar__item proinfo-tab-tit font-14" href="#tab2">框架產品</a>
        <a class="weui-navbar__item proinfo-tab-tit font-14" href="#tab3">軟體產品</a>
        <a class="weui-navbar__item proinfo-tab-tit font-14" href="#tab4">開發組件</a>
    </div>
    <div class="weui-tab__bd proinfo-tab-con">
        <div id="tab1" class="weui-tab__bd-item weui-tab__bd-item--active">
            <div class="wy-Module">
                <div class="wy-Module-tit-line"></div>
                <div class="wy-Module-con">
                    <ul class="wy-pro-list clear">
                        @*<li>
                            <a href="pro_info.html">
                                <div class="proimg"><img src="~/Content/wechat/web/upload/pro1.jpg"></div>
                                <div class="protxt">
                                    <div class="name">洋河藍色瓶裝經典Q7濃香型白酒500ml52度高端純糧食白酒2瓶裝包郵</div>
                                    <div class="wy-pro-pri">¥<span>296.00</span></div>
                                </div>
                            </a>
                        </li>*@
                    </ul>
                </div>
            </div>
        </div>
        ......................
    </div>
</div>

上面我們主要就是根據產品的類別構建幾個Tab選項卡,然後在其中的內容區域,動態獲取數據,組裝層類似加亮代碼部分的產品信息列表即可。

 由於幾個不同的Tab處理都需要進行分頁獲取 ,我們初始化一個DIV來做下拉頁面進行分頁數據展示區域,如下所示。

<div class="weui-loadmore">
    <i class="weui-loading"></i>
    <span class="weui-loadmore__tips">正在載入</span>
</div>

我們來看看獲取產品列表的JS載入處理操作代碼,可以看到我們依舊利用非同步獲取數據並綁定視圖控制項的方式。

        //綁定產品列表
        function BindProducts(pageindex) {
            if (categoryId == 0) {
                categoryId = "";
            }
            currentPage = pageindex;//設置當前的頁嗎

            //構建分頁獲取數據的請求信息
            var url = "/H5/GetProductList";
            var data = {
                type: categoryId,
                status: '', //所有狀態
                pageindex: pageindex,
                pagesize: rows
            };
            //首頁載入時候,清空信息處理
            if (pageindex == 1) {
                $(`${tabid} .wy-pro-list`).html("");
                $(".weui-loadmore").show();
            }

            //獲取數據並綁定界面
            $.getJSON(url, data, function (result) {
                //$(`${tabid} .wy-pro-list`).html("");
                var html = "";
                $.each(result.list, function (i, item) {
                    html += `
                        <li>
                            <a href="/h5/ProductDetail?id=${item.ID}">
                                <div class="proimg"><img src="${item.Picture}"></div>
                                <div class="protxt">
                                    <div class="name">${item.ProductName}</div>
                                    <div class="wy-pro-pri">¥<span>${item.Price}</span></div>
                                </div>
                            </a>
                        </li>`;
                });
                $(`${tabid} .wy-pro-list`).append(html);

                //如果沒有多餘的數據,則隱藏“正在載入..”的提示
                if (result.list.length == 0) {
                    $(".weui-loadmore").hide();
                } else {
                    currentPage += 1;
                }
            });
        }

        //實現下拉分頁刷新數據
        var loading = false;
        $(document.body).infinite().on("infinite", function () {
            if (loading) return;
            loading = true;
            setTimeout(function () {
                BindProducts(currentPage);
                loading = false;
            }, 2000);
        });

由於我使用了不同的Tab頁面來承載不同的商品數據,那麼我們單擊不同的Tab的時候,需要處理不同的分類,如下代碼所示。

$(function () {
    FastClick.attach(document.body);

    BindBanners();
    BindProducts(currentPage, "#tab1");

    $('.weui-navbar__item').on('click', function () {
        tabid = jQuery(this).attr("href");
        LoadTabData();
    });
});

//觸發載入選項頁面數據
function LoadTabData() {
    if (tabid == "#tab1") {
        categoryId = "0";
        BindProducts(1);
    } else if (tabid == "#tab2") {
        categoryId = "1";
        BindProducts(1);
    } else if (tabid == "#tab3") {
        categoryId = "2";
        BindProducts(1);
    } else if (tabid == "#tab4") {
        categoryId = "3";
        BindProducts(1);
    }
}

商品列表最終的界面效果如下所示。

2、商品的明細處理

前面介紹了商品的分類列表展示處理操作,商品的明細處理就是我們在單擊某個商品的時候,進一步展示其圖片和介紹內容,方便客戶進行瞭解或者購買操作。

商品詳細頁面會帶入一個id參數,然後頁面根據對應的ID,載入詳細的商品信息。

  頁麵包括基礎的介紹,和商品的詳細HTML介紹內容,這些一樣是可以在後臺頁面進行動態維護的。

 

  頁面內容的處理,主要就是獲取JSON載入產品明細的數據進行展示。

<script>
    $(function () {
        FastClick.attach(document.body);

        //頭部返回按鈕,返回主頁
        $(".wy-header-icon-back").click(function () {
            location.href = "/h5/ProductList";
        });

        GetProductDetail();
        refreshShopCartNumber();
    });

    //綁定產品明細
    function GetProductDetail() {
        var url = "/H5/GetProductDetail";
        var data = {
            id: "@Request["ID"]"
        }
        //獲取數據並綁定界面
        $.getJSON(url, data, function (result) {

            $("#slide").html("");
            var html = "";
            if (result.pics && result.pics.length > 0) {
                $.each(result.pics, function (i, item) {
                    html += `<div class="swiper-slide"><a href="javascript:;"><img src="${item.pic}" style="width:100%;height:auto" /></a></div>`;
                });
                $("#slide").html(html);
            }

            //設置迴圈時間
            $(".swiper-zhutu").swiper({
                loop: true,
                paginationType: 'fraction',
                autoplay: 5000
            });

            $(".wy-media-box__title").text(result.ProductName);
            $("#description").text(result.Description);
            $("#price").text(result.Price);
            $("#picture").val(result.Picture);

            //產品詳情
            $(".pro-detail").html(result.Note);
        });
    }
</script>

對於頁面裡面,還有購物車的處理和展示,以及購買支付的處理,我們留到下一個隨筆進行細講。

購物車列表

 

購買選擇和確認

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 如題,納悶為什麼有空白子項並且Clear也沒用,所以搜了下,傳送門https://www.cnblogs.com/gc2013/p/4103910.html 使用的是ListView的Details視圖,提一下。 由於博主分析了很多我沒細看,因為我只是想解決這個簡單的問題,類似於直接把第一項給移除掉 ...
  • 在前面隨筆《利用微信公眾號實現商品的展示和支付(1)》介紹了商品的列表和明細信息的處理,本篇隨筆接著上一篇,繼續介紹關於商品的微信支付和購物車處理方面,其中微信支付裡面,也涉及到了獲取微信共用地址的處理,從而個更加方便錄入郵寄地址信息;購物車可以從本地的localStorage對象進行獲取和處理,也... ...
  • 實現一個基於動態代理的 AOP Intro 上次看基於動態代理的 AOP 框架實現,立了一個 Flag, 自己寫一個簡單的 AOP 實現示例,今天過來填坑了 目前的實現是基於 Emit 來做的,後面有時間再寫一個基於 Roslyn 來實現的示例 效果演示 演示代碼: 切麵邏輯定義: 測試服務定義 測 ...
  • 後端:asp.net core web api + EF Core 前端:VUE + Element-UI+ Node環境的後臺管理系統 資料庫:SQL Server2017 伺服器:阿裡雲伺服器 線上地址:http://www.wangjk.wang 賬號:admin 密碼:123 API文檔地址 ...
  • 數組類型 在 C 中,數組實際上是對象,數組是一種數據結構,它包含若幹相同類型的變數。 數組概述 數組具有以下屬性: 數組可以是 "一維" 、 "多維" 或 "交錯" 的。 數值數組元素的預設值設置為零,而引用元素的預設值設置為 null。 交錯數組是數組的數組,因此其元素是引用類型並初始化為 nu ...
  • 劍指Offer題目,求數值的整數次方,題目描述,給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。保證base和exponent不同時為0。包括遞歸,整數的快速冪等多種解法 ...
  • 場景 有時會遇到使用枚舉類型的時候。 比如傳遞過來一個int的list,要根據這個list將對應的chekbox選中。 首先新建一個類KillComponents public enum KillComponents { /// <summary> /// 上霧化器 /// </summary> S ...
  • 昨天有朋友在公眾號發消息說看不懂await,async執行流,其實看不懂太正常了,因為你沒經過社會的毒打,沒吃過牢飯就不知道自由有多重要,沒生過病就不知道健康有多重要,沒用過ContinueWith就不知道await,async有多重要,下麵我舉兩個案例佐證一下? 一:案例一 【嵌套下的非同步】 寫了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...