微擎模块开发-微擎小程序商城商品订单功能详解(后端篇)

下单页面功能设计思路

  1. 获取用户联系方式及收货地址;
  2. 获取订单商品的详细信息;
  3. 点击去付款,跳转至微信支付页面;
  4. 支付成功后,删除购物车商品信息,跳转至全部订单界面。
新建订单表
CREATE TABLE `shancloudy`.`ims_shangcheng_xk_order` ( 
	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
	`out_trade_no` VARCHAR(18) NOT NULL COMMENT '交易订单号' , 
	`total_price` DECIMAL(10,2) NOT NULL DEFAULT '0' COMMENT '总价格' , 
	`member_id` MEDIUMINT NOT NULL COMMENT '会员id' , 
	`member_name` VARCHAR(60) NOT NULL COMMENT '会员姓名' , 
	`member_tel` VARCHAR(11) NOT NULL COMMENT '会员手机号' , 
	`member_address` VARCHAR(255) NOT NULL COMMENT '详细收货地址' , 
	`create_time` VARCHAR(10) NOT NULL COMMENT '生成订单时间' , 
	`order_status` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '0:未支付,1:代发货,2待收货,3待评价,4待退款' , 
PRIMARY KEY (`id`)) ENGINE = InnoDB;

在这里插入图片描述

新建订单商品表
CREATE TABLE `shancloudy`.`ims_shangcheng_xk_order_goods` ( 
	`id` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
	`order_id` MEDIUMINT NOT NULL COMMENT '订单id' , 
	`goods_id` MEDIUMINT NOT NULL COMMENT '商品id' , 
PRIMARY KEY (`id`)) ENGINE = InnoDB;

在这里插入图片描述

生成订单ordering.wxml
<!--shangcheng_xk/pages/order/ordering/ordering.wxml-->
<view class="container">
<scroll-view scroll-y="true" style="height: {{screenHeight}}px;" >
	<view class="address">
		<image src="http://www.shancloudy.com/attachment/images/2/2020/07/a1ADVtSUTDKsSq0N4T1aaDuX44QQ4F.png" mode="widthFix"></image>
		<view class="address-info" wx:if="{{ username || telnumber || address}}">
			<text>{{ username }}-{{ telnumber }}</text>
			<text>{{address}}</text>
		</view>
		<view class="address-info" wx:else>
			<text>请选择收货地址...</text>
		</view>
	</view>
	<view class="goods-list">
		<view class="goods-item" wx:if="{{ orderGoods }}" wx:for="{{ orderGoods }}" wx:key="id">
			<view class="goods-thumb">
				<image src="{{ item.image }}" mode="widthFix"></image>
			</view>
			<view class="goods-info">
				<view class="goods-title">
					<text>{{ item.goods_name }}</text>
					<text>{{ item.goods_desc}}</text>
				</view>
				<view class="g-p-info">
					<view class="goods-price">
						<text>{{ item.now_price }}</text>
						<text>{{ item.original_price }}</text>
					</view>
					<view class="goods-num">
						<!-- <text>x1</text> -->
					</view>
				</view>
			</view>
		</view>
		<view class="goods-item" wx:if="{{ nowBuyGoods }}">
			<view class="goods-thumb">
				<image src="{{nowBuyGoods.image[0] }}" mode="widthFix"></image>
			</view>
			<view class="goods-info">
				<view class="goods-title">
					<text>{{ nowBuyGoods.goods_name }}</text>
					<text>{{ nowBuyGoods.goods_desc}}</text>
				</view>
				<view class="g-p-info">
					<view class="goods-price">
						<text>{{ nowBuyGoods.now_price }}</text>
						<text>{{ nowBuyGoods.original_price }}</text>
					</view>
					<view class="goods-num">
						<!-- <text>x1</text> -->
					</view>
				</view>
			</view>
		</view>
	</view>
	<view class="other">
		<view class="other-menu">
			<image class="other-thumb" src="http://www.shancloudy.com/attachment/images/2/2020/07/Pg59rV5Sksb79rox77v56Kb3okv7b5.png" mode="widthFix"></image>
			<view class="other-name">
				<text>配送费</text>
				<text>></text>
			</view>
		</view>
		<view class="other-menu">
			<image class="other-thumb" src="http://www.shancloudy.com/attachment/images/2/2020/07/RwJ888q8JpxhH8Q0p8xt8jPRZq8Nx8.png" mode="widthFix"></image>
			<view class="other-name">
				<text>留言</text>
				<text>></text>
			</view>
		</view>
		<view class="other-menu">
			<image class="other-thumb" src="http://www.shancloudy.com/attachment/images/2/2020/07/HY5APtjfnyJwOf1VtVTKk1ipn177Kb.png" mode="widthFix"></image>
			<view class="other-name">
				<text>优惠券</text>
				<text>></text>
			</view>
		</view>
	</view>
	<view class="pay-type">
		<view class="pay-title">支付方式</view>
		<view class="wxpay">
			<icon type="success" size="16"></icon>
			<text>微信支付</text>
		</view>
	</view>
</scroll-view>
	<view class="pay">
		<view class="total">
			<text>合计:</text>
			<text>{{ orderPrice }}</text>
		</view>
		<view class="payment" bindtap="goPay">
			<text>去付款</text>
		</view>
	</view>
</view>
生成订单ordering.js
// shangcheng_xk/pages/order/ordering/ordering.js
var app = getApp()
Page({

	/**
	 * 页面的初始数据
	 */
	data: {
		screenHeight: '',
		username: '',
		telnumber: '',
		address: '',
		orderPrice: '',
		orderGoods: '',
		nowBuyGoods: ''
	},

	/**
	 * 生命周期函数--监听页面加载
	 */
	onLoad: function (options) {
		var that = this
		wx.getSystemInfo({
			success: function (res) {
				var screenHeight = res.windowHeight - 50
				that.setData({
					screenHeight: screenHeight
				})
			},
		})
		this.getOrderInfo()
		this.getMemberAddress()
	},

	// 获取用户收货地址
	getMemberAddress: function () {
		var that = this
		var member = wx.getStorageSync('member')
		var memberId = member.id
		app.util.request({
			url: 'entry/wxapp/getMemberAddress',
			data: {
				m: 'shangcheng_xk',
				member_id: memberId
			},
			success(res) {
				that.setData({
					username: res.data.data.username,
					telnumber: res.data.data.telnumber,
					address: res.data.data.address
				})
			}
		});
	},

	// 获取订单商品信息
	getOrderInfo: function (orderPrice, goodsId) {
		var that = this
		var orderPrice = wx.getStorageSync('orderPrice')
		var orderGoods = wx.getStorageSync('orderGoods')
		var goodsInfo = wx.getStorageSync('goodsInfo')
		if (orderPrice && orderGoods) {
			that.setData({
				orderPrice: orderPrice,
				orderGoods: orderGoods
			})
		} else {
			that.setData({
				orderPrice: goodsInfo.now_price,
				nowBuyGoods: goodsInfo
			})
		}
	},

	// 去付款
	goPay: function () {
		var that = this
		var member = wx.getStorageSync('member')
		var memberId = member.id
		var goodsInfo = wx.getStorageSync('goodsInfo')
		var orderGoods = wx.getStorageSync('orderGoods')
		var orderPrice = wx.getStorageSync('orderPrice')
		if (goodsInfo) {
			app.util.request({
				url: 'entry/wxapp/getGoodsOrder',
				data: {
					m: 'shangcheng_xk',
					member_id: memberId,
					goods_id: goodsInfo.id,
					goods_price: goodsInfo.now_price
				},
				success(res) {
					if (res.data.data.status == 200) {
						wx.removeStorageSync('goodsInfo')
						var outTradeNo = res.data.data.out_trade_no
						var orderPrice = res.data.data.order_price
						var orderId = res.data.data.order_id
						var orderType = 'goodsType'
						that.weixinpay(outTradeNo, orderPrice, orderId, orderType)
					}
				}
			})
		} else if (orderPrice && orderGoods) {
			var orderGoodsId = []
			for (var i = 0; i < orderGoods.length; i++) {
				orderGoodsId[i] = orderGoods[i]['id']
			}
			var goodsIds = orderGoodsId.join('-')
			app.util.request({
				url: 'entry/wxapp/getCartOrder',
				data: {
					m: 'shangcheng_xk',
					member_id: memberId,
					goods_ids: goodsIds,
					order_price: orderPrice
				},
				success(res) {
					if (res.data.data.status == 200) {
						wx.removeStorageSync('orderPrice')
						wx.removeStorageSync('orderGoods')
						var outTradeNo = res.data.data.out_trade_no
						var orderPrice = res.data.data.order_price
						var orderId = res.data.data.order_id
						var orderType = 'cartType'
						that.weixinpay(outTradeNo, orderPrice, orderId, orderType)
					}
				}
			})
		}

	},

	// 微信支付
	weixinpay: function (outTradeNo, orderPrice, orderId, orderType) {
		var that = this
		app.util.request({
			'url': 'entry/wxapp/pay', //调用wxapp.php中的doPagePay方法获取支付参数
			data: {
				outTradeNo: outTradeNo,
				orderPrice: orderPrice
			},
			'cachetime': '0',
			success(res) {
				if (res.data && res.data.data && !res.data.errno) {
					//发起支付
					wx.requestPayment({
						'timeStamp': res.data.data.timeStamp,
						'nonceStr': res.data.data.nonceStr,
						'package': res.data.data.package,
						'signType': 'MD5',
						'paySign': res.data.data.paySign,
						'success': function (res) {
							// 从购物车生成的订单,并成功交易后,需要删除购物车中的商品
							if (orderType == 'cartType') {
								var member = wx.getStorageSync('member')
								var memberId = member.id
								app.util.request({
									url: 'entry/wxapp/delCartGoods',
									data: {
										m: 'shangcheng_xk',
										memberId:memberId
									},
									success(res) {
										that.setData({

										})
									}
								})
							}
							//订单支付成功,修改订单状态至代发货
							app.util.request({
								url: 'entry/wxapp/modifyOrderStatus',
								data: {
									m: 'shangcheng_xk',
									orderId: orderId
								},
								success(res) {
									that.setData({

									})
								}
							})
							wx.showToast({
								title: '支付成功',
								icon: 'success',
								duration: 2000
							})
							setTimeout(function () {
								wx.navigateTo({
									url: '/shangcheng_xk/pages/order/myorder/myorder',
								})
							}, 2000)
						},
						'fail': function (res) {
							console.log('支付失败')
						}
					})
				}
			},
			fail(res) {
				wx.showModal({
					title: '系统提示',
					content: res.data.message ? res.data.message : '错误',
					showCancel: false,
					success: function (res) {
						if (res.confirm) {
							backApp()
						}
					}
				})
			}
		})
	},
	/**
	 * 生命周期函数--监听页面初次渲染完成
	 */
	onReady: function () {

	},

	/**
	 * 生命周期函数--监听页面显示
	 */
	onShow: function () {

	},

	/**
	 * 生命周期函数--监听页面隐藏
	 */
	onHide: function () {

	},

	/**
	 * 生命周期函数--监听页面卸载
	 */
	onUnload: function () {

	},

	/**
	 * 页面相关事件处理函数--监听用户下拉动作
	 */
	onPullDownRefresh: function () {

	},

	/**
	 * 页面上拉触底事件的处理函数
	 */
	onReachBottom: function () {

	},

	/**
	 * 用户点击右上角分享
	 */
	onShareAppMessage: function () {

	}
})
生成订单wxapp.php
// 获取会员默认收货地址信息
	public function doPageGetMemberAddress(){
		global $_W,$_GPC;
		$errno = 0;
		$message = '返回消息';
		$data = array();
		$addressRes = pdo_get('shangcheng_xk_address',['member_id'=>$_GPC['member_id'],'default_address'=>1]);
		if($addressRes){
			return $this->result($errno, '获取用户收货地址成功', $addressRes);
		}else{
			return $this->result($errno, '获取用户收货地址失败', ['status'=>400]);
		}
	}

	// 生成单独商品订单信息,用户在商品详情页点击购买后生成的订单
	public function doPageGetGoodsOrder(){
		global $_W,$_GPC;
		$errno = 0;
		$message = '返回消息';
		$data = array();
		$addressInfo = pdo_get('shangcheng_xk_address',['member_id'=>$_GPC['member_id'],'default_address'=>1]);
		$goodsInfo = pdo_get('shangcheng_xk_goods',['id'=>$_GPC['goods_id']]);

		// 生成订单号
		$orderNo = $this->OutTradeNo();

		$orderData = [
			'out_trade_no'	=>$orderNo,
			'total_price'	=>$goodsInfo['now_price'],
			'member_id'		=>$_GPC['member_id'],
			'member_name'	=>$addressInfo['username'],
			'member_tel'	=>$addressInfo['telnumber'],
			'member_address'=>$addressInfo['address'],
			'create_time'	=>time(),
			'order_status'	=>0
		];
		$orderRes = pdo_insert('shangcheng_xk_order',$orderData);
		if($orderRes){
			$orderId = pdo_insertid();
			$orderGoodsData = [
				'order_id'	=>$orderId,
				'goods_id'	=>$_GPC['goods_id']
			];
			$orderGoodsRes = pdo_insert('shangcheng_xk_order_goods',$orderGoodsData);
			if($orderGoodsRes){
				return $this->result($errno, '插入订单商品表成功', ['status'=>200,'out_trade_no'=>$orderNo,'order_price'=>$goodsInfo['now_price'],'order_id'=>$orderId]);
			}else{
				return $this->result($errno, '插入订单商品表失败', ['status'=>400]);
			}
			return $this->result($errno, '生成订单数据成功', $orderId);
		}else{
			return $this->result($errno, '生成订单数据失败', ['status'=>400]);
		}
	}

	// 用户在购物车页面点击立即购买生成的订单
	public function doPageGetCartOrder(){
		global $_W,$_GPC;
		$errno = 0;
		$message = '返回消息';
		$data = array();
		$orderPrice = $_GPC['order_price'];
		$addressInfo = pdo_get('shangcheng_xk_address',['member_id'=>$_GPC['member_id'],'default_address'=>1]);
		// 生成订单号
		$orderNo = $this->OutTradeNo();

		$orderData = [
			'out_trade_no'	=>$orderNo,
			'total_price'	=>$orderPrice,
			'member_id'		=>$_GPC['member_id'],
			'member_name'	=>$addressInfo['username'],
			'member_tel'	=>$addressInfo['telnumber'],
			'member_address'=>$addressInfo['address'],
			'create_time'	=>time(),
			'order_status'	=>0
		];
		$orderRes = pdo_insert('shangcheng_xk_order',$orderData);
		if($orderRes){
			$orderId = pdo_insertid();
			$goodsIds = $_GPC['goods_ids'];
			$goodsIdsRes = explode('-', $goodsIds);
			foreach ($goodsIdsRes as $k => $v) {
				$goodsData = [
					'order_id'	=>$orderId,
					'goods_id'	=>$v
				];
				$orderGoodsRes = pdo_insert('shangcheng_xk_order_goods',$goodsData);
			}
			if($orderGoodsRes){
				return $this->result($errno, '插入订单商品表成功', ['status'=>200,'out_trade_no'=>$orderNo,'order_price'=>$orderPrice,'order_id'=>$orderId]);
			}else{
				return $this->result($errno, '插入订单商品表失败', ['status'=>400]);
			}
			return $this->result($errno, '生成订单数据成功', $orderId);
		}else{
			return $this->result($errno, '生成订单数据失败', ['status'=>400]);
		}
	}

	// 生成唯一订单号
	public function OutTradeNo(){
		$yCode = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J');
		$orderNo = $yCode[intval(date('Y')) - 2013] . strtoupper(dechex(date('m'))) . date('d') . time() . substr(microtime(), 2, 5) . sprintf('%02d', rand(0, 99999));
		return $orderNo;
	}

	// 调用微信支付接口
	public function doPagePay() {
		global $_GPC, $_W;
        //获取订单号,保证在业务模块中唯一即可
		$orderid = $_GPC['outTradeNo'];
		$fee = $_GPC['orderPrice'];
        //构造支付参数
		$order = array(
			'tid' => $orderid,
            'user' => $_W['openid'], //用户OPENID
            'fee' => floatval($fee), //金额
            'title' => '小康课堂',
        );
        //生成支付参数,返回给小程序端
		$pay_params = $this->pay($order);
		if (is_error($pay_params)) {
			return $this->result(1, '支付失败,请重试');
		}
		return $this->result(0, '', $pay_params);
	}

	// 从购物车生成的订单,并成功交易后,需要删除购物车中的商品
	public function doPageDelCartGoods(){
		global $_W,$_GPC;
		$errno = 0;
		$message = '返回消息';
		$memberId = $_GPC['memberId'];
		$cartRes = pdo_delete('shangcheng_xk_cart',['member_id'=>$memberId,'selected'=>1]);
		if($cartRes){
			return $this->result($errno, '删除购物车选中产品成功', ['status'=>200]);
		}else{
			return $this->result($errno, '删除购物车选中产品失败', ['status'=>400]);
		}
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值