Przeglądaj źródła

[刷卡支付][收银台]:刷卡支付成功

release_toaliyun_real
Stormeye Wu 7 lat temu
rodzic
commit
31bedcc5e8
7 zmienionych plików z 246 dodań i 37 usunięć
  1. +11
    -0
      mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java
  2. +1
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java
  3. +7
    -0
      mallinkService/src/main/java/com/iformall/service/WxOrderService.java
  4. +8
    -0
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  5. +106
    -4
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  6. +95
    -32
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  7. +18
    -0
      mallinkService/src/main/resources/mapper/WxOrderMapper.xml

+ 11
- 0
mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java Wyświetl plik

@@ -10,6 +10,8 @@ import com.iformall.exception.MallinkException;
import com.iformall.service.*; import com.iformall.service.*;
import com.iformall.utils.IPUtil; import com.iformall.utils.IPUtil;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -211,4 +213,13 @@ public class WxMicroPayController extends BaseController {
return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage()); return new ResultData(ErrorCode.PAY_ORDER_ERROR, e.getMessage());
} }
} }

@ApiOperation("某日期扫码支付总流水")
@GetMapping("getMicroPayAmountOnDate")
@ApiImplicitParams({
@ApiImplicitParam(name = "date", value = "日期yyyy-MM-dd", dataType = "string", paramType = "query")})
public ResultData getUnverifiedAmountOnDate(String date) {
//return wxCouponOrderService.listOnDateAsPage(getUser().getId(), date, null, null, false);
return new ResultData();
}
} }

+ 1
- 1
mallinkService/src/main/java/com/iformall/enums/EnumPayStatus.java Wyświetl plik

