Parcourir la source

[支付][修复]:微信支付成功失败检查

release_toaliyun_real
Stormeye.Wu il y a 7 ans
Parent
révision
442855f526
8 fichiers modifiés avec 244 ajouts et 176 suppressions
  1. +9
    -42
      mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java
  2. +1
    -0
      mallinkService/src/main/java/com/simple/enums/EnumPayStatus.java
  3. +0
    -6
      mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java
  4. +20
    -0
      mallinkService/src/main/java/com/simple/pay/WxPayment.java
  5. +31
    -24
      mallinkService/src/main/java/com/simple/service/WxPayOrderService.java
  6. +10
    -7
      mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java
  7. +173
    -92
      mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java
  8. +0
    -5
      mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml

+ 9
- 42
mallinkCApi/src/main/java/com/simple/controller/WxPayOrderController.java Voir le fichier

@@ -70,54 +70,21 @@ public class WxPayOrderController extends BaseController {
return new ResultData(ErrorCode.PAY_ORDER_ERROR); return new ResultData(ErrorCode.PAY_ORDER_ERROR);
} }


/**
*
* @return 接收微信异步通知
* @throws Exception 可能产生的任何异常
*/
@AuthIgnore
@RequestMapping(value = "/notify/pay", method = RequestMethod.POST)
public String __doNotify(HttpServletRequest request) throws Exception {
Map<String, String> paramMap = null;
String response;
@ApiOperation("更新支付订单状态")
@PostMapping("/updatePayOrder")
public ResultData updatePayOrder(@RequestBody WxPayOrder wxPayOrder) {
try { try {
String xml = IOUtils.toString(request.getInputStream(), Charset.forName("UTF-8"));
paramMap = WxPayment.xmlToMap(xml);
logger.info("payment wxpay, notify, param: " + paramMap.toString() );
response = wxPayOrderService.notify(paramMap, EnumPayWay.PAY_WAY_WEAPP);
logger.info("payment wxpay, notify success, req : " + paramMap.toString() + ", resp: " + response.toString());
return response;
} catch (BizMessageException e) {
logger.error("payment wxpay, notify error, req: " + paramMap.toString() + ", e:" + e.getLocalizedMessage());
return e.getMessage();
wxPayOrderService.handlePayOrderStatusUpdate(wxPayOrder);
return new ResultData();
} catch (MallinkException e) { } catch (MallinkException e) {
logger.error("payment wxpay, notify error, req: " + paramMap.toString() + ", e:" +e.getLocalizedMessage());
return e.getMessage();
logger.error("payment wechat, order create error, update 2: " + wxPayOrder.toString() + ", e:" + e.getMessage());
return new ResultData(e.getErrorCode(), e.getMessage());
} catch (Exception e) { } catch (Exception e) {
logger.error("payment wxpay, order create error, req: " + paramMap.toString() + ", e: " + e.getMessage());
return e.getMessage();
logger.error("payment wechat, order create error, update 3: " + wxPayOrder.toString() + ", e:" + e.getMessage());
} }
return new ResultData(ErrorCode.PAY_ORDER_ERROR);
} }


/**
*
* @return 同步回调(订单状态主动检查)
* @throws Exception 可能产生的任何异常
*/
@RequestMapping(value = "/callback", method = {RequestMethod.GET, RequestMethod.POST})
public String __doCallback(HttpServletRequest request) throws Exception {

logger.info("payment wxpay, callback,request:" + request.toString());

return "\n" +
"\n" +
"<xml>\n" +
"\n" +
" <return_code><![CDATA[SUCCESS]]></return_code>\n" +
" <return_msg><![CDATA[OK]]></return_msg>\n" +
"</xml>\n";
}
@ApiOperation("分页列表接口") @ApiOperation("分页列表接口")
@GetMapping("/list") @GetMapping("/list")
@ApiImplicitParams({ @ApiImplicitParams({


+ 1
- 0
mallinkService/src/main/java/com/simple/enums/EnumPayStatus.java Voir le fichier

@@ -8,6 +8,7 @@ public enum EnumPayStatus {
PAY_WAY_WAIT(0, "支付中"), PAY_WAY_WAIT(0, "支付中"),
PAY_WAY_SUCCESS(1, "支付成功"), PAY_WAY_SUCCESS(1, "支付成功"),
PAY_WAY_FAIL(2, "支付失败"), PAY_WAY_FAIL(2, "支付失败"),
PAY_WAY_CANCEL(3, "取消支付")
; ;


public static EnumPayStatus getEnum(Integer code) { public static EnumPayStatus getEnum(Integer code) {


+ 0
- 6
mallinkService/src/main/java/com/simple/mapper/WxCouponOrderMapper.java Voir le fichier

@@ -8,10 +8,4 @@ import com.simple.domain.po.WxCouponOrder;
public interface WxCouponOrderMapper extends CommonMapper<WxCouponOrder, Long> { public interface WxCouponOrderMapper extends CommonMapper<WxCouponOrder, Long> {


List<WxCouponOrder> findList(WxCouponOrder wxCouponOrder); List<WxCouponOrder> findList(WxCouponOrder wxCouponOrder);

} }

+ 20
- 0
mallinkService/src/main/java/com/simple/pay/WxPayment.java Voir le fichier

@@ -153,6 +153,26 @@ public class WxPayment {


} }


/**
* 小程序统一下单后二次签名
*
* @param appId
* @param timestamp
* @param prepay_id
* @param paternerKey
* @return
*/
public static Map<String, String> buildWeappSecondSignMap(String appId, String timestamp, String prepay_id, String paternerKey) {
Map<String, String> params = new HashMap<String, String>();
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", appId);
sighMap.put("timeStamp", timestamp);
sighMap.put("package", "prepay_id="+prepay_id);
sighMap.put("signType", "MD5");

return buildSignAfterParasMap(params, paternerKey);
}

/** /**
* 关闭订单 * 关闭订单
* *


+ 31
- 24
mallinkService/src/main/java/com/simple/service/WxPayOrderService.java Voir le fichier

@@ -13,7 +13,8 @@ public interface WxPayOrderService {


/** /**
* 创建支付订单 * 创建支付订单
* @param record 支付订单请求
*
* @param record 支付订单请求
* @param payWay * @param payWay
* @return * @return
*/ */
@@ -21,28 +22,45 @@ public interface WxPayOrderService {


/** /**
* 异步通知 * 异步通知
* @param paramMap 异步通知参数
* @param payWay 支付方式
*
* @param paramMap 异步通知参数
* @param payWay 支付方式
* @return * @return
*/ */
String notify(Map<String, String> paramMap, EnumPayWay payWay); String notify(Map<String, String> paramMap, EnumPayWay payWay);


/** /**
* 支付成功处理 * 支付成功处理
*
* @param record * @param record
* @param transactionId * @param transactionId
*/ */
void handleOrderPaySuccess(WxPayOrder record, String transactionId); void handleOrderPaySuccess(WxPayOrder record, String transactionId);


/**
* 支付状态处理
*
* @param record
*/
void handlePayOrderStatusUpdate(WxPayOrder record);

/** /**
* 页面回调 * 页面回调
* @param paramMap 页面通知参数
* @param payWay 支付方式
*
* @param paramMap 页面通知参数
* @param payWay 支付方式
* @return * @return
*/ */
void callback(Map<String, String> paramMap, EnumPayWay payWay); void callback(Map<String, String> paramMap, EnumPayWay payWay);


/**
/**
* 保存或更新实体
*
* @param record
*/
void saveOrUpdate(WxPayOrder record);

/**
* 根据实体查询分页列表 * 根据实体查询分页列表
* *
* @param record * @param record
@@ -50,22 +68,17 @@ public interface WxPayOrderService {
* @param pageSize * @param pageSize
* @return * @return
*/ */
PageInfo<WxPayOrder> listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize);
/**
PageInfo<WxPayOrder> listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize);
/**
* 根据Id获得实体 * 根据Id获得实体
* *
* @param id * @param id
* @return * @return
*/ */
WxPayOrder getById(Long id); WxPayOrder getById(Long id);
/**
* 保存或更新实体
*
* @param record
*/
void saveOrUpdate(WxPayOrder record);




/** /**
* 根据Id删除实体 * 根据Id删除实体
@@ -73,12 +86,6 @@ public interface WxPayOrderService {
* @param id * @param id
*/ */
void deleteById(Long id); void deleteById(Long id);



} }

+ 10
- 7
mallinkService/src/main/java/com/simple/service/impl/WxOrderServiceImpl.java Voir le fichier

@@ -103,22 +103,25 @@ public class WxOrderServiceImpl implements WxOrderService {
} }


// check 购买是否超限 // check 购买是否超限
int count = 0;
try { try {
WxCouponOrder query = new WxCouponOrder(); WxCouponOrder query = new WxCouponOrder();
query.setCouponId(couponId); query.setCouponId(couponId);
query.setCUserId(user.getId());
query.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode()); query.setCouponOrderStatus(EnumCouponOrderStatus.COUPON_ORDER_USE_WAIT.getCode());
List<WxCouponOrder> list = wxCouponOrderMapper.findList(query);
if (list.size() >= coupon.getUseLimitQuantity()) {
//解锁
redisLock.unlock(couponIdStr, timeStr);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED);
}
count = wxCouponOrderMapper.selectCount(query);
}catch (Exception e) { }catch (Exception e) {
//解锁 //解锁
redisLock.unlock(couponIdStr, timeStr); redisLock.unlock(couponIdStr, timeStr);
logger.error("此券购买数量检查出问题了, couponId: " + couponIdStr);
logger.error("购买是否超限-DB, couponId: " + couponIdStr + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.ORDER_IS_FAIL); throw new MallinkException(ErrorCode.ORDER_IS_FAIL);
} }
if (count > coupon.getUseLimitQuantity()) {
//解锁
redisLock.unlock(couponIdStr, timeStr);
logger.error("此券购买数量已超限, couponId: " + couponIdStr + ", count: " + count);
throw new MallinkException(ErrorCode.ORDER_IS_LIMITED);
}


try { try {
// 减库存 // 减库存


+ 173
- 92
mallinkService/src/main/java/com/simple/service/impl/WxPayOrderServiceImpl.java Voir le fichier

@@ -47,10 +47,10 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
@Autowired @Autowired
WxOrderMapper wxOrderMapper; WxOrderMapper wxOrderMapper;


@Autowired
@Autowired
WxPayOrderMapper wxPayOrderMapper; WxPayOrderMapper wxPayOrderMapper;


@Autowired
@Autowired
WxOrderService wxOrderService; WxOrderService wxOrderService;


JSONObject errorMap = JSON.parseObject("{\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," + JSONObject errorMap = JSON.parseObject("{\"NOAUTH\":{\"detail\":\"商户无此接口权限\",\"reason\":\"商户未开通此接口权限\",\"resolution\":\"请商户前往申请此接口权限\"}," +
@@ -77,82 +77,98 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
// 1. check 订单 // 1. check 订单
WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId()); WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId());
if (order == null) { if (order == null) {
logger.warn("pay order, order not allow, repaymentReq: " + record.toString() +", payWay: " + payWay.toString());
logger.error("pay order, order not allow, repaymentReq: " + record.toString() + ", payWay: " + payWay.toString());
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND);
} }
if (order.getOrderStatus() != EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()) { if (order.getOrderStatus() != EnumOrderStatus.ORDER_STATUS_PENDING_PAYMENT.getCode()) {
logger.warn("pay order, order status not allow, repaymentReq: " + order.toString() + " , payWay: " + payWay.toString());
logger.error("pay order, order status not allow, repaymentReq: " + order.toString() + " , payWay: " + payWay.toString());
throw new MallinkException(ErrorCode.ORDER_IS_NOT_PAY); throw new MallinkException(ErrorCode.ORDER_IS_NOT_PAY);
} }
// 2. check 是否有支付订单 // 2. check 是否有支付订单
List<WxPayOrder> list = wxPayOrderMapper.findList(record);
if (list.size() > 0) {
throw new MallinkException(ErrorCode.PAY_ORDER_EXIST);
}
// 3. 创建支付订单
Long id = idworker.nextId();
Date currentDate = new Date(); Date currentDate = new Date();

record.setId(id);
record.setTenantId(user.getTenantId());
record.setCUserId(user.getId());
record.setCreateTime(currentDate);
record.setUpdateTime(currentDate);
int currentTime = Utility.convertDate2TimeStamp(currentDate); int currentTime = Utility.convertDate2TimeStamp(currentDate);
record.setPayTimeStart(currentTime);
record.setPayTimeEnd(currentTime);
// 支付单号
record.setPayOrderNo(String.valueOf(id));
record.setPayAmount(order.getPayment());
record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode());
record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());

int sqlRow = wxPayOrderMapper.insertSelective(record);
if(sqlRow != 1) {
throw new MallinkException(ErrorCode.DB_FAIL);
List<WxPayOrder> list = wxPayOrderMapper.findList(record);
String payOrderNo = "";
if (list.size() <= 0) {
// 3. 创建支付订单
Long id = idworker.nextId();
payOrderNo = String.valueOf(id);
record.setId(id);
record.setTenantId(user.getTenantId());
record.setCUserId(user.getId());
record.setCreateTime(currentDate);
record.setUpdateTime(currentDate);
record.setPayTimeStart(currentTime);
record.setPayTimeEnd(currentTime);
// 支付单号
record.setPayOrderNo(payOrderNo);
record.setPayAmount(order.getPayment());
record.setPayVendor(EnumPayWay.PAY_WAY_WEAPP.getCode());
record.setPayOrderStatus(EnumPayStatus.PAY_WAY_WAIT.getCode());

int sqlRow = wxPayOrderMapper.insertSelective(record);
if (sqlRow != 1) {
logger.error("pay order insert error: " + record.toString());
throw new MallinkException(ErrorCode.DB_FAIL);
}
} else {
record = list.get(0);
payOrderNo = String.valueOf(record.getId());
} }

WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId()); WxPayAccount payAccount = wxPayAccountMapper.selectByPrimaryKey(appInfo.getPayId());
{
// 统一下单
String noncestr = Utility.generate32UUID();
WxPayOrderP wxPayOrderP = new WxPayOrderP();
wxPayOrderP.setOpenid(user.getOpenId());
wxPayOrderP.setAppid(user.getAppId());
wxPayOrderP.setMch_id(payAccount.getMchId());
wxPayOrderP.setNonce_str(noncestr);
wxPayOrderP.setBody(order.getDetail());
wxPayOrderP.setOut_trade_no(record.getPayOrderNo());
wxPayOrderP.setTotal_fee(order.getPayment());
wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP
wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl());
wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型
wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID
wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime));
wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime + 15 * 60)); // 15分钟结束
wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey()));
String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP));
logger.info("pay order, wechat pushOrder, wxPayOrder:" + wxPayOrderP.toString() + ", response: " + response.toString());
Map<String, String> returnMap = WxPayment.xmlToMap(response);
String result_no = returnMap.get("result_code");
if ("SUCCESS".equals(result_no)) {
String prepay_id = returnMap.get("prepay_id");
String timestamp = String.valueOf(Utility.getCurrentTimeStamp());
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", returnMap.get("appid"));
sighMap.put("timeStamp", timestamp);
sighMap.put("nonceStr", noncestr);
sighMap.put("package", "prepay_id="+prepay_id);
sighMap.put("signType", "MD5");
String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey());
returnMap.put("timeStamp", timestamp);
returnMap.put("nonceStr", noncestr);
returnMap.put("package", "prepay_id="+prepay_id);
returnMap.put("paySign", signAgent);
return new ResultData(200, "创建支付订单成功", returnMap);
} else {
JSONObject errObj = errorMap.getJSONObject(result_no);
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap);
}

