【愚公系列】2022年11月 微信小程序-优购电商项目-商品支付页面

news2024/11/28 20:59:57

文章目录

  • 前言
    • 1. 商品⽀付页面设计规范
  • 一、商品支付页面
    • 1.业务逻辑
    • 2.涉及的接口数据
    • 3. 关键技术
  • 二、商品购物车页面相关代码
    • 1.页面代码
    • 2.效果


前言

1. 商品⽀付页面设计规范

第一、支付流程一定要简单。现代人的生活节奏是非常快速的,而且情绪比较浮躁。当用户在浏览网站的时候,遇到复杂的操作自然就会产生烦躁的心理,就是关闭网站。一个电商网站想要持续发展,在设计支付流程的时候,一定要简化,这样才能提升转化率,还可以提升用户体验。

第二、网站支付的时候,提供的支付方式越多,转化率越高。因此,在设计的支付页面的时候,一定要支持多种支持方式,包括第三方支付,例如微信、支付宝、网上银行等等。

第三、积极引导用户。支付页面在设计时,简单的操作可以让支付流程产生良好的交互性,视觉设计也会显得更加清晰。用户在操作的时候,一定要清晰地引导用户下一步的操作是什么?同时在遇到问题的时候,要及时帮助用户解决问题,积极响应,减轻用户的焦虑。

第四、给用户提供更多的激励。例如用户在完成支付之后,可以参与抽奖活动,提升用户体验。也可以在完成支付之后,可以领取相应金额的优惠券,从而促进用户的消费以及分享的积极性。

第五、给用户推荐相关的产品。支付成功之后显示的页面,不仅要显示订单的信息,支付信息,还可以根据用户的浏览、购买记录等等,向用户推荐相关的产品,并且引导用户点击浏览。

一、商品支付页面

1.业务逻辑

  1. 获取微信收货地址
  2. 渲染购物⻋中要结算的商品
  3. 实现⽀付
    1. 获取微信的登录信息
    2. 获取⾃⼰后台返回的⽀付相关参数
    3. 调⽤微信接⼝实现 ⽀付
    4. ⽀付成功创建订单
    5. 跳转到订单⻚⾯

在这里插入图片描述

2.涉及的接口数据

  1. 获取预⽀付参数
  2. 创建订单
  3. 更新订单状态

3. 关键技术

⼩程序⽀付api

二、商品购物车页面相关代码

1.页面代码

/**
 * promise 形式  getSetting
 */
export const getSetting=()=>{
  return new Promise((resolve,reject)=>{
    wx.getSetting({
      success: (result) => {
        resolve(result);
      },
      fail: (err) => {
        reject(err);
      }
    });
  })
}
/**
 * promise 形式  chooseAddress
 */
export const chooseAddress=()=>{
  return new Promise((resolve,reject)=>{
    wx.chooseAddress({
      success: (result) => {
        resolve(result);
      },
      fail: (err) => {
        reject(err);
      }
    });
  })
}

/**
 * promise 形式  openSetting
 */
export const openSetting=()=>{
  return new Promise((resolve,reject)=>{
    wx.openSetting({
      success: (result) => {
        resolve(result);
      },
      fail: (err) => {
        reject(err);
      }
    });
  })
}

/**
 *  promise 形式  showModal
 * @param {object} param0 参数
 */
export const showModal=({content})=>{
  return new Promise((resolve,reject)=>{
    wx.showModal({
      title: '提示',
      content: content,
      success :(res) =>{
        resolve(res);
      },
      fail:(err)=>{
        reject(err);
      }
    })
  })
}


/**
 *  promise 形式  showToast
 * @param {object} param0 参数
 */
export const showToast=({title})=>{
  return new Promise((resolve,reject)=>{
    wx.showToast({
      title: title,
      icon: 'none',
      success :(res) =>{
        resolve(res);
      },
      fail:(err)=>{
        reject(err);
      }
    })
  })
}

/**
 * promise 形式  login
 */
export const login=()=>{
  return new Promise((resolve,reject)=>{
    wx.login({
      timeout:10000,
      success: (result) => {
        resolve(result);
      },
      fail: (err) => {
        reject(err);
      }
    });
  })
}

/**
 * promise 形式的 小程序的微信支付
 * @param {object} pay 支付所必要的参数
 */
export const requestPayment=(pay)=>{
  return new Promise((resolve,reject)=>{
   wx.requestPayment({
      ...pay,
     success: (result) => {
      resolve(result)
     },
     fail: (err) => {
       reject(err);
     }
   });
     
  })
}


