|
|
@@ -22,9 +22,11 @@ import com.txz.cif.dubbo.client.OperatingConfigDubboServiceClient;
|
|
|
import com.txz.cif.model.*;
|
|
|
import com.txz.cif.service.*;
|
|
|
import com.txz.cif.util.TFPayUtil;
|
|
|
+import com.txz.cif.util.TKPayUtil;
|
|
|
import com.txz.cif.web.para.RecordParam;
|
|
|
import com.txz.cif.web.para.WithdrawParam;
|
|
|
import com.txz.cif.web.ro.TFWithdrawCallbackRO;
|
|
|
+import com.txz.cif.web.ro.TKWithdrawCallbackRO;
|
|
|
import com.txz.mall.enums.NoticeEnum;
|
|
|
import com.txz.operating.dto.ConfigDTO;
|
|
|
import io.jsonwebtoken.Claims;
|
|
|
@@ -42,6 +44,7 @@ import javax.annotation.Resource;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
+import java.util.Date;
|
|
|
import java.util.List;
|
|
|
|
|
|
import static com.txz.cif.core.AbstractApiController.X_CLIENT_TOKEN;
|
|
|
@@ -53,40 +56,40 @@ import static com.txz.cif.core.AbstractApiController.X_CLIENT_TOKEN;
|
|
|
@RestController
|
|
|
@RequestMapping("/api/withdraw/record")
|
|
|
public class WithdrawRecordApiController {
|
|
|
-
|
|
|
+
|
|
|
private static Logger log = LoggerFactory.getLogger(WithdrawRecordApiController.class);
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private WithdrawRecordService withdrawRecordService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private SequenceService sequenceService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private AuthService authService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private AccountService accountService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private BizLogService bizLogService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private PaymentChannelService paymentChannelService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private UserService userService;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private LockTemplate lockTemplate;
|
|
|
-
|
|
|
+
|
|
|
@Resource
|
|
|
private OperatingConfigDubboServiceClient operatingConfigDubboServiceClient;
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
@Resource
|
|
|
private NoticeDubboServiceClient noticeDubboServiceClient;
|
|
|
-
|
|
|
+
|
|
|
@PostMapping("/add")
|
|
|
@ApiOperation(value = "新增提现订单", httpMethod = "POST")
|
|
|
public Result add(@RequestBody WithdrawParam param, @RequestHeader(value = X_CLIENT_TOKEN, required = false) String token) {
|
|
|
@@ -95,7 +98,7 @@ public class WithdrawRecordApiController {
|
|
|
}
|
|
|
try {
|
|
|
Triple<Boolean, String, Claims> result = authService.verifyToken(token);
|
|
|
-
|
|
|
+
|
|
|
if (!result.getLeft()) {
|
|
|
// token无效
|
|
|
String errorMsg = result.getMiddle();
|
|
|
@@ -104,7 +107,7 @@ public class WithdrawRecordApiController {
|
|
|
}
|
|
|
Claims claims = result.getRight();
|
|
|
Long userId = Long.valueOf(claims.get("userId").toString());
|
|
|
-
|
|
|
+
|
|
|
User user = userService.findById(userId);
|
|
|
if (user == null) {
|
|
|
return ResultGenerator.genFailResult(ResultCode.USER_IS_NULL);
|
|
|
@@ -141,7 +144,7 @@ public class WithdrawRecordApiController {
|
|
|
return ResultGenerator.genFailResult(ResultCode.AMOUNT_OUT_MAX);
|
|
|
}
|
|
|
String key = "";
|
|
|
- if (param.getAccountType() == 1){
|
|
|
+ if (param.getAccountType() == 1) {
|
|
|
key = "withdraw_rate";
|
|
|
} else {
|
|
|
key = "earning_withdraw_rate";
|
|
|
@@ -149,7 +152,7 @@ public class WithdrawRecordApiController {
|
|
|
com.txz.operating.result.Result<ConfigDTO> openRedEnvelopeRate = operatingConfigDubboServiceClient.getConfigByCode(key);
|
|
|
String rate = openRedEnvelopeRate.getData().getValueInfo();
|
|
|
BigDecimal fee = param.getAmount().multiply(new BigDecimal(rate)).divide(BigDecimal.valueOf(100), 2, RoundingMode.DOWN);
|
|
|
-
|
|
|
+
|
|
|
Account account = accountService.getAccount(userId, param.getAccountType());
|
|
|
if (account == null) {
|
|
|
return ResultGenerator.genFailResult(ResultCode.ACCOUNT_IS_NULL);
|
|
|
@@ -157,9 +160,9 @@ public class WithdrawRecordApiController {
|
|
|
if (account.getEffectiveBalance().compareTo(param.getAmount().add(fee)) < 0) {
|
|
|
return ResultGenerator.genFailResult(ResultCode.EFFECTIVE_BALANCE_IS_INSUFFICIENT);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
String orderNo = sequenceService.genSerialNumber("withdraw_rule", null);
|
|
|
-
|
|
|
+
|
|
|
WithdrawRecord withdrawRecord = new WithdrawRecord();
|
|
|
withdrawRecord.setOrderNo(orderNo);
|
|
|
withdrawRecord.setStatus(1);
|
|
|
@@ -172,28 +175,28 @@ public class WithdrawRecordApiController {
|
|
|
withdrawRecord.setBank(user.getBank());
|
|
|
withdrawRecord.setBankAccount(user.getBankAccount());
|
|
|
withdrawRecord.setBankAccountName(user.getBankAccountName());
|
|
|
-// withdrawRecord.setChannel(param.getChannel());
|
|
|
+ // withdrawRecord.setChannel(param.getChannel());
|
|
|
withdrawRecord.setCurrency(param.getCurrency());
|
|
|
withdrawRecord.setAmount(param.getAmount());
|
|
|
withdrawRecord.setCreateTime(DateUtil.date());
|
|
|
withdrawRecordService.add(withdrawRecord);
|
|
|
// 新增日志
|
|
|
bizLogService.save(BizLog.builder()
|
|
|
- .bizType(2)
|
|
|
- .bizNo(orderNo)
|
|
|
- .type(4)
|
|
|
- .createTime(DateUtil.date())
|
|
|
- .createUser(user.getName())
|
|
|
- .memo("提交提现申请").build());
|
|
|
+ .bizType(2)
|
|
|
+ .bizNo(orderNo)
|
|
|
+ .type(4)
|
|
|
+ .createTime(DateUtil.date())
|
|
|
+ .createUser(user.getName())
|
|
|
+ .memo("提交提现申请").build());
|
|
|
return ResultGenerator.genSuccessResult(withdrawRecord);
|
|
|
} catch (Exception e) {
|
|
|
log.error("新增对象操作异常e:{}", e);
|
|
|
return ResultGenerator.genFailResult(ResultCode.INTERNAL_SERVER_ERROR);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
+
|
|
|
+
|
|
|
@PostMapping("/list")
|
|
|
@ApiOperation(value = "withdrawRecord获取列表", httpMethod = "POST")
|
|
|
public Result<List<WithdrawRecord>> list(@RequestBody RecordParam param, HttpServletRequest request) {
|
|
|
@@ -202,7 +205,7 @@ public class WithdrawRecordApiController {
|
|
|
ResultGenerator.genFailResult(ResultCode.OAUTH_INVALID_ACCESS_TOKEN);
|
|
|
}
|
|
|
PageHelper.startPage(param.getPage(), param.getSize());
|
|
|
-
|
|
|
+
|
|
|
Condition condition = new Condition(WithdrawRecord.class);
|
|
|
Criteria criteria = condition.createCriteria();
|
|
|
criteria.andEqualTo("userId", userId);
|
|
|
@@ -246,7 +249,7 @@ public class WithdrawRecordApiController {
|
|
|
}
|
|
|
return ResultGenerator.genSuccessResult(pageInfo);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
/**
|
|
|
* tfpay提现通知
|
|
|
*/
|
|
|
@@ -268,12 +271,12 @@ public class WithdrawRecordApiController {
|
|
|
return "FAIL";
|
|
|
}
|
|
|
boolean checkSignResult = TFPayUtil.verifySignature(BeanUtil.copyProperties(dto, CheckWithdrawSignDTO.class), paymentChannels.get(0).getSecretKey(), dto.getSign());
|
|
|
-
|
|
|
+
|
|
|
if (!checkSignResult) {
|
|
|
log.error("签名校验失败");
|
|
|
return "FAIL";
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
Condition condition = new Condition(WithdrawRecord.class);
|
|
|
Example.Criteria criteria = condition.createCriteria();
|
|
|
criteria.andEqualTo("thirdOrderNo", dto.getOrderid());
|
|
|
@@ -283,7 +286,7 @@ public class WithdrawRecordApiController {
|
|
|
log.error("提现订单不存在");
|
|
|
return "FAIL";
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// //TODO 回调成功
|
|
|
// JSONObject json = JSONUtil.parseObj(data);
|
|
|
// String orderNo = json.getStr("orderNo");
|
|
|
@@ -336,7 +339,7 @@ public class WithdrawRecordApiController {
|
|
|
} catch (Exception e) {
|
|
|
log.error("新增充值回调日志失败", e);
|
|
|
// }
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
try {
|
|
|
noticeDubboServiceClient.addMoneyNotice(ne, record.getUserId());
|
|
|
@@ -348,5 +351,107 @@ public class WithdrawRecordApiController {
|
|
|
lockTemplate.releaseLock(lockInfo);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ /**
|
|
|
+ * tkpay提现通知
|
|
|
+ */
|
|
|
+ @PostMapping("/callback/tkpay")
|
|
|
+ public String tkcallback(@RequestBody TKWithdrawCallbackRO dto) {
|
|
|
+ LockInfo lockInfo = lockTemplate.lock(String.format(MyConstants.TK_PAY_WITHDRAW_NOTIFY_LOCK, dto.getOutTradeNo()), Long.valueOf(1000 * 60 * 2), Long.valueOf(1000 * 1), RedisTemplateLockExecutor.class);
|
|
|
+ if (null == lockInfo) {
|
|
|
+ return "WAIT";
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ log.info("提现渠道--->tkpay,提现回调通知--->" + dto);
|
|
|
+ Condition channelCondition = new Condition(PaymentChannel.class);
|
|
|
+ Example.Criteria channelCriteria = channelCondition.createCriteria();
|
|
|
+ channelCriteria.andEqualTo("channelName", "tk");
|
|
|
+ channelCriteria.andEqualTo("isValid", 1);
|
|
|
+ List<PaymentChannel> paymentChannels = paymentChannelService.findByCondition(channelCondition);
|
|
|
+ if (CollectionUtil.isEmpty(paymentChannels)) {
|
|
|
+ log.error("支付渠道不存在");
|
|
|
+ return "fail";
|
|
|
+ }
|
|
|
+ boolean checkSignResult = TKPayUtil.verifySignature(BeanUtil.copyProperties(dto, com.txz.cif.dto.tkpay.CheckWithdrawSignDTO.class), paymentChannels.get(0).getSecretKey(), dto.getSign());
|
|
|
+
|
|
|
+ if (!checkSignResult) {
|
|
|
+ log.error("签名校验失败");
|
|
|
+ return "fail";
|
|
|
+ }
|
|
|
+
|
|
|
+ Condition condition = new Condition(WithdrawRecord.class);
|
|
|
+ Example.Criteria criteria = condition.createCriteria();
|
|
|
+ criteria.andEqualTo("thirdOrderNo", dto.getOutTradeNo());
|
|
|
+ criteria.andEqualTo("status", 2);
|
|
|
+ List<WithdrawRecord> records = withdrawRecordService.findByCondition(condition);
|
|
|
+ if (CollectionUtil.isEmpty(records)) {
|
|
|
+ log.error("提现订单不存在");
|
|
|
+ return "fail";
|
|
|
+ }
|
|
|
+
|
|
|
+ // //TODO 回调成功
|
|
|
+ // JSONObject json = JSONUtil.parseObj(data);
|
|
|
+ // String orderNo = json.getStr("orderNo");
|
|
|
+ // WithdrawRecord record = withdrawRecordService.findBy("orderNo", orderNo);
|
|
|
+ // if (record == null) {
|
|
|
+ // return ResultGenerator.genFailResult("订单未找到");
|
|
|
+ // }
|
|
|
+ // Integer type = 8;
|
|
|
+ // if (StrUtil.equals("1", json.getStr("status"))) {
|
|
|
+ // withdrawRecordService.success(record);
|
|
|
+ // } else {
|
|
|
+ // withdrawRecordService.fail(record);
|
|
|
+ // type = 9;
|
|
|
+ // }
|
|
|
+ // try {
|
|
|
+ // // 新增充值回调日志
|
|
|
+ // bizLogService.save(BizLog.builder().bizType(2).bizNo(orderNo)
|
|
|
+ // .type(type).createTime(DateUtil.date()).createUser("第三方")
|
|
|
+ // .memo("提现回调").build());
|
|
|
+ // } catch (Exception e) {
|
|
|
+ // log.error("新增充值回调日志失败", e);
|
|
|
+ // }
|
|
|
+ // return ResultGenerator.genSuccessResult();
|
|
|
+ WithdrawRecord record = records.get(0);
|
|
|
+ NoticeEnum ne = null;
|
|
|
+ Integer type = 8;
|
|
|
+ if (dto.getStatus() == 5) {
|
|
|
+ withdrawRecordService.success(record, new Date());
|
|
|
+ if (record.getAccountType() == 1) {
|
|
|
+ ne = NoticeEnum.MONEY_WITHDRAWAL_WALLET_SUCCESS;
|
|
|
+ } else if (record.getAccountType() == 2) {
|
|
|
+ ne = NoticeEnum.MONEY_WITHDRAWAL_ACCOUNT_SUCCESS;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ withdrawRecordService.fail(records.get(0));
|
|
|
+ type = 9;
|
|
|
+ ne = NoticeEnum.MONEY_WITHDRAWAL_FAIL;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ // 新增充值回调日志
|
|
|
+ bizLogService.save(BizLog.builder()
|
|
|
+ .bizType(2)
|
|
|
+ .bizNo(record.getOrderNo())
|
|
|
+ .thirdOrderNo(dto.getOutTradeNo())
|
|
|
+ .type(type)
|
|
|
+ .receiveMessage(dto.toString())
|
|
|
+ .createTime(DateUtil.date())
|
|
|
+ .createUser("TFPAY")
|
|
|
+ .memo("提现回调").build());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("新增充值回调日志失败", e);
|
|
|
+ // }
|
|
|
+
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ noticeDubboServiceClient.addMoneyNotice(ne, record.getUserId());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("新增提现回调消息失败", e);
|
|
|
+ }
|
|
|
+ return "success";
|
|
|
+ } finally {
|
|
|
+ lockTemplate.releaseLock(lockInfo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
}
|