@@ -8,7 +8,7 @@ public enum EnumPayStatus {
PAY_STATUS_UNKNOWN(-1, "未知"), PAY_STATUS_UNKNOWN(-1, "未知"),
PAY_STATUS_WAIT(0, "支付中"), PAY_STATUS_WAIT(0, "支付中"),
PAY_STATUS_SUCCESS(1, "支付成功"), PAY_STATUS_SUCCESS(1, "支付成功"),
PAY_STATUS_ERR(2, "支付错误"),
PAY_STATUS_FAIL(2, "支付错误"),
PAY_STATUS_CANCEL(3, "取消支付"), PAY_STATUS_CANCEL(3, "取消支付"),
PAY_STATUS_CANCEL_FAIL(4,"取消支付失败"), PAY_STATUS_CANCEL_FAIL(4,"取消支付失败"),
PAY_STATUS_CLOSE(5, "关闭支付订单"), PAY_STATUS_CLOSE(5, "关闭支付订单"),


+ 7
- 0
mallinkService/src/main/java/com/iformall/service/WxOrderService.java Wyświetl plik

@@ -63,6 +63,13 @@ public interface WxOrderService {
*/ */
int orderSuccess(WxOrder updateOrder); int orderSuccess(WxOrder updateOrder);


/**
* microPayOrderSuccess 刷卡支付成功
* @param updateOrder
* @return
*/
int microPayOrderSuccess(WxOrder updateOrder);

/** /**
* updateOrderStatus 更新订单状态, 只针对已取消及已退款 * updateOrderStatus 更新订单状态, 只针对已取消及已退款
* @param updateOrder * @param updateOrder


+ 8
- 0
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java Wyświetl plik

@@ -68,6 +68,14 @@ public interface WxPayOrderService {
*/ */
void handleOrderPaySuccess(WxPayOrder record, String transactionId); void handleOrderPaySuccess(WxPayOrder record, String transactionId);


/**
* 刷卡支付成功处理
*
* @param record
* @param transactionId
*/
void handleMicroOrderPaySuccess(WxPayOrder record, String transactionId, String openId, String isSubscribe);

/** /**
* 支付状态处理 * 支付状态处理
* *


+ 106
- 4
mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java Wyświetl plik

@@ -21,6 +21,8 @@ import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;


import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;


@Service @Service
@@ -61,6 +63,9 @@ public class WxOrderServiceImpl implements WxOrderService {
@Autowired @Autowired
WxPayOrderMapper wxPayOrderMapper; WxPayOrderMapper wxPayOrderMapper;


@Autowired
WxMerchantBUserMapper wxMerchantBUserMapper;

@Autowired @Autowired
WxPayOrderService wxPayOrderService; WxPayOrderService wxPayOrderService;


@@ -599,12 +604,42 @@ public class WxOrderServiceImpl implements WxOrderService {
logger.error("订单更新失败:" + e.getMessage()); logger.error("订单更新失败:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR); throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR);
} }
// 创建couponOrder
// 创建couponOrder
try {
createCouponOrder(user, updateOrder, coupon);
} catch (Exception e) {
logger.error("保存订单:" + e.getMessage());
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
}

// 成长值 计算
try { try {
createCouponOrder(user, updateOrder, coupon);
wxScoreRulesService.addScore(EnumScoreType.CONSUMPTION,updateOrder);
} catch (Exception e) { } catch (Exception e) {
logger.error("保存订单:" + e.getMessage());
throw new MallinkException(ErrorCode.COUPON_ORDER_SAVE_ERR);
logger.error("成长值:" + e.getMessage());
}
return ret;
}

@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public int microPayOrderSuccess(WxOrder updateOrder) {
Date currentDate = new Date();
WxCUser user = wxCUserMapper.selectByPrimaryKey(updateOrder.getCUserId());
if (user == null) {
logger.error("用户不存在, userId: " + updateOrder.getCUserId());
throw new MallinkException(ErrorCode.USER_IS_EMPTY);
}
// 已支付,更新支付时间
updateOrder.setPaymentTime(currentDate);
updateOrder.setOrderStatus(EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS.getCode());
updateOrder.setUpdateDate(currentDate);
int ret = 0;
try {
ret = wxOrderMapper.updateByPrimaryKey(updateOrder);
} catch (Exception e) {
logger.error("订单更新失败:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_UPDATE_ERR);
} }


// 成长值 计算 // 成长值 计算
@@ -613,6 +648,8 @@ public class WxOrderServiceImpl implements WxOrderService {
} catch (Exception e) { } catch (Exception e) {
logger.error("成长值:" + e.getMessage()); logger.error("成长值:" + e.getMessage());
} }

//// TODO 支付发券
return ret; return ret;
} }


@@ -712,4 +749,69 @@ public class WxOrderServiceImpl implements WxOrderService {
return wxOrderMapper.selectDetailOfCUser(record); return wxOrderMapper.selectDetailOfCUser(record);
} }



/*
@Override
public ResultData microPayListOnDateAsPage(Long bUserId, String date, Integer pageIndex, Integer pageSize) {

WxMerchantBUser wxMerchantBUser = wxMerchantBUserMapper.selectByPrimaryKey(bUserId.longValue());
if (wxMerchantBUser == null) {
logger.error("B端用户不存在:" + bUserId);
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND);
}

WxMerchant wxMerchant = wxMerchantMapper.selectByPrimaryKey(wxMerchantBUser.getMerchantId());
if (wxMerchant == null) {
logger.error("商户不存在:" + bUserId);
throw new MallinkException(ErrorCode.MERCHANT_INFO_NOT_FOUND);
}

SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
String dateString;
Date startDate;
Date endDate;

if (date == null) {
endDate = new Date();
dateString = fmt.format(new Date());
try {
startDate = fmt.parse(dateString);
} catch (ParseException e) {
return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR);
}
} else {
try {
startDate = fmt.parse(date);
} catch (ParseException e) {
return new ResultData(ErrorCode.SYS_PARAMETER_CAST_ERROR);
}
Calendar cal = Calendar.getInstance();
cal.setTime(startDate);
cal.add(Calendar.DATE, 1);
endDate = cal.getTime();
}

Map dateMap = new HashMap();
dateMap.put("startDate", startDate);
dateMap.put("endDate", endDate);
dateMap.put("merchantID", wxMerchant.getId());

Map resultMap = new HashMap();

if (pageIndex == null || pageSize == null) {
List<WxCouponOrder> list;
list = wxOrderMapper.findListOfOrderedByDate(dateMap);
logger.info("find " + list.size() + " coupon order from " + startDate + " to " + new Date());
int total_price = 0;
for (WxCouponOrder couponOrder : list) {
total_price = total_price + couponOrder.getCouponPrice();
}
resultMap.put("amount", total_price);
} else {
resultMap.put("list", PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> wxCouponOrderMapper.findListOfOrderedByDateForBUser(dateMap)));
}
return new ResultData(resultMap);
}
*/

} }