import { getSetting, chooseAddress, openSetting, showModal, showToast, requestPayment } from "../../utils/asyncWx.js";
import regeneratorRuntime from '../../lib/runtime/runtime';
import { request } from "../../request/index.js";
Page({
  data: {
    address: {},
    cart: [],
    totalPrice: 0,
    totalNum: 0
  },
  onShow() {
    // 1 获取缓存中的收货地址信息
    const address = wx.getStorageSync("address");
    // 1 获取缓存中的购物车数据
    let cart = wx.getStorageSync("cart") || [];
    // 过滤后的购物车数组
    cart = cart.filter(v => v.checked);
    this.setData({ address });

    // 1 总价格 总数量
    let totalPrice = 0;
    let totalNum = 0;
    cart.forEach(v => {
      totalPrice += v.num * v.goods_price;
      totalNum += v.num;
    })
    this.setData({
      cart,
      totalPrice, totalNum,
      address
    });
  },
  // 点击 支付 
  async handleOrderPay() {
    try {

      // 1 判断缓存中有没有token 
      const token = wx.getStorageSync("token");
      // 2 判断
      if (!token) {
        wx.navigateTo({
          url: '/pages/auth/index'
        });
        return;
      }
      // 3 创建订单
      // 3.1 准备 请求头参数
      // const header = { Authorization: token };
      // 3.2 准备 请求体参数
      const order_price = this.data.totalPrice;
      const consignee_addr = this.data.address.all;
      const cart = this.data.cart;
      let goods = [];
      cart.forEach(v => goods.push({
        goods_id: v.goods_id,
        goods_number: v.num,
        goods_price: v.goods_price
      }))
      const orderParams = { order_price, consignee_addr, goods };
      // 4 准备发送请求 创建订单 获取订单编号
      const { order_number } = await request({ url: "/my/orders/create", method: "POST", data: orderParams });
      // 5 发起 预支付接口
      const { pay } = await request({ url: "/my/orders/req_unifiedorder", method: "POST", data: { order_number } });
      // 6 发起微信支付 
      await requestPayment(pay);
      // 7 查询后台 订单状态
      const res = await request({ url: "/my/orders/chkOrder", method: "POST", data: { order_number } });
      await showToast({ title: "支付成功" });
      // 8 手动删除缓存中 已经支付了的商品
      let newCart=wx.getStorageSync("cart");
      newCart=newCart.filter(v=>!v.checked);
      wx.setStorageSync("cart", newCart);
        
      // 8 支付成功了 跳转到订单页面
      wx.navigateTo({
        url: '/pages/order/index'
      });
        
    } catch (error) {
      await showToast({ title: "支付失败" })
      console.log(error);
    }
  }


})
<!-- 收货地址 -->
<view class="revice_address_row">
    <view   class="user_info_row" >
      <view class="user_info">
        <view>{{address.userName}}</view>
        <view>{{address.all}}</view>
      </view>
      <view class="user_phone">{{address.telNumber}}</view>
    </view>
  </view>
  
  <!-- 购物车内容 -->
  <view class="cart_content">
    <view class="cart_title">购物车</view>
    <view class="cart_main">
          <view class="cart_item"
        wx:for="{{cart}}"
        wx:key="goods_id"
        >
            <!-- 商品图片 -->
            <navigator class="cart_img_wrap">
            <image mode="widthFix" src="{{item.goods_small_logo}}" ></image>
            </navigator>
            <!-- 商品信息 -->
            <view class="cart_info_wrap">
              <view class="goods_name">{{item.goods_name}}</view>
              <view class="goods_price_wrap">
                <view class="goods_price">{{item.goods_price}}</view>
                <view class="cart_num_tool">
                  <view class="goods_num">X {{item.num}}</view>
                </view>
              </view>
            </view>
          </view>
    </view>
  </view>
  
  <!-- 底部工具栏 -->
  <view class="footer_tool">
    <!-- 总价格 -->
    <view class="total_price_wrap">
      <view class="total_price">
        合计: <text class="total_price_text">{{totalPrice}}</text>
      </view>
      <view>包含运费</view>
    </view>
    <view class="order_pay_wrap" bindtap="handleOrderPay"  >
      支付({{totalNum}})
    </view>
  </view>
