| | |
| | | String orderId = generatePayOrderId(); |
| | | BigDecimal amount = new BigDecimal(tradeAmount).setScale(2, RoundingMode.HALF_UP); |
| | | |
| | | String notifyUrl = "https://api.greenbackcaps.top/user/rechargeCallbackFour.do"; |
| | | String notifyUrl = "https://api.nalandacapital.mom/user/rechargeCallbackFour.do"; |
| | | String custId = "U" + user.getId(); |
| | | String mobile = StringUtils.isNotBlank(user.getPhone()) ? user.getPhone() : "0000000000"; |
| | | if (mobile.length() > 16) { |
| | |
| | | dataObj.put("customerEmail","123456@qq.com");//需替换 |
| | | dataObj.put("customerPhone",user.getPhone());//需替换 |
| | | dataObj.put("merchantOrderNo",generatePayOrderId());//自定义订单号 |
| | | dataObj.put("notifyUrl", "https://api.greenbackcaps.top/user/rechargeCallbackZero.do");//回调通知地址 |
| | | dataObj.put("notifyUrl", "https://api.nalandacapital.mom/user/rechargeCallbackZero.do");//回调通知地址 |
| | | JSONObject requestObj = new JSONObject(); |
| | | log.info("代收参数:{}", dataObj); |
| | | // 加密数据 |
| | |
| | | params.put("merchant_order_id", merchantOrderId); |
| | | params.put("amount", amount.toString()); |
| | | params.put("pay_channel", payChannel); |
| | | params.put("notify_url", "https://api.greenbackcaps.top/user/rechargeCallbackThree.do"); // 异步通知地址 |
| | | params.put("page_return_url", "https://stock.greenbackcaps.top/#/user"); // 前端返回地址 |
| | | params.put("notify_url", "https://api.nalandacapital.mom/user/rechargeCallbackThree.do"); // 异步通知地址 |
| | | params.put("page_return_url", "https://stock.nalandacapital.mom/#/user"); // 前端返回地址 |
| | | |
| | | // 可选参数 |
| | | if (user != null) { |
| | |
| | | // 保留两位小数,四舍五入 |
| | | amount = amount.setScale(2, BigDecimal.ROUND_HALF_UP); |
| | | params.put("total_fee", String.valueOf(amount)); // 交易金额(保留两位小数) |
| | | params.put("notify_url", "https://api.greenbackcaps.top/user/rechargeCallbackTwo.do"); // 异步通知地址 |
| | | params.put("notify_url", "https://api.nalandacapital.mom/user/rechargeCallbackTwo.do"); // 异步通知地址 |
| | | params.put("reply_type", "URL"); // 执行方式 |
| | | params.put("timestamp", String.valueOf(System.currentTimeMillis())); // 时间戳 |
| | | params.put("customer_name", StringUtils.isEmpty(UserNameUtil.formatCustomerName(user.getNickName())) ? "IsNotSet" : UserNameUtil.formatCustomerName(user.getNickName())); // 客户姓名 |
| | |
| | | //商家订单号 保证每笔订单唯一 |
| | | params.put("mch_order_no", generatePayOrderId()); |
| | | //异步通知地址 不超过 200 字节,支付成功后发起,不能携带参数 |
| | | params.put("notify_url", "https://api.greenbackcaps.top/user/rechargeCallback.do"); |
| | | params.put("notify_url", "https://api.nalandacapital.mom/user/rechargeCallback.do"); |
| | | // 订单时间 时间格式yyyy-MM-dd HH:mm:ss |
| | | params.put("order_date", getOrderTime()); |
| | | //支付类型 请查阅商户后台通道编码 |
| | |
| | | * 代付回调处理 |
| | | */ |
| | | @Override |
| | | public void payoutCallback(PayoutCallbackVo vo, HttpServletResponse response) throws IOException { |
| | | log.info("代付回调进来了:" + vo.toString()); |
| | | |
| | | public void payoutCallback(HttpServletRequest request, HttpServletResponse response) throws IOException { |
| | | response.setStatus(200); |
| | | response.setContentType("text/plain;charset=UTF-8"); |
| | | PrintWriter pw = response.getWriter(); |
| | | |
| | | try { |
| | | // 验证签名 |
| | | String key = "PAXkm5ptBhvzNYBSpdm3p7ipwGUQOF8Fm3tYp0"; // 商户密钥 |
| | | Map<String, String> signParams = new HashMap<>(); |
| | | signParams.put("merchant_id", vo.getMerchantId()); |
| | | signParams.put("app_id", vo.getAppId()); |
| | | signParams.put("system_order_id", vo.getSystemOrderId()); |
| | | signParams.put("merchant_order_id", vo.getMerchantOrderId()); |
| | | signParams.put("amount", vo.getAmount()); |
| | | signParams.put("order_status", vo.getOrderStatus()); |
| | | signParams.put("msg", vo.getMsg()); |
| | | |
| | | boolean signValid = PaymentSignUtil.verifySign(signParams, key, vo.getSign()); |
| | | if (!signValid) { |
| | | log.error("代付回调签名验证失败"); |
| | | pw.print("error 签名验证失败"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } |
| | | |
| | | // 根据商户订单号查找代付记录 |
| | | |
| | | String tradeResult = request.getParameter("tradeResult"); |
| | | String merTransferId = request.getParameter("merTransferId"); |
| | | String merNo = request.getParameter("merNo"); |
| | | String tradeNo = request.getParameter("tradeNo"); |
| | | String transferAmount = request.getParameter("transferAmount"); |
| | | String applyDate = request.getParameter("applyDate"); |
| | | String version = request.getParameter("version"); |
| | | String respCode = request.getParameter("respCode"); |
| | | String sign = request.getParameter("sign"); |
| | | String signType = request.getParameter("signType"); |
| | | log.info("watchglb代付回调: tradeResult={}, merTransferId={}, merNo={}, tradeNo={}, transferAmount={}, applyDate={}, version={}, respCode={}, signType={}", |
| | | tradeResult, merTransferId, merNo, tradeNo, transferAmount, applyDate, version, respCode, signType); |
| | | |
| | | if (StringUtils.isBlank(merTransferId) || StringUtils.isBlank(tradeResult)) { |
| | | pw.print("FAIL"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } |
| | | |
| | | String key = "CZ5Q6NNI6D9YTCXZAIWIC8SAQCC35UZR"; |
| | | Map<String, String> signParams = new TreeMap<>(); |
| | | if (StringUtils.isNotBlank(tradeResult)) signParams.put("tradeResult", tradeResult); |
| | | if (StringUtils.isNotBlank(merTransferId)) signParams.put("merTransferId", merTransferId); |
| | | if (StringUtils.isNotBlank(merNo)) signParams.put("merNo", merNo); |
| | | if (StringUtils.isNotBlank(tradeNo)) signParams.put("tradeNo", tradeNo); |
| | | if (StringUtils.isNotBlank(transferAmount)) signParams.put("transferAmount", transferAmount); |
| | | if (StringUtils.isNotBlank(applyDate)) signParams.put("applyDate", applyDate); |
| | | if (StringUtils.isNotBlank(version)) signParams.put("version", version); |
| | | if (StringUtils.isNotBlank(respCode)) signParams.put("respCode", respCode); |
| | | |
| | | if (!PaymentSignUtil.verifySign(signParams, key, sign)) { |
| | | log.error("watchglb代付回调验签失败, merTransferId={}, signParams={}", merTransferId, signParams); |
| | | pw.print("FAIL"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } |
| | | |
| | | synchronized (merTransferId) { |
| | | TransferResponse transferResponse = transferResponseService.getOne( |
| | | new LambdaQueryWrapper<>(TransferResponse.class) |
| | | .eq(TransferResponse::getMerTransferId, vo.getMerchantOrderId()) |
| | | .eq(TransferResponse::getMerTransferId, merTransferId) |
| | | ); |
| | | |
| | | if (ObjectUtils.isEmpty(transferResponse)) { |
| | | log.info("未找到代付订单记录,商户订单号:{}", vo.getMerchantOrderId()); |
| | | pw.print("error 未找到代付订单"); |
| | | log.error("未找到代付记录,merTransferId={}", merTransferId); |
| | | pw.print("FAIL"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } |
| | | |
| | | // 检查是否已处理过 |
| | | if (transferResponse.getCallbackState() != 0) { |
| | | log.info("代付回调已处理过,商户订单号:{}", vo.getMerchantOrderId()); |
| | | pw.print("success"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } |
| | | |
| | | // 查找提现记录 |
| | | |
| | | UserWithdraw userWithdraw = userWithdrawMapper.selectByPrimaryKey(transferResponse.getWithId()); |
| | | if (ObjectUtils.isEmpty(userWithdraw)) { |
| | | log.info("未找到提现记录,withId:{}", transferResponse.getWithId()); |
| | | pw.print("error 未找到提现记录"); |
| | | log.error("未找到提现记录,withId={}", transferResponse.getWithId()); |
| | | pw.print("FAIL"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } |
| | | |
| | | // 根据订单状态处理 |
| | | String orderStatus = vo.getOrderStatus(); |
| | | if ("WAIT_CONFIRM".equals(orderStatus) || "WAIT_PAY".equals(orderStatus) || "PAY_ING".equals(orderStatus)) { |
| | | log.info("代付回调交易中,商户订单号:{},状态:{}", vo.getMerchantOrderId(), orderStatus); |
| | | pw.print("success"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } else if ("PAY_FAIL".equals(orderStatus)) { |
| | | // 代付失败 |
| | | transferResponse.setTradeResult(2); // 失败 |
| | | transferResponse.setCallbackState(2); // 失败 |
| | | transferResponse.setRespCode("FAIL"); // 响应状态:失败 |
| | | transferResponse.setErrorMsg(vo.getMsg()); // 失败原因 |
| | | transferResponse.setSignType("MD5"); // 签名方式 |
| | | transferResponse.setSign(vo.getSign()); // 签名 |
| | | transferResponse.setUpdatedAt(new Date()); |
| | | |
| | | transferResponse.setTradeNo(StringUtils.defaultIfBlank(tradeNo, transferResponse.getTradeNo())); |
| | | transferResponse.setSignType(StringUtils.defaultIfBlank(signType, "MD5")); |
| | | transferResponse.setSign(sign); |
| | | transferResponse.setRespCode(StringUtils.defaultIfBlank(respCode, "SUCCESS")); |
| | | transferResponse.setApplyDate(StringUtils.defaultIfBlank(applyDate, transferResponse.getApplyDate())); |
| | | transferResponse.setUpdatedAt(new Date()); |
| | | |
| | | if ("1".equals(tradeResult)) { |
| | | transferResponse.setTradeResult(1); |
| | | transferResponse.setCallbackState(1); |
| | | transferResponseService.updateById(transferResponse); |
| | | |
| | | userWithdraw.setWithStatus(2); // 失败 |
| | | userWithdraw.setWithMsg("Withdrawal failed:" + vo.getMsg()); |
| | | |
| | | userWithdraw.setWithStatus(1); |
| | | userWithdraw.setWithMsg("代付成功"); |
| | | userWithdraw.setTransTime(new Date()); |
| | | userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); |
| | | |
| | | // 返还用户资金 |
| | | |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userWithdraw.getUserId()); |
| | | if (userAssets != null) { |
| | | userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt())); |
| | | userAssetsMapper.updateById(userAssets); |
| | | } |
| | | pw.print("success"); |
| | | } else if ("2".equals(tradeResult)) { |
| | | transferResponse.setTradeResult(2); |
| | | transferResponse.setCallbackState(2); |
| | | transferResponse.setErrorMsg("watchglb payout failed"); |
| | | transferResponseService.updateById(transferResponse); |
| | | |
| | | userWithdraw.setWithStatus(2); |
| | | userWithdraw.setWithMsg("Withdrawal failed:watchglb payout failed"); |
| | | userWithdraw.setTransTime(new Date()); |
| | | userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); |
| | | |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userWithdraw.getUserId()); |
| | | if (userAssets != null) { |
| | | userAssets.setAvailableBalance(userAssets.getAvailableBalance().add(userWithdraw.getWithAmt())); |
| | | userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt())); |
| | | userAssetsMapper.updateById(userAssets); |
| | | } |
| | | |
| | | log.info("代付回调失败,商户订单号:{}", vo.getMerchantOrderId()); |
| | | pw.print("success"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } else if ("PAY_SUCCESS".equals(orderStatus)) { |
| | | // 代付成功 |
| | | transferResponse.setTradeResult(1); // 成功 |
| | | transferResponse.setCallbackState(1); // 成功 |
| | | transferResponse.setRespCode("SUCCESS"); // 响应状态:成功 |
| | | transferResponse.setSignType("MD5"); // 签名方式 |
| | | transferResponse.setSign(vo.getSign()); // 签名 |
| | | transferResponse.setUpdatedAt(new Date()); |
| | | transferResponseService.updateById(transferResponse); |
| | | |
| | | userWithdraw.setWithStatus(1); // 成功 |
| | | userWithdraw.setWithMsg("代付成功"); |
| | | userWithdraw.setTransTime(new Date()); |
| | | userWithdrawMapper.updateByPrimaryKeySelective(userWithdraw); |
| | | |
| | | // 扣除冻结资金 |
| | | UserAssets userAssets = iUserAssetsServices.assetsByTypeAndUserId("IN", userWithdraw.getUserId()); |
| | | if (userAssets != null) { |
| | | userAssets.setFreezeMoney(userAssets.getFreezeMoney().subtract(userWithdraw.getWithAmt())); |
| | | userAssetsMapper.updateById(userAssets); |
| | | } |
| | | |
| | | log.info("代付回调成功,商户订单号:{}", vo.getMerchantOrderId()); |
| | | pw.print("success"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | } else { |
| | | log.error("代付回调未知状态,商户订单号:{},状态:{}", vo.getMerchantOrderId(), orderStatus); |
| | | pw.print("error 未知状态"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | return; |
| | | log.warn("watchglb回调状态未知, merTransferId={}, tradeResult={}", merTransferId, tradeResult); |
| | | pw.print("success"); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | | log.error("代付回调处理异常:", e); |
| | | pw.print("error 处理异常"); |
| | | pw.flush(); |
| | | pw.close(); |
| | | } |