商城业务 --> 支付宝沙箱支付

This commit is contained in:
Kirk Lin 2021-07-16 16:31:12 +08:00
parent 3ac43525c9
commit b564dfbe7b
85 changed files with 3755 additions and 23 deletions

View file

@ -32,7 +32,7 @@ public class Query<T> {
long limit = 10;
if(params.get(Constant.PAGE) != null){
curPage = Long.parseLong((String)params.get(Constant.PAGE));
curPage = Long.parseLong(params.get(Constant.PAGE).toString());
}
if(params.get(Constant.LIMIT) != null){
limit = Long.parseLong((String)params.get(Constant.LIMIT));

View file

@ -53,6 +53,10 @@
<groupId>com.github.ben-manes.caffeine</groupId>
<artifactId>caffeine</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

View file

@ -5,9 +5,11 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@SpringBootApplication
@EnableDiscoveryClient
@EnableRedisHttpSession
@EnableFeignClients(basePackages = "name.lkk.kkmall.member.feign")
@MapperScan("name.lkk.kkmall.member.dao")
public class KkmallMemberApplication {

View file

@ -0,0 +1,39 @@
package name.lkk.kkmall.member.config;
import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
/**
* 配置OpenFeign拦截器
* 解决远程调用时丢失请求头的问题
*
* @author kirklin
*/
@Configuration
public class MallFeignConfig {
@Bean("requestInterceptor")
public RequestInterceptor requestInterceptor() {
return requestInterceptor -> {
//1使用RequestContextHolder拿到刚进来的请求数据
ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (requestAttributes != null) {
//老请求
HttpServletRequest request = requestAttributes.getRequest();
//2同步请求头的数据主要是cookie
//把老请求的cookie值放到新请求上来进行一个同步
String cookie = request.getHeader("Cookie");
requestInterceptor.header("Cookie", cookie);
}
};
}
}

View file

@ -0,0 +1,22 @@
package name.lkk.kkmall.member.config;
import name.lkk.kkmall.member.interceptor.LoginUserInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Arrays;
@Configuration
public class MemberWebConfig implements WebMvcConfigurer {
@Autowired
private LoginUserInterceptor loginUserInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginUserInterceptor).addPathPatterns("/**").excludePathPatterns(Arrays.asList("/login", "/member/member/login"));
}
}

View file

@ -0,0 +1,20 @@
package name.lkk.kkmall.member.feign;
import name.lkk.common.utils.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.Map;
@FeignClient("kkmall-order")
public interface OrderFeignService {
/**
* 查询当前登录的用户的所有订单信息
*/
@PostMapping("/order/order/listWithItem")
R listWithItem(@RequestBody Map<String, Object> params);
}

View file

@ -0,0 +1,40 @@
package name.lkk.kkmall.member.interceptor;
import name.lkk.common.constant.AuthServerConstant;
import name.lkk.common.vo.MemberRsepVo;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Component
public class LoginUserInterceptor implements HandlerInterceptor {
public static ThreadLocal<MemberRsepVo> threadLocal = new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String uri = request.getRequestURI();
// 这个请求直接放行
boolean match = new AntPathMatcher().match("/member/**", uri);
if (match) {
return true;
}
HttpSession session = request.getSession();
MemberRsepVo memberRsepVo = (MemberRsepVo) session.getAttribute(AuthServerConstant.LOGIN_USER);
if (memberRsepVo != null) {
threadLocal.set(memberRsepVo);
return true;
} else {
// 没登陆就去登录
session.setAttribute("msg", AuthServerConstant.NOT_LOGIN);
response.sendRedirect("http://auth.kkmall.com/login.html");
return false;
}
}
}

View file

@ -0,0 +1,33 @@
package name.lkk.kkmall.member.web;
import lombok.extern.slf4j.Slf4j;
import name.lkk.common.utils.R;
import name.lkk.kkmall.member.feign.OrderFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.HashMap;
@Slf4j
@Controller
public class MemberWebController {
@Autowired
private OrderFeignService orderFeignService;
@GetMapping("/memberOrder.html")
public String memberOrderPage(@RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum, Model model) {
// 这里可以获取到支付宝给我们传来的所有数据
// 查出当前登录用户的所有订单
HashMap<String, Object> page = new HashMap<>();
page.put("page", pageNum);
R r = orderFeignService.listWithItem(page);
model.addAttribute("orders", r);
// 支付宝返回的页面数据
// log.info(r.get("page").toString());
return "orderList";
}
}

View file

@ -13,6 +13,15 @@ spring:
server-addr: localhost:8848
application:
name: kkmall-member
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
mvc:
static-path-pattern: /static/**
thymeleaf:
cache: true
suffix: .html
prefix: classpath:/templates/
session:
store-type: redis

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,113 @@
$(".nav_ul .li").removeClass("hover")
$(".nav_ul .li").hover(function () {
$(this).children("ol").stop().show()
$(this).css({"color": "black", "background": "white", "border": "1px solid #ccc"})
$(this).addClass("hover")
}, function () {
$(this).children("ol").stop().hide()
$(this).css({"color": "white", "background": "#E2231A", "border": "none"})
$(this).removeClass("hover")
})
$(".nav_ul .li ol li").hover(function () {
$(this).css({"background": "#F3F3F3", "color": "#E43953"})
}, function () {
$(this).css({"background": "#fff", "color": "#000"})
})
$("#nav .right .shop>li").hover(function () {
$(this).children("ol").stop().show()
}, function () {
$(this).children("ol").stop().hide()
})
$(".details .detailsLiok").hover(function () {
$(this).children("ol").stop().show();
$(this).css({"border": "1px solid #ccc", "border-bottom": "none", "background": "white"});
$(this).children("i").addClass("allBig_i1").removeClass("allBig_i")
}, function () {
$(this).children("ol").stop().hide()
$(this).css({"border": "none", "background": "#F3F3F3"})
$(this).children("i").addClass("allBig_i").removeClass("allBig_i1")
})
$(".details .detailsUl>li ol li").hover(function () {
$(this).css({"background": "#F3F3F3", "color": "#E43953"})
}, function () {
$(this).css({"background": "#fff", "color": "#000"})
})
$(".details .detailsUlDiv>li ol li").hover(function () {
$(this).css({"background": "#F3F3F3", "color": "#E43953"})
}, function () {
$(this).css({"background": "#fff", "color": "#000"})
})
$(".table").hover(function () {
$(this).find(".isShow").show()
}, function () {
$(this).find(".isShow").hide()
})
$(".table .isShow").hover(function () {
$(this).addClass("table_i51").removeClass("table_i5")
}, function () {
$(this).addClass("table_i5").removeClass("table_i51")
})
$(".buy_btm dl .ab_operate ul .guanzhu").hover(function () {
$(this).children(".buy_btm_i").addClass("buy_btm_i1_1").removeClass("buy_btm_i1")
}, function () {
$(this).children(".buy_btm_i").addClass("buy_btm_i1").removeClass("buy_btm_i1_1")
})
$(".buy_btm dl .ab_operate ul .zhan").hover(function () {
$(this).children(".buy_btm_i0").addClass("buy_btm_i2_1").removeClass("buy_btm_i2")
}, function () {
$(this).children(".buy_btm_i0").addClass("buy_btm_i2").removeClass("buy_btm_i2_1")
})
$(".mySwiper .mySwiper_like ol .liList").mouseover(function () {
var i = $(this).index();
$('.mySwiper .mySwiper_like ol .liList').css({
"background": "none",
"color": "#666"
}).eq(i).css({"background": "#E4393C", "color": "white"})
$(".mySwiper ul li").hide().eq(i).stop().show()
})
$(".fixed .dog").hover(function () {
$(this).children("img").attr("src", "img/joygif_hover.gif")
}, function () {
$(this).children("img").attr("src", "img/joygif.gif")
})
$(".fixed .teSe .test_li1").hover(function () {
$(this).children("ol").show()
}, function () {
$(this).children("ol").hide()
})
$(document).bind("scroll", function () {
var oTop = document.body.scrollTop || document.documentElement.scrollTop;
// var oScreen=window.screen.width
if (oTop > 50) {
$(".teSe ul .test_li3").css({"display": "block"})
} else {
$(".teSe ul .test_li3").css({"display": "none"})
}
})
$(".hide").hover(function () {
$(this).children(".hi").stop().show();
}, function () {
$(this).children(".hi").stop().hide();
})

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,689 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>KK商城订单</title>
<link rel="stylesheet" href="/static/member/css/index.css">
<style media="screen">
* {
font-family: "微软雅黑";
}
</style>
</head>
<body>
<div id="nav">
<nav>
<div class="myjd">
<h3>我的KK商城</h3>
<button onclick="location.href='http://kkmall.com'">返回KK商城首页</button>
</div>
<ul class="nav_ul">
<li>首页</li>
<li class="li hover">账户设置<i class="ul_i"></i>
<ol>
<li>个人信息</li>
<li>账户安全</li>
<li>我的尺码</li>
<li>账号绑定</li>
<li>收货地址</li>
<li>用药人信息</li>
<li>分享绑定</li>
<li>邮件订阅</li>
<li>应用授权</li>
<li>快捷支付</li>
<li>增票资质</li>
<li>企业发票</li>
<li>采购需求单</li>
</ol>
</li>
<li class="li">社区<i class="ul_i"></i>
<ol>
<li>个人主页</li>
<li>我的活动</li>
<li>我的圈子</li>
<li>我的帖子</li>
</ol>
</li>
<li>消息</li>
</ul>
<div class="right">
<div class="btn">
<input type="text" placeholder="空调">
<button>搜索</button>
</div>
<ul class="shop">
<li><i class="shop_che"></i>我的购物车 >
<ol>
<li>
<img src="/static/member/img/shop.png" alt="">
<div>购物车中还没有商品,赶紧选购吧</div>
<div style="clear:both;"></div>
</li>
</ol>
</li>
</ul>
</div>
<div style="clear:both;"></div>
</nav>
</div>
<div style="clear:both;"></div>
<div id="big">
<div id="bigLeft">
<ul>
<h5>订单中心</h5>
<li style="color:#E4393C;font-weight:800;">我的订单</li>
<li>我的活动</li>
<li>评价晒单</li>
<li>我的常购商品<img src="/static/member/img/new.png"></li>
<li>购物助手</li>
</ul>
<ul>
<h5>关注中心</h5>
<li>关注的商品</li>
<li>关注的店铺</li>
<li>关注的专辑</li>
<li>收藏的内容<img src="/static/member/img/new.png"></li>
<li>关注的活动</li>
<li>浏览历史</li>
</ul>
<ul>
<h5>资产中心</h5>
<li>小金库</li>
<li>KK商城白条</li>
<li>领货码</li>
<li>余额</li>
<li>优惠券</li>
<li>礼品卡</li>
<li>京豆</li>
<li>KK商城钢镚<img src="/static/member/img/new.png"></li>
</ul>
<ul>
<h5>特色业务</h5>
<li>我的营业厅</li>
<li>KK商城通信</li>
<li>定期购</li>
<li>我的回收单</li>
<li>节能补贴</li>
<li>医药服务</li>
<li>流量加油站</li>
<li>黄金托管</li>
<li>视频教育订单</li>
<li>海外房产预约</li>
<li>我的全球购</li>
<li>装修服务</li>
</ul>
<ul>
<h5>客户服务</h5>
<li>返修退换货</li>
<li>价格保护</li>
<li>意见建议</li>
<li>我的问答</li>
<li>购买咨询</li>
<li>交易纠纷</li>
<li>KK商城维修</li>
<li>上门预约服务</li>
<li>我的发票</li>
<li>举报中心</li>
</ul>
<ul>
<h5>设置</h5>
<li>个人信息</li>
<li>收货地址</li>
<li><img src="/static/member/img/59126ae3N1b306e2c.jpg" alt=""></li>
</ul>
</div>
<div id="bigRight">
<div class="myOrder">
<p>我的订单</p>
</div>
<div class="allBig">
<div class="allOrder">
<ul class="allOrderTop">
<li>
<ol>
<li>全部订单</li>
<li>待付款</li>
<li>待收货</li>
<li>待评价</li>
<div style="clear:both;"></div>
</ol>
</li>
<li class="allOrderTopLi">我的常购商品</li>
<li class="allOrderTopLi">好货清仓</li>
<li class="allOrderTopLastLi">
<span>订单回收站</span>
<div>
<input type="text" placeholder="商品名称/商品编号/订单号">
<button class="search"></button>
<button calss="gao">高级<i></i></button>
</div>
</li>
<div class="clear:both;"></div>
</ul>
</div>
<div class="details">
<ul class="detailsUl">
<div class="detailsUlDiv">
<li class="detailsLiok detailsLi">近三个月订单<i class="allBig_i"></i>
<ol>
<li>近三个月订单</li>
<li>今年内订单</li>
<li>今年内订单</li>
<li>2016年订单</li>
<li>2015年订单</li>
<li>2014年订单</li>
<li>2014年以前订单</li>
</ol>
</li>
<li class="detailsLi">订单详情</li>
<div style="clear:both;"></div>
</div>
<li class="detailsLi1">收货人</li>
<li class="detailsLi1">金额</li>
<li class="detailsLi1 detailsLiok">全部状态<i class="allBig_i"></i>
<ol>
<li>全部状态</li>
<li>等待付款</li>
<li>等待收货</li>
<li>已完成</li>
<li>已取消</li>
</ol>
</li>
<li class="detailsLi1">操作</li>
<div style="clear:both;"></div>
</ul>
</div>
<table class="table" th:each="order : ${orders.page.list}">
<tr>
<td colspan="7" style="background:#F7F7F7">
<span style="color:#AAAAAA">[[${order.createTime}]]</span>
<span><ruby style="color:#AAAAAA">订单号:</ruby> [[${order.orderSn}]]</span>
<span>KK商城<i class="table_i"></i></span>
<i class="table_i5 isShow"></i>
</td>
</tr>
<tr class="tr" th:each="item,itemStat : ${order.itemEntities}"
th:if="${!#strings.isEmpty(item.skuName)}">
<td colspan="3" style="border-right: 1px solid #ccc">
<img style="width: 60px;height: 60px;" th:src="${item.skuPic}" alt="" class="img">
<div>
<p style="width: 242px;height: auto;overflow: auto">[[${item.skuName}]]</p>
<div><i class="table_i4"></i>找搭配</div>
</div>
<div style="margin-left:15px;">x[[${item.skuQuantity}]]</div>
<div style="clear:both"></div>
</td>
<td th:if="${itemStat.index==0}" th:rowspan="${itemStat.size}">[[${order.memberUsername}]]<i><i
class="table_i1"></i></i></td>
<td th:if="${itemStat.index==0}" th:rowspan="${itemStat.size}"
style="padding-left:10px;color:#AAAAB1;">
<p th:if="${itemStat.index==0}" th:rowspan="${itemStat.size}" style="margin-bottom:5px;">总额
¥[[${order.payAmount}]]</p>
<hr th:if="${itemStat.index==0}" th:rowspan="${itemStat.size}" style="width:90%;">
<p>在线支付</p>
</td>
<td>
<ul>
<li style="color:#71B247;" th:if="${order.status==0}">待付款</li>
<li style="color:#71B247;" th:if="${order.status==1}">已付款</li>
<li style="color:#71B247;" th:if="${order.status==2}">已发货</li>
<li style="color:#71B247;" th:if="${order.status==3}">已完成</li>
<li style="color:#71B247;" th:if="${order.status==4}">已取消</li>
<li style="color:#71B247;" th:if="${order.status==5}">售后中</li>
<li style="color:#71B247;" th:if="${order.status==6}">售后完成</li>
<li style="margin:4px 0;" class="hide"><i class="table_i2"></i>跟踪<i class="table_i3"></i>
<div class="hi">
<div class="p-tit">
普通快递 运单号:[[${#strings.substring(order.orderSn,0,20)}]]
</div>
<div class="hideList">
<ul>
<li>
【[[${order.receiverProvince}]]】
在[[${order.receiverProvince}]][[${order.receiverCity}]][[${order.receiverDetailAddress}]]进行签收扫描,快件已被拍照(您
的快件已签收,感谢您使用韵达快递)签收
</li>
<li>
【[[${order.receiverProvince}]]】 在北京昌平区南口公司进行签收扫描,快件已被拍照(您
的快件已签收,感谢您使用韵达快递)签收
</li>
<li>
【[[${order.receiverProvince}]]】
在[[${order.receiverDetailAddress}]]进行派件扫描
</li>
<li>
【[[${order.receiverProvince}]]】
在[[${order.receiverCity}]][[${order.receiverDetailAddress}]]进行派件扫描;派送业务员:xxx
业务员 xxx;联系电话:18173516309
</li>
</ul>
</div>
</div>
</li>
<li class="tdLi">订单详情</li>
</ul>
</td>
<td>
<button>确认收货</button>
<p style="margin:4px 0; ">取消订单</p>
<p>催单</p>
</td>
</tr>
</table>
<div class="order_btm">
<div>
<button>上一页</button>
<span>1</span>
<button>下一页</button>
</div>
</div>
<div style="clear:both;"></div>
</div>
<div class="buy">
<div class="buy_top">
<div>买什么</div>
<div>查看更多商品专辑</div>
</div>
<div style="clear:both;"></div>
<div class="buy_btm">
<dl>
<dt>
<div>最适合冬季的茶</div>
<p>不入魔不成仙</p>
</dt>
<dd class="ab_goods">
<div><img src="/static/member/img/bu.jpg" alt=""></div>
<div>
<img src="/static/member/img/1xb.jpg" alt="">
<img src="/static/member/img/1xb1.jpg" alt="">
<div>32</div>
</div>
</dd>
<div style="clear:both;"></div>
<dd class="ab_operate">
<ul>
<li class="guanzhu"><i class="buy_btm_i1 buy_btm_i"></i>关注 7</li>
<li class="zhan"><i class="buy_btm_i2 buy_btm_i0"></i>赞 7</li>
<div style="clear:both;"></div>
</ul>
</dd>
</dl>
<dl>
<dt>
<div>用新奇搞怪献给那些有趣的灵魂</div>
<p>小太阳骥少</p>
</dt>
<dd class="ab_goods">
<div><img src="/static/member/img/bu1.jpg" alt=""></div>
<div>
<img src="/static/member/img/2xb.jpg" alt="">
<img src="/static/member/img/2xb1.jpg" alt="">
<div>17</div>
</div>
</dd>
<div style="clear:both;"></div>
<dd class="ab_operate">
<ul>
<li class="guanzhu"><i class="buy_btm_i1 buy_btm_i"></i>关注 9</li>
<li class="zhan"><i class="buy_btm_i2 buy_btm_i0"></i>赞 8</li>
<div style="clear:both;"></div>
</ul>
</dd>
</dl>
<dl>
<dt>
<div>流感来了,如何做好防护?</div>
<p>gulimall-guliyuan</p>
</dt>
<dd class="ab_goods">
<div><img src="/static/member/img/bu2.jpg" alt=""></div>
<div>
<img src="/static/member/img/3xb.jpg" alt="">
<img src="/static/member/img/3xb1.jpg" alt="">
<div>23</div>
</div>
</dd>
<div style="clear:both;"></div>
<dd class="ab_operate">
<ul>
<li class="guanzhu"><i class="buy_btm_i1 buy_btm_i"></i>关注 8</li>
<li class="zhan"><i class="buy_btm_i2 buy_btm_i0"></i>赞 7</li>
<div style="clear:both;"></div>
</ul>
</dd>
</dl>
<dl>
<dt>
<div>流感来了,如何做好防护?</div>
<p>gulimall-guliyuan</p>
</dt>
<dd class="ab_goods">
<div><img src="/static/member/img/bu3.jpg" alt=""></div>
<div>
<img src="/static/member/img/xb.jpg" alt="">
<img src="/static/member/img/xb1.jpg" alt="">
<div>23</div>
</div>
</dd>
<div style="clear:both;"></div>
<dd class="ab_operate">
<ul>
<li class="guanzhu"><i class="buy_btm_i1 buy_btm_i"></i>关注 4</li>
<li class="zhan"><i class="buy_btm_i2 buy_btm_i0"></i>赞 11</li>
<div style="clear:both;"></div>
</ul>
</dd>
</dl>
<div style="clear:both;"></div>
</div>
</div>
<div class="mySwiper">
<div class="mySwiper_like">
<div class="left">猜你喜欢</div>
<ol>
<li class="liList">1</li>
<li class="liList">2</li>
<li class="liList">3</li>
<div style="clear:both"></div>
</ol>
<div style="clear:both"></div>
</div>
<ul>
<li style="display:block;">
<dl>
<dt><img src="/static/member/image/lunbo.jpg" alt=""></dt>
<dd>
<div>花王 (Merries) 妙而舒 纸尿裤</div>
<div>大号 L54片 尿不湿9-14千克</div>
<p>¥83.90</p>
<span>(已有363668人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/lunbo1.jpg" alt=""></dt>
<dd>
<div>三只松鼠 肉干肉脯 休闲零食</div>
<div>猪肉脯自然片150g/袋子</div>
<p>¥26.90</p>
<span>(已有448374人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/lunbo2.jpg" alt=""></dt>
<dd>
<div>满减不止5折三只松鼠_小贱牛</div>
<div>板筋120gx1袋休闲零食特产</div>
<p>¥22.80</p>
<span>(已有169149人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/lunbo3.jpg" alt=""></dt>
<dd>
<div>良品铺子鸭脖子 甜辣味真空小包装</div>
<div>香辣卤味零食休闲小吃熟食190g</div>
<p>¥21.90</p>
<span>(已有208040人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/lunbo4.jpg" alt=""></dt>
<dd>
<div>欧莱雅LOREAL男士控油</div>
<div>(男士洗面奶 收缩毛孔 去黑头)</div>
<p>¥39.00</p>
<span>(已有604670人评价)</span>
</dd>
</dl>
<div style="clear:both;"></div>
</li>
<li>
<dl>
<dt><img src="/static/member/image/live.jpg" alt=""></dt>
<dd>
<div>花王 (Merries) 妙而舒 纸尿裤</div>
<div>大号 L54片 尿不湿9-14千克</div>
<p>¥83.90</p>
<span>(已有363668人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/live1.jpg" alt=""></dt>
<dd>
<div>三只松鼠 肉干肉脯 休闲零食</div>
<div>猪肉脯自然片150g/袋子</div>
<p>¥26.90</p>
<span>(已有448374人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/live2.jpg" alt=""></dt>
<dd>
<div>满减不止5折三只松鼠_小贱牛</div>
<div>板筋120gx1袋休闲零食特产</div>
<p>¥22.80</p>
<span>(已有169149人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/live3.jpg" alt=""></dt>
<dd>
<div>良品铺子鸭脖子 甜辣味真空小包装</div>
<div>香辣卤味零食休闲小吃熟食190g</div>
<p>¥21.90</p>
<span>(已有208040人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/live4.jpg" alt=""></dt>
<dd>
<div>欧莱雅LOREAL男士控油</div>
<div>(男士洗面奶 收缩毛孔 去黑头)</div>
<p>¥39.00</p>
<span>(已有604670人评价)</span>
</dd>
</dl>
<div style="clear:both;"></div>
</li>
<li>
<dl>
<dt><img src="/static/member/image/lunbo5.jpg" alt=""></dt>
<dd>
<div>花王 (Merries) 妙而舒 纸尿裤</div>
<div>大号 L54片 尿不湿9-14千克</div>
<p>¥83.90</p>
<span>(已有363668人评价)</span>
</dd>
</dl>
<dl>
<dt><img src="/static/member/image/lunbo6.jpg" alt=""></dt>
<dd>
<div>三只松鼠 肉干肉脯 休闲零食</div>
<div>猪肉脯自然片150g/袋子</div>
<p>¥26.90</p>
<span>(已有448374人评价)</span>
</dd>
</dl>
<div style="clear:both;"></div>
</li>
</ul>
</div>
<div id="logo">
<img src="/static/member/img/datu.jpg" alt="">
<img src="/static/member/img/datu1.jpg" alt="">
</div>
</div>
<div style="clear:both;"></div>
</div>
<div class="footer">
<div class="top">
<ul>
<li class="item fore1">
<i></i>
品类齐全,轻松购物
</li>
<li class="item fore2">
<i></i>
多仓直发,极速配送
</li>
<li class="item fore3">
<i></i>
正品行货,精致服务
</li>
<li class="item fore4">
<i></i>
天天低价,畅选无忧
</li>
<div style="clear:both;"></div>
</ul>
</div>
<div class="wrap">
<div class="wrap1">
<div class="wrap2">
<dl>
<dt>购物指南</dt>
<dd>购物流程</dd>
<dd>会员介绍</dd>
<dd>生活旅行/团购</dd>
<dd>常见问题</dd>
<dd>大家电</dd>
<dd>联系客服</dd>
</dl>
<dl>
<dt>配送方式</dt>
<dd>上门自提</dd>
<dd>211限时达</dd>
<dd>配送服务查询</dd>
<dd>配送费收取标准</dd>
<dd>海外配送</dd>
</dl>
<dl>
<dt>支付方式</dt>
<dd>货到付款</dd>
<dd>在线支付</dd>
<dd>分期付款</dd>
<dd>邮局汇款</dd>
<dd>公司转账</dd>
</dl>
<dl>
<dt>公司转账</dt>
<dd>售后政策</dd>
<dd>价格保护</dd>
<dd>退款说明</dd>
<dd>返修/退换货</dd>
<dd>取消订单</dd>
</dl>
<dl>
<dt>特色服务</dt>
<dd>夺宝岛</dd>
<dd>DIY装机</dd>
<dd>延保服务</dd>
<dd>KK商城E卡</dd>
<dd>KK商城通信</dd>
<dd>KK商城gulimall+</dd>
</dl>
</div>
</div>
</div>
<p class="p1">
<a href="/static/member/">关于我们</a>
<a href="/static/member/">联系我们</a>
<a href="/static/member/">联系客服</a>
<a href="/static/member/">合作招商</a>
<a href="/static/member/">合作招商</a>
<a href="/static/member/">营销中心</a>
<a href="/static/member/" style="width:80px;">手机KK商城</a>
<a href="/static/member/">友情链接</a>
<a href="/static/member/">销售联盟</a>
<a href="/static/member/" style="width:80px;">KK商城社区</a>
<a href="/static/member/">风险监测</a>
<a href="/static/member/">隐私政策</a>
<a href="/static/member/" style="width:80px;">KK商城公益</a>
<a href="/static/member/" style="width:80px;">English Site</a>
<a href="/static/member/" style="border-right: none">Contact Us</a>
</p>
<p class="p2">
<a href="/static/member/">京公网安备 11000002000088号</a>
<a href="/static/member/">京ICP证070359号</a>
<a href="/static/member/">互联网药品信息服务资格证编号(京)-经营性-2014-0008</a>
<a href="/static/member/">新出发京零 字第大120007号</a>
</p>
<p class="p3">
<a href="/static/member/">互联网出版许可证编号新出网证(京)字150号</a>
<a href="/static/member/">出版物经营许可证</a>
<a href="/static/member/">网络文化经营许可证京网文[2014]2148-348号</a>
<a href="/static/member/">违法和不良信息举报电话4006561155</a>
</p>
<p class="p4">
<a href="/static/member/">Copyright © 2004 - 2017 KK商城gulimall.com 版权所有</a>
<a href="/static/member/">消费者维权热线4006067733</a>
<a href="/static/member/">经营证照</a>
</p>
<p class="p5">
<a href="/static/member/">KK商城旗下网站KK商城钱包</a>
<a href="/static/member/">KK商城云</a>
</p>
<p class="img">
<span class="span icon1"></span>
<span class="span icon2"></span>
<span class="span icon3"></span>
<span class="span icon4"></span>
<span class="span icon5"></span>
<span class="span icon6"></span>
</p>
<div style="clear: both"></div>
</div>
<div class="fixed">
<div class="teSe">
<ul>
<li class="test_li1">
<ol>
<div></div>
<li>宽带</li>
<li>我的旅行订单</li>
<li>夺宝箱</li>
<li>我的定期送</li>
<li>我的竞拍保证金</li>
<li>KK商城白条</li>
<li>KK商城回收</li>
<li>装机大师</li>
<li>黄金托管业务</li>
</ol>
</li>
<li class="test_li2"></li>
<li><a href="/static/member/" class="test_li3"></a></li>
</ul>
</div>
</div>
</body>
<script src="/static/member/js/jquery-3.1.1.min.js"></script>
<script src="/static/member/js/index.js"></script>
</html>

View file

@ -7,6 +7,8 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.UUID;
/**
* @author: kirklin
* @date: 2021/6/26 5:02 下午
@ -20,6 +22,11 @@ public class PublisherController {
@RequestMapping("{name}")
public String sendMessage(@PathVariable("name") String name) {
return producerService.publish("lkk", R.ok("接收到的信息:"+name));
StringBuffer stringBuffer = new StringBuffer();
for (int i = 1; i <= 100; i++) {
stringBuffer.append(producerService.publish("lkk", R.ok("</br>接收到的信息:" + "订单号" + UUID.randomUUID())));
}
return stringBuffer.toString();
}
}

View file

@ -24,6 +24,13 @@
<artifactId>kkmall-common</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 支付宝支付SDK-->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.10.29.ALL</version>
</dependency>
<!--引入消息队列-->
<dependency>
<groupId>org.springframework.boot</groupId>

View file

@ -6,10 +6,12 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
@EnableRabbit
@SpringBootApplication
@EnableDiscoveryClient
@EnableRedisHttpSession
@EnableFeignClients("name.lkk.kkmall.order.feign")
@MapperScan("name.lkk.kkmall.order.dao")
public class KkmallOrderApplication {

View file

@ -4,4 +4,12 @@ package name.lkk.kkmall.order.constant;
public class OrderConstant {
public static final String USER_ORDER_TOKEN_PREFIX = "order:token";
/**
* 支付宝支付成功
*/
public static final String ALIPAY_TRADE_SUCCESS = "TRADE_SUCCESS";
/**
* 支付宝支付完成
*/
public static final String ALIPAY_TRADE_FINISHED = "TRADE_FINISHED";
}

