package com.xzx.gc.pay.service;
|
|
import cn.hutool.core.bean.BeanUtil;
|
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.date.DateUtil;
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
import cn.hutool.core.util.IdUtil;
|
import cn.hutool.core.util.NumberUtil;
|
import cn.hutool.core.util.StrUtil;
|
import cn.hutool.http.HttpUtil;
|
import cn.hutool.json.JSONObject;
|
import cn.hutool.json.JSONUtil;
|
import com.alipay.api.AlipayApiException;
|
import com.alipay.api.AlipayClient;
|
import com.alipay.api.CertAlipayRequest;
|
import com.alipay.api.DefaultAlipayClient;
|
import com.alipay.api.domain.AlipayOpenOperationOpenbizmockBizQueryModel;
|
import com.alipay.api.domain.AlipayTradeAppPayModel;
|
import com.alipay.api.internal.util.AlipaySignature;
|
import com.alipay.api.request.AlipayOpenOperationOpenbizmockBizQueryRequest;
|
import com.alipay.api.request.AlipayTradeAppPayRequest;
|
import com.alipay.api.response.AlipayOpenOperationOpenbizmockBizQueryResponse;
|
import com.alipay.api.response.AlipayTradeAppPayResponse;
|
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageInfo;
|
import com.xzx.gc.common.constant.*;
|
import com.xzx.gc.common.dto.CommonDto;
|
import com.xzx.gc.common.dto.SimplePage;
|
import com.xzx.gc.common.dto.log.PayInfoLog;
|
import com.xzx.gc.common.exception.BusinessException;
|
import com.xzx.gc.common.exception.RestException;
|
import com.xzx.gc.common.exception.wx.WxPayNotifyResponseException;
|
import com.xzx.gc.common.utils.*;
|
import com.xzx.gc.entity.*;
|
import com.xzx.gc.model.JsonResult;
|
import com.xzx.gc.model.admin.*;
|
import com.xzx.gc.model.pay.*;
|
import com.xzx.gc.model.user.AccountVo;
|
import com.xzx.gc.pay.mapper.*;
|
import com.xzx.gc.util.DoubleUtil;
|
import com.xzx.gc.util.SessionUtil;
|
import com.xzx.gc.util.pay.util.WechatpayUtil;
|
import com.xzx.gc.util.pay.util.entity.ResultEntity;
|
import com.xzx.gc.util.pay.util.entity.TransfersDtoAdmin;
|
import io.swagger.annotations.ApiModelProperty;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.codec.binary.Base64;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import tk.mybatis.mapper.entity.Example;
|
|
import javax.annotation.PostConstruct;
|
import javax.servlet.http.HttpServletRequest;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.*;
|
|
|
@Service
|
@Transactional
|
@Slf4j
|
public class PayService {
|
|
@Autowired
|
private PayInfoMapper payInfoMapper;
|
|
@Autowired
|
private AccountLogMapper accountLogMapper;
|
|
@Autowired
|
private SysMessageMapper sysMessageMapper;
|
|
@Autowired
|
private IdUtils idUtils;
|
|
@Autowired
|
private HttpServletRequest request;
|
|
@Autowired
|
private OtherUserMapper otherUserMapper;
|
|
@Autowired
|
private UserMapper userMapper;
|
|
@Autowired
|
private UserService userService;
|
|
@Autowired
|
private PayRequestMapper payRequestMapper;
|
|
@Autowired
|
private PlatformAccountInfoMapper platformAccountInfoMapper;
|
|
@Autowired
|
private RedisUtil redisUtil;
|
|
@Autowired
|
private BusinessUtil businessUtil;
|
|
@Autowired
|
private AccountMapper accountMapper;
|
|
@Autowired
|
private PayInfoLogService payInfoLogService;
|
|
@Autowired
|
private AccountService accountService;
|
|
@Autowired
|
private OtherUserService otherUserService;
|
|
@Autowired
|
private PlatformAccountLogService platformAccountLogService;
|
|
@Autowired
|
private PlatformAccountInfoService platformAccountInfoService;
|
|
@Autowired
|
private ConfigService configService;
|
|
@Autowired
|
private ConfigMapper configMapper;
|
|
@Autowired
|
private AccountBindService accountBindService;
|
|
@Autowired
|
private SessionUtil sessionUtil;
|
@Autowired
|
private UserRoleMapper userRoleMapper;
|
|
@Autowired
|
private PlatformAccountLogMapper platformAccountLogMapper;
|
|
@Autowired
|
private AccountScoreLogMapper accountScoreLogMapper;
|
|
@Autowired
|
private CityPartnerService cityPartnerService;
|
|
|
@Value("${anroidAppId}")
|
private String anroidAppId;
|
@Value("${wx.app.url}")
|
String TRANS_URL;
|
@Value("${wx.app.key}")
|
String APP_KEY;
|
@Value("${wx.path}")
|
String CERT_PATH;
|
@Value("${wx.pay.appid}")
|
String APP_ID;
|
@Value("${wx.mchid}")
|
String MCH_ID;
|
@Value("${wx.name}")
|
String MCH_NAME;
|
@Value("${wx.create.ip}")
|
String CREATE_IP;
|
|
@Autowired
|
private PartnerAccountLogService partnerAccountLogService;
|
@Autowired
|
private PartnerAccountService partnerAccountService;
|
|
private static CertAlipayRequest getClientParams() {
|
CertAlipayRequest certParams = new CertAlipayRequest();
|
//https://blog.csdn.net/sinat_32575213/article/details/79651110
|
certParams.setServerUrl("https://openapi.alipaydev.com/gateway.do");
|
//请更换为您的AppId
|
certParams.setAppId("2021000119674887");
|
//请更换为您的PKCS8格式的应用私钥
|
certParams.setPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCDXABjX661uzuAbwEOa2YV9S3Xm409k27LRkJsBHRyhHuq4+MK5OnFMpNmYl+e2rIvQ9y+1YI65NovPV4XTAt6tr2wIE2uD8dLJELHxwZyUpLSgdLW4Ds6qoea8qoZk3563baO2i0EnuSk9evBpzzJtO0+QDiNGASrE+7mPL9ygCv8V4i185h/LpinKTymnIhyTtEmjEAXITPM/e2PvWTE+RCz07kkXIEquVtcj/5geRPqXaogsbaMgwy3oKiZLRw8Axo8OhO9zDTnfFeO7pwPvWTAMFYKZu7jbOTMa4vT0DQYqDIDmNzCbTCfkfE3VQrmI4KTacprTz46fNC5UXq9AgMBAAECggEAdtaS21RC4NJkgErsb7kmABNxx69IVj69a1VC3iohl0DYCMBmNQLnoqmgxG2XCEXeEfiZCmRqjxFfeoFQUE9Ry1Drxx1SaXiI2igR6l7aLC8b+SnOLutpaifAyqNi1ASl1k4izJYBSD7fp4V8JhRAYFM4lqrO/oaOIp/D77NhmBmfV5XIzZOzeLkHaLN8pTqUdvTF917MkmUsY1iysol+EmU/pZePkcwIcHoQcJ9yWam8bRErXAqoKSvMcXetpsaIN6Fgn/sMkk/coJW2rSWNxUQVn+RTvKwT9UGehah/jwqzNwg/FhiKu28PDLccQzbK/VkZ2sTla3w/AlKnmn91QQKBgQDcHdwyjI25tRMayjneZc5VOKA65Du1RubiXdJU+14288qDNHmR4CMxIe49gHPknWwkiLNa0VnhnINJSsEXtvpcPY1ICL9TnHGBCYFpA+4Wc6gYa6CqUeg41O5ki0b+Ar3xp3hVOqeBnHdyKwv1/UvHWeFYPXwqg5MFu3iA1mLnNQKBgQCYxgeecZshL6iwww8kHaCxNf92l4s89YIpiTFsv70SAt+h7OxN9wzJcF2dQbUIEB0Q26KWeomzd4rZRr0CqcpMj/HRQzk0W8fGGEKGAZwjf33aa1VSehY8ZMYBCgJcVk7CRl/XQ+51ppqr80HwGBgSqV5P3b6T1vmiZlRP1GTOaQKBgQCiAwRo3FUQY/u80y3GyK4WwcgFsKlV4urboGzIif+teMEM01nLieq9JhlBgUNL+KZ5OXixlreOPHHRR0laWB5sOA2+AFo6g0Jz1HhAwFjEg7osx0MJOaIv+mHA9VZ6bbA6pqYGLVbPKkgsawyxsQ7OmxQmq5KxhAh5xqOKSMGhJQKBgGFpg9onnj7e4LU06yagLaJRR/8aShIoiUJq1DT/XVNquaXKKDLeYCzhlQ98oi3t+FqTcWx53eutQb+hN0vHb9K5xfsk3gjgrNVHCsPfquuHk3v+DH12k08XApoPA8pUzgtaTCo6ioZCIUWa6mRpOJBNpnFOdwJVhP9kOEZeq5hhAoGAMKztAVJCzjiJr7Htd8pUc/hjLXUznUfbNfigNtNXAKL7QWHmrz5NIDuFKY2gn08ahAoZG/P34N2DrrhEOrBlT249FEFEo7HH1EvFbEN1QosCZFhXTWkcgSxcmj9TRu4uLVppW+6hMxVbR2ZY4MGmCQPJEu91JnQzYqyZAt6SGYw=");
|
//请更换为您使用的字符集编码,推荐采用utf-8
|
certParams.setCharset("utf-8");
|
certParams.setFormat("json");
|
certParams.setSignType("RSA2");
|
//请更换为您的应用公钥证书文件路径
|
certParams.setCertPath("E:/card/appCertPublicKey_2021000119674887.crt");
|
//请更换您的支付宝公钥证书文件路径
|
certParams.setAlipayPublicCertPath("E:/card/alipayCertPublicKey_RSA2.crt");
|
//更换为支付宝根证书文件路径
|
certParams.setRootCertPath("E:/card/alipayRootCert.crt");
|
return certParams;
|
}
|
|
|
private AlipayClient alipayClient;
|
|
@PostConstruct
|
public void init() throws AlipayApiException {
|
// 1. 创建AlipayClient实例
|
if (SpringUtil.isDev()) {
|
alipayClient = new DefaultAlipayClient(getClientParams());
|
}
|
|
}
|
|
public int addPayInfo(PayInfoModel model) {
|
CoreUser user = sessionUtil.getCurrentUser();
|
model.setAccountId("");
|
model.setStatus("1");
|
model.setPayType("1");
|
model.setCreateUserId(user.getId() + "");
|
model.setCreateTime(DateUtil.now());
|
return payInfoMapper.addPayInfo(model);
|
}
|
|
public CommonDto PayInfoAdd(PayInfoReq payInfoReq) {
|
|
String lockId = "";
|
if (StrUtil.isNotBlank(payInfoReq.getCreateUserId())) {
|
lockId = payInfoReq.getCreateUserId();
|
} else if (StrUtil.isNotBlank(payInfoReq.getUserId())) {
|
lockId = payInfoReq.getUserId();
|
}
|
CommonDto commonDto = new CommonDto();
|
if (StrUtil.isNotBlank(lockId) && redisUtil.setnx(Constants.REDIS_PAY_KEY + "add:" + lockId, lockId)) {
|
try {
|
String payOrderId = idUtils.generate("ZF", 0);
|
payInfoReq.setPayOrderId(payOrderId);
|
String now = DateUtil.now();
|
payInfoReq.setCreateTime(now);
|
//充值或者支入则不需要写入支付申请表
|
if (PayEnum.提现.getValue().equals(payInfoReq.getPayType())) {
|
|
|
String configValue = configService.findByCode("WITHDRAW_MAX_MONEY").getConfigValue();
|
|
if (Convert.toBigDecimal(payInfoReq.getMoney()).compareTo(Convert.toBigDecimal(configValue)) > 0) {
|
throw new RestException(-1, "单笔提现金额不能超过" + configValue);
|
}
|
|
//查询账号是否被冻结
|
AccountInfo byUserIdWithStatus = accountService.findByUserId(payInfoReq.getCreateUserId());
|
if (byUserIdWithStatus == null) {
|
throw new RestException(-1, "账户已被禁用");
|
}
|
|
|
List<PayInfoVo> withdrawList = payInfoMapper.queryWithdrawInfo(payInfoReq);
|
if (withdrawList.size() >= 1) {
|
|
throw new RestException(-1, "一天只能提现一次");
|
}
|
List<AccountVo> accountList = payInfoMapper.queryMyMoney(payInfoReq);
|
AccountVo accountVo = accountList.get(0);
|
|
//提现金额
|
BigDecimal bigDecimal = NumberUtil.toBigDecimal(payInfoReq.getMoney());
|
//余额
|
BigDecimal bigDecimal1 = NumberUtil.toBigDecimal(accountVo.getMoney());
|
|
//判断账户余额是否足够,返回-1表示余额不够
|
|
if (NumberUtil.isGreater(bigDecimal, bigDecimal1)) {
|
throw new RestException(-1, "用户余额不足");
|
}
|
|
//查询账户信息 安卓回收员提现转成普通用户
|
if (1 == Convert.toInt(payInfoReq.getChangeUserFlag(), 0)) {
|
String createUserId = payInfoReq.getCreateUserId();
|
OtherUserInfo otherUserInfo = otherUserMapper.selectByPrimaryKey(createUserId);
|
String mobilePhone = otherUserInfo.getMobilePhone();
|
|
|
UserInfo userInfo1 = userService.findByMobile(mobilePhone);
|
|
if (userInfo1 != null) {
|
payInfoReq.setOpenId(userInfo1.getOpenId());
|
}
|
}
|
|
payInfoReq.setStatus(PayEnum.待审核.getValue());
|
payInfoReq.setAccountId(accountVo.getAccountId());
|
payInfoMapper.payRequestInfoAdd(payInfoReq);
|
|
|
PayInfoLog payInfoLog = new PayInfoLog();
|
BeanUtil.copyProperties(payInfoReq, payInfoLog);
|
payInfoLog.setAccount(accountVo.getAccountName());
|
payInfoLog.setAccountClass(PayEnum.微信.getValue());
|
payInfoLog.setPayType(PayEnum.提现交易.getValue());
|
payInfoLogService.add(payInfoLog);
|
|
|
commonDto.setId(payOrderId);
|
|
if (PayEnum.银行卡.getValue().equals(Convert.toStr(payInfoReq.getAccountType(), ""))) {
|
commonDto.setExtra(PayEnum.手动审核.getValue());
|
} else {
|
ConfigInfo configInfo = new ConfigInfo();
|
configInfo.setConfigTypeCode("APPROVAL_TYPE");
|
ConfigInfo configInfo1 = configMapper.selectOne(configInfo);
|
if (PayEnum.自动审核.getValue().equals(configInfo1.getConfigValue())) {
|
|
log.debug("调用后台的提现方法");
|
TransfersDtoAdmin transfersDtoAdmin = new TransfersDtoAdmin();
|
transfersDtoAdmin.setPayOrderId(payOrderId);
|
if (businessUtil.isApp(request.getHeader("clientType"))) {
|
transfersDtoAdmin.setOtherUserId(payInfoReq.getCreateUserId());
|
} else {
|
transfersDtoAdmin.setUserId(payInfoReq.getCreateUserId());
|
transfersDtoAdmin.setOtherUserId("");
|
}
|
wxPay(transfersDtoAdmin);
|
//防止前端在调用自动审核接口
|
commonDto.setExtra(PayEnum.自动审核.getValue());
|
} else {
|
//防止前端在调用自动审核接口
|
commonDto.setExtra(PayEnum.手动审核.getValue());
|
}
|
}
|
}
|
} catch (RestException e) {
|
ExceptionUtils.err(e.getMsg(), e);
|
} catch (Exception e) {
|
ExceptionUtils.err("提现失败", e);
|
} finally {
|
redisUtil.del(Constants.REDIS_PAY_KEY + "add:" + lockId);
|
}
|
}
|
return commonDto;
|
}
|
|
public List<PayInfoVo> queryPayInfo(PayInfoReq payInfoReq) {
|
List<PayInfoVo> payInfoList = payInfoMapper.queryPayInfo(payInfoReq);
|
return payInfoList;
|
}
|
|
public List<PayInfoVo> queryPayRequestInfo(PayInfoReq payInfoReq) {
|
List<PayInfoVo> payInfoList = payInfoMapper.queryPayRequestInfo(payInfoReq);
|
return payInfoList;
|
}
|
|
|
public void addPay(PayInfo payInfo) {
|
payInfo.setCreateTime(DateUtil.now());
|
payInfoMapper.insertSelective(payInfo);
|
}
|
|
|
public int webChatRechargeCallback(Map map) {
|
String userId = (String) map.get("userId");
|
String money = (String) map.get("money");
|
String fee = (String) map.get("fee");
|
String payOrderId = (String) map.get("payOrderId");
|
|
|
//更改状态
|
int returnvalue = payInfoMapper.updatePayInfoStatus(map);
|
|
|
AccountInfo accountInfo1 = accountService.findByUserId(userId);
|
if (accountInfo1 == null) {
|
throw new WxPayNotifyResponseException("账户不存在:" + userId);
|
}
|
|
|
OtherUserInfo otherUserInfo = otherUserService.findByIdByNotDel(userId);
|
|
boolean flag = otherUserInfo != null && (CommonEnum.回收员.getValue().equals(otherUserInfo.getUserType()) || CommonEnum.入库员.getValue().equals(otherUserInfo.getUserType()) || CommonEnum.打包站运营员.getValue().equals(otherUserInfo.getUserType()) || CommonEnum.打包员.getValue().equals(otherUserInfo.getUserType())) && StrUtil.isNotBlank(accountInfo1.getFixedLimit()) && Convert.toBigDecimal(accountInfo1.getFixedLimit(), Constants.MONEY_INIT).compareTo(BigDecimal.ZERO) > 0;
|
if (flag) {
|
//回收员充值 和额度相关
|
AccountVo accountVo = new AccountVo();
|
BeanUtil.copyProperties(accountInfo1, accountVo);
|
accountService.addAccount(accountVo, CommonEnum.充值操作.getValue(), payOrderId, money);
|
} else {
|
String now = DateUtil.now();
|
AccountLog accountLog = new AccountLog();
|
accountLog.setCreateTime(now);
|
accountLog.setAccountId(accountInfo1.getAccountId());
|
accountLog.setOldMoney(accountInfo1.getMoney());
|
accountLog.setNewMoney(Convert.toStr(NumberUtil.add(Convert.toBigDecimal(accountInfo1.getMoney()), Convert.toBigDecimal(money))));
|
accountLog.setCreateUserId(userId);
|
accountLog.setChannelType(Convert.toShort(CommonEnum.充值操作.getValue()));
|
accountLog.setOrderId(payOrderId);
|
accountLogMapper.insertSelective(accountLog);
|
|
map.put("money", Convert.toBigDecimal(money));
|
payInfoMapper.updateMyMoneyByOrder(map);
|
|
}
|
|
//添加平台日志
|
String oldMoney = Constants.MONEY_INIT.toString();
|
String oldHbb = Constants.MONEY_INIT.toString();
|
|
PlatformAccountInfo moneyKey = platformAccountInfoService.findByKey(Constants.PLAT_MONEY_KEY);
|
if (moneyKey != null) {
|
oldMoney = moneyKey.getFieldValue();
|
}
|
PlatformAccountInfo hbbKey = platformAccountInfoService.findByKey(Constants.PLAT_HBB_KEY);
|
if (hbbKey != null) {
|
oldHbb = hbbKey.getFieldValue();
|
}
|
|
//算上服务费的金额
|
String MoneyAndFee = money;
|
// if(StrUtil.isNotBlank(fee)){
|
// MoneyAndFee=NumberUtil.add(Convert.toBigDecimal(money),Convert.toBigDecimal(fee)).toString();
|
// }
|
|
PlatformAccountLog platformAccountLog = new PlatformAccountLog();
|
platformAccountLog.setCreateUserId(userId);
|
platformAccountLog.setType(Convert.toInt(CommonEnum.平台充值.getValue()));
|
platformAccountLog.setOldMoney(Convert.toBigDecimal(oldMoney));
|
platformAccountLog.setMoney(Convert.toBigDecimal(MoneyAndFee));
|
platformAccountLog.setNewMoney(NumberUtil.add(platformAccountLog.getOldMoney(), platformAccountLog.getMoney()));
|
platformAccountLog.setOldHbb(Convert.toBigDecimal(oldHbb));
|
platformAccountLog.setHbb(Convert.toBigDecimal("-" + money));
|
platformAccountLog.setNewHbb(NumberUtil.add(platformAccountLog.getOldHbb(), platformAccountLog.getHbb()));
|
platformAccountLog.setFlowNo(payOrderId);
|
platformAccountLogService.add(platformAccountLog);
|
|
//更新平台账户
|
platformAccountInfoService.updateMoney(MoneyAndFee);
|
platformAccountInfoService.updateHbb("-" + money);
|
|
//充值消息录入
|
SysMessage sysMessage = new SysMessage();
|
sysMessage.setCreateTime(DateUtils.getCurDateTime());
|
sysMessage.setCreateUserId(userId);
|
sysMessage.setFlag("2");
|
sysMessage.setMessage("您已经充值" + money + "元");
|
sysMessage.setMessageSubTypeName("充值");
|
sysMessage.setMessageType("2");
|
sysMessage.setUserId(userId);
|
sysMessageMapper.insert(sysMessage);
|
|
return returnvalue;
|
}
|
|
// public int audit(CommonDto commonDto) {
|
// String payOrderId = commonDto.getId();
|
// boolean lock = false;
|
// try {
|
// if (redisUtil.setnx(Constants.REDIS_PAY_KEY + "audit:" + payOrderId, payOrderId)) {
|
// lock = true;
|
// PayRequestInfo payInfo = payRequestMapper.selectByPrimaryKey(payOrderId);
|
// if (payInfo != null) {
|
// //调用提现自动审核接口
|
// log.info("调用提现自动审核接口");
|
// Map<String, Object> map = new HashMap<>();
|
// map.put("payOrderId", commonDto.getId());
|
// if (businessUtil.isApp(request.getHeader("clientType"))) {
|
// map.put("otherUserId", request.getHeader("userId"));
|
// } else {
|
// map.put("userId", payInfo.getCreateUserId());
|
// map.put("otherUserId", "");
|
// }
|
//
|
// String post = null;
|
// boolean error = false;
|
// log.info("提现审核请求参数:{}", JSONUtil.toJsonPrettyStr(map));
|
// try {
|
// post = HttpUtil.post(adminUrl + "gc-pay/admin/front/wx/pay/wxPay.do", JSONUtil.toJsonStr(map));
|
// } catch (Exception e) {
|
// error = true;
|
// log.error("远程调用提现审核接口失败", e);
|
// }
|
//
|
// if (error) {
|
// //修改状态
|
// PayRequestInfo payRequestInfo = new PayRequestInfo();
|
// payRequestInfo.setPayOrderId(payOrderId);
|
// payRequestInfo.setPayFlag(Convert.toInt(PayEnum.支付失败.getValue()));
|
// payRequestInfo.setStatus(PayEnum.已审核完成.getValue());
|
// payRequestInfo.setUnpassReason("提现审核接口超时");
|
// payRequestMapper.updateByPrimaryKeySelective(payRequestInfo);
|
// return -1;
|
// } else {
|
// log.info("提现审核返回结果:{}", post);
|
// JSONObject jsonObject = JSONUtil.parseObj(post);
|
// Integer code = jsonObject.getInt("code");
|
// String data = jsonObject.getStr("data", "");
|
// if (code != 0) {
|
// throw new RestException(-1, data);
|
// }
|
// }
|
// } else {
|
// throw new RestException(-1, "提现订单不存在");
|
// }
|
// }
|
// } catch (RestException e) {
|
// throw new BusinessException(-1, e.getMsg(), ExceptionUtil.getMessage(e));
|
// } catch (Exception e) {
|
// ExceptionUtils.err("提现审核失败", e);
|
// } finally {
|
// if (lock == true) {
|
// redisUtil.del(Constants.REDIS_PAY_KEY + "audit:" + payOrderId);
|
// }
|
// }
|
// return 0;
|
// }
|
|
|
/**
|
* 提现
|
* @param money
|
*/
|
// public void withdraw(String money,String userId,String clientType,Long accountBindId) {
|
// boolean lock=false;
|
// try {
|
// if(redisUtil.setnx(Constants.REDIS_PAY_KEY + "withdraw:" +userId, userId)) {
|
// lock=true;
|
// PayInfoReq payInfoReq = new PayInfoReq();
|
// payInfoReq.setMoney(money);
|
// payInfoReq.setCreateUserId(userId);
|
// List<PayInfoVo> withdrawList = payMapper.queryWithdrawInfo(payInfoReq);
|
// if (withdrawList.size() >= 1) {
|
// throw new RestException(-1, "一天只能提现一次");
|
// }
|
// String payOrderId = idUtils.generate("ZF", 0);
|
// payInfoReq.setPayOrderId(payOrderId);
|
// String now = DateUtil.now();
|
// payInfoReq.setCreateTime(now);
|
// List<AccountVo> accountList = payMapper.queryMyMoney(payInfoReq);
|
// AccountVo accountVo = accountList.get(0);
|
// payInfoReq.setAccountId(accountVo.getAccountId());
|
// payInfoReq.setPayType(PayEnum.提现.getValue());
|
// //提现金额
|
// BigDecimal bigDecimal = NumberUtil.toBigDecimal(payInfoReq.getMoney());
|
// //余额
|
// BigDecimal bigDecimal1 = NumberUtil.toBigDecimal(accountVo.getMoney());
|
//
|
// //判断账户余额是否足够,返回-1表示余额不够
|
//
|
// if (NumberUtil.isGreater(bigDecimal, bigDecimal1)) {
|
// throw new RestException(-1, "用户余额不足");
|
// }
|
//
|
// //查询用户openId
|
// if (CommonEnum.WEB.getValue().equals(clientType)) {
|
// UserInfo userInfo = userMapper.selectByPrimaryKey(userId);
|
// payInfoReq.setOpenId(userInfo.getOpenId());
|
// } else {
|
// OtherUserInfo otherUserInfo = otherUserMapper.selectByPrimaryKey(userId);
|
// payInfoReq.setOpenId(otherUserInfo.getOpenId());
|
// }
|
//
|
// payInfoReq.setStatus(PayEnum.已审核.getValue());
|
// payInfoReq.setAccountBindId(accountBindId);
|
// payMapper.payRequestInfoAdd(payInfoReq);
|
//
|
//
|
// PayInfoLog payInfoLog = new PayInfoLog();
|
// BeanUtil.copyProperties(payInfoReq, payInfoLog);
|
// payInfoLog.setAccount(accountVo.getAccountName());
|
// payInfoLog.setAccountClass(PayEnum.微信.getValue());
|
// payInfoLog.setPayType(PayEnum.提现交易.getValue());
|
// payInfoLogService.add(payInfoLog);
|
//
|
// //是否自动审核 银行卡等肯定是手动审核
|
// ConfigInfo configInfo = new ConfigInfo();
|
// configInfo.setConfigTypeCode("APPROVAL_TYPE");
|
// ConfigInfo configInfo1 = configMapper.selectOne(configInfo);
|
// if (configInfo1 != null) {
|
// String configValue = configInfo1.getConfigValue();
|
// if(PayEnum.自动审核.getValue().equals(configValue)){
|
// log.info("调用提现自动审核接口");
|
// Map<String, Object> map = new HashMap<>();
|
// map.put("payOrderId", commonDto.getId());
|
// }
|
// }
|
//
|
//
|
//
|
// }
|
// }catch (RestException e){
|
// throw new RestException(-1,e.getMsg());
|
// }catch (Exception e){
|
// ExceptionUtils.err("提现审核失败",e);
|
// }finally {
|
// if(lock){
|
// redisUtil.del(Constants.REDIS_PAY_KEY +"withdraw:" +userId);
|
// }
|
// }
|
//
|
// }
|
|
|
/**
|
* 查询当前用户一周内是否有充值成功的记录
|
*/
|
// public List<PayInfo> findForWeekByUserIdAndType(String userId, String payType) {
|
// return payInfoMapper.findForWeekByUserIdAndType(userId, payType);
|
// }
|
public void updateStatus(String payOrderId, String status) {
|
Example example = new Example(PayInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("payOrderId", payOrderId);
|
criteria.andNotEqualTo("status", "2");
|
PayInfo payInfo = new PayInfo();
|
payInfo.setStatus(status);
|
payInfoMapper.updateByExampleSelective(payInfo, example);
|
}
|
|
public AccountBindInfo findPayMethod(String userId) {
|
AccountBindInfo payMethod = payInfoMapper.findPayMethod(userId);
|
if (payMethod == null) {
|
List<AccountBindInfo> byUserId = accountBindService.findByUserId(userId);
|
if (CollUtil.isNotEmpty(byUserId)) {
|
return byUserId.get(0);
|
} else {
|
return null;
|
}
|
} else {
|
return payMethod;
|
}
|
}
|
|
|
public void sendWxPay(String url, String path, TransfersDtoAdmin dto, UserAccountModel userAccount, String mobilePhone, String oldMoney) {
|
String param = WechatpayUtil.getStringBuild(dto);
|
PayLog payLog = insertLog(dto, userAccount, param);
|
ResultEntity iResult = WechatpayUtil.doTransfers(url, path, dto, userAccount, param);
|
payLog.setResponseData(iResult.getMsg());
|
if (!iResult.isSuccess()) {
|
throw new RestException(iResult.getMsg());
|
} else {
|
updateAccount(payLog, dto.getPayOrderId(), mobilePhone, oldMoney);
|
}
|
}
|
|
|
/**
|
* 企业提现零钱接口
|
*
|
* @param dto
|
* @param userAccount
|
*/
|
private PayLog insertLog(TransfersDtoAdmin dto, UserAccountModel userAccount, String param) {
|
// 添加账户log请求前信息
|
PayLog payLog = new PayLog();
|
payLog.setId(IdUtil.getSnowflake(1, 3).nextId());
|
payLog.setAccountBeforeMoney(userAccount.getMoney());
|
payLog.setUserId(dto.getUserId());
|
payLog.setAccountId(userAccount.getAccountId());
|
payLog.setWxOpenid(dto.getOpenid());
|
payLog.setCreateTime(DateUtil.now());
|
payLog.setPayStatus("0");
|
//因为接口使用的是以分为单位,所以需要转为元
|
String a = new BigDecimal(dto.getAmount()).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP).toString();
|
payLog.setMoney(Double.valueOf(a));
|
payLog.setWithdrawBeforeMoney(Double.parseDouble("0"));
|
payLog.setMchBillno(dto.getPayOrderId());
|
|
payLog.setRequestParams(param);
|
return payLog;
|
|
}
|
|
private void updateAccount(PayLog payLog, String payOrderId, String mobilePhone, String oldMoney) {
|
UserAccountModel userAccountModel1 = accountMapper.queryAccountInfo(payLog.getUserId(), mobilePhone);
|
double mm = MathUtils.subDouble(userAccountModel1.getMoney(), payLog.getMoney());
|
PayLog newPl = new PayLog();
|
newPl.setAccountId(payLog.getAccountId());
|
newPl.setMoney(mm);
|
// 更新账号余额
|
accountMapper.updateAccountMoneyDouble(newPl);
|
//写入消息列表中
|
String message = "您的提现已经到了:" + payLog.getMoney() + "元,提现单号:" + payOrderId + ",请注意查收.";
|
sysMessageMapper.insertMessage(message, payLog.getUserId(), "", "1", "提现", DateUtil.now());
|
|
UserAccountModel userAccountModel = accountMapper.queryAccountInfo(payLog.getUserId(), mobilePhone);
|
AccountLogModel model = new AccountLogModel();
|
model.setAccountId(userAccountModel.getAccountId());
|
model.setChannelType("2");
|
model.setCreateTime(DateUtil.now());
|
model.setCreateUserId(userAccountModel.getUserId());
|
model.setNewFixedLimit(userAccountModel.getFixedLimit());
|
model.setNewLimit(userAccountModel.getOverdraftLimit());
|
model.setNewMoney(String.valueOf(userAccountModel.getMoney()));
|
model.setOldFixedLimit(userAccountModel.getFixedLimit());
|
model.setOldLimit(userAccountModel.getOverdraftLimit());
|
model.setOldMoney(oldMoney);
|
model.setOrderId(payOrderId);
|
accountLogMapper.insertAccountLog(model);
|
//写入平台日志表,扣除平台金额添加环保币
|
insertPlatLog(payLog.getMoney() + "", payOrderId);
|
}
|
|
public Map<String, Object> queryPayInfoDetail(String payOrderId) {
|
Map<String, Object> map = payRequestMapper.queryPayInfoDetail(payOrderId);
|
if (!"1".equals(map.get("usertype"))) {
|
String roleName = userRoleMapper.queryPayInfoUserRole(map.get("usertype").toString());
|
map.put("roleName", roleName);
|
} else {
|
map.put("roleName", "普通用户");
|
}
|
|
if (map.get("status").equals("2")) {
|
map.put("statusName", "已审核");
|
} else if (map.get("status").equals("3")) {
|
map.put("statusName", "审核未通过");
|
} else {
|
map.put("statusName", "待审核");
|
}
|
return map;
|
}
|
|
private void insertPlatLog(String amount, String payOrderId) {
|
String acc = platformAccountInfoMapper.queryAccountByAdminId();
|
String[] accArr = acc.split(",");
|
String adminMoney = accArr[1];
|
String adminhbb = accArr[2];
|
//平台
|
BigDecimal oldAdminMoney = new BigDecimal(adminMoney);
|
BigDecimal oldAdminhbb = new BigDecimal(adminhbb);
|
//平台账户处理红包
|
BigDecimal newAdminMoney = oldAdminMoney.subtract(new BigDecimal(amount));
|
BigDecimal newAdminhbb = oldAdminhbb.add(new BigDecimal(amount));
|
|
platformAccountInfoMapper.updatePlatformHbb(DoubleUtil.roundTwo(newAdminhbb.toString()));
|
platformAccountInfoMapper.updatePlatformMoney(DoubleUtil.roundTwo(newAdminMoney.toString()));
|
PlatformAccountLogModel platformAccountLogModel = new PlatformAccountLogModel();
|
platformAccountLogModel.setCreateTime(DateUtil.now());
|
platformAccountLogModel.setCreateUserId("1");
|
platformAccountLogModel.setMoney(DoubleUtil.roundTwo("0"));
|
platformAccountLogModel.setHbb("-" + DoubleUtil.roundTwo(amount));
|
platformAccountLogModel.setOldHbb(DoubleUtil.roundTwo(adminhbb));
|
platformAccountLogModel.setOldMoney(DoubleUtil.roundTwo(adminMoney));
|
platformAccountLogModel.setNewHbb(DoubleUtil.roundTwo(newAdminhbb.toString()));
|
platformAccountLogModel.setNewMoney(DoubleUtil.roundTwo(adminMoney));
|
platformAccountLogModel.setCreateUserName("平台管理员");
|
platformAccountLogModel.setCreateUserType("2");
|
platformAccountLogModel.setCreateUserMobile("--");
|
platformAccountLogModel.setFlowNo(payOrderId);
|
platformAccountLogMapper.insertPlatFormLog(platformAccountLogModel);
|
}
|
|
|
public void wxPay(TransfersDtoAdmin dto) {
|
MoneyModel moneyModel;
|
String payOrderId = dto.getPayOrderId();
|
String otherUserId = dto.getOtherUserId();
|
String key=RedisKeyConstant.WITHDRAW_KEY+payOrderId;
|
try {
|
if(redisUtil.setnx(key,"0")){
|
if (StringUtils.isEmpty(dto.getPayOrderId())) {
|
throw new RestException("payOrderId不能为空");
|
} else {
|
moneyModel = getMoneyModel(dto.getPayOrderId());
|
String desc;
|
//监测金额和用户是否一致
|
if (null != otherUserId && !"".equals(otherUserId)) {
|
desc = checkMoneyModel(moneyModel, otherUserId);
|
} else {
|
desc = checkMoneyModel(moneyModel, dto.getUserId());
|
}
|
if (!"success".equals(desc)) {
|
throw new RestException(desc);
|
}
|
}
|
|
//查询用户openId
|
String openId;
|
UserModel userModel = null;
|
CityPartner cityPartner = null;
|
if (StrUtil.isNotBlank(otherUserId)) {
|
//根据用户ID判断是否是合伙人 是则代表是合伙人的运营员在操作
|
cityPartner = cityPartnerService.findByUserId(otherUserId, OrderEnum.合伙人.getValue());
|
if (cityPartner == null) {
|
//回收员之类的在提现
|
dto.setMch_appid(anroidAppId);
|
userModel = otherUserMapper.queryUserOtherInfoById(otherUserId);
|
}
|
} else {
|
dto.setMch_appid(APP_ID);
|
userModel = userMapper.queryUserById(dto.getUserId());
|
}
|
|
//不是合伙人提现
|
if (cityPartner == null && userModel == null) {
|
throw new RestException("用户不存在");
|
}
|
//查询用户账户是否能提现
|
if (cityPartner == null) {
|
//检测金额是否足够
|
UserAccountModel userAccount=checkUserAccount(moneyModel, userModel);
|
String oldMoney = String.valueOf(userAccount.getMoney());
|
|
openId = userModel.getOpenId();
|
String mobilePhone = userModel.getMobilePhone();
|
if (StrUtil.isNotBlank(openId)) {
|
dto.setOpenid(openId);
|
dto.setMchid(MCH_ID);
|
dto.setAppkey(APP_KEY);
|
dto.setSpbill_create_ip(CREATE_IP);
|
dto.setMch_name("湖南小棕熊环保科技有限责任公司");
|
dto.setDesc("企业付款到零钱");
|
if (null != otherUserId && !"".equals(otherUserId)) {
|
dto.setUserId(otherUserId);
|
|
}
|
//自动转为以分为单位
|
dto.setAmount(Double.parseDouble(moneyModel.getMoney()));
|
dto.setPayOrderId(payOrderId);
|
sendWxPay(TRANS_URL, CERT_PATH, dto, userAccount, mobilePhone, oldMoney);
|
}else {
|
throw new RestException("用户OPENID为空");
|
}
|
}else {
|
//线下打款 减去其环保币
|
PartnerAccountLog partnerAccountLog=new PartnerAccountLog();
|
partnerAccountLog.setPartnerId(cityPartner.getId()+"");
|
partnerAccountLog.setFlowNo(payOrderId);
|
//提现
|
partnerAccountLog.setType("2");
|
partnerAccountLog.setMoney("-"+moneyModel.getMoney());
|
partnerAccountLogService.add(partnerAccountLog);
|
partnerAccountService.updateReduceMoneyByPartnerId(cityPartner.getId()+"",Convert.toBigDecimal(moneyModel.getMoney()));
|
}
|
|
// 更新支付状态
|
PayRequestInfo payRequestInfo=new PayRequestInfo();
|
payRequestInfo.setPayOrderId(payOrderId);
|
payRequestInfo.setStatus("2");
|
payRequestInfo.setPayFlag(2);
|
payRequestInfo.setExamineTime(DateUtil.now());
|
payRequestMapper.updateByPrimaryKeySelective(payRequestInfo);
|
}
|
}catch (RestException e){
|
ExceptionUtils.err(e.getMsg(), e);
|
}catch (Exception e){
|
ExceptionUtils.err("提现失败", e);
|
}finally {
|
redisUtil.del(key);
|
}
|
|
}
|
|
private MoneyModel getMoneyModel(String payOrderId) {
|
MoneyModel moneyModel = new MoneyModel();
|
moneyModel.setPayOrderId(payOrderId);
|
moneyModel = payRequestMapper.queryMoney(moneyModel);
|
moneyModel.setStatus("3");
|
moneyModel.setPayFlag("3");
|
moneyModel.setExamineTime(DateUtil.now());
|
return moneyModel;
|
}
|
|
private UserAccountModel checkUserAccount(MoneyModel moneyModel, UserModel userModel) {
|
|
// 查询用户账号表
|
UserAccountModel userAccountModel = accountMapper.queryAccountInfo(userModel.getUserId(), userModel.getMobilePhone());
|
if (userAccountModel == null) {
|
throw new RestException("此用户未查询到账户信息");
|
}
|
if (userAccountModel.getDelFlag().equals("1")) {
|
throw new RestException("账户信息已删除");
|
}
|
if (userAccountModel.getMoney() < Double.parseDouble(moneyModel.getMoney())) {
|
throw new RestException("账户金额不足");
|
}
|
if (!userModel.getOpenId().equals(moneyModel.getOpenId())) {
|
throw new RestException("用户和支付的openId不一致");
|
}
|
return userAccountModel;
|
}
|
|
/**
|
* @param model
|
* @return
|
*/
|
private String checkMoneyModel(MoneyModel model, String userId) {
|
if (!model.getCreateUserId().equals(userId)) {
|
model.setUnpassReason("userId和支付订单里面的userId不一致");
|
payRequestMapper.updateMoney(model);
|
return "userId和支付订单里面的userId不一致";
|
}
|
if (StringUtils.isEmpty(model.getCreateUserId())) {
|
model.setUnpassReason("用户ID不能为空");
|
payRequestMapper.updateMoney(model);
|
return "用户ID不能为空";
|
}
|
if (StringUtils.isEmpty(model.getMoney())) {
|
model.setUnpassReason("金钱不能为空");
|
payRequestMapper.updateMoney(model);
|
return "金钱不能为空";
|
}
|
if (Double.parseDouble(model.getMoney()) <= 0.3) {
|
model.setUnpassReason("金额不能等于或小于0.3");
|
payRequestMapper.updateMoney(model);
|
return "金额不能等于或小于1";
|
}
|
return "success";
|
}
|
|
|
/**
|
* 根据用户id和支付类型和支付第二类型分页查询
|
*
|
* @param userId 用户id
|
* @param payType 支付类型
|
* @param secondType 第二类型
|
* @return
|
*/
|
public PageInfo<PayInfo> findPageByUserIdAndSecondType(SimplePage simplePage, String userId, String payType, String secondType) {
|
Example example = new Example(PayInfo.class);
|
Example.Criteria criteria = example.createCriteria();
|
criteria.andEqualTo("createUserId", userId);
|
if (StrUtil.isNotBlank(payType))
|
criteria.andEqualTo("payType", payType);
|
if (StrUtil.isNotBlank(secondType))
|
criteria.andEqualTo("paySecondType", secondType);
|
example.setOrderByClause("create_time desc");
|
PageHelper.startPage(simplePage.getPageNo(), simplePage.getPageSize());
|
List<PayInfo> payInfos = payInfoMapper.selectByExample(example);
|
PageInfo<PayInfo> payInfoPageInfo = new PageInfo<>(payInfos);
|
return payInfoPageInfo;
|
}
|
|
|
/**
|
* 积分列表
|
*
|
* @param payScoreParamDTO
|
* @return
|
*/
|
public PayScoreResDTO scoreList(PayScoreParamDTO payScoreParamDTO) {
|
PayScoreResDTO resDTO = new PayScoreResDTO();
|
List<PayScoreResPerDTO> list = payInfoMapper.scoreList(payScoreParamDTO);
|
PageInfo<PayScoreResPerDTO> pageInfo = new PageInfo<>(list);
|
resDTO.setPageInfo(pageInfo);
|
//平台总积分
|
String collectScore = platformAccountInfoService.findByKey("collectScore").getFieldValue();
|
resDTO.setAllPlatScore(businessUtil.changeMoney(collectScore));
|
//获取总积分
|
BigDecimal allRechargeScore = Constants.MONEY_INIT;
|
//消耗总积分
|
BigDecimal allConsumeScore = Constants.MONEY_INIT;
|
|
List<AccountScoreLog> accountScoreLogs = accountScoreLogMapper.selectAll();
|
|
for (AccountScoreLog accountScoreLog : accountScoreLogs) {
|
Short channelType = accountScoreLog.getChannelType();
|
String manageScore = accountScoreLog.getManageScore();
|
if (Convert.toShort(1).equals(channelType)) {
|
//获取
|
allRechargeScore = NumberUtil.add(allRechargeScore, businessUtil.changeMul(manageScore));
|
} else if (Convert.toShort(2).equals(channelType)) {
|
//消耗
|
allConsumeScore = NumberUtil.add(allConsumeScore, businessUtil.changeMul(manageScore));
|
}
|
}
|
resDTO.setAllRechargeScore(businessUtil.changeMoney(allRechargeScore));
|
resDTO.setAllConsumeScore(businessUtil.changeMoney(allConsumeScore));
|
|
return resDTO;
|
}
|
|
private AlipayTradeAppPayRequest getRequest() {
|
// 初始化Request,并填充Model属性。实际调用时请替换为您想要使用的API对应的Request对象。
|
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
|
// AlipayOpenOperationOpenbizmockBizQueryModel model = new AlipayOpenOperationOpenbizmockBizQueryModel();
|
// model.setBizNo("test");
|
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
|
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
|
model.setBody("我是测试数据");
|
model.setSubject("App支付测试Java");
|
model.setOutTradeNo(idUtils.generate("ZF", 1));
|
model.setTimeoutExpress("30m");
|
model.setTotalAmount("0.01");
|
model.setProductCode("QUICK_MSECURITY_PAY");
|
request.setBizModel(model);
|
request.setNotifyUrl("http://zan7755.ngrok2.xiaomiqiu.cn/gc-pay/pay/ali/notify");
|
return request;
|
}
|
|
public String aliPay(AliPayDTO aliPayDTO) throws AlipayApiException {
|
// 2. 创建使用的Open API对应的Request请求对象
|
AlipayTradeAppPayRequest request = getRequest();
|
// 3. 发起请求并处理响应
|
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
|
if (response.isSuccess()) {
|
log.debug("阿里支付调用成功。");
|
} else {
|
log.debug("阿里支付调用失败,原因:" + response.getMsg() + "," + response.getSubMsg());
|
}
|
return response.getBody();
|
}
|
|
public String aliPayNotify(Map<String, String> params) throws AlipayApiException {
|
log.debug("阿里回调返回:{}", JSONUtil.toJsonStr(params));
|
//切记alipaypublickey是支付宝的公钥,请去open.alipay.com对应应用下查看。
|
//boolean AlipaySignature.rsaCertCheckV1(Map<String, String> params, String publicKeyCertPath, String charset,String signType)
|
boolean flag = AlipaySignature.rsaCertCheckV1(params, "E:/card/alipayCertPublicKey_RSA2.crt", "UTF-8", "RSA2");
|
return Convert.toStr(flag);
|
}
|
}
|