// 统一下单
String noncestr = Utility.generate32UUID();
WxPayOrderP wxPayOrderP = new WxPayOrderP();
wxPayOrderP.setOpenid(user.getOpenId());
wxPayOrderP.setAppid(user.getAppId());
wxPayOrderP.setMch_id(payAccount.getMchId());
wxPayOrderP.setNonce_str(noncestr);
wxPayOrderP.setBody(order.getDetail());
wxPayOrderP.setOut_trade_no(record.getPayOrderNo());
wxPayOrderP.setTotal_fee(order.getPayment());
wxPayOrderP.setSpbill_create_ip(record.getIp()); // 终端IP
wxPayOrderP.setNotify_url(payAccount.getPayNotifyUrl());
wxPayOrderP.setTrade_type(WxPay.TradeType.JSAPI.name()); // 终端类型
wxPayOrderP.setProduct_id(String.valueOf(order.getId())); // 订单ID
wxPayOrderP.setTime_start(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime));
wxPayOrderP.setTime_expire(Utility.getDataFormatStringYYYYMMDDHHmmss(currentTime + 15 * 60)); // 15分钟结束
wxPayOrderP.setSign(WxPayment.createSign(BeanUtils.toStringMap(wxPayOrderP), payAccount.getApiKey()));
String response = WxPay.pushOrder(BeanUtils.toStringMap(wxPayOrderP));
logger.info("pay order, wechat pushOrder, " + wxPayOrderP.toString() + ", response: " + response.toString());
Map<String, String> returnMap = WxPayment.xmlToMap(response);
returnMap.put("payOrderId", payOrderNo);
String result_code = returnMap.get("result_code");
if ("SUCCESS".equals(result_code)) {
/*
Map<String, String> signMap = WxPayment.buildWeappSecondSignMap(returnMap.get("appid"),
String.valueOf(Utility.getCurrentTimeStamp()),
returnMap.get("prepay_id"),
payAccount.getApiKey());

String signAgent = signMap.remove("sign");
returnMap.putAll(signMap);
returnMap.put("paySign", signAgent);
*/
String prepay_id = returnMap.get("prepay_id");
String timestamp = String.valueOf(Utility.getCurrentTimeStamp());
Map<String, String> sighMap = MapUtil.getOrderMap();
sighMap.put("appId", returnMap.get("appid"));
sighMap.put("timeStamp", timestamp);
sighMap.put("nonceStr", noncestr);
sighMap.put("package", "prepay_id=" + prepay_id);
sighMap.put("signType", "MD5");
String signAgent = WxPayment.createSign(sighMap, payAccount.getApiKey());
returnMap.put("timeStamp", timestamp);
returnMap.put("nonceStr", noncestr);
returnMap.put("package", "prepay_id=" + prepay_id);
returnMap.put("paySign", signAgent);
logger.info("back to UI: " +returnMap.toString());
return new ResultData(200, "创建支付订单成功", returnMap);
} else {
JSONObject errObj = errorMap.getJSONObject(result_code);
return new ResultData(ErrorCode.PAY_ORDER_ERROR.getCode(), errObj.toJSONString(), returnMap);
} }
} catch (RuntimeException e) { } catch (RuntimeException e) {
throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage()); throw new MallinkException(ErrorCode.PAY_ORDER_ERROR.getCode(), e.getMessage());
@@ -167,8 +183,9 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {


/** /**
* 提供微信支付回调调用 * 提供微信支付回调调用
* @param paramMap 异步通知参数
* @param payWay 支付方式
*
* @param paramMap 异步通知参数
* @param payWay 支付方式
* @return * @return
*/ */
@Override @Override
@@ -188,16 +205,14 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
try { try {
if (payWay == EnumPayWay.PAY_WAY_WEAPP) { if (payWay == EnumPayWay.PAY_WAY_WEAPP) {
boolean signVerified = false; boolean signVerified = false;
if (payWay == EnumPayWay.PAY_WAY_WECHAT) {
// 微信支付
signVerified = WxPayment.verifyNotify(paramMap, partnerKey);
}
// 微信支付
signVerified = WxPayment.verifyNotify(paramMap, partnerKey);
if (!signVerified) { if (!signVerified) {
logger.warn("notify order, wxpay checksign error, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString());
logger.warn("notify order, wxpay checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR); throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} }
if (!"SUCCESS".equals(paramMap.get("return_code"))) { if (!"SUCCESS".equals(paramMap.get("return_code"))) {
logger.warn("notify order, wxpay status not success, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString());
logger.warn("notify order, wxpay status not success, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
Map<String, String> resultMap = new LinkedHashMap<>(); Map<String, String> resultMap = new LinkedHashMap<>();
resultMap.put("return_code", "FAIL"); resultMap.put("return_code", "FAIL");
resultMap.put("return_msg", "订单状态码非SUCCESS"); resultMap.put("return_msg", "订单状态码非SUCCESS");
@@ -208,15 +223,15 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
Long payOrderId = Long.valueOf(payOrderNo); Long payOrderId = Long.valueOf(payOrderNo);
WxPayOrder payOrder = wxPayOrderMapper.selectByPrimaryKey(payOrderId); WxPayOrder payOrder = wxPayOrderMapper.selectByPrimaryKey(payOrderId);
if (payOrder == null) { if (payOrder == null) {
logger.warn("notify order, wxpay check pay order not exists, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString());
logger.warn("notify order, wxpay check pay order not exists, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
Map<String, String> resultMap = new LinkedHashMap<>(); Map<String, String> resultMap = new LinkedHashMap<>();
resultMap.put("return_code", "FAIL"); resultMap.put("return_code", "FAIL");
resultMap.put("return_msg", "订单不存在"); resultMap.put("return_msg", "订单不存在");
return XmlUtil.parseDto2Xml(resultMap, ""); return XmlUtil.parseDto2Xml(resultMap, "");
} }
// 验证支付金额 // 验证支付金额
if(!paramMap.get("total_fee").equals(payOrder.getPayAmount().toString())) {
logger.warn("notify order, wxpay check total_fee is invalid, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString());
if (!paramMap.get("total_fee").equals(payOrder.getPayAmount().toString())) {
logger.warn("notify order, wxpay check total_fee is invalid, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
Map<String, String> resultMap = new LinkedHashMap<>(); Map<String, String> resultMap = new LinkedHashMap<>();
resultMap.put("return_code", "FAIL"); resultMap.put("return_code", "FAIL");
resultMap.put("return_msg", "订单总金额不一致"); resultMap.put("return_msg", "订单总金额不一致");
@@ -225,14 +240,14 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {


// 处理支付成功 // 处理支付成功
handleOrderPaySuccess(payOrder, paramMap.get("transaction_id")); handleOrderPaySuccess(payOrder, paramMap.get("transaction_id"));
logger.info("notify order, wxpay checksign success, paramMap:{}, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString());
logger.info("notify order, wxpay checksign success, paramMap:{}, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString());
Map<String, String> resultMap = new LinkedHashMap<>(); Map<String, String> resultMap = new LinkedHashMap<>();
resultMap.put("return_code", "SUCCESS"); resultMap.put("return_code", "SUCCESS");
resultMap.put("return_msg", "OK"); resultMap.put("return_msg", "OK");
return XmlUtil.parseDto2Xml(resultMap, ""); return XmlUtil.parseDto2Xml(resultMap, "");
} }
} catch (RuntimeException e) { } catch (RuntimeException e) {
logger.warn("notify order, alipay checksign error, paramMap: "+paramMap.toString()+ ", payWay:" + payWay.toString() + ", e:" + e.getMessage());
logger.warn("notify order, alipay checksign error, paramMap: " + paramMap.toString() + ", payWay:" + payWay.toString() + ", e:" + e.getMessage());
throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR); throw new MallinkException(ErrorCode.PAY_ORDER_NOTIFY_CHECK_SIGN_ERROR);
} }
return ""; return "";
@@ -246,8 +261,21 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
@Override @Override
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class}) @Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = {Exception.class})
public void handleOrderPaySuccess(WxPayOrder record, String transactionId) { public void handleOrderPaySuccess(WxPayOrder record, String transactionId) {
Date currentDate = new Date();
EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus()); EnumPayStatus payStatus = EnumPayStatus.getEnum(record.getPayOrderStatus());
// 判断支付状态 // 判断支付状态
if (payStatus == EnumPayStatus.PAY_WAY_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_WAY_WAIT) { if (payStatus != EnumPayStatus.PAY_WAY_WAIT) {
logger.error("pay success handle, payOrder " + record.getPayOrderNo() + logger.error("pay success handle, payOrder " + record.getPayOrderNo() +
"is paid success , orderId : " + record.getOrderId()); "is paid success , orderId : " + record.getOrderId());
@@ -255,11 +283,11 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
} }
WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId()); WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId());
if (order == null) { if (order == null) {
logger.error("pay success handle, order " + record.getOrderId() +" not found , payOrderGid : " + record.getPayOrderNo());
logger.error("pay success handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo());
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND); throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND);
} }


Date currentDate = new Date();
// 修改支付订单状态 // 修改支付订单状态
try { try {
WxPayOrder updateOrder = new WxPayOrder(); WxPayOrder updateOrder = new WxPayOrder();
@@ -297,6 +325,65 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
*/ */
} }


@Override
public void handlePayOrderStatusUpdate(WxPayOrder record) {
// 判断支付状态
if (record.getPayOrderStatus() != EnumPayStatus.PAY_WAY_WAIT.getCode()) {
logger.error("pay handle, payOrder " + record.getPayOrderNo() +
"is complete s , orderId : " + record.getOrderId());
return;
}
WxOrder order = wxOrderMapper.selectByPrimaryKey(record.getOrderId());
if (order == null) {
logger.error("pay success handle, order " + record.getOrderId() + " not found , payOrderGid : " + record.getPayOrderNo());
throw new MallinkException(ErrorCode.ORDER_IS_NOT_FIND);
}

Date currentDate = new Date();
// 修改支付订单状态
try {
WxPayOrder updateOrder = new WxPayOrder();
updateOrder.setId(record.getId());
updateOrder.setOrderId(record.getOrderId());
updateOrder.setUpdateTime(currentDate);
updateOrder.setPayOrderStatus(record.getPayOrderStatus());
wxPayOrderMapper.updateByPrimaryKeySelective(updateOrder);
} catch (Exception e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL);
}

// 修改订单状态
if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_SUCCESS.getCode()) {
try {
wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_PAYMENT_SUCCESS);
} catch (Exception e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL);
}
} else if (record.getPayOrderStatus() == EnumPayStatus.PAY_WAY_CANCEL.getCode()) {
try {
wxOrderService.updateOrderStatus(order.getId(), EnumOrderStatus.ORDER_STATUS_OVERTIME_CANCEL);
} catch (Exception e) {
logger.error(e.getMessage());
throw new MallinkException(ErrorCode.DB_FAIL);
}
}
/*
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
public PageInfo<WxPayOrder> listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize) { public PageInfo<WxPayOrder> listAsPage(WxPayOrder record, Integer pageIndex, Integer pageSize) {
@@ -313,7 +400,7 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
if (record.getId() == null) { if (record.getId() == null) {
//record.setId(UUID.randomUUID().toString().replaceAll("-", "")); //record.setId(UUID.randomUUID().toString().replaceAll("-", ""));
IdWorker idWorker = new IdWorker(0, 0); IdWorker idWorker = new IdWorker(0, 0);
record.setId(idWorker.nextId());
record.setId(idWorker.nextId());
wxPayOrderMapper.insertSelective(record); wxPayOrderMapper.insertSelective(record);
} else { } else {
wxPayOrderMapper.updateByPrimaryKeySelective(record); wxPayOrderMapper.updateByPrimaryKeySelective(record);
@@ -324,12 +411,6 @@ public class WxPayOrderServiceImpl implements WxPayOrderService {
public void deleteById(Long id) { public void deleteById(Long id) {
wxPayOrderMapper.deleteByPrimaryKey(id); wxPayOrderMapper.deleteByPrimaryKey(id);
} }


} }

+ 0
- 5
mallinkService/src/main/resources/mapper/WxCouponOrderMapper.xml Voir le fichier

@@ -90,9 +90,4 @@
<include refid="dynamicWhereConditions" /> <include refid="dynamicWhereConditions" />
</select> </select>







</mapper> </mapper>

Chargement…
Annuler
Enregistrer