+ 95
- 32
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java Wyświetl plik

@@ -461,22 +461,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
String openId = returnMap.get("openid"); String openId = returnMap.get("openid");
String isSubscribe = returnMap.get("is_subscribe"); String isSubscribe = returnMap.get("is_subscribe");
String transactionId = returnMap.get("transaction_id"); String transactionId = returnMap.get("transaction_id");

String err_code = returnMap.get("err_code");
String errMsg = returnMap.get("err_code_des");
if(errMsg.length() <= 0) {
errMsg = returnMap.get("return_msg");
}

record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
record.setTransactionId(transactionId); record.setTransactionId(transactionId);
record.setUpdateTime(new Date()); record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateByPrimaryKeySelective(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return new ResultData(Result.SUCCESS, errMsg, returnMap);
handleMicroOrderPaySuccess(record, transactionId, openId, isSubscribe);
return new ResultData(Result.SUCCESS, "刷卡支付成功", returnMap);
} else { } else {
String err_code = returnMap.get("err_code"); String err_code = returnMap.get("err_code");
String errMsg = returnMap.get("err_code_des"); String errMsg = returnMap.get("err_code_des");
@@ -544,23 +533,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
String openId = returnMap.get("openid"); String openId = returnMap.get("openid");
String isSubscribe = returnMap.get("is_subscribe"); String isSubscribe = returnMap.get("is_subscribe");
String transactionId = returnMap.get("transaction_id"); String transactionId = returnMap.get("transaction_id");

String err_code = returnMap.get("err_code");
String errMsg = returnMap.get("err_code_des");
if(errMsg.length() <= 0) {
errMsg = returnMap.get("return_msg");
}

record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
record.setTransactionId(transactionId); record.setTransactionId(transactionId);
record.setUpdateTime(new Date()); record.setUpdateTime(new Date());
try {
wxPayOrderMapper.updateByPrimaryKeySelective(record);
} catch (Exception e) {
logger.error("pay order update error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
// TODO update order
return new ResultData(Result.SUCCESS, errMsg, returnMap);
handleMicroOrderPaySuccess(record, transactionId, openId, isSubscribe);
return new ResultData(Result.SUCCESS, "刷卡支付成功", returnMap);
} else { } else {
String err_code = returnMap.get("err_code"); String err_code = returnMap.get("err_code");
String errMsg = returnMap.get("err_code_des"); String errMsg = returnMap.get("err_code_des");
@@ -717,7 +694,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
// handlePayOrderStatusUpdate(record); // handlePayOrderStatusUpdate(record);
return new ResultData(ErrorCode.PAY_ORDER_PAYING, returnMap); return new ResultData(ErrorCode.PAY_ORDER_PAYING, returnMap);
} else { } else {
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_ERR.getCode());
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_FAIL.getCode());
// handlePayOrderStatusUpdate(record); // handlePayOrderStatusUpdate(record);
return new ResultData(ErrorCode.PAY_ORDER_ERROR, returnMap); return new ResultData(ErrorCode.PAY_ORDER_ERROR, returnMap);
} }
@@ -1179,6 +1156,92 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
*/ */
} }