page {
  padding-bottom: 90rpx;
}
.revice_address_row .user_info_row {
  display: flex;
  padding: 20rpx;
}
.revice_address_row .user_info_row .user_info {
  flex: 5;
}
.revice_address_row .user_info_row .user_phone {
  flex: 3;
  text-align: right;
}
.cart_content .cart_title {
  padding: 20rpx;
  font-size: 36rpx;
  color: var(--themeColor);
  border-top: 1rpx solid currentColor;
  border-bottom: 1rpx solid currentColor;
}
.cart_content .cart_main .cart_item {
  display: flex;
  padding: 10rpx;
  border-bottom: 1rpx solid #ccc;
}
.cart_content .cart_main .cart_item .cart_img_wrap {
  flex: 2;
  display: flex;
  justify-content: center;
  align-items: center;
}
.cart_content .cart_main .cart_item .cart_img_wrap image {
  width: 80%;
}
.cart_content .cart_main .cart_item .cart_info_wrap {
  flex: 4;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
}
.cart_content .cart_main .cart_item .cart_info_wrap .goods_name {
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 2;
  color: #666;
}
.cart_content .cart_main .cart_item .cart_info_wrap .goods_price_wrap {
  display: flex;
  justify-content: space-between;
}
.cart_content .cart_main .cart_item .cart_info_wrap .goods_price_wrap .goods_price {
  color: var(--themeColor);
  font-size: 34rpx;
}
.cart_content .cart_main .cart_item .cart_info_wrap .goods_price_wrap .cart_num_tool {
  display: flex;
}
.cart_content .cart_main .cart_item .cart_info_wrap .goods_price_wrap .cart_num_tool .goods_num {
  width: 55rpx;
  height: 55rpx;
  display: flex;
  justify-content: center;
  align-items: center;
}
.footer_tool {
  position: fixed;
  bottom: 0;
  left: 0;
  width: 100%;
  height: 90rpx;
  background-color: #fff;
  display: flex;
  border-top: 1rpx solid #ccc;
}
.footer_tool .total_price_wrap {
  flex: 5;
  padding-right: 15rpx;
  text-align: right;
}
.footer_tool .total_price_wrap .total_price .total_price_text {
  color: var(--themeColor);
  font-size: 34rpx;
  font-weight: 600;
}
.footer_tool .order_pay_wrap {
  flex: 3;
  background-color: var(--themeColor);
  color: #fff;
  font-size: 32rpx;
  font-weight: 600;
  display: flex;
  justify-content: center;
  align-items: center;
}

2.效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解Java内存区域(最新版面试题)

1、什么是JVM&#xff1f; JVM&#xff08;Java Virtual Machine&#xff09;是用于运行Java字节码的虚拟机&#xff0c;包括一套字节码指令集、一组程序寄存器、一个虚拟机栈、一个虚拟机堆、一个方法区和一个垃圾回收器。JVM运行在操作系统之上&#xff0c;不与硬件设备直接交…

微信小程序消息订阅Java

前言 编写日期 : 2022-11-04 写这篇文章原因 公司给政府做一个订餐系统&#xff0c;需要在员工在小程序上发起订餐后经过部门领导和书记的审批后&#xff0c;再由食堂确认订餐结果。在订餐审批单在各个节点流转的过程中&#xff0c;需要给每一个节点的审批人发送微信订阅消息…

Linux企业应用——Docker(三)之史上最简单,一篇学会Docker私有仓库Harbor的搭建

文章目录一、什么是Harbor二、搭建私有仓库1.安装docker-ce2.安装软件库包3.创建认证三、在另一台已安装docker的主机上四、搭建Harbor测试docker hub虽然方便&#xff0c;但是还是有限制&#xff1a;• 需要internet连接&#xff0c;速度慢• 所有人都可以访问• 由于安全原因…

SharpShooter Reports.Web 7.5 Crack

SharpShooter Reports.Web 是真正的跨平台报告查看器&#xff0c;因为它能够向 Windows、Linux、Mac OS 甚至 iOS 和 Android 平板电脑和手机提供报告。创建的报告可以轻松集成到任何网站和网页中&#xff0c;包括 MS MVC 和 ASP.NET 应用程序。by Ω578867473报告设计方便易用…

22级第三次比赛题解

文章目录A (1). Ashy与几何(贪心几何)B (2). One eye question of hengheng(前缀和)C Fox hate oranges(模拟)D KingZhangs Similar pair (思维)E (5). 38秒你敢交我A题&#xff1f;F (6). How many numbers are thereG (7). Jump lattice (思维)H (8). CCoolGuang Conjecture(…

五十万字总结,2022最新Java面试八股汇总(含答案,收藏版)

写在前面 今年的疫情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&a…

【网安神器篇】——瑞士军刀Netcat

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

G1D5-Intriguing properties of neural networks

