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

[支付][刷卡支付]:分账+发券

release_toaliyun_real
Stormeye Wu 7 лет назад
Родитель
Сommit
9fb9f0620b
15 измененных файлов: 255 добавлений и 98 удалений
  1. +34
    -8
      mallinkAdmin/src/main/java/com/iformall/controller/WxMallConfigController.java
  2. +20
    -11
      mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java
  3. +2
    -2
      mallinkBApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java
  4. +20
    -8
      mallinkService/src/main/java/com/iformall/domain/po/WxCUser.java
  5. +2
    -2
      mallinkService/src/main/java/com/iformall/enums/EnumCouponSendSendType.java
  6. +38
    -0
      mallinkService/src/main/java/com/iformall/enums/EnumUserIsSubscribe.java
  7. +8
    -0
      mallinkService/src/main/java/com/iformall/service/WxCouponOrderService.java
  8. +1
    -1
      mallinkService/src/main/java/com/iformall/service/WxOrderService.java
  9. +3
    -5
      mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java
  10. +15
    -0
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java
  11. +11
    -7
      mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java
  12. +2
    -1
      mallinkService/src/main/java/com/iformall/service/impl/WxOrderServiceImpl.java
  13. +88
    -52
      mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java
  14. +10
    -1
      mallinkService/src/main/resources/mapper/WxCUserMapper.xml
  15. +1
    -0
      mallinkService/src/main/resources/mapper/WxOrderMapper.xml

+ 34
- 8
mallinkAdmin/src/main/java/com/iformall/controller/WxMallConfigController.java Просмотреть файл

