Commit adb18f33 authored by liuyang's avatar liuyang

完成定时检查订单

parent 59ae5ada
...@@ -48,12 +48,10 @@ public class AlipayNotifyController { ...@@ -48,12 +48,10 @@ public class AlipayNotifyController {
boolean verify_result = AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(), "UTF-8", "RSA2"); boolean verify_result = AlipaySignature.rsaCheckV1(params, alipayProperties.getAlipayPublicKey(), "UTF-8", "RSA2");
if (verify_result){ if (verify_result){
//验证成功 //验证成功
if(trade_status.equals("TRADE_SUCCESS")){ if(trade_status.equals("TRADE_SUCCESS") || trade_status.equals("TRADE_FINISHED")){
orderService.orderComplete(out_trade_no); orderService.orderComplete(out_trade_no);
} else if (trade_status.equals("TRADE_FINISHED")){ } else if (trade_status.equals("TRADE_CLOSED")){
orderService.updateStatus(out_trade_no, ProductOrderStatusEnum.PAY_CLOSE);
}else if (trade_status.equals("WAIT_BUYER_PAY")){
orderService.updateStatus(out_trade_no, ProductOrderStatusEnum.WAIT_PAY);
} }
}else { }else {
//验证失败 //验证失败
...@@ -61,7 +59,6 @@ public class AlipayNotifyController { ...@@ -61,7 +59,6 @@ public class AlipayNotifyController {
} }
} catch (AlipayApiException e) { } catch (AlipayApiException e) {
log.error(e.getMessage(),e); log.error(e.getMessage(),e);
orderService.updateStatus(out_trade_no, ProductOrderStatusEnum.PAY_FAILD);
return "fail"; return "fail";
} }
return "success"; return "success";
......
...@@ -2,10 +2,13 @@ package com.qkdata.alipay.service; ...@@ -2,10 +2,13 @@ package com.qkdata.alipay.service;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.alipay.api.*; import com.alipay.api.*;
import com.alipay.api.domain.AlipayTradeCloseModel;
import com.alipay.api.domain.AlipayTradeQueryModel; import com.alipay.api.domain.AlipayTradeQueryModel;
import com.alipay.api.domain.AlipayTradeWapPayModel; import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.request.AlipayTradeCloseRequest;
import com.alipay.api.request.AlipayTradeQueryRequest; import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeWapPayRequest; import com.alipay.api.request.AlipayTradeWapPayRequest;
import com.alipay.api.response.AlipayTradeCloseResponse;
import com.alipay.api.response.AlipayTradeQueryResponse; import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeWapPayResponse; import com.alipay.api.response.AlipayTradeWapPayResponse;
import com.qkdata.alipay.config.AlipayProperties; import com.qkdata.alipay.config.AlipayProperties;
...@@ -58,12 +61,15 @@ public class AlipayService { ...@@ -58,12 +61,15 @@ public class AlipayService {
model.setOutTradeNo(orderNo); model.setOutTradeNo(orderNo);
request.setBizModel(model); request.setBizModel(model);
AlipayTradeQueryResponse response = alipayClient.execute(request); AlipayTradeQueryResponse response = alipayClient.execute(request);
String result = ""; return response.getTradeStatus();
if (response.isSuccess()){ }
result = response.getTradeStatus();
}else { public AlipayTradeCloseResponse closeOrder(String orderNo) throws AlipayApiException {
log.info("Alipay trade query faild:"+JSONObject.toJSONString(response)); AlipayTradeCloseRequest request = new AlipayTradeCloseRequest();
} AlipayTradeCloseModel model = new AlipayTradeCloseModel();
return result; model.setOutTradeNo(orderNo);
request.setBizModel(model);
AlipayTradeCloseResponse response = alipayClient.execute(request);
return response;
} }
} }
...@@ -4,7 +4,16 @@ package com.qkdata.biz.enums; ...@@ -4,7 +4,16 @@ package com.qkdata.biz.enums;
* 订单状态 * 订单状态
*/ */
public enum ProductOrderStatusEnum { public enum ProductOrderStatusEnum {
/**
* 待支付
*/
WAIT_PAY, WAIT_PAY,
/**
* 已支付
*/
PAY_COMPLETE, PAY_COMPLETE,
PAY_FAILD; /**
* 支付关闭
*/
PAY_CLOSE;
} }
...@@ -3,6 +3,7 @@ package com.qkdata.biz.management.entity; ...@@ -3,6 +3,7 @@ package com.qkdata.biz.management.entity;
import java.math.BigDecimal; import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.qkdata.biz.enums.PayMethodEnum; import com.qkdata.biz.enums.PayMethodEnum;
import com.qkdata.biz.enums.PaySourceEnum;
import com.qkdata.biz.enums.ProductOrderStatusEnum; import com.qkdata.biz.enums.ProductOrderStatusEnum;
import com.qkdata.biz.enums.ProductTypeEnum; import com.qkdata.biz.enums.ProductTypeEnum;
import com.qkdata.common.base.entity.BasePO; import com.qkdata.common.base.entity.BasePO;
...@@ -82,6 +83,10 @@ public class ProductOrderPO extends BasePO { ...@@ -82,6 +83,10 @@ public class ProductOrderPO extends BasePO {
* 订单状态 * 订单状态
*/ */
private ProductOrderStatusEnum status; private ProductOrderStatusEnum status;
/**
* 支付来源
*/
private PaySourceEnum source;
} }
...@@ -5,11 +5,14 @@ import cn.hutool.core.date.DateTime; ...@@ -5,11 +5,14 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil; import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayApiException;
import com.alipay.api.domain.AlipayTradeWapPayModel; import com.alipay.api.domain.AlipayTradeWapPayModel;
import com.alipay.api.response.AlipayTradeCloseResponse;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayOrderCloseResult;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult; import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService; import com.github.binarywang.wxpay.service.WxPayService;
...@@ -27,6 +30,7 @@ import com.qkdata.biz.sys.service.SysRoleService; ...@@ -27,6 +30,7 @@ import com.qkdata.biz.sys.service.SysRoleService;
import com.qkdata.biz.sys.service.SysUserService; import com.qkdata.biz.sys.service.SysUserService;
import com.qkdata.biz.sys.vo.SysRoleModel; import com.qkdata.biz.sys.vo.SysRoleModel;
import com.qkdata.biz.web.vo.*; import com.qkdata.biz.web.vo.*;
import com.qkdata.common.base.entity.BasePO;
import com.qkdata.common.base.enums.CodeEnum; import com.qkdata.common.base.enums.CodeEnum;
import com.qkdata.common.base.exception.BusinessException; import com.qkdata.common.base.exception.BusinessException;
import com.qkdata.common.base.model.PageResult; import com.qkdata.common.base.model.PageResult;
...@@ -35,7 +39,9 @@ import com.qkdata.common.util.HttpContextUtils; ...@@ -35,7 +39,9 @@ import com.qkdata.common.util.HttpContextUtils;
import com.qkdata.common.util.IPUtils; import com.qkdata.common.util.IPUtils;
import com.qkdata.common.util.UserContext; import com.qkdata.common.util.UserContext;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
...@@ -72,6 +78,9 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product ...@@ -72,6 +78,9 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
private OrgSurplusService orgSurplusService; private OrgSurplusService orgSurplusService;
@Autowired @Autowired
private AlipayService alipayService; private AlipayService alipayService;
@Autowired
@Qualifier("stringRedisTemplate")
private RedisTemplate redisTemplate;
private String generateOrderNo() { private String generateOrderNo() {
DateTime nowDateTime = DateUtil.date(); DateTime nowDateTime = DateUtil.date();
...@@ -189,6 +198,7 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product ...@@ -189,6 +198,7 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
po.setPayMethod(model.getPayMethod()); po.setPayMethod(model.getPayMethod());
po.setStatus(ProductOrderStatusEnum.WAIT_PAY); po.setStatus(ProductOrderStatusEnum.WAIT_PAY);
po.setUserId(UserContext.getUserId()); po.setUserId(UserContext.getUserId());
po.setSource(model.getSource());
return po; return po;
} }
...@@ -199,46 +209,56 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product ...@@ -199,46 +209,56 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
update(po, Wrappers.<ProductOrderPO>lambdaUpdate().eq(ProductOrderPO::getOrderNo,outTradeNo)); update(po, Wrappers.<ProductOrderPO>lambdaUpdate().eq(ProductOrderPO::getOrderNo,outTradeNo));
} }
public ProductOrderStatusEnum queryStatus(String orderNo) { public ProductOrderStatusEnum queryFromThirdPlatform(String orderNo,PayMethodEnum payMethod){
ProductOrderPO orderPO = getByOrderNo(orderNo); try {
if (orderPO == null){ if (payMethod == PayMethodEnum.WeiXin) {
throw new BusinessException("订单号不存在"); if(wxService.getConfig().isUseSandboxEnv()){
} String key = wxService.getSandboxSignKey();
if (orderPO.getStatus() == ProductOrderStatusEnum.PAY_COMPLETE){ wxService.getConfig().setMchKey(key);
return ProductOrderStatusEnum.PAY_COMPLETE; }
}else { WxPayOrderQueryResult queryResult = wxService.queryOrder(null, orderNo);
try { if ("SUCCESS".equals(queryResult.getTradeState())){
if (orderPO.getPayMethod() == PayMethodEnum.WeiXin) { updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
if(wxService.getConfig().isUseSandboxEnv()){ return ProductOrderStatusEnum.PAY_COMPLETE;
String key = wxService.getSandboxSignKey(); }else if ("CLOSED".equals(queryResult.getTradeState())){
wxService.getConfig().setMchKey(key); updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
} return ProductOrderStatusEnum.PAY_CLOSE;
WxPayOrderQueryResult queryResult = wxService.queryOrder(null, orderNo); }else {
if ("SUCCESS".equals(queryResult.getTradeState())){ return ProductOrderStatusEnum.WAIT_PAY;
}
}else if (payMethod == PayMethodEnum.AliPay){
try {
String queryResult = alipayService.queryOrder(orderNo);
if (queryResult.equals("TRADE_SUCCESS") || queryResult.equals("TRADE_FINISHED")){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE); updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
return ProductOrderStatusEnum.PAY_COMPLETE; return ProductOrderStatusEnum.PAY_COMPLETE;
}else if (queryResult.equals("TRADE_CLOSED")){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
return ProductOrderStatusEnum.PAY_CLOSE;
}else { }else {
return ProductOrderStatusEnum.PAY_FAILD; return ProductOrderStatusEnum.WAIT_PAY;
}
}else if (orderPO.getPayMethod() == PayMethodEnum.AliPay){
try {
String queryResult = alipayService.queryOrder(orderNo);
if (queryResult.equals("TRADE_SUCCESS") || queryResult.equals("TRADE_FINISHED")){
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
return ProductOrderStatusEnum.PAY_COMPLETE;
}else {
return ProductOrderStatusEnum.PAY_FAILD;
}
} catch (AlipayApiException e) {
throw new BusinessException("查询支付宝订单请求异常");
} }
}else { } catch (AlipayApiException e) {
throw new BusinessException("暂不支持的支付类型"); throw new BusinessException("查询支付宝订单请求异常");
} }
} catch (WxPayException e) { }else {
log.error(e.getMessage(),e); throw new BusinessException("暂不支持的支付类型");
return ProductOrderStatusEnum.PAY_FAILD;
} }
} catch (WxPayException e) {
log.error(e.getMessage(),e);
return ProductOrderStatusEnum.WAIT_PAY;
}
}
public ProductOrderStatusEnum queryStatus(String orderNo) {
ProductOrderPO orderPO = getByOrderNo(orderNo);
if (orderPO == null){
throw new BusinessException("订单号不存在");
}
if (orderPO.getStatus() == ProductOrderStatusEnum.WAIT_PAY){
return queryFromThirdPlatform(orderNo,orderPO.getPayMethod());
}else {
return orderPO.getStatus();
} }
} }
...@@ -287,6 +307,8 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product ...@@ -287,6 +307,8 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
public CreateOrderResult payAgain(CreateOrderModel model) { public CreateOrderResult payAgain(CreateOrderModel model) {
CreateOrderResult result = new CreateOrderResult();
result.setOrderNo(model.getOrderNo());
ProductOrderPO orderPO = getByOrderNo(model.getOrderNo()); ProductOrderPO orderPO = getByOrderNo(model.getOrderNo());
if (orderPO == null){ if (orderPO == null){
throw new BusinessException("请求错误,订单不存在"); throw new BusinessException("请求错误,订单不存在");
...@@ -294,10 +316,80 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product ...@@ -294,10 +316,80 @@ public class ProductOrderService extends ServiceImpl<ProductOrderMapper, Product
if (orderPO.getStatus() == ProductOrderStatusEnum.PAY_COMPLETE){ if (orderPO.getStatus() == ProductOrderStatusEnum.PAY_COMPLETE){
throw new BusinessException("订单已完成,请不要重覆支付"); throw new BusinessException("订单已完成,请不要重覆支付");
} }
CreateOrderResult result = new CreateOrderResult(); //下单来源不一致
result.setOrderNo(model.getOrderNo()); if (orderPO.getPayMethod() == PayMethodEnum.WeiXin && orderPO.getSource() != model.getSource()){
Object rtObj = prePay(orderPO,model.getSource(),model.getOpenId(),model.getReturnUrl()); if (orderPO.getSource() == PaySourceEnum.MWEB){
result.setResult(rtObj); throw new BusinessException("请从浏览器中支付");
}else if (orderPO.getSource() == PaySourceEnum.JSAPI){
throw new BusinessException("请从微信浏览器中支付");
}
}
ProductOrderStatusEnum status = queryFromThirdPlatform(orderPO.getOrderNo(),orderPO.getPayMethod());
if (status == ProductOrderStatusEnum.WAIT_PAY){
Object rtObj = prePay(orderPO,model.getSource(),model.getOpenId(),model.getReturnUrl());
result.setResult(rtObj);
return result;
}else if (status == ProductOrderStatusEnum.PAY_COMPLETE){
throw new BusinessException("订单已支付完成,请不要重覆下单");
}else if (status == ProductOrderStatusEnum.PAY_CLOSE){
throw new BusinessException("订单已关闭,请重新下单");
}
return result; return result;
} }
/**
* 定时检查未支付订单的状态(取30分钟前的订单)
*/
public void checkProductOrder() {
LocalDateTime now = LocalDateTime.now();
LocalDateTime endTime = now.minusMinutes(30);
List<ProductOrderPO> orderList = list(Wrappers.<ProductOrderPO>lambdaQuery()
.eq(ProductOrderPO::getStatus,ProductOrderStatusEnum.WAIT_PAY)
.le(BasePO::getCreateTime,endTime));
for (ProductOrderPO order : orderList){
ProductOrderStatusEnum status = queryFromThirdPlatform(order.getOrderNo(),order.getPayMethod());
if (status == ProductOrderStatusEnum.WAIT_PAY){
closeOrder(order.getOrderNo(),order.getPayMethod());
}
}
}
private void closeOrder(String orderNo,PayMethodEnum payMethod) {
if (payMethod == PayMethodEnum.WeiXin){
try {
WxPayOrderCloseResult result = wxService.closeOrder(orderNo);
if (result.getResultCode().equals("SUCCESS")){
if (result.getResultCode().equals("SUCCESS")){
//关单成功
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
}else if (result.getErrCode().equals("ORDERPAID")){
//订单已支付
updateStatus(orderNo,ProductOrderStatusEnum.PAY_COMPLETE);
}else if (result.getErrCode().equals("ORDERCLOSED")){
//订单已关闭
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
}
}else {
log.error(JSONObject.toJSONString(result));
}
} catch (WxPayException e) {
log.error(e.getMessage(),e);
}
}else if (payMethod == PayMethodEnum.AliPay){
try {
AlipayTradeCloseResponse response = alipayService.closeOrder(orderNo);
if (response.isSuccess()){
//关单成功
updateStatus(orderNo,ProductOrderStatusEnum.PAY_CLOSE);
}else {
//关单失败
log.error(JSONObject.toJSONString(response));
}
} catch (AlipayApiException e) {
log.error(e.getMessage(),e);
}
}
}
} }
\ No newline at end of file
...@@ -25,12 +25,14 @@ public class TimeTaskService { ...@@ -25,12 +25,14 @@ public class TimeTaskService {
private RedisTemplate redisTemplate; private RedisTemplate redisTemplate;
@Autowired @Autowired
private CourseConsumeRecordService recordService; private CourseConsumeRecordService recordService;
@Autowired
private ProductOrderService productOrderService;
/** /**
* 每30分钟执行一次 * 每5分钟执行一次
*/ */
@Scheduled(cron = "0 */5 * * * ?") @Scheduled(cron = "0 0/5 * * * ?")
public void saveConsumeRecord(){ public void saveConsumeRecord(){
log.debug("TimeTaskService saveConsumeRecord excute start================="); log.debug("TimeTaskService saveConsumeRecord excute start=================");
Set<String> keys = redisTemplate.opsForHash().keys(BizConstants.CACHE_KE_CONSUME_RECORD); Set<String> keys = redisTemplate.opsForHash().keys(BizConstants.CACHE_KE_CONSUME_RECORD);
...@@ -45,4 +47,14 @@ public class TimeTaskService { ...@@ -45,4 +47,14 @@ public class TimeTaskService {
} }
log.debug("TimeTaskService saveConsumeRecord excute end================="); log.debug("TimeTaskService saveConsumeRecord excute end=================");
} }
/**
* 每隔1分名检查未支付订单状态
*/
@Scheduled(cron = "0 0/1 * * * ?")
public void checkProductOrder(){
log.debug("TimeTaskService checkProductOrder excute start=================");
productOrderService.checkProductOrder();
log.debug("TimeTaskService checkProductOrder excute end=================");
}
} }
...@@ -43,9 +43,6 @@ public class WxPayNotifyController { ...@@ -43,9 +43,6 @@ public class WxPayNotifyController {
}catch (WxPayException e){ }catch (WxPayException e){
log.error(e.getMessage(),e); log.error(e.getMessage(),e);
if (null != outTradeNo){
orderService.updateStatus(outTradeNo,ProductOrderStatusEnum.PAY_FAILD);
}
} }
return WxPayNotifyResponse.success("OK"); return WxPayNotifyResponse.success("OK");
} }
......
...@@ -24,9 +24,14 @@ sms: ...@@ -24,9 +24,14 @@ sms:
api: api:
v3: http://localhost:9004/sms/api/v3 v3: http://localhost:9004/sms/api/v3
## 支付宝沙箱环境 ## 支付宝沙箱环境
#alipay:
# appId: 2021000117670831
# url: https://openapi.alipaydev.com/gateway.do
# appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJOkoU54PfkfL6LktJzYRvWGQjXptV0Y2w3h35Zf4yjfIKjAXLumiNE00XCWcsR2HWbx23SpcHLlk9peUd1+OKGkk1D4Ts99r/5OimRmVjnF+/pRPtooCMEa1ub6NO2IPTnyz/jxn4gXsGlKRVIMP7Sa9xVodZib4IXWemf7+jysQuG1R5kN9ClkQi+WIv4MExueUJiu2tyhDnuvk/vIDGP3tTbY1myedqx/StZIu2zQRul/KIDKkNUmXVds0F9QbnwK7AdcQwyCyy86XQzytq0GNPqL83YZGEvmH0mJ4nfkWKpyHzOLmkhvkKzOD3rRi8HtV7YUMTWN3v3vHrRE/pAgMBAAECggEAJK/puFcA4ZeSXyJbTHreaio2c2JKoxHoEJ4BY3jKEdfzGrC+p+3JH9ZGKN+BrsvSs1J3nlYZtHjGsP2WGHlsQrKuWboxbm0BJqKbNEDjwFLBImpOvpxQQ6JCPKEqBt1JuRz4Gca3ScHME0FQAdZFrvvPJLzeaKiznmbiXBgRMweRW704Nk2HfM3Uo7x2PS3BiCDdaQ0CXnj63EWHCteyLf4TlgV7qlk0OG9uh9RWm5xRC5/ucscc8oa8BdC/fLdAh7T2XIHFtVhEe+KPYvobJ3lFZlRb/jhKlu79wWXC08zoQrunCesvsB/RrLDTHk0FV29h1qv3BneOLFVDiwj6BQKBgQC9dXcDmRx7kZcA/dDz13RljWo0kmuYQt1h1dI1a7GgqcIdI5jdwOf3vVN7Ctge6YLaG+ptiaXU+SAMN1HQnqzN5DlKn2Q7hN66I+KQjfOYggnDEscOIPEaY/avAsSVZObZu+bK/XDIbypDDl4dELvVQy8ckd4CCCKC8QduqObu8wKBgQC5bKQzIrvtmaEhqbjvP83CZyiGG/GB3zzogJUKA6nm0oKiURHldoA5UozYyvbu3sBBuw81NQYuMMBVBZgO3XIFc7hHVqyn93dHgzOxUFYk2bhliVg9siFg6n3YQWvxIDkP6NGVhCXPLL+0H33rcBCjgQyxJyUa35rAzovFWu7UswKBgQClvrvNxAcs+2N1lJdWm6jSpvLA50+Ftwlh6+OopHyTJ7AQOfIkHf1RuKntvMDx2iuFkGJ4TbFsLj4hMcw7jHV08jJE3Eid4VHQ2k/9UpJHW4wawrSt4ZfMFKPc27kLUWi8FyyDbVFbqBT68PjYyKjqm4n9nobwlBlNIHv2DYFqjQKBgDWUH+oqujTQtI+elDKFtDXdSwddYa6OS/I+3VH0dw6ce2Tdmhc845YstUgbdbjWIqWboKxWMv/71Ed9A1AgSscqhfAPKnqqdgvy7Gfq98lUJAUq55WEOELh3xUy6jbVgceIFa9nbOltW8N3ahIy4ovsSTeTQRR/0h6uUBLp0KMjAoGAHJBJOAnS8csXYIIMArXcxCUgnC90sMQ9DySaTxmtfTVAy7Gs1TnBLRpwWOg55u1KebVTgx5T6vU+KupNi5KAbuK/1so27XXCo7DAY83leJTn9UC4iyOSOhTyNBwvd8uDyT2XrxbesSTBLe1dT3QtXJwT4iBttKky9lsAQDHB13o=
# alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhBcqLFQhDttWG9Ffqzf8SNjYP/IzBHxUh9XxHVbUXFtDyCY4L0mZKfOCKKq9q7gC0D3wWEmP+OS4b/5oB7n0DgWExTb2lcStzwzISEyoRagGH38EWH77PgN97tsJw6p06nVTWr+0W60tb1FZeFmCNbqzEpuF22srRztKzfHfoyn8KyL5LcZ15JBPC8uuRT0fSh2txYrjvVuToh8tdMcLEL/LGj1h/E8ol7qSUfHkyQNyeWgP2YrzzmW9QvLuRYUS2ZjhMbbBbGpkq9Bf35kwNG3gvcb0y0cYXV9zR/OLgz0aRF7scDIICUYG9/9o0ezGaH4veaKCUC+8Zx9CqUUdZwIDAQAB
## 支付宝正式环境
alipay: alipay:
appId: 2021000117670831 appId: 2021002147662648
url: https://openapi.alipaydev.com/gateway.do url: https://openapi.alipay.com/gateway.do
appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJOkoU54PfkfL6LktJzYRvWGQjXptV0Y2w3h35Zf4yjfIKjAXLumiNE00XCWcsR2HWbx23SpcHLlk9peUd1+OKGkk1D4Ts99r/5OimRmVjnF+/pRPtooCMEa1ub6NO2IPTnyz/jxn4gXsGlKRVIMP7Sa9xVodZib4IXWemf7+jysQuG1R5kN9ClkQi+WIv4MExueUJiu2tyhDnuvk/vIDGP3tTbY1myedqx/StZIu2zQRul/KIDKkNUmXVds0F9QbnwK7AdcQwyCyy86XQzytq0GNPqL83YZGEvmH0mJ4nfkWKpyHzOLmkhvkKzOD3rRi8HtV7YUMTWN3v3vHrRE/pAgMBAAECggEAJK/puFcA4ZeSXyJbTHreaio2c2JKoxHoEJ4BY3jKEdfzGrC+p+3JH9ZGKN+BrsvSs1J3nlYZtHjGsP2WGHlsQrKuWboxbm0BJqKbNEDjwFLBImpOvpxQQ6JCPKEqBt1JuRz4Gca3ScHME0FQAdZFrvvPJLzeaKiznmbiXBgRMweRW704Nk2HfM3Uo7x2PS3BiCDdaQ0CXnj63EWHCteyLf4TlgV7qlk0OG9uh9RWm5xRC5/ucscc8oa8BdC/fLdAh7T2XIHFtVhEe+KPYvobJ3lFZlRb/jhKlu79wWXC08zoQrunCesvsB/RrLDTHk0FV29h1qv3BneOLFVDiwj6BQKBgQC9dXcDmRx7kZcA/dDz13RljWo0kmuYQt1h1dI1a7GgqcIdI5jdwOf3vVN7Ctge6YLaG+ptiaXU+SAMN1HQnqzN5DlKn2Q7hN66I+KQjfOYggnDEscOIPEaY/avAsSVZObZu+bK/XDIbypDDl4dELvVQy8ckd4CCCKC8QduqObu8wKBgQC5bKQzIrvtmaEhqbjvP83CZyiGG/GB3zzogJUKA6nm0oKiURHldoA5UozYyvbu3sBBuw81NQYuMMBVBZgO3XIFc7hHVqyn93dHgzOxUFYk2bhliVg9siFg6n3YQWvxIDkP6NGVhCXPLL+0H33rcBCjgQyxJyUa35rAzovFWu7UswKBgQClvrvNxAcs+2N1lJdWm6jSpvLA50+Ftwlh6+OopHyTJ7AQOfIkHf1RuKntvMDx2iuFkGJ4TbFsLj4hMcw7jHV08jJE3Eid4VHQ2k/9UpJHW4wawrSt4ZfMFKPc27kLUWi8FyyDbVFbqBT68PjYyKjqm4n9nobwlBlNIHv2DYFqjQKBgDWUH+oqujTQtI+elDKFtDXdSwddYa6OS/I+3VH0dw6ce2Tdmhc845YstUgbdbjWIqWboKxWMv/71Ed9A1AgSscqhfAPKnqqdgvy7Gfq98lUJAUq55WEOELh3xUy6jbVgceIFa9nbOltW8N3ahIy4ovsSTeTQRR/0h6uUBLp0KMjAoGAHJBJOAnS8csXYIIMArXcxCUgnC90sMQ9DySaTxmtfTVAy7Gs1TnBLRpwWOg55u1KebVTgx5T6vU+KupNi5KAbuK/1so27XXCo7DAY83leJTn9UC4iyOSOhTyNBwvd8uDyT2XrxbesSTBLe1dT3QtXJwT4iBttKky9lsAQDHB13o= appPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJOkoU54PfkfL6LktJzYRvWGQjXptV0Y2w3h35Zf4yjfIKjAXLumiNE00XCWcsR2HWbx23SpcHLlk9peUd1+OKGkk1D4Ts99r/5OimRmVjnF+/pRPtooCMEa1ub6NO2IPTnyz/jxn4gXsGlKRVIMP7Sa9xVodZib4IXWemf7+jysQuG1R5kN9ClkQi+WIv4MExueUJiu2tyhDnuvk/vIDGP3tTbY1myedqx/StZIu2zQRul/KIDKkNUmXVds0F9QbnwK7AdcQwyCyy86XQzytq0GNPqL83YZGEvmH0mJ4nfkWKpyHzOLmkhvkKzOD3rRi8HtV7YUMTWN3v3vHrRE/pAgMBAAECggEAJK/puFcA4ZeSXyJbTHreaio2c2JKoxHoEJ4BY3jKEdfzGrC+p+3JH9ZGKN+BrsvSs1J3nlYZtHjGsP2WGHlsQrKuWboxbm0BJqKbNEDjwFLBImpOvpxQQ6JCPKEqBt1JuRz4Gca3ScHME0FQAdZFrvvPJLzeaKiznmbiXBgRMweRW704Nk2HfM3Uo7x2PS3BiCDdaQ0CXnj63EWHCteyLf4TlgV7qlk0OG9uh9RWm5xRC5/ucscc8oa8BdC/fLdAh7T2XIHFtVhEe+KPYvobJ3lFZlRb/jhKlu79wWXC08zoQrunCesvsB/RrLDTHk0FV29h1qv3BneOLFVDiwj6BQKBgQC9dXcDmRx7kZcA/dDz13RljWo0kmuYQt1h1dI1a7GgqcIdI5jdwOf3vVN7Ctge6YLaG+ptiaXU+SAMN1HQnqzN5DlKn2Q7hN66I+KQjfOYggnDEscOIPEaY/avAsSVZObZu+bK/XDIbypDDl4dELvVQy8ckd4CCCKC8QduqObu8wKBgQC5bKQzIrvtmaEhqbjvP83CZyiGG/GB3zzogJUKA6nm0oKiURHldoA5UozYyvbu3sBBuw81NQYuMMBVBZgO3XIFc7hHVqyn93dHgzOxUFYk2bhliVg9siFg6n3YQWvxIDkP6NGVhCXPLL+0H33rcBCjgQyxJyUa35rAzovFWu7UswKBgQClvrvNxAcs+2N1lJdWm6jSpvLA50+Ftwlh6+OopHyTJ7AQOfIkHf1RuKntvMDx2iuFkGJ4TbFsLj4hMcw7jHV08jJE3Eid4VHQ2k/9UpJHW4wawrSt4ZfMFKPc27kLUWi8FyyDbVFbqBT68PjYyKjqm4n9nobwlBlNIHv2DYFqjQKBgDWUH+oqujTQtI+elDKFtDXdSwddYa6OS/I+3VH0dw6ce2Tdmhc845YstUgbdbjWIqWboKxWMv/71Ed9A1AgSscqhfAPKnqqdgvy7Gfq98lUJAUq55WEOELh3xUy6jbVgceIFa9nbOltW8N3ahIy4ovsSTeTQRR/0h6uUBLp0KMjAoGAHJBJOAnS8csXYIIMArXcxCUgnC90sMQ9DySaTxmtfTVAy7Gs1TnBLRpwWOg55u1KebVTgx5T6vU+KupNi5KAbuK/1so27XXCo7DAY83leJTn9UC4iyOSOhTyNBwvd8uDyT2XrxbesSTBLe1dT3QtXJwT4iBttKky9lsAQDHB13o=
alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhBcqLFQhDttWG9Ffqzf8SNjYP/IzBHxUh9XxHVbUXFtDyCY4L0mZKfOCKKq9q7gC0D3wWEmP+OS4b/5oB7n0DgWExTb2lcStzwzISEyoRagGH38EWH77PgN97tsJw6p06nVTWr+0W60tb1FZeFmCNbqzEpuF22srRztKzfHfoyn8KyL5LcZ15JBPC8uuRT0fSh2txYrjvVuToh8tdMcLEL/LGj1h/E8ol7qSUfHkyQNyeWgP2YrzzmW9QvLuRYUS2ZjhMbbBbGpkq9Bf35kwNG3gvcb0y0cYXV9zR/OLgz0aRF7scDIICUYG9/9o0ezGaH4veaKCUC+8Zx9CqUUdZwIDAQAB alipayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAigumfaT5OI9WRVkZKC6lU95MaxCwNvcyRo+oQlItuhQLJexyIcLk87i4WWEmkkZOu8SLsPazkn18QeMnMwy98Pm1iGZCBmwFnj3UNq0qm5lfmpao945QKskArKVr/kkRMBNNm6INGpsppZAvBaBsiiSw4jrrgTE9AP3SvPQ2rykiZaU5Kcn7nMUueZt2aYIbJrpQ70mcl18sZILDPL0vNQJ1pIFMJN6B/BxSJDfi5Bbh2fiwOu+qVivBfYbCJuHpx2RWGA7jknGsnXHUHfAekAlFhtwGpa+fvpQPoB1jRPmvi8VQGJA+zU6lunxcRxpTEVGr1ryeeTUFIixQY9XNuQIDAQAB
ALTER TABLE `product_order`
ADD COLUMN `source` varchar(20) NULL COMMENT '支付来源' AFTER `pay_method`;
\ No newline at end of file
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
( (
SELECT * SELECT *
from course_consume_record from course_consume_record
WHERE user_id = #{userId} WHERE user_id = #{p.userId}
and is_del = 0 and is_del = 0
ORDER BY update_time desc,course_id ASC LIMIT 100000 ORDER BY update_time desc,course_id ASC LIMIT 100000
) t ) t
...@@ -52,6 +52,6 @@ ...@@ -52,6 +52,6 @@
INNER JOIN course c on r.course_id = c.id INNER JOIN course c on r.course_id = c.id
INNER JOIN course_chapter chapter on chapter.id = r.chapter_id INNER JOIN course_chapter chapter on chapter.id = r.chapter_id
INNER JOIN resource res ON res.id = chapter.resource_id INNER JOIN resource res ON res.id = chapter.resource_id
ORDER BY r.update_time DESC; ORDER BY r.update_time DESC
</select> </select>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment