|
|
|
@ -48,6 +48,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.security.cert.X509Certificate;
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
|
import java.util.Collections;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
@ -124,21 +125,38 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override // 金额交易!
|
|
|
|
|
public void changeBalanceByOpenId(String openId, BigDecimal amount, BalanceChangeTypeEnum changeTypeEnum) {
|
|
|
|
|
public void changeBalanceById(String id, String openId, BigDecimal amount, BalanceChangeTypeEnum changeTypeEnum) {
|
|
|
|
|
LambdaQueryWrapper<Client> wrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
wrapper.eq(Client::getWxOpenid, openId);
|
|
|
|
|
wrapper.eq(Client::getId, id).or().eq(Client::getWxOpenid, openId);
|
|
|
|
|
wrapper.last("for update");
|
|
|
|
|
Client client = this.getOne(wrapper);
|
|
|
|
|
BigDecimal balance = client.getBanlance();
|
|
|
|
|
String remark;
|
|
|
|
|
LocalDateTime now = LocalDateTime.now();
|
|
|
|
|
if (changeTypeEnum.equals(BalanceChangeTypeEnum.INCOME)) { // 收入
|
|
|
|
|
client.setBanlance(balance.add(amount));
|
|
|
|
|
balance = balance.add(amount);
|
|
|
|
|
remark = "废品回收结算,收入" + amount + "元";
|
|
|
|
|
} else { // 支出/提现
|
|
|
|
|
if (balance.compareTo(amount) < 0) {
|
|
|
|
|
throw new BizIllegalException("余额不足");
|
|
|
|
|
}
|
|
|
|
|
client.setBanlance(balance.subtract(amount));
|
|
|
|
|
balance = balance.subtract(amount);
|
|
|
|
|
remark = "微信提现" + amount + "元";
|
|
|
|
|
}
|
|
|
|
|
// 更新余额
|
|
|
|
|
client.setBanlance(balance);
|
|
|
|
|
client.setUpdateTime(now);
|
|
|
|
|
this.updateById(client);
|
|
|
|
|
|
|
|
|
|
// 添加流水记录
|
|
|
|
|
ClientAccountDetail accountDetail = new ClientAccountDetail();
|
|
|
|
|
accountDetail.setClientId(client.getId());
|
|
|
|
|
accountDetail.setAmount(amount);
|
|
|
|
|
accountDetail.setChangeType(changeTypeEnum);
|
|
|
|
|
accountDetail.setBanlance(balance);
|
|
|
|
|
accountDetail.setRemark(remark);
|
|
|
|
|
accountDetail.setCreatorTime(now);
|
|
|
|
|
accountDetailMapper.insert(accountDetail);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -153,48 +171,49 @@ public class ClientServiceImpl extends ServiceImpl<ClientMapper, Client> impleme
|
|
|
|
|
return accountDetailMapper.selectPage(pageDO, wrapperX);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public void cashBalance(String openId, Integer amount) throws Exception {
|
|
|
|
|
// BatchTransferModel batchTransferModel = new BatchTransferModel()
|
|
|
|
|
// .setAppid(wxPayV3Properties.getAppId())
|
|
|
|
|
// .setOut_batch_no(PayKit.generateStr())
|
|
|
|
|
// .setBatch_name("测试商户转账到零钱")
|
|
|
|
|
// .setBatch_remark("测试商户转账到零钱")
|
|
|
|
|
// .setTotal_amount(amount)
|
|
|
|
|
// .setTotal_num(1)
|
|
|
|
|
// .setTransfer_detail_list(Collections.singletonList(
|
|
|
|
|
// new TransferDetailInput()
|
|
|
|
|
// .setOut_detail_no(PayKit.generateStr())
|
|
|
|
|
// .setTransfer_amount(1)
|
|
|
|
|
// .setTransfer_remark("测试商户转账到零钱")
|
|
|
|
|
// .setOpenid(openId)));
|
|
|
|
|
//
|
|
|
|
|
// log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel));
|
|
|
|
|
// // 删除
|
|
|
|
|
// IJPayHttpResponse response = WxPayApi.v3(
|
|
|
|
|
// RequestMethodEnum.POST,
|
|
|
|
|
// WxDomainEnum.CHINA.toString(),
|
|
|
|
|
// TransferApiEnum.TRANSFER_BATCHES.toString(),
|
|
|
|
|
// wxPayV3Properties.getMchId(),
|
|
|
|
|
// getSerialNumber(),
|
|
|
|
|
// null,
|
|
|
|
|
// wxPayV3Properties.getKeyPath(),
|
|
|
|
|
// JSONUtil.toJsonStr(batchTransferModel)
|
|
|
|
|
// );
|
|
|
|
|
// log.info("发起商家转账响应 {}", response);
|
|
|
|
|
// 根据证书序列号查询对应的证书来验证签名结果
|
|
|
|
|
// boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Properties.getPlatformCertPath());
|
|
|
|
|
// 模拟提现成功
|
|
|
|
|
this.changeBalanceById(null, openId, new BigDecimal(amount), BalanceChangeTypeEnum.CASH_OUT);
|
|
|
|
|
/* BatchTransferModel batchTransferModel = new BatchTransferModel()
|
|
|
|
|
.setAppid(wxPayV3Properties.getAppId())
|
|
|
|
|
.setOut_batch_no(PayKit.generateStr())
|
|
|
|
|
.setBatch_name("测试商户转账到零钱")
|
|
|
|
|
.setBatch_remark("测试商户转账到零钱")
|
|
|
|
|
.setTotal_amount(amount)
|
|
|
|
|
.setTotal_num(1)
|
|
|
|
|
.setTransfer_detail_list(Collections.singletonList(
|
|
|
|
|
new TransferDetailInput()
|
|
|
|
|
.setOut_detail_no(PayKit.generateStr())
|
|
|
|
|
.setTransfer_amount(1)
|
|
|
|
|
.setTransfer_remark("测试商户转账到零钱")
|
|
|
|
|
.setOpenid(openId)));
|
|
|
|
|
|
|
|
|
|
log.info("发起商家转账请求参数 {}", JSONUtil.toJsonStr(batchTransferModel));
|
|
|
|
|
// 删除
|
|
|
|
|
IJPayHttpResponse response = WxPayApi.v3(
|
|
|
|
|
RequestMethodEnum.POST,
|
|
|
|
|
WxDomainEnum.CHINA.toString(),
|
|
|
|
|
TransferApiEnum.TRANSFER_BATCHES.toString(),
|
|
|
|
|
wxPayV3Properties.getMchId(),
|
|
|
|
|
getSerialNumber(),
|
|
|
|
|
null,
|
|
|
|
|
wxPayV3Properties.getKeyPath(),
|
|
|
|
|
JSONUtil.toJsonStr(batchTransferModel)
|
|
|
|
|
);
|
|
|
|
|
log.info("发起商家转账响应 {}", response);
|
|
|
|
|
// 根据证书序列号查询对应的证书来验证签名结果
|
|
|
|
|
boolean verifySignature = WxPayKit.verifySignature(response, wxPayV3Properties.getPlatformCertPath());
|
|
|
|
|
// log.info("verifySignature: {}", verifySignature);
|
|
|
|
|
// if (response.getStatus() == OK && verifySignature) {
|
|
|
|
|
// return response.getBody();
|
|
|
|
|
// }
|
|
|
|
|
// if (response.getStatus() != OK) {
|
|
|
|
|
// throw new BizIllegalException("提现失败");
|
|
|
|
|
// }
|
|
|
|
|
// 模拟提现成功
|
|
|
|
|
this.changeBalanceByOpenId(openId, new BigDecimal(amount), BalanceChangeTypeEnum.CASH_OUT);
|
|
|
|
|
// return response.getBody();
|
|
|
|
|
if (response.getStatus() != OK) {
|
|
|
|
|
throw new BizIllegalException("提现失败");
|
|
|
|
|
}
|
|
|
|
|
// return response.getBody(); */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|