@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void handleMicroOrderPaySuccess(WxPayOrder record, String transactionId, String openId, String isSubscribe) {
Date currentDate = new Date();
EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus());
// 判断支付状态
if (payStatus == EnumPayStatus.PAY_STATUS_SUCCESS) {
// 已经是成功状态,只更新transactionId
try {
record.setUpdateTime(currentDate);
record.setTransactionId(transactionId);
wxPayOrderMapper.updateByPrimaryKeySelective(record);
} catch (Exception e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return;
}
if (payStatus != EnumPayStatus.PAY_STATUS_WAIT) {
logger.info("pay success handle, payOrder " + record.getPayOrderNo() +
"is paid success , orderId : " + record.getOrderId());
return;
}

// add c_user
Date curDate = new Date();
WxCUser userQ = new WxCUser();
userQ.setOpenId(openId);
userQ.setCreateDate(curDate);
userQ.setUpdateDate(curDate);
WxCUser user1 = wxCUserMapper.findByOpenId(userQ);
if(user1 == null) {
final IdWorker idWorker = IdWorker.get();
userQ.setId(idWorker.nextId());
wxCUserMapper.insertSelective(userQ);
} else {
userQ.setId(user1.getId());
}

WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId());
if (order == null) {
logger.error("pay success handle, order " + record.getOrderId() + " not found , payOrderid : " + record.getPayOrderNo());
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND);
}

// 修改支付订单状态
WxPayOrder updateOrder = new WxPayOrder();
updateOrder.setId(record.getId());
updateOrder.setOrderId(record.getOrderId());
updateOrder.setUpdateTime(currentDate);
updateOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
updateOrder.setTransactionId(transactionId);
try {
wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder);
} catch (Exception e) {
logger.error("支付订单数据库更新失败: " + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "支付订单数据库更新失败: " + e.getMessage());
}

// 修改订单状态
order.setCUserId(user1.getId());
try {
int _count = wxOrderService.microPayOrderSuccess(order);
if (_count > 1) {
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
}
} catch (Exception e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新");
}

/*
Map<String, String> msgMap = new HashMap<>();
try {
msgMap.put("name", String.valueOf(order.getCouponId()));
msgMap.put("orderNo", String.valueOf(order.getId()));
msgMap.put("createTime", Utility.getDataFormatString3(order.getCreateDate()));
msgMap.put("standingTime", order.getCreateDate() + "-" + currentDate );
// 短信 通知 商户
//smsSenderHandler.sendSms("SMS_18195394", order.getMobile(), msgMap);
} catch (Exception e) {
logger.error("pay success handle, sms send exception, payOrderi: " + updatePayOrder+ ", msgMap: " + msgMap.toString() + ", e: " + e.getMessage());
}
*/
}

@Override @Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void handlePayOrderStatusUpdate(WxPayOrder record) { public void handlePayOrderStatusUpdate(WxPayOrder record) {
@@ -1241,8 +1304,8 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND); throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND);
} }


if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_CANCEL.getCode()) {
// 支付订单取消
if (record.getPayOrderStatus() == EnumPayStatus.PAY_STATUS_FAIL.getCode()) {
// 支付订单失败,取消此订单
if (record.getPayAmount() > 0) { if (record.getPayAmount() > 0) {
payOrderQ = new WxPayOrder(); payOrderQ = new WxPayOrder();
payOrderQ.setTenantId(order.getTenantId()); payOrderQ.setTenantId(order.getTenantId());


+ 18
- 0
mallinkService/src/main/resources/mapper/WxOrderMapper.xml Wyświetl plik

@@ -238,5 +238,23 @@


</select> </select>


<select id="dayMicroPayAmountList" parameterType="com.iformall.domain.po.WxOrder" resultType="java.lang.Integer">
select count(*) from wx_order
where 1=1
<if test=" null != tenantId ">
and `tenant_id` = #{tenantId}
</if>
<if test=" null != cUserId ">
and `c_user_id` = #{cUserId}
</if>
<if test=" null != couponId ">
and `coupon_id` = #{couponId}
</if>
<if test=" null != orderStatus ">
and `order_status` = #{orderStatus}
</if>
and `create_date` between date_sub(now(),interval 1 day) and now()
</select>



</mapper> </mapper>

Ładowanie…
Anuluj
Zapisz