View file

@ -1,5 +1,6 @@
package name.lkk.kkmall.order.controller;
import lombok.extern.slf4j.Slf4j;
import name.lkk.common.utils.PageUtils;
import name.lkk.common.utils.R;
import name.lkk.kkmall.order.entity.OrderEntity;
@ -20,11 +21,23 @@ import java.util.Map;
* @date 2021-06-07 16:38:57
*/
@RestController
@Slf4j
@RequestMapping("order/order")
public class OrderController {
@Autowired
private OrderService orderService;
/**
* 查询当前登录的用户的所有订单信息
*/
@PostMapping("/listWithItem")
public R listWithItem(@RequestBody Map<String, Object> params) {
// log.info("当前登录的用户的所有订单信息请求参数:"+params);
PageUtils page = orderService.queryPageWithItem(params);
// log.info("当前登录的用户的所有订单信息请求结果:"+page);
return R.ok().put("page", page);
}
@GetMapping("/status/{orderSn}")
public R getOrderStatus(@PathVariable("orderSn") String orderSn) {
OrderEntity orderEntity = orderService.getOrderByOrderSn(orderSn);

View file

@ -1,17 +1,24 @@
package name.lkk.kkmall.order.dao;
import name.lkk.kkmall.order.entity.OrderEntity;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import name.lkk.kkmall.order.entity.OrderEntity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 订单
*
*
* @author KirkLin
* @email linkirk@163.com
* @date 2021-06-07 16:38:57
*/
@Mapper
public interface OrderDao extends BaseMapper<OrderEntity> {
/**
* 修改订单状态
*
* @param orderSn
* @param code
*/
void updateOrderStatus(@Param("orderSn") String orderSn, @Param("code") Integer code);
}

View file

@ -1,13 +1,15 @@
package name.lkk.kkmall.order.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.math.BigDecimal;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
/**
* 订单
*
@ -190,4 +192,6 @@ public class OrderEntity implements Serializable {
*/
private Date modifyTime;
@TableField(exist = false)
private List<OrderItemEntity> itemEntities;
}

View file

@ -24,12 +24,12 @@ public class LoginUserInterceptor implements HandlerInterceptor {
String uri = request.getRequestURI();
AntPathMatcher antPathMatcher = new AntPathMatcher();
boolean match = antPathMatcher.match("/order/order/status/**", uri);
boolean match1 = antPathMatcher.match("/payed/notify", uri);
if (match || match1) {
if (antPathMatcher.match("/order/order/status/**", uri)) {
return true;
}
if (antPathMatcher.match("/payed/notify", uri)) {
return true;
}
//获取登录的用户信息
MemberRsepVo memberRsepVo = (MemberRsepVo) request.getSession().getAttribute(AuthServerConstant.LOGIN_USER);

View file

@ -0,0 +1,78 @@
package name.lkk.kkmall.order.listener;
import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import lombok.extern.slf4j.Slf4j;
import name.lkk.kkmall.order.service.OrderService;
import name.lkk.kkmall.order.utils.AlipayTemplate;
import name.lkk.kkmall.order.vo.PayAsyncVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 支付宝支付验证器
*
* @author kirklin
*/
@Slf4j
@RestController
public class OrderPayedListener {
@Autowired
private OrderService orderService;
@Autowired
private AlipayTemplate alipayTemplate;
/**
* http://member.kkmall.com/memberOrder.html?
* charset=utf-8
* &out_trade_no=202107161613374701415947717195235330
* &method=alipay.trade.page.pay.return
* &total_amount=6005.00
* &sign=1B%2F3g1gCXnkeH0G3DyVpV1L670%2F6rl3tpMGMFIv4K3N2VJXi3lhwu%2FNqmXsWB8cziL7sWR0NsPF%2FiTx9EliM3%2FTaYzfwHEKoYuVrNt95wzQ%2BddLQR9YraXpHMbjP%2FCsBZ6f7gCkUmBOsA7mst03czcI%2FwY%2Far5U0DSEp6N1CDqRAS4qBmBCJerH76FCKh%2BPddSzOMhusI5VfVLdj2pc6ovO4riiff5QmRoAmk5c9rSWfuTdf0OJwzVjtL4%2B5G0TtMNL1te3RDrLeE46ZmFkQ5%2FOF4AVqNQZWL0HnMBB%2BsKZwQU%2FsQIZm6wqiBHitZ5TdwS044g004GJ40vTCY%2FiMyw%3D%3D&trade_no=2021071622001450870501339571&auth_app_id=2021000117689509&version=1.0&app_id=2021000117689509&sign_type=RSA2&seller_id=2088621956134182&timestamp=2021-07-16+16%3A20%3A13
*
* @param vo
* @param request
* @return
* @throws UnsupportedEncodingException
* @throws AlipayApiException
*/
@PostMapping("/payed/notify")
public String handleAliPayed(PayAsyncVo vo, HttpServletRequest request) throws UnsupportedEncodingException, AlipayApiException {
log.info("\n收到支付宝最后的通知数据\n" + vo);
// Map<String, String[]> result = request.getParameterMap();
// String map = "";
// for (String key : result.keySet()) {
// map += key + "-->" + request.getParameter(key) + "\n";
// }
// 验签
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
//乱码解决这段代码在出现乱码时使用
// valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
// 只要我们收到了支付宝给我们的异步通知 验签成功 我们就要给支付宝返回success
if (AlipaySignature.rsaCheckV1(params, alipayTemplate.getAlipay_public_key(), alipayTemplate.getCharset(), alipayTemplate.getSign_type())) {
return orderService.handlePayResult(vo);
}
log.warn("\n受到恶意验签攻击");
return "fail";
}
}

View file

@ -3,9 +3,7 @@ package name.lkk.kkmall.order.service;
import com.baomidou.mybatisplus.extension.service.IService;
import name.lkk.common.utils.PageUtils;
import name.lkk.kkmall.order.entity.OrderEntity;
import name.lkk.kkmall.order.vo.OrderConfirmVo;
import name.lkk.kkmall.order.vo.OrderSubmitVo;
import name.lkk.kkmall.order.vo.SubmitOrderResponseVo;
import name.lkk.kkmall.order.vo.*;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@ -42,5 +40,23 @@ public interface OrderService extends IService<OrderEntity> {
void closeOrder(OrderEntity entity);
/**
* 获取当前订单的支付信息
*/
PayVo getOrderPay(String orderSn);
/**
* 查询当前登录的用户的所有订单信息
*/
PageUtils queryPageWithItem(Map<String, Object> params);
/**
* 处理支付结果
*
* @param vo
* @return
*/
String handlePayResult(PayAsyncVo vo);
}

View file

@ -17,6 +17,7 @@ import name.lkk.kkmall.order.constant.OrderConstant;
import name.lkk.kkmall.order.dao.OrderDao;
import name.lkk.kkmall.order.entity.OrderEntity;
import name.lkk.kkmall.order.entity.OrderItemEntity;
import name.lkk.kkmall.order.entity.PaymentInfoEntity;
import name.lkk.kkmall.order.feign.CartFeignService;
import name.lkk.kkmall.order.feign.MemberFeignService;
import name.lkk.kkmall.order.feign.ProductFeignService;
@ -24,6 +25,7 @@ import name.lkk.kkmall.order.feign.WmsFeignService;
import name.lkk.kkmall.order.interceptor.LoginUserInterceptor;
import name.lkk.kkmall.order.service.OrderItemService;
import name.lkk.kkmall.order.service.OrderService;
import name.lkk.kkmall.order.service.PaymentInfoService;
import name.lkk.kkmall.order.to.OrderCreateTo;
import name.lkk.kkmall.order.vo.*;
import org.springframework.amqp.AmqpException;
@ -57,6 +59,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> impleme
@Autowired
private OrderItemService orderItemService;
@Autowired
PaymentInfoService paymentInfoService;
@Autowired
private MemberFeignService memberFeignService;
@ -250,6 +255,73 @@ public class OrderServiceImpl extends ServiceImpl<OrderDao, OrderEntity> impleme
}
}
@Override
public PayVo getOrderPay(String orderSn) {
PayVo payVo = new PayVo();
OrderEntity order = this.getOrderByOrderSn(orderSn);
// 保留2位小数位向上补齐
payVo.setTotal_amount(order.getTotalAmount().add(order.getFreightAmount() == null ? new BigDecimal("0") : order.getFreightAmount()).setScale(2, BigDecimal.ROUND_UP).toString());
payVo.setOut_trade_no(order.getOrderSn());
List<OrderItemEntity> entities = orderItemService.list(new QueryWrapper<OrderItemEntity>().eq("order_sn", order.getOrderSn()));
payVo.setSubject("kkmall");
payVo.setBody("kkmall");
if (null != entities.get(0).getSkuName() && entities.get(0).getSkuName().length() > 1) {
// payVo.setSubject(entities.get(0).getSkuName());
// payVo.setBody(entities.get(0).getSkuName());
payVo.setSubject("kkmall");
payVo.setBody("kkmall");
}
return payVo;
}
@Override
public PageUtils queryPageWithItem(Map<String, Object> params) {
MemberRsepVo rsepVo = LoginUserInterceptor.threadLocal.get();
// if (rsepVo==null){
// rsepVo = new MemberRsepVo();
// rsepVo.setId(14L);
// log.warn("警告,用户未进入订单系统就查询个人订单,已展示系统默认数据");
// }
IPage<OrderEntity> page = this.page(
new Query<OrderEntity>().getPage(params),
// 查询这个用户的最新订单 [降序排序]
new QueryWrapper<OrderEntity>().eq("member_id", rsepVo.getId()).orderByDesc("id")
);
List<OrderEntity> order_sn = page.getRecords().stream().peek(order -> {
// 查询这个订单关联的所有订单项
List<OrderItemEntity> orderSn = orderItemService.list(new QueryWrapper<OrderItemEntity>().eq("order_sn", order.getOrderSn()));
order.setItemEntities(orderSn);
}).collect(Collectors.toList());
log.info(order_sn.toString());
page.setRecords(order_sn);
return new PageUtils(page);
}
@Override
public String handlePayResult(PayAsyncVo vo) {
// 1.保存交易流水
PaymentInfoEntity infoEntity = new PaymentInfoEntity();
infoEntity.setAlipayTradeNo(vo.getTrade_no());
infoEntity.setOrderSn(vo.getOut_trade_no());
// TRADE_SUCCESS
infoEntity.setPaymentStatus(vo.getTrade_status());
infoEntity.setCallbackTime(vo.getNotify_time());
infoEntity.setSubject(vo.getSubject());
infoEntity.setTotalAmount(new BigDecimal(vo.getTotal_amount()));
infoEntity.setCreateTime(vo.getGmt_create());
paymentInfoService.save(infoEntity);
// 2.修改订单状态信息
if (OrderConstant.ALIPAY_TRADE_SUCCESS.equals(vo.getTrade_status()) || OrderConstant.ALIPAY_TRADE_FINISHED.equals(vo.getTrade_status())) {
// 支付成功
String orderSn = vo.getOut_trade_no();
log.info("支付成功");
this.baseMapper.updateOrderStatus(orderSn, OrderStatusEnum.PAYED.getCode());
}
return "success";
}
/**
* 保存订单所有数据

View file

@ -0,0 +1,92 @@
package name.lkk.kkmall.order.utils;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import lombok.Data;
import name.lkk.kkmall.order.vo.PayVo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* 支付宝支付沙箱环境配置
*
* @author kirklin
*/
@ConfigurationProperties(prefix = "alipay")
@Component
@Data
public class AlipayTemplate {
/**
* 在支付宝创建的应用的id
*/
private String app_id = "2021000117689509";
/**
* 商户私钥您的PKCS8格式RSA2私钥
*/
private String merchant_private_key = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCy4zXCMp+5IjCZHh/Q0epeMV7qHErBGwoc5VgeTSH3sw3A3/iRmsVy6MAvwFt8Ji0tWpByIZqADc6K0i3apPriuPvpFOHkCwi6Y4QSQqynPNyZNFNGs33fxgd1bdalWA96EoulR0J6ChxTF9PYmThUPxGfXWE73Lv+iv4Ih28jkF9ZwQMLBhE4+lanAOvVeiRM0Xa7Z036W6feAsbb5HhSIY3WViUXXPtb/Ld+gRvhpbj7Xlz92oMbEvQdixtX5Op09rXiSdweS1RL6rKF/lk9u2vADyqMtzriLseBEKvg9RTz7Sxgsho+M9aW7MkNCUO9hBVMme2xBIMCT0ErghxrAgMBAAECggEBAItY2GiVHLyPOIId6DS3QDTtin0dWtH/6SnHMZQxC3OzQ9Rp42wwvvwa+JJ56gnUhz6cHIb7TCnSF4El5lg6ScDQzlKrVKdaPQtMN/Ytf+aqT0D8dJ5PdY8Z6Hd9/0U/SpcR2Tv/PXZpZ9UGa5x/BlUB6A1XJUYHVV4cEXS9Y0K0hnExgIumjhhDP2HjxEb18lWAa/+F7dpYANw2a8r0XqoW5d014y19twA7RX6Zp0wd8KdOHImmS9sM/8hTYTfhho0Q+SvhJ7WCHvvA/olxQ3eFLxXvrP+KmXDH7tGG13jihYV8kJ/8u2/T6ZcoQH5u1CCsn+kTfgImhmEhpzRDR7ECgYEA5ngtZ/xgrU645x/qKfF3qooHR7DA0J8oH7G8Kq6/VoqcVZiyEOcaOlLwp0FjplSipkf52D737xVHvL1ttfDPZNGmGoERkDt75g0ep5KkSAvsWca4EXE9TQiodtcx22Q3t229ayze5uKaRUw8zWow82HA9Ne3UQdD2TQaJgBRF0kCgYEAxrQ8IzAHF0SWNtJtaep/V7CDR6iUj4SK1cCtIN2ZBWeNpPoHyX6HcQSK60G6Tl96clPrxd8RzuHXBDhO5HYMhMcJRKXpxmTo5GzCy15N15AcK+s8QVp2KxIq6oYl6pReVjU0l91IB0qxpUEmhQhUJX8GrOltZoMlx6i6bCPIUhMCgYANXsdzkuag50I+1lElYcbJc/x8IjrtX25aeFssNrsO8Dell5gs9ttEqu8fJOH9EkflUaOi8fQ8QIXK40psFa5ScP8r5nT4YxsK+5PdsNoq+9YYVzjyehlOUMRFMLLJwYSh9ZHZl97OkjLU9llIqXJxjCg/jAwsfTlobmdd8QLDUQKBgHZwiEgRIKjl4QPcegtgE3eZZycXfTXuszKmHowwij2GdA+aWXnpSaI8KvH/w6VjlAEBtM/FH0BJrXh+d8gF9YBPg16/5pCzJX7CtXmzRILxC1nCZbAu07Doq1wPihpBRdns7OR4qa5u/2SZaPRy+nU/OiNnICaylZplIHnE+mqxAoGBANh+9aeV8eXkBhd7VXXwsDPhcJC4uXEV3+3HmV3roKeyIVVezQcKmdce44AxUWXzb4QVNUrLmbgm2RbXIQie0BawQ7wn7QWwJXN9WXf6ZVdtqbqCAoxhcaLqmm5Mcc229UUFHM7WxyWo+POT/Ba7lArqtcS8pWyxVIUx/ykReWxv";
/**
* 支付宝公钥,查看地址https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥
*/
private String alipay_public_key = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Gd8dERvTwkORWsWKt4y41Qjv1rWp1dlJ32iMHsz7BQ1TPBLkEKy+oOl52vkmoGIdzvtRqKxG8hKLna7JQXytGm2+2dVI2STLCU2nS6ix0Ce80wrQDdMLMIceFVfwmJ0Z+ZOWcZJL4SxwhB1KAXkSsx6xrUcbnIgoI1S2/MECvRKJp5Iz98zkF3QWt6tSvzz1MbvpW0dP1bDG9mYPDEXGKeFYnr5GwJTbEs1Zfk6CvwxQNFI8O1Xma+KuclsZil+kEiEuDqJN+LlrJMXOO1YLtnkncnkXlZxqqlYqf57z9t1Tgg17CD+3rG7uhUMDhgPVKABg6aiB4VHY0ynJbYBVwIDAQAB";
// 服务器[异步通知]页面路径 需http://格式的完整路径不能加?id=123这类自定义参数必须外网可以正常访问
// 支付宝会悄悄的给我们发送一个请求告诉我们支付成功的信息
private String notify_url = "http://order.kkmall.com/payed/notify";
// 页面跳转同步通知页面路径 需http://格式的完整路径不能加?id=123这类自定义参数必须外网可以正常访问
//同步通知支付成功一般跳转到成功页
private String return_url = "http://member.kkmall.com/memberOrder.html";
// 签名方式
private String sign_type = "RSA2";
// 字符编码格式
private String charset = "utf-8";
// 自动关单时间
private String timeout = "15m";
// 支付宝网关 https://openapi.alipaydev.com/gateway.do
private String gatewayUrl = "https://openapi.alipaydev.com/gateway.do";
public String pay(PayVo vo) throws AlipayApiException {
//AlipayClient alipayClient = new DefaultAlipayClient(AlipayTemplate.gatewayUrl, AlipayTemplate.app_id, AlipayTemplate.merchant_private_key, "json", AlipayTemplate.charset, AlipayTemplate.alipay_public_key, AlipayTemplate.sign_type);
//1根据支付宝的配置生成一个支付客户端
AlipayClient alipayClient = new DefaultAlipayClient(gatewayUrl,
app_id, merchant_private_key, "json",
charset, alipay_public_key, sign_type);
//2创建一个支付请求 //设置请求参数
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
alipayRequest.setReturnUrl(return_url);
alipayRequest.setNotifyUrl(notify_url);
//商户订单号商户网站订单系统中唯一订单号必填
String out_trade_no = vo.getOut_trade_no();
//付款金额必填
String total_amount = vo.getTotal_amount();
//订单名称必填
String subject = vo.getSubject();
//商品描述可空
String body = vo.getBody();
// 30分钟内不付款就会自动关单
alipayRequest.setBizContent("{\"out_trade_no\":\"" + out_trade_no + "\","
+ "\"total_amount\":\"" + total_amount + "\","
+ "\"subject\":\"" + subject + "\","
+ "\"body\":\"" + body + "\","
+ "\"timeout_express\":\"" + timeout + "\","
+ "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
String result = alipayClient.pageExecute(alipayRequest).getBody();
//会收到支付宝的响应响应的是一个页面只要浏览器显示这个页面就会自动来到支付宝的收银台页面
return result;
}
}

View file

@ -0,0 +1,33 @@
package name.lkk.kkmall.order.web;
import com.alipay.api.AlipayApiException;
import name.lkk.kkmall.order.service.OrderService;
import name.lkk.kkmall.order.utils.AlipayTemplate;
import name.lkk.kkmall.order.vo.PayVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class PayWebController {
@Autowired
private AlipayTemplate alipayTemplate;
@Autowired
private OrderService orderService;
/**
* 告诉浏览器我们会返回一个html页面
*/
@ResponseBody
@GetMapping(value = "/payOrder", produces = "text/html")
public String payOrder(@RequestParam("orderSn") String orderSn) throws AlipayApiException {
PayVo payVo = orderService.getOrderPay(orderSn);
return alipayTemplate.pay(payVo);
}
}

View file

@ -55,4 +55,11 @@ kkMallRabbitmq:
ttl: 900000
# 库存解锁队列
ReleaseOther: stock.release.stock.queue
ReleaseOtherKey: order.release.other
ReleaseOtherKey: order.release.other
alipay:
app_id: 2021000117689509
# 支付宝异步回调通知 这个来感应订单是否完成
notify_url: http://order.kkmall.com/payed/notify
return_url: http://member.kkmall.com/memberOrder.html
timeout: 15m

View file

@ -48,6 +48,11 @@
<result property="commentTime" column="comment_time"/>
<result property="modifyTime" column="modify_time"/>
</resultMap>
<!-- 修改订单状态 -->
<update id="updateOrderStatus">
UPDATE `oms_order`
SET `status` = #{code}
WHERE order_sn = #{orderSn}
</update>
</mapper>

View file

@ -143,7 +143,7 @@
<a href="http://auth.kkmall.com/reg.html" style="color: red;">免费注册</a> |
</li>
<li th:if="${session.loginUser} !=null">
<a href="http://order.kkmall.com/list.html" class="aa">我的订单</a> |
<a href="http://member.kkmall.com/memberOrder.html" class="aa">我的订单</a> |
</li>
<li class="jingdong" style="width:95px;">
<a href="/static/order/detail/javascript:;">我的KK商城</a><span

View file

@ -32,16 +32,15 @@ server.port=8848
### If use MySQL as datasource:
# spring.datasource.platform=mysql
spring.datasource.platform=mysql
### Count of DB:
# db.num=1
db.num=1
### Connect URL of DB:
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# db.user.0=nacos
# db.password.0=nacos
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=3000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
#db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=6000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=66CcFf!!
### Connection pool configuration: hikariCP
@ -49,7 +48,6 @@ db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#*************** Naming Module Related Configurations ***************#
### Data dispatch task execution period in milliseconds:
# nacos.naming.distro.taskDispatchPeriod=200