Просмотр исходного кода

[POS][修改]:B端联调-POS券独立核销检查

release_toaliyun_real
Stormeye Wu 6 лет назад
Родитель
Сommit
fda5ab7f0c
11 измененных файлов: 598 добавлений и 248 удалений
  1. +3
    -1
      mallinkBApi/src/main/java/com/iformall/controller/PosOrderController.java
  2. +23
    -238
      mallinkBApi/src/main/java/com/iformall/controller/WxPosController.java
  3. +451
    -0
      mallinkBApi/src/main/java/com/iformall/service/PosBrunService.java
  4. +9
    -5
      mallinkBApi/src/main/java/com/iformall/utils/PosUtil.java
  5. +16
    -1
      mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java
  6. +1
    -1
      mallinkService/src/main/java/com/iformall/domain/po/PosOrder.java
  7. +1
    -1
      mallinkService/src/main/java/com/iformall/domain/po/PosPayOrder.java
  8. +47
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumPosOrderStatus.java
  9. +1
    -1
      mallinkService/src/main/java/com/iformall/enums/EnumPosOrderType.java
  10. +38
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumPosPayType.java
  11. +8
    -0
      mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java

+ 3
- 1
mallinkBApi/src/main/java/com/iformall/controller/PosOrderController.java Просмотреть файл

@@ -1,7 +1,8 @@
package com.iformall.controller;

import com.iformall.common.ErrorCode;
import com.iformall.enums.EnumPosOrderType;
import com.iformall.service.PosBrunService;
import com.iformall.service.PosPayOrderService;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import org.slf4j.Logger;
@@ -26,6 +27,7 @@ import io.swagger.annotations.ApiOperation;
public class PosOrderController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());


private final PosOrderService posOrderService;

@ApiOperation("分页列表接口")


+ 23
- 238
mallinkBApi/src/main/java/com/iformall/controller/WxPosController.java Просмотреть файл

@@ -1,15 +1,11 @@
package com.iformall.controller;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.exception.MallinkException;
import com.iformall.pay.WxPayConstant;
import com.iformall.pay.WxPayment;
import com.iformall.utils.PosUtil;
import com.iformall.service.PosBrunService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
@@ -27,36 +23,12 @@ public class WxPosController extends BaseController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private String posDevId;

@Autowired
private String posReqKey;

@Autowired
private String posResKey;

@Autowired
private String posUrl;

PosUtil posUtil = new PosUtil();
private PosBrunService posService;