@@ -21,7 +21,7 @@ public class WxMallConfigController extends BaseController {
private WxMallConfigService wxMallConfigService;

@ApiOperation("获取停车劵开关")
@GetMapping("getStopCarConpon")
@GetMapping("getStopCarCoupon")
public ResultData getStopCarConpon() {
WxMallConfig wxMallConfig = new WxMallConfig();
wxMallConfig.setKey("stopCarCouponSwitch");
@@ -35,10 +35,10 @@ public class WxMallConfigController extends BaseController {
}

@ApiOperation("获取核销劵开关")
@GetMapping("getVerifyConpon")
@GetMapping("getVerifyCoupon")
public ResultData getVerifyConpon() {
WxMallConfig wxMallConfig = new WxMallConfig();
wxMallConfig.setKey("verifyConponSwitch");
wxMallConfig.setKey("verifyCouponSwitch");
wxMallConfig.setTenantId(getTenantId());
PageInfo<WxMallConfig> page = wxMallConfigService.listAsPage(wxMallConfig, 1, 1);
if (page.getSize() > 0) {
@@ -48,8 +48,22 @@ public class WxMallConfigController extends BaseController {
return new ResultData();
}

@PostMapping("updateStopCarConpon")
@ApiOperation("修改停车开关")
@ApiOperation("获取B端刷卡支付发劵开关")
@GetMapping("getMicroPayCouponSwitch")
public ResultData getMicroPayConpon() {
WxMallConfig wxMallConfig = new WxMallConfig();
wxMallConfig.setKey("microPayCouponSwitch");
wxMallConfig.setTenantId(getTenantId());
PageInfo<WxMallConfig> page = wxMallConfigService.listAsPage(wxMallConfig, 1, 1);
if (page.getSize() > 0) {
WxMallConfig config = page.getList().get(0);
return new ResultData(config);
}
return new ResultData();
}

@PostMapping("updateStopCarCoupon")
@ApiOperation("修改停车发券开关")
public ResultData updateStopCarConpon(@RequestBody WxMallConfig wxMallConfig) {
WxMallConfig temp = new WxMallConfig();
// temp.setKey("stopCarCouponSwitch");
@@ -59,11 +73,23 @@ public class WxMallConfigController extends BaseController {
return new ResultData();
}

@PostMapping("updateVerifyConpon")
@ApiOperation("修改核销开关")
@PostMapping("updateVerifyCoupon")
@ApiOperation("修改核销发券开关")
public ResultData updateVerifyConpon(@RequestBody WxMallConfig wxMallConfig) {
WxMallConfig temp = new WxMallConfig();
// temp.setKey("verifyConponSwitch");
// temp.setKey("verifyCouponSwitch");
temp.setValue(wxMallConfig.getValue());
temp.setId(wxMallConfig.getId());
wxMallConfigService.saveOrUpdate(temp);
return new ResultData();
}


@PostMapping("updateMicroPayCouponSwitch")
@ApiOperation("修改刷卡支付发券开关")
public ResultData updateMicroPayCoupon(@RequestBody WxMallConfig wxMallConfig) {
WxMallConfig temp = new WxMallConfig();
// temp.setKey("verifyCouponSwitch");
temp.setValue(wxMallConfig.getValue());
temp.setId(wxMallConfig.getId());
wxMallConfigService.saveOrUpdate(temp);


+ 20
- 11
mallinkBApi/src/main/java/com/iformall/controller/WxMicroPayController.java Просмотреть файл

@@ -5,6 +5,7 @@ import com.iformall.common.ErrorCode;
import com.iformall.common.ResultData;
import com.iformall.config.PayProperty;
import com.iformall.domain.po.*;
import com.iformall.enums.EnumAppType;
import com.iformall.enums.EnumOrderType;
import com.iformall.enums.EnumPayWay;
import com.iformall.enums.EnumRefundWay;
@@ -51,6 +52,9 @@ public class WxMicroPayController extends BaseController {
@Autowired
WxRefundOrderService wxRefundOrderService;

@Autowired
WxAppinfoService wxAppinfoService;

@ApiOperation(value = "刷卡支付订单", notes = "params:{\"authCode\":\"String\",\"totalFee\":\"String\"},\n" +
"注意:\n" +
"提醒1:提交支付请求后微信会同步返回支付结果。当返回结果为“系统错误”时,商户系统等待5秒后调用【查询订单API】,查询支付实际交易结果;当返回结果为“USERPAYING”时,商户系统可设置间隔时间(建议10秒)重新查询支付结果,直到支付成功或超时(建议30秒);\n" +
@@ -64,9 +68,11 @@ public class WxMicroPayController extends BaseController {
String totalFeeStr = paramMap.get("totalFee");

if (StringUtils.isBlank(authCode)) {
logger.error("authCode不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "authCode不能为空");
}
if (StringUtils.isBlank(totalFeeStr)) {
logger.error("totalFee不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "totalFee不能为空");
}

@@ -78,23 +84,22 @@ public class WxMicroPayController extends BaseController {
try {
order = wxOrderService.saveMicroOrder(user, totalFeeStr);
} catch (MallinkException e) {
logger.error(e.getMessage());
logger.error("saveMicopayOrder 1" + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
logger.error("saveMicopayOrder 2" + e.getMessage());
return new ResultData(ErrorCode.ORDER_IS_FAIL, e.getMessage());
}

WxAppinfo appInfo = getAppInfo(user.getAppId());

WxPayOrder record = new WxPayOrder();
record.setTenantId(user.getTenantId());
record.setOrderId(order.getId());
record.setAuthCode(authCode);
record.setPayAmount(order.getPayment());
record.setIp(ipStr);

try {
return wxPayOrderService.createMicroPayOrder(payProperty.isReal(), appInfo, user, record, EnumPayWay.PAY_WAY_WECHAT);
return wxPayOrderService.createMicroPayOrder(payProperty.isReal(), user, record, EnumPayWay.PAY_WAY_WECHAT);
} catch (MallinkException e) {
logger.error("payment wechat, order create error, req 2: " + record.toString() + ", e:" + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
@@ -112,13 +117,14 @@ public class WxMicroPayController extends BaseController {
String orderIdStr = paramMap.get("orderId");

if (StringUtils.isBlank(payOrderIdStr)) {
logger.error("payOrderId不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId不能为空");
}
if (StringUtils.isBlank(orderIdStr)) {
logger.error("orderId不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空");
}
WxMerchantBUser user = getUser();
WxAppinfo appInfo = getAppInfo(user.getAppId());

Long payOrderId = 0L;
Long orderId = 0L;
@@ -138,12 +144,13 @@ public class WxMicroPayController extends BaseController {
}

WxPayOrder record = new WxPayOrder();
record.setTenantId(user.getTenantId());
record.setId(payOrderId);
record.setbUserId(user.getId());
record.setOrderId(orderId);

try {
ResultData resultData = wxPayOrderService.payOrderQuery(appInfo, record);
ResultData resultData = wxPayOrderService.payOrderQuery(record);
return resultData;
} catch (MallinkException e) {
logger.error("payment wechat, order query error, req 2: " + record.toString() + ", e:" + e.getMessage());
@@ -162,13 +169,14 @@ public class WxMicroPayController extends BaseController {
String orderIdStr = paramMap.get("orderId");

if (StringUtils.isBlank(payOrderIdStr)) {
logger.error("payOrderId不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "payOrderId不能为空");
}
if (StringUtils.isBlank(orderIdStr)) {
logger.error("orderId不能为空");
return new ResultData(ErrorCode.SYS_PARAMETER_NOT_NULL.getCode(), "orderId不能为空");
}
WxMerchantBUser user = getUser();
WxAppinfo appInfo = getAppInfo(user.getAppId());

Long payOrderId = 0L;
Long orderId = 0L;
@@ -188,13 +196,14 @@ public class WxMicroPayController extends BaseController {
}

WxPayOrder record = new WxPayOrder();
record.setTenantId(user.getTenantId());
record.setId(payOrderId);
record.setPayOrderNo(payOrderIdStr);
record.setbUserId(user.getId());
record.setOrderId(orderId);

try {
return wxPayOrderService.payOrderReverse(appInfo, record);
return wxPayOrderService.payOrderReverse(record);
} catch (MallinkException e) {
logger.error("payment wechat, order query error, req 2: " + record.toString() + ", e:" + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
@@ -248,10 +257,10 @@ public class WxMicroPayController extends BaseController {
ResultData rd = wxRefundOrderService.createRefundOrderFromMicroPay(payProperty.isReal(), appinfo, orderId, EnumRefundWay.B, bUser.getId());
return rd;
} catch (MallinkException e) {
logger.error(e.getMessage());
logger.error("退款 1:" + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) {
logger.error(e.getMessage());
logger.error("退款 2:" + e.getMessage());
return new ResultData(ErrorCode.REFUND_ORDER_ERROR);
}
}


+ 2
- 2
mallinkBApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java Просмотреть файл

@@ -15,13 +15,13 @@ public class TenantInfoImpl implements TenantInfo {

@Override
public String getTenantId() {
String tenantId = "";
String tenantId = null;
try {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
tenantId = (String) request.getAttribute(AuthorizationInterceptor.TENANT_ID);
return tenantId;
} catch (Exception e) {
logger.error(e.getMessage());
logger.error("getTenantId: " + e.getMessage());
}
return tenantId;
}


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

@@ -129,14 +129,9 @@ public class WxCUser implements Serializable {
/*附加信息**/
@io.swagger.annotations.ApiModelProperty(value="附加信息",name="extraInfo")
private String extraInfo;

public String getExtraInfo() {
return extraInfo;
}

public void setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
}
/**是否关注公众号**/
@io.swagger.annotations.ApiModelProperty(value="是否关注公众号",name="isSubscribe")
private Integer isSubscribe;

//渠道名称
@Transient
@@ -331,6 +326,22 @@ public class WxCUser implements Serializable {
this.sceneDescription = sceneDescription;
}

public String getExtraInfo() {
return extraInfo;
}

public void setExtraInfo(String extraInfo) {
this.extraInfo = extraInfo;
}

public Integer getIsSubscribe() {
return isSubscribe;
}

public void setIsSubscribe(Integer isSubscribe) {
this.isSubscribe = isSubscribe;
}

public static enum Field
{
Id_ASC("`id` ASC"),Id_DESC("`id` DESC")
@@ -362,6 +373,7 @@ public class WxCUser implements Serializable {
,Latitude_ASC("`latitude` ASC"),Latitude_DESC("`latitude` DESC")
,LoginCount_ASC("`login_count` ASC"),LoginCount_DESC("`login_count` DESC")
,ExtraInfo_ASC("`extra_info` ASC"),ExtraInfo_DESC("`extra_info` DESC")
,IsSubscribe_ASC("`is_subscribe` ASC"),IsSubscribe_DESC("`is_subscribe` DESC")
;
private String value;
Field(String value){


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

@@ -5,13 +5,13 @@ package com.iformall.enums;
*/
public enum EnumCouponSendSendType {

// 2:停车发券 3:核销发券
// 2:停车发券 3:核销发券 4: B端刷卡发券
UNKNOWN(-1, "未知"),
INJECT(0, "精准发券"),
ACTIVE(1, "主动(保留)"),
CAR_STOP(2, "停车发券"),
COUPON_VERIFY(3, "核销发券"),
B_MICROPAY(4, "B端刷卡发券")
;

public static EnumCouponSendSendType getEnum(Integer code) {


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

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

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

// 0-否 1-是

NO(0, "N"),
YES(1, "Y")
;

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

private Integer code;
private String message;

EnumUserIsSubscribe(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/service/WxCouponOrderService.java Просмотреть файл

@@ -4,6 +4,7 @@ import com.github.pagehelper.PageInfo;
import com.iformall.common.ResultData;
import com.iformall.domain.po.WxCouponOrder;
import com.iformall.domain.po.WxMerchantBUser;
import com.iformall.domain.po.WxOrder;
import com.iformall.domain.vo.CUserDateAmountVo;

import java.util.Date;
@@ -70,6 +71,13 @@ public interface WxCouponOrderService {
*/
boolean sendCouponAfterVerify(WxCouponOrder couponOrder, WxMerchantBUser bUser);

/**
* B端刷卡支付发券
* @param order
* @param bUser
*/
boolean sendCouponAfterMicroPay(String tenantId, Long orderId, Long cUserId);

/**
* 核销分账
* @param couponOrder


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

@@ -133,6 +133,6 @@ public interface WxOrderService {
* @param orderId
* @param payOrderId
*/
void shareForMicroPay(Long orderId, Long payOrderId);
void shareForMicroPay(String tenantId, Long orderId, Long payOrderId);

}

+ 3
- 5
mallinkService/src/main/java/com/iformall/service/WxPayOrderService.java Просмотреть файл

@@ -28,14 +28,13 @@ public interface WxPayOrderService {
* @param payWay
* @return
*/
ResultData createMicroPayOrder(boolean isReal, WxAppinfo appInfo, WxMerchantBUser user, WxPayOrder record, EnumPayWay payWay);
ResultData createMicroPayOrder(boolean isReal, WxMerchantBUser user, WxPayOrder record, EnumPayWay payWay);

/**
* 微信支付订单查询
* @param appInfo 支付订单Appinfo
* @param record 支付订单
*/
ResultData payOrderQuery(WxAppinfo appInfo, WxPayOrder record);
ResultData payOrderQuery(WxPayOrder record);

/**
* 微信支付关闭订单
@@ -46,10 +45,9 @@ public interface WxPayOrderService {

/**
* 微信支付刷卡支付撤销订单
* @param appInfo 支付订单Appinfo
* @param record 支付订单
*/
ResultData payOrderReverse(WxAppinfo appInfo, WxPayOrder record);
ResultData payOrderReverse(WxPayOrder record);

/**
* 异步通知


+ 15
- 0
mallinkService/src/main/java/com/iformall/service/impl/WxCouponOrderServiceImpl.java Просмотреть файл

@@ -368,6 +368,7 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {
// 微信分账
try {
WxPayOrder wxPayOrder = new WxPayOrder();
wxPayOrder.setTenantId(couponOrder.getTenantId());
wxPayOrder.setOrderId(couponOrder.getOrderId());
wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());
wxPayOrder = wxPayOrderMapper.selectOne(wxPayOrder);
@@ -392,6 +393,20 @@ public class WxCouponOrderServiceImpl implements WxCouponOrderService {
return false;
}

@Override
public boolean sendCouponAfterMicroPay(String tenantId, Long orderId, Long cUserId) {
// B端刷卡支付发券
WxOrder wxOrder = wxOrderMapper.selectByPrimaryKey(orderId);
if (wxOrder != null) {
try {
return wxCouponSendService.sendCouponToUser(tenantId, cUserId, EnumCouponSendSendType.B_MICROPAY);
} catch (Exception e) {
logger.error("核销发券: " + e.getMessage());
}
}
return false;
}

/**
* 微信模板消息
*


+ 11
- 7
mallinkService/src/main/java/com/iformall/service/impl/WxCouponSendServiceImpl.java Просмотреть файл

@@ -73,7 +73,7 @@ public class WxCouponSendServiceImpl implements WxCouponSendService {
@Transactional
public boolean sendCouponToUser(String tenantId, Long cUserId, EnumCouponSendSendType type) {
//查询开关是否打开
//查询停车或者核销的券 stopCarCouponSwitch verifyConponSwitch
//查询停车或者核销的券 stopCarCouponSwitch, verifyCouponSwitch, microPayCouponSwitch
WxCouponSend wxCouponSendQuery = new WxCouponSend();
wxCouponSendQuery.setTenantId(tenantId);
wxCouponSendQuery.setStatus(EnumCouponSendStatus.VALID.getCode());
@@ -84,13 +84,17 @@ public class WxCouponSendServiceImpl implements WxCouponSendService {
actionType = EnumCouponSendSendType.CAR_STOP.getCode();
wxCouponSendQuery.setSendType(actionType);
configKey = "stopCarCouponSwitch";
}
else if (type == EnumCouponSendSendType.COUPON_VERIFY) {
} else if (type == EnumCouponSendSendType.COUPON_VERIFY) {
//核销
actionType = EnumCouponSendSendType.COUPON_VERIFY.getCode();
wxCouponSendQuery.setSendType(actionType);
configKey = "verifyConponSwitch";
} else {
configKey = "verifyCouponSwitch";
} else if (type == EnumCouponSendSendType.B_MICROPAY) {
//B端刷卡发券
actionType = EnumCouponSendSendType.B_MICROPAY.getCode();
wxCouponSendQuery.setSendType(actionType);
configKey = "microPayCouponSwitch";
}else {
return false;
}
WxMallConfig wxMallConfigQuery = new WxMallConfig();
@@ -108,7 +112,7 @@ public class WxCouponSendServiceImpl implements WxCouponSendService {
try {
checkTime = pushLimitService.checkSendTime(tenantId);
} catch (MallinkException e) {
logger.error(e.getMessage());
logger.error("push limit check time :" + e.getMessage());
return false;
}

@@ -122,7 +126,7 @@ public class WxCouponSendServiceImpl implements WxCouponSendService {
try {
checkLimit = pushLimitService.checkCoupon(tenantId, cUserId, send.getCouponId());
} catch (MallinkException e) {
logger.error(e.getMessage());
logger.error("券达到limit: " + e.getMessage());
}
if (!checkLimit) {
continue;


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

@@ -820,10 +820,11 @@ public class WxOrderServiceImpl implements WxOrderService {

@Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void shareForMicroPay(Long orderId, Long payOrderId) {
public void shareForMicroPay(String tenantId, Long orderId, Long payOrderId) {
// 微信分账
try {
WxPayOrder wxPayOrder = new WxPayOrder();
wxPayOrder.setTenantId(tenantId);
wxPayOrder.setId(payOrderId);
wxPayOrder.setOrderId(orderId);
wxPayOrder.setPayOrderStatus(EnumPayStatus.PAY_STATUS_SUCCESS.getCode());


+ 88
- 52
mallinkService/src/main/java/com/iformall/service/impl/WxPayOrderServiceImpl.java Просмотреть файл

@@ -13,6 +13,7 @@ import com.iformall.enums.*;
import com.iformall.exception.MallinkException;
import com.iformall.mapper.*;
import com.iformall.pay.*;
import com.iformall.service.WxCouponOrderService;
import com.iformall.service.WxOrderService;
import com.iformall.service.WxPayOrderService;
import com.iformall.utils.BeanUtils;
@@ -26,7 +27,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.text.ParseException;
import java.util.*;

@@ -61,9 +61,15 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
@Autowired
WxMerchantMapper wxMerchantMapper;

@Autowired
WxMerchantBUserMapper wxMerchantBUserMapper;

@Autowired
WxProfitSharingReceiverMapper wxProfitSharingReceiverMapper;

@Autowired
WxCouponOrderService wxCouponOrderService;

JSONObject errorMap = JSON.parseObject("{" +
"\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," +
"\"NOTENOUGH\":{\"detail\":\"余额不足\",\"reason\":\"用户帐号余额不足\",\"resolution\":\"用户帐号余额不足,请用户充值或更换支付卡后再支付\"}," +
@@ -352,9 +358,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
}

@Override
public ResultData createMicroPayOrder(boolean isReal, WxAppinfo appInfo, WxMerchantBUser user, WxPayOrder record, EnumPayWay payWay) {
public ResultData createMicroPayOrder(boolean isReal, WxMerchantBUser user, WxPayOrder record, EnumPayWay payWay) {
final IdWorker idworker = IdWorker.get();

WxAppinfo appInfo = getWxAppinfo(EnumOrderType.MICROPAY.getCode(), user.getTenantId());

EnumPayShare isShare = EnumPayShare.NO;

try {
@@ -414,6 +422,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
Double dChargeFee = Math.ceil(record.getPayAmount() * 1.0D * payAccount.getRate() / 1000);
Integer share_amount = record.getPayAmount() - dChargeFee.intValue();
record.setShareAmount(share_amount);
if (share_amount <= 0) {
isShare = EnumPayShare.NO;
record.setShare(isShare.getCode());
}
}

int sqlRow = wxPayOrderMapper.insertSelective(record);
@@ -456,7 +468,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
returnMap.put("orderId", orderNo);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_code");
if("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equals(result_code)) {
String openId = returnMap.get("openid");
String isSubscribe = returnMap.get("is_subscribe");
@@ -468,7 +480,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} else {
String err_code = returnMap.get("err_code");
String errMsg = returnMap.get("err_code_des");
if(errMsg.length() <= 0) {
if (errMsg.length() <= 0) {
errMsg = returnMap.get("return_msg");
}
record.setFailReason(errMsg);
@@ -499,7 +511,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
WxMicroPayOrderSP wxPayOrderSP = new WxMicroPayOrderSP();
wxPayOrderSP.setAppid(appInfo.getParentAppId());
wxPayOrderSP.setMch_id(payAccount.getMchId());
wxPayOrderSP.setSub_appid(user.getAppId());
wxPayOrderSP.setSub_appid(appInfo.getAppId());
wxPayOrderSP.setSub_mch_id(payAccount.getSubMchId());
wxPayOrderSP.setDevice_info(user.getPhone());
wxPayOrderSP.setNonce_str(noncestr);
@@ -527,10 +539,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
returnMap.put("orderId", orderNo);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_code");
if("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equals(result_code)) {
String openId = returnMap.get("openid");
String isSubscribe = returnMap.get("is_subscribe");
String openId = returnMap.get("sub_openid");
String isSubscribe = returnMap.get("sub_is_subscribe");
String transactionId = returnMap.get("transaction_id");
record.setTransactionId(transactionId);
record.setUpdateTime(new Date());
@@ -539,7 +551,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} else {
String err_code = returnMap.get("err_code");
String errMsg = returnMap.get("err_code_des");
if(errMsg.length() <= 0) {
if (errMsg.length() <= 0) {
errMsg = returnMap.get("return_msg");
}
record.setFailReason(errMsg);
@@ -646,23 +658,33 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
* 微信订单查询
*/
@Override
public ResultData payOrderQuery(WxAppinfo appInfo, WxPayOrder record) {
public ResultData payOrderQuery(WxPayOrder record) {

try {
if (StringUtils.isBlank(record.getPayOrderNo()))
record.setPayOrderNo(String.valueOf(record.getId()));

WxPayOrder payOrder = wxPayOrderMapper.selectByPrimaryKey(record.getId());
if(payOrder != null) {
if (payOrder != null) {
record.setPayOrderStatus(payOrder.getPayOrderStatus());
} else {
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), "payOrder not found");
}

WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId());
if (order == null) {
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), "Order not found");
}

WxAppinfo appInfo = getWxAppinfo(order.getType(), record.getTenantId());

String response = wechatPayOrderQuery(appInfo, record);

logger.info("pay order query, " + record.toString() + ", response: " + response);
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_code");
if("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equals(result_code)) {
String trade_state = returnMap.get("trade_state");
//SUCCESS—支付成功
@@ -812,7 +834,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_code");
if("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equals(result_code)) {
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_CANCEL.getCode());
handlePayOrderStatusUpdate(record);
@@ -906,10 +928,12 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
}

/**
* 微信刷卡支付撤销订单
* 撤销订单 - 刷卡支付
*/
@Override
public ResultData payOrderReverse(WxAppinfo appInfo, WxPayOrder record) {
public ResultData payOrderReverse(WxPayOrder record) {

WxAppinfo appInfo = getWxAppinfo(EnumOrderType.MICROPAY.getCode(), record.getTenantId());

try {
String response = wechatPayOrderReverse(appInfo, record);
@@ -918,7 +942,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String return_code = returnMap.get("return_code");
String result_code = returnMap.get("result_code");
if("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equalsIgnoreCase(return_code)) {
if ("SUCCESS".equals(result_code)) {
record.setPayOrderStatus(EnumPayStatus.PAY_STATUS_REVERSE.getCode());
record.setUpdateTime(new Date());
@@ -999,6 +1023,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
// 普通商户号
appinfo = wxAppinfoMapper.findByAppId(appId);
if (appinfo == null) {
logger.error("appid not found: " + appId);
throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND);
}
isNormal = true;
@@ -1006,6 +1031,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
// 服务号 现在用hmac-sha256
appinfo = wxAppinfoMapper.findByAppId(subAppId);
if (appinfo == null) {
logger.error("subappid not found: " + subAppId);
throw new MallinkException(ErrorCode.APP_ID_NOT_FOUND);
}
isNormal = false;
@@ -1181,7 +1207,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
record.setFailReason("");
wxPayOrderMapper.updateByPrimaryKeySelective(record);
} catch (Exception e) {
logger.error(e.getMessage());
logger.error("更新transactionId: " + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL);
}
return;
@@ -1198,22 +1224,34 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND);
}

WxAppinfo appinfo = getWxAppinfo(order.getType(), order.getTenantId());
WxAppinfo appinfo = getWxAppinfo(EnumOrderType.MICROPAY.getCode(), order.getTenantId());

// add c_user
Date curDate = new Date();
WxCUser userQ = new WxCUser();
userQ.setOpenId(openId);
userQ.setCreateDate(curDate);
userQ.setUpdateDate(curDate);
userQ.setAppId(appinfo.getAppId());
WxCUser user1 = wxCUserMapper.findByOpenId(userQ);
if(user1 == null) {
if (user1 == null) {
final IdWorker idWorker = IdWorker.get();
userQ.setId(idWorker.nextId());
userQ.setCreateDate(curDate);
userQ.setUpdateDate(curDate);
if ("N".equalsIgnoreCase(isSubscribe)) {
userQ.setIsSubscribe(EnumUserIsSubscribe.NO.getCode());
} else {
userQ.setIsSubscribe(EnumUserIsSubscribe.NO.getCode());
}
wxCUserMapper.insertSelective(userQ);
} else {
userQ.setId(user1.getId());
userQ.setUpdateDate(curDate);
if ("N".equalsIgnoreCase(isSubscribe)) {
userQ.setIsSubscribe(EnumUserIsSubscribe.NO.getCode());
} else {
userQ.setIsSubscribe(EnumUserIsSubscribe.NO.getCode());
}
wxCUserMapper.updateByPrimaryKeySelective(userQ);
}

// 修改支付订单状态
@@ -1237,38 +1275,43 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
try {
int _count = wxOrderService.microPayOrderSuccess(order);
if (_count > 1) {
logger.error("order micro pay count > 1");
throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
}
} catch (Exception e) {
logger.error(e.getMessage());
logger.error("order status : " + e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL.getCode(), "订单更新");
}

// 支付分账
try {
wxOrderService.shareForMicroPay(record.getOrderId(), record.getId());
logger.info("订单分账: orderId: {}, payOrderId: {}", record.getOrderId(), record.getId());
} catch (Exception e) {
logger.error("订单分账失败: orderId: {}, payOrderId: {}", record.getOrderId(), record.getId());
logger.error(e.getMessage());
// throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND.getCode(), "分账更新");
}
// 延迟3秒后分账
new Thread(() -> {
String tenantId = record.getTenantId();
Long orderId = record.getOrderId();
Long payOrderId = record.getId();
try {
Thread.currentThread().sleep(3000);
} catch (Exception e) {
logger.error("sleep error: " + e.getMessage());
}

// TODO 支付发券
// 支付分账
try {
wxOrderService.shareForMicroPay(tenantId, orderId, payOrderId);
logger.info("订单分账: orderId: {}, payOrderId: {}", orderId, payOrderId);
} catch (Exception e) {
logger.error("订单分账失败: orderId: {}, payOrderId: {}", orderId, payOrderId);
logger.error("订单分账失败: " +e.getMessage());
}
}).start();

/*
Map<String, String> msgMap = new HashMap<>();
// B端刷卡支付发券
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);
wxCouponOrderService.sendCouponAfterMicroPay(record.getTenantId(), record.getOrderId(), record.getcUserId());
} catch (Exception e) {
logger.error("pay success handle, sms send exception, payOrderi: " + updatePayOrder+ ", msgMap: " + msgMap.toString() + ", e: " + e.getMessage());
logger.error("订单刷卡失败: orderId: {}, payOrderId: {}", record.getOrderId(), record.getId());
logger.error("订单刷卡失败: " +e.getMessage());
}
*/
}

@Override
@@ -1285,7 +1328,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
logger.error("pay handle, order " + record.getOrderId() + " not found , payOrderid : " + record.getPayOrderNo());
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND);
}
if(order.getType().equals(EnumOrderType.COUPON.getCode())) {
if (order.getType().equals(EnumOrderType.COUPON.getCode())) {
WxCUser user = wxCUserMapper.selectByPrimaryKey(order.getCUserId());
if (user == null) {
logger.error("pay handle, order " + record.getOrderId() + " not found , payOrderid : " + record.getPayOrderNo());
@@ -1295,7 +1338,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {

if (order.getPayment() > 0) {
// 订单金额不为0时, 支付订单未创建, 返回异常
if (!(record.getId() >0)) {
if (!(record.getId() > 0)) {
throw new MallinkException(ErrorCode.PAY_ORDER_NOT_FOUND);
}
}
@@ -1421,14 +1464,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
WxAppinfo appInfo = null;
WxAppinfo appinfoQ = new WxAppinfo();
appinfoQ.setTenantId(tenentId);
if(orderType.equals(EnumOrderType.COUPON.getCode())) {
appinfoQ.setType(EnumAppType.C.getCode());
} else if(orderType.equals(EnumOrderType.MICROPAY.getCode())) {
appinfoQ.setType(EnumAppType.B.getCode());
} else {
appinfoQ.setType(EnumAppType.C.getCode());
}

appinfoQ.setType(EnumAppType.C.getCode());
List<WxAppinfo> appList = wxAppinfoMapper.select(appinfoQ);
if (appList.size() > 0) {
appInfo = appList.get(0);


+ 10
- 1
mallinkService/src/main/resources/mapper/WxCUserMapper.xml Просмотреть файл

@@ -31,10 +31,15 @@
<result column="longitude" jdbcType="DECIMAL" property="longitude"/>
<result column="login_count" jdbcType="INTEGER" property="loginCount"/>
<result column="extra_info" jdbcType="VARCHAR" property="extraInfo"/>
<result column="is_ubscribe" jdbcType="TINYINT" property="isSubscribe"/>
</resultMap>

<sql id="allColumns">
`id`,`tenant_id`,`open_id`,`union_id`,`nick_name`,`gender`,`avatar_url`,`phone`,`pure_phone`,`city`,`province`,`language`,`country_code`,`register_ip`,`verify_code_phone`,`qrcode_source`,`scene`,`scene_address`,`session_key`,`score`,`update_date`,`create_date`,`app_id`,`token`,`expire_time`,`latitude`, `longitude`, `login_count`, `extra_info`
`id`,`tenant_id`,`open_id`,`union_id`,`nick_name`,`gender`,`avatar_url`,`phone`,`pure_phone`,
`city`,`province`,`language`,`country_code`,`register_ip`,`verify_code_phone`,
`qrcode_source`,`scene`,`scene_address`,`session_key`,`score`,
`update_date`,`create_date`,`app_id`,`token`,`expire_time`,`latitude`, `longitude`,
`login_count`, `extra_info`, `is_subscribe`
</sql>

<sql id="dynamicWhereConditions">
@@ -156,6 +161,10 @@
and `extra_info` = #{extraInfo}
</if>

<if test=" null != isSubscribe ">
and `is_subscribe` = #{isSubscribe}
</if>

<if test=" null != ids ">
and id in
<foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")">


+ 1
- 0
mallinkService/src/main/resources/mapper/WxOrderMapper.xml Просмотреть файл

@@ -286,6 +286,7 @@
<if test="endDate != null">
AND create_date &lt; #{endDate,jdbcType=TIMESTAMP}
</if>
order by create_date desc
</select>




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