今天考完软考中项啦~~明天还有翻译&#xff0c;不过不想复习啦~ 读读论文啦~读网络安全文献课需要的叭 这篇2013年的intruging properties of neural networks的作者都好大佬&#xff01;&#xff01;&#xff01; 先来看看h指数是什么哈~ 一、h指数 一个人的所有论文中&…

C语言题解 | 去重数组合并数组

… &#x1f333;&#x1f332;&#x1f331;本文已收录至&#xff1a;C语言题解系列 更多知识尽在此专栏中&#xff01; 文章目录&#x1f349;前言&#x1f349;正文&#x1f34d;去重数组&#x1f34c;分析&#x1f34c;思路&#x1f34c;代码&#x1f34d;合并数组&#x1…

Allegro基本规则设置指导书之Physical规则设置

Allegro基本规则设置指导书之Physical规则设置 下面介绍规则设置指导书之Physical规则设置 点击Set-up-constraints-Constraint Manager打开规则管理器 设置Physical规则 打开时默认有个Default规则 从左往右 Line Width 最小线宽 最大线宽 Neck 最小线宽 Neck的走线长度 如…

动态内存分配:malloc、calloc、realloc(超详解析,多维度分析,小白一看就懂!!!!)

目录 一、前言 二、动态内存的简单介绍 &#x1f349;什么是动态内存分配 &#x1f34e;为什么要使用动态内存分配 三、动态内存函数的介绍和拓展 &#x1f34b;malloc()函数 &#x1f34a;free()函数 &#x1f34c;calloc()函数 &#x1f347;realloc()函数 四、…

UDP套接字编程详解

UDP 是OSI&#xff08;Open System Interconnection&#xff0c;开放式系统互联&#xff09; 参考模型中一种无连接的传输层协议。 UDP协议与TCP协议一样用于处理数据包。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点&#xff0c;也就是说&#xff0c;当报文发送之…

【状语从句练习题】综合训练

1. 改正错误 1.第二个 either 改为or 2.后面的 he plays 去掉&#xff0c;不必要的重复 3.but 去掉 4.cold 后 and 5.I went out. 加 个 I. 6.第一个 will 去掉&#xff0c;get 变为 ges 7.so 去掉 8.去掉第二个 either 9.去掉后面的 I need 10.Although/but 去掉一个 11.后…

【JavaSE】类和对象——上

文章目录1. 类的定义1.1 什么是类1.2 如何定义类2. 类的实例化3. this关键字3.1 this访问成员变量和成员方法3.2 构造方法及this()我们给类初始化的方法有&#xff1a;3.2.1 就地初始化3.2.2 使用 set 方法赋值3.2.3 使用构造方法4. 如何便捷的打印对象中属性1. 类的定义 1.1 什…

【Pytorch Lighting】第 1 章:PyTorch Lightning adventure

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

数据中心通识

文章目录一 数据中心定义特点二 机房定义内部物品物理环境三 服务器定义外型分类与PC相比的优点超线程技术固态硬盘和机械硬盘四 网络定义OSI模型局域网的拓扑结构TCP/IP协议常见端口号IP地址介绍、格式、分类、子网掩码DNS三层交换机五 存储格式化缓存RAID技术存储体系架构IP-…

二叉树的前中后序遍历(递归与迭代)

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 简介 前序遍历 递归法 迭代法 中序遍历 递归法 迭代法 后序遍历 递归法 迭代法 简介 前面学习二叉树的时候&#xff0c;已经学过…

渗透测试 | 域名信息收集

0x00 前言 信息收集可以说是在渗透测试中最重要的一部分&#xff0c;上文对 IP 信息收集做了一个简要的叙述&#xff0c;认识了 CDN 技术和网络空间搜索引擎。但是很多网站的主站因为访问流量过大的原因通常会使用 CDN 技术&#xff0c;同时也可以有效防止 DDOS 攻击。在域名信…

前端面经 强缓存与协商缓存

前端面经 强缓存与协商缓存 图片多来自第三方平台 文章目录前端面经 强缓存与协商缓存适用场合浏览器缓存的过程缓存规则强缓存&#xff08;本地缓存&#xff09;协商缓存缓存分为两种&#xff1a;强缓存和协商缓存&#xff0c;根据响应的header内容来决定 获取资源形式状态码…

【C++】二叉搜索树

前言 hi~大家好呀&#xff0c;欢迎点进我的C学习笔记~ 我的前一篇C笔记链接~ 【C】多态_柒海啦的博客-CSDN博客 本篇需要用到的基础二叉树C语言实现链接~ 用c语言实现一个简单的链表二叉树_柒海啦的博客-CSDN博客_c语言建立二叉树链表 我们知道&#xff0c;查找一个数据会有很多…