@ApiOperation(value = "检查POS Server是否正常", notes = "")
@GetMapping("checkAvaiable")
public ResultData checkAvaiable() {
try {
String resStr = posUtil.checkPosMemServer(posUrl);
if (resStr != null) {
return new ResultData();
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.checkAvaiable();
}

@ApiOperation(value = "商户POS用户/B端用户登录检查")
@@ -72,79 +44,19 @@ public class WxPosController extends BaseController {
if (StringUtils.isBlank(password)) {
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "密码不能为空");
}
try {
String resStr = posUtil.checkUserPassword(posUrl, posDevId, posReqKey,
user.getTenantId(), phone, password);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.checkUserPassword(user, phone, password);
}

@ApiOperation(value = "获取会员折扣/优惠券/消费卡是否启用")
@PostMapping("getPosMemConfig")
public ResultData getPosMemConfig() {
try {
String resStr = posUtil.getPosMemConfig(posUrl, posDevId, posReqKey,
getTenantId());
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.getPosMemConfig(getTenantId());
}

@ApiOperation(value = "获取注册二维码及小票二维码规则")
@PostMapping("getQrCode")
public ResultData getQrCode() {
try {
String resStr = posUtil.getQrCode(posUrl, posDevId, posReqKey,
getTenantId());
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.getQrCode(getTenantId());
}

@ApiOperation(value = "会员识别")
@@ -172,80 +84,22 @@ public class WxPosController extends BaseController {
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
try {
String resStr = posUtil.checkMem(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()),
memIdStr, memPhoneStr, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.checkMem(user, memIdStr, memPhoneStr, posOrderIdStr, posAmountStr);
}

@ApiOperation(value = "券核销检查")
@PostMapping("checkCouponOrderForVerify")
public ResultData checkCouponOrderForVerify(@RequestBody Map<String, String> params) {
@ApiOperation(value = "券独立核销检查")
@PostMapping("checkCouponOrderForIndepentVerify")
public ResultData checkCouponOrderForIndepentVerify(@RequestBody Map<String, String> params) {
WxMerchantBUser user = getUser();
String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券包ID
String verifyType = params.get(WxPayConstant.VERIFY_TYPE); // 核销类型
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID
String posAmountStr = params.get(WxPayConstant.POS_AMOUNT); // POS订单金额(单位:分)

if (StringUtils.isBlank(couponOrderIdStr)) {
String errMessage = "request params[coupon_order_id] error.";
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
if (StringUtils.isBlank(verifyType)) {
String errMessage = "request params[verify_type] error.";
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
if (StringUtils.isBlank(posOrderIdStr)) {
String errMessage = "request params[pos_order_id] error.";
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
if (StringUtils.isBlank(posAmountStr)) {
String errMessage = "request params[pos_amount] error.";
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
try {
String resStr = posUtil.checkCouponOrderForVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, verifyType, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
String verifyType = WxPayConstant.VERIFY_TYPE_INDEPENT;
return posService.checkCouponOrderForIndepentVerify(user, verifyType, couponOrderIdStr);
}

@ApiOperation(value = "券预核销")
@@ -271,28 +125,7 @@ public class WxPosController extends BaseController {
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
try {
String resStr = posUtil.couponOrderPreVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.couponOrderPreVerify(user, couponOrderIdStr, posOrderIdStr, posAmountStr);
}

@ApiOperation(value = "券预核销取消")
@@ -318,69 +151,21 @@ public class WxPosController extends BaseController {
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
try {
String resStr = posUtil.couponOrderPreVerifyCancel(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return posService.couponOrderPreVerifyCancel(user, couponOrderIdStr, posOrderIdStr, posAmountStr);
}

@ApiOperation(value = "券独立核销")
@PostMapping("couponOrderIndependentVerify")
public ResultData couponOrderIndependentVerify(@RequestBody Map<String, String> params) {
@ApiOperation(value = "券独立核销", notes = "{\"couponOrderId\":\"string\", \"payment\":\"string(单位:分)\"}")
@PostMapping("posVerifyIndepent")
public ResultData posVerifyIndepent(@RequestBody Map<String, String> params) {
WxMerchantBUser user = getUser();
String couponOrderIdStr = params.get(WxPayConstant.COUPON_ORDER_ID); // 券包ID
String posOrderIdStr = params.get(WxPayConstant.POS_ORDER_ID); // POS订单ID

if (StringUtils.isBlank(couponOrderIdStr)) {
String errMessage = "request params[coupon_order_id] error.";
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
if (StringUtils.isBlank(posOrderIdStr)) {
String errMessage = "request params[pos_order_id] error.";
String couponOrderId = params.get("coupon_order_id");
String payment = params.get("payment");
if (StringUtils.isBlank(couponOrderId)) {
String errMessage = "券ID为空";
logger.error(errMessage);
throw new MallinkException(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
try {
String resStr = posUtil.couponOrderIndependentVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, posOrderIdStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), errMessage);
}
return posService.posVerifyIndepent(user, couponOrderId, payment);
}

@ApiOperation(value = "核销接口", notes = "{\"couponOrderId\":\"string\"}")


+ 451
- 0
mallinkBApi/src/main/java/com/iformall/service/PosBrunService.java Просмотреть файл

@@ -0,0 +1,451 @@
package com.iformall.service;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.iformall.common.ErrorCode;
import com.iformall.common.Result;
import com.iformall.common.ResultData;
import com.iformall.domain.po.PosOrder;
import com.iformall.domain.po.PosPayOrder;
import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.enums.EnumPosOrderStatus;
import com.iformall.enums.EnumPosOrderType;
import com.iformall.enums.EnumPosPayType;
import com.iformall.exception.MallinkException;
import com.iformall.pay.WxPayConstant;
import com.iformall.pay.WxPayment;
import com.iformall.utils.PosUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.Date;
import java.util.Map;

@Service
public class PosBrunService {
private final Logger logger = LoggerFactory.getLogger(this.getClass());

@Autowired
private String posDevId;

@Autowired
private String posReqKey;

@Autowired
private String posResKey;

@Autowired
private String posUrl;

@Autowired
private PosOrderService posOrderService;

@Autowired
private PosPayOrderService posPayOrderService;

PosUtil posUtil = new PosUtil();

/**
* 检查POS Server是否正常
* @return
*/
public ResultData checkAvaiable() {
try {
String resStr = posUtil.checkPosMemServer(posUrl);
if (resStr != null) {
return new ResultData();
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 商户POS用户/B端用户登录检查
* @param user
* @param phone
* @param password
* @return
*/
public ResultData checkUserPassword(WxMerchantBUser user, String phone, String password) {
try {
String resStr = posUtil.checkUserPassword(posUrl, posDevId, posReqKey,
user.getTenantId(), phone, password);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 获取会员折扣/优惠券/消费卡是否启用
* @param tenantId
* @return
*/
public ResultData getPosMemConfig(String tenantId) {
try {
String resStr = posUtil.getPosMemConfig(posUrl, posDevId, posReqKey, tenantId);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 获取注册二维码及小票二维码规则
* @param tenantId
* @return
*/
public ResultData getQrCode(String tenantId) {
try {
String resStr = posUtil.getQrCode(posUrl, posDevId, posReqKey, tenantId);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 会员识别
* @param user
* @param memIdStr
* @param memPhoneStr
* @param posOrderIdStr
* @param posAmountStr
* @return
*/
public ResultData checkMem(WxMerchantBUser user,
String memIdStr, String memPhoneStr,
String posOrderIdStr, String posAmountStr) {
try {
String resStr = posUtil.checkMem(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()),
memIdStr, memPhoneStr, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 券独立核销检查
* @param user
* @param verifyType
* @param couponOrderIdStr
* @return
*/
public ResultData checkCouponOrderForIndepentVerify(WxMerchantBUser user,
String verifyType,
String couponOrderIdStr) {
try {
String resStr = posUtil.checkCouponOrderForVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
verifyType, couponOrderIdStr, null, null);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 券独立核销检查
* @param user
* @param verifyType
* @param couponOrderIdStr
* @param posOrderIdStr
* @param posAmountStr
* @return
*/
public ResultData checkCouponOrderForVerify(WxMerchantBUser user,
String verifyType,
String couponOrderIdStr,
String posOrderIdStr, String posAmountStr) {
try {
String resStr = posUtil.checkCouponOrderForVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, verifyType, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 券预核销
* @param user
* @param couponOrderIdStr
* @param posOrderIdStr
* @param posAmountStr
* @return
*/
public ResultData couponOrderPreVerify(WxMerchantBUser user,
String couponOrderIdStr,
String posOrderIdStr, String posAmountStr) {
try {
String resStr = posUtil.couponOrderPreVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 券预核销取消
* @param user
* @param couponOrderIdStr
* @param posOrderIdStr
* @param posAmountStr
* @return
*/
public ResultData couponOrderPreVerifyCancel(WxMerchantBUser user,
String couponOrderIdStr,
String posOrderIdStr, String posAmountStr) {
try {
String resStr = posUtil.couponOrderPreVerifyCancel(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, posOrderIdStr, posAmountStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

/**
* 券独立核销
* @param user
* @param couponOrderIdStr
* @param posOrderIdStr
* @return
*/
public ResultData couponOrderIndependentVerify(WxMerchantBUser user, String couponOrderIdStr, String posOrderIdStr) {
try {
String resStr = posUtil.couponOrderIndependentVerify(posUrl, posDevId, posReqKey,
user.getTenantId(), String.valueOf(user.getMerchantId()), String.valueOf(user.getId()),
couponOrderIdStr, posOrderIdStr);
if (resStr != null) {
JSONObject retObj = JSON.parseObject(resStr);
Map options = retObj;
if (!WxPayment.verifyNotifyHMAC(options, posResKey)) {
return new ResultData(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} else {
return new ResultData(resStr);
}
} else {
return new ResultData(Result.ERROR, "无返回值");
}
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
}

public ResultData posVerifyIndepent(WxMerchantBUser user, String couponOrderId, String payment) {
// 1. 创建 POS订单
PosOrder posOrder = new PosOrder();
posOrder.setTenantId(user.getTenantId());
posOrder.setType(EnumPosOrderType.VERIFY_INDEPENDENT.getCode());
posOrder.setBuUserId(user.getId());
posOrder.setOrderStatus(EnumPosOrderStatus.PENDING_VERIFY.getCode());
posOrder.setPaymentType(EnumPosPayType.PAY_VERIFY_INDEPENT.getCode());
if (StringUtils.isNotBlank(payment)) {
posOrder.setPayment(Integer.valueOf(payment));
}
try {
posOrderService.saveOrUpdate(posOrder);
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
// 2. 创建 POS支付订单
Date curDate = new Date();
PosPayOrder posPayOrder = new PosPayOrder();
posPayOrder.setTenantId(user.getTenantId());
posPayOrder.setBuUserId(user.getId());
posPayOrder.setOrderId(posOrder.getId());
posPayOrder.setType(EnumPosPayType.PAY_VERIFY_INDEPENT.getCode());
posPayOrder.setPayTimeStart(curDate);
posPayOrder.setPayTimeEnd(curDate);
posPayOrder.setPayOrderNo(couponOrderId);
posPayOrder.setPayOrderStatus(EnumPosOrderStatus.PENDING_VERIFY.getCode());
posPayOrder.setCreateTime(curDate);
posPayOrder.setUpdateTime(curDate);
try {
posPayOrderService.saveOrUpdate(posPayOrder);
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}

// 3. POS支付订单支付
try {
couponOrderIndependentVerify(user, couponOrderId, posOrder.getPosOrderNo());
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}

try {
PosPayOrder updateOrder = new PosPayOrder();
updateOrder.setId(posPayOrder.getId());
updateOrder.setPayOrderStatus(EnumPosOrderStatus.VERIFY_SUCCESS.getCode());
posPayOrderService.saveOrUpdate(posPayOrder);
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}

// 4. POS订单支付
try {
PosOrder updateOrder = new PosOrder();
updateOrder.setId(posOrder.getId());
posOrder.setOrderStatus(EnumPosOrderStatus.VERIFY_SUCCESS.getCode());
posOrderService.saveOrUpdate(posOrder);
} catch (MallinkException e) {
logger.error(e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
return new ResultData(Result.ERROR, e.getMessage());
}
return new ResultData();
}
}

+ 9
- 5
mallinkBApi/src/main/java/com/iformall/utils/PosUtil.java Просмотреть файл

@@ -254,25 +254,29 @@ public class PosUtil {
* @param tenantId
* @param merchantId
* @param buUserId
* @param couponOrderId
* @param verifyType
* @param couponOrderId
* @param posOrderId
* @param posAmount
* @return 券是否可核销
*/
public String checkCouponOrderForVerify(String baseUrl, String devId, String reqKey,
String tenantId, String merchantId, String buUserId,
String couponOrderId, String verifyType,
String verifyType, String couponOrderId,
String posOrderId, String posAmount) throws MallinkException {
Map<String, String> paramMap = new HashMap<>();
paramMap.put(WxPayConstant.DEV_ID, devId);
paramMap.put(WxPayConstant.TENANT_ID, tenantId);
paramMap.put(WxPayConstant.MERCHANT_ID, merchantId);
paramMap.put(WxPayConstant.BUSER_ID, buUserId);
paramMap.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId);
paramMap.put(WxPayConstant.VERIFY_TYPE, verifyType);
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
paramMap.put(WxPayConstant.COUPON_ORDER_ID, couponOrderId);
if (StringUtils.isNotBlank(posOrderId)) {
paramMap.put(WxPayConstant.POS_ORDER_ID, posOrderId);
}
if (StringUtils.isNotBlank(posAmount)) {
paramMap.put(WxPayConstant.POS_AMOUNT, posAmount);
}
paramMap = WxPayment.buildSignAfterParasMapForHMAC(paramMap, reqKey);

String respStr = doPost(baseUrl + URL_CheckCouponOrderForVerify, paramMap);


+ 16
- 1
mallinkPosApi/src/main/java/com/iformall/service/impl/PosServiceImpl.java Просмотреть файл

@@ -13,7 +13,6 @@ import com.iformall.mapper.WxCouponMapper;
import com.iformall.mapper.WxCouponMerchantMapper;
import com.iformall.mapper.WxCouponOrderMapper;
import com.iformall.mapper.WxOrderMapper;
import com.iformall.pay.WxPay;
import com.iformall.pay.WxPayConstant;
import com.iformall.service.*;
import lombok.AllArgsConstructor;
@@ -24,6 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestBody;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@@ -53,6 +53,9 @@ public class PosServiceImpl implements PosService {
private final WxCouponMerchantMapper couponMerchantMapper;
private final WxCouponMapper couponMapper;


private final SimpleDateFormat mydateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

/**
* 门店用户登录检查
* @param params
@@ -711,11 +714,23 @@ public class PosServiceImpl implements PosService {
logger.info("券可以被核销: " + couponOrderIdStr);
retMap.put(WxPayConstant.ID, couponOrderIdStr);
retMap.put(WxPayConstant.CHECK, WxPayConstant.TRUE);
retMap.put(WxPayConstant.MEM_ID, String.valueOf(couponOrderCVo.getCUserId()));
retMap.put(WxPayConstant.TITLE, couponOrderCVo.getTitle());
retMap.put(WxPayConstant.COVER_IMG, couponOrderCVo.getCoverImg());
retMap.put(WxPayConstant.EXPIRE_TIME, mydateFormat.format(couponOrderCVo.getExpiredTime()));
retMap.put(WxPayConstant.PRICE, String.valueOf(couponOrderCVo.getPrice()));
retMap.put(WxPayConstant.STATUS, EnumCouponOrderStatus.getEnum(couponOrderCVo.getCouponOrderStatus()).getMessage());
return retMap;
} else if (couponOrderCVo.getCouponOrderStatus().equals(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode())) {
logger.info("券可以被核销: " + couponOrderIdStr);
retMap.put(WxPayConstant.ID, couponOrderIdStr);
retMap.put(WxPayConstant.CHECK, WxPayConstant.TRUE);
retMap.put(WxPayConstant.MEM_ID, String.valueOf(couponOrderCVo.getCUserId()));
retMap.put(WxPayConstant.TITLE, couponOrderCVo.getTitle());
retMap.put(WxPayConstant.COVER_IMG, couponOrderCVo.getCoverImg());
retMap.put(WxPayConstant.EXPIRE_TIME, mydateFormat.format(couponOrderCVo.getExpiredTime()));
retMap.put(WxPayConstant.PRICE, String.valueOf(couponOrderCVo.getPrice()));
retMap.put(WxPayConstant.STATUS, EnumCouponOrderStatus.getEnum(couponOrderCVo.getCouponOrderStatus()).getMessage());
return retMap;
}
} else if (actionType.equals(EnumVerifyActionType.PRE_VERIFY)) {


+ 1
- 1
mallinkService/src/main/java/com/iformall/domain/po/PosOrder.java Просмотреть файл

@@ -29,7 +29,7 @@ public class PosOrder implements Serializable {
private Integer orderStatus;
@io.swagger.annotations.ApiModelProperty(value="b端用户",name="buUserId")
private Long buUserId;
@io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款 2:自动退款 3:A端退款",name="paymentType")
@io.swagger.annotations.ApiModelProperty(value="0: 付款 1: 退款 2:自动退款 3:A端退款 10.核销",name="paymentType")
private Integer paymentType;
@io.swagger.annotations.ApiModelProperty(value="支付金额:允许有负数,退款时为负值。核销时,金额可以不填写",name="paymentType")
private Integer payment;


+ 1
- 1
mallinkService/src/main/java/com/iformall/domain/po/PosPayOrder.java Просмотреть файл

@@ -32,7 +32,7 @@ public class PosPayOrder implements Serializable {
private Long buUserId;
@io.swagger.annotations.ApiModelProperty(value="支付类型(1:独立核销 2:支付核销 3:现金支付)",name="type")
private Integer type;
@io.swagger.annotations.ApiModelProperty(value="支付来源(0: 现金, 1:微信 2:支付核销 3:现金支付)",name="payFrom")
@io.swagger.annotations.ApiModelProperty(value="支付来源(0: 现金, 1:微信 2:支付核销 3:现金支付, 10:券)",name="payFrom")
private Integer payFrom;
@io.swagger.annotations.ApiModelProperty(value="支付金额(分)",name="payAmount")
private Integer payAmount;


+ 47
- 0
mallinkService/src/main/java/com/iformall/enums/EnumPosOrderStatus.java Просмотреть файл

@@ -0,0 +1,47 @@
package com.iformall.enums;


/**
* @author Stormeye
*/

public enum EnumPosOrderStatus {

PENDING_PAYMENT(0, "待付款"),
PAYMENT_SUCCESS(1, "已支付"),
OVERTIME_CANCEL(2, "已取消"),
PENDING_REFUND(3, "待退款"),
REFUND_SUCCESS(4,"已退款"),
REFUND_FAILD(5, "退款失败"),
PENDING_VERIFY(10, "待核销"),
VERIFY_SUCCESS(11, "已核销"),
VERIFY_CANCEL(12, "核销待退"),
VERIFY_CANCELED(13, "核销已退")
;


public static EnumPosOrderStatus getEnum(Integer code) {
for (EnumPosOrderStatus value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}

private Integer code;
private String message;

EnumPosOrderStatus(Integer code, String message) {
this.code = code;
this.message = message;
}

public Integer getCode() {
return code;
}

public String getMessage() {
return message;
}
}

+ 1
- 1
mallinkService/src/main/java/com/iformall/enums/EnumPosOrderType.java Просмотреть файл

@@ -2,7 +2,7 @@ package com.iformall.enums;


/**
* @author gongbiao
* @author Stormeye
*/

public enum EnumPosOrderType {


+ 38
- 0
mallinkService/src/main/java/com/iformall/enums/EnumPosPayType.java Просмотреть файл

@@ -0,0 +1,38 @@
package com.iformall.enums;

/**
* Created by Stormeye on 2018/08/09.
*/
public enum EnumPosPayType {

PAY_PAYMENT(0, "付款"),
PAY_B_REFUND(1, "B端退款"),
PAY_AUTO_REFUND(2, "自动退款"),
PAY_ADMIN_REFUND(3, "A端退款"),
PAY_VERIFY_INDEPENT(10, "核销"),
;
public static EnumPosPayType getEnum(Integer code) {
for (EnumPosPayType value : values()) {
if (value.getCode().equals(code)) {
return value;
}
}
return null;
}

private Integer code;
private String message;

EnumPosPayType(Integer code, String message) {
this.code = code;
this.message = message;
}

public Integer getCode() {
return code;
}

public String getMessage() {
return message;
}
}

+ 8
- 0
mallinkService/src/main/java/com/iformall/pay/WxPayConstant.java Просмотреть файл

@@ -32,6 +32,14 @@ public class WxPayConstant {
public final static String PHONE = "phone";
public final static String PASSWORD = "password";

public final static String TITLE = "title";
public final static String COVER_IMG = "cover_img";
public final static String EXPIRE_TIME = "expire_time";
public final static String VALID_START_DATE = "valid_start_date";
public final static String VALID_END_DATE = "valid_end_date";
public final static String PRICE = "price";
public final static String STATUS = "status";

public final static String VERIFY_TYPE = "verify_type";
public final static String VERIFY_TYPE_INDEPENT = "independent";
public final static String VERIFY_TYPE_PAY = "pay";


Загрузка…
Отмена
Сохранить