package com.xxx.xpay.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.xxx.xpay.common.enums.PayStatusEnum;
import com.xxx.xpay.common.enums.PayWayEnum;
import com.xxx.xpay.common.enums.SignEnum;
import com.xxx.xpay.common.enums.StatusEnum;
import com.xxx.xpay.common.exception.BizException;
import com.xxx.xpay.common.request.dto.NetBankPayDto;
import com.xxx.xpay.common.request.dto.TradeQueryDto;
import com.xxx.xpay.common.resp.dto.NetBankRespData;
import com.xxx.xpay.common.resp.dto.PayResultDto;
import com.xxx.xpay.common.resp.dto.PayWayInfo;
import com.xxx.xpay.common.resp.dto.ReponseDto;
import com.xxx.xpay.common.utils.SignUtil;
import com.xxx.xpay.entity.TradePaymentOrder;
import com.xxx.xpay.entity.TradePaymentRecord;
import com.xxx.xpay.entity.UserInfo;
import com.xxx.xpay.entity.UserPayConfig;
import com.xxx.xpay.factory.PayStrategyFactory;
import com.xxx.xpay.iclient.IAliapyFrontClient;
import com.xxx.xpay.mapper.PayWayMapper;
import com.xxx.xpay.service.IMchService;
import com.xxx.xpay.service.IPayService;
import com.xxx.xpay.service.ITradePaymentService;
import com.xxx.xpay.service.IUserPayConfigService;
import com.xxx.xpay.service.strategy.IPayStrategyService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
/**
* @author fl
* @ClassName PayServiceImpl
* @description: 支付业务接口实现
* @datetime 2022年 11月 30日 14:52
* @version: 1.0
*/
@Service
@Slf4j
public class PayServiceImpl implements IPayService {
@Autowired
private IMchService mchService;
@Autowired
private IUserPayConfigService userPayConfigService;
@Autowired
private ITradePaymentService tradePaymentService;
@Autowired
private IAliapyFrontClient iAliapyFrontClient;
@Override
public NetBankRespData doPay(NetBankPayDto payDto) throws BizException {
//1.2验证商户是否存在
UserInfo userInfo = mchService.getMchInfoByMchId(payDto.getUserNo());
if (ObjectUtils.isEmpty(userInfo)) {
throw new BizException("商户id不存在");
}
//1.2 检查商户状态是否正常
if (!userInfo.getStatus().equals(StatusEnum.NORMAL.getCode())) {
throw new BizException("商户状态不可用");
}
//1.3 检查支付方式是否存在
List<UserPayConfig> payConfigList = userPayConfigService.getUserPayConfigByMchId(payDto.getUserNo());
if (CollectionUtils.isEmpty(payConfigList)) {
throw new BizException("商户没有可用的支付方式");
}
//list 转流 取 支付方式等于请求的那一条,取第一条,
Optional<UserPayConfig> optional = payConfigList.stream().filter(u ->
u.getPayWayCode().equals(payDto.getPayWayCode())).limit(1).findFirst();
//判断Optional 是否为空
if (!optional.isPresent()) {
throw new BizException("不支持次支付方式");
}
UserPayConfig userPayConfig = optional.get();
if (!StatusEnum.NORMAL.getCode().equals(userPayConfig.getStatus())) {
throw new BizException("支付方式状态不可用");
}
//2. 验证签名
try {
SignUtil.veiryfySign(payDto.getSign(), payDto, SignEnum.MD5, userPayConfig.getPaySecret());
} catch (Exception e) {
throw new BizException("验证签名失败,请求非法");
}
//2.生成支付订单,支付记录
TradePaymentRecord paymentRecord = tradePaymentService.createOrderAndRecord(payDto, userInfo.getUserName());
if (ObjectUtils.isEmpty(paymentRecord)) {
throw new BizException("支付失败,请重试");
}
//2.1 投递消息到 延迟队列中:实现交易超时关闭:45关闭
//3.根据支付方式:调用支付公司的接口 : 避免支付流程: if else 逻辑太多: java 设计模式:策略模式
String payWayCode = payDto.getPayWayCode();
//根据 code 去实例化创建对象
IPayStrategyService payStrategyService = PayStrategyFactory.getBean(payWayCode);
if (ObjectUtils.isEmpty(payStrategyService)) {
throw new BizException("暂不支持此支付方式");
}
//执行支付
NetBankRespData netBankRespData = payStrategyService.payment(paymentRecord);
//4.解析封装返回 TODO
return netBankRespData;
}
@Override
public List<PayWayInfo> queryByMchList(String userNo) throws BizException {
//1.检查商户状态
UserInfo userInfo = mchService.getMchInfoByMchId(userNo);
if (ObjectUtils.isEmpty(userInfo)) {
throw new BizException("商户id不存在");
}
if (!userInfo.getStatus().equals(StatusEnum.NORMAL.getCode())) {
throw new BizException("商户状态不可用");
}
List<PayWayInfo> payWayInfoList = new ArrayList<>();
//2.查询商户的支付列表
List<UserPayConfig> payConfigList = userPayConfigService.getUserPayConfigByMchId(userNo);
if (ObjectUtils.isEmpty(payConfigList)) {
return payWayInfoList;
}
//jdk1.8
List<PayWayInfo> wayInfoList = payConfigList.stream().map(u -> {
PayWayInfo payWayInfo = new PayWayInfo();
payWayInfo.setPayWayCode(u.getPayWayCode());
payWayInfo.setPayWayName(u.getPayWayName());
payWayInfo.setProductCcode(u.getProductName());
payWayInfo.setImage(""); //TODO
return payWayInfo;
}).collect(Collectors.toList());
return wayInfoList;
}
@Override
public Map query(TradeQueryDto queryDto) throws BizException {
JSONObject object = new JSONObject();
//1.签名验证 TODO
//2.查询商户订单号
TradePaymentOrder paymentOrder = tradePaymentService.queryByMchOrderNo(queryDto.getMchOrderNo(),
queryDto.getMchId());
//3.交易不存在
if (ObjectUtils.isEmpty(paymentOrder)) {
throw new BizException("商户对应的订单不存在");
}
TradePaymentRecord paymentRecord = tradePaymentService.queryByTrxNo(paymentOrder.getTrxNo());
if (ObjectUtils.isEmpty(paymentRecord)) {
throw new BizException("交易不存在");
}
//4交易成功或者失败
if (PayStatusEnum.FAIL.getCode().equals(paymentOrder.getStatus()) ||
PayStatusEnum.SUCCESS.getCode().equals(paymentOrder.getStatus())) {
//回调地址
object.put("notifyUrl", paymentOrder.getNotifyUrl());
//支付状态
object.put("status", paymentOrder.getStatus());
//返回描述
object.put("statusDesc", paymentRecord.getBankReturnMsg()); //todo
//商户订单号
object.put("mchOrderNo", paymentOrder.getMerchantOrderNo());
//支付系统的流水
object.put("trxNo", paymentOrder.getTrxNo());
//支付方式
object.put("payWayCode", paymentOrder.getPayWayCode());
//支付完成时间
object.put("paySuccessTime", paymentRecord.getPaySuccessTime());
//商户号
object.put("mchNo", paymentOrder.getMerchantNo());
//签名算法
object.put("signType", SignEnum.MD5.getCode());
//回调地址
object.put("mchNotifyUrl", paymentOrder.getNotifyUrl());
//生成签名 TODO
return object;
}
//4.订单处于支付中,未支付,就调用前置服务�
没有合适的资源?快使用搜索试试~ 我知道了~
基于springboot+redis+mysql的支付系统源码+数据库.zip
共480个文件
xml:241个
class:101个
java:101个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
5星 · 超过95%的资源 1 下载量 49 浏览量
2022-12-17
09:23:09
上传
评论 2
收藏 510KB ZIP 举报
温馨提示
基于springboot+redis+mysql的支付系统源码+数据库.zip 基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码+数据库.zip基于springboot+redis+mysql的支付系统源码
资源推荐
资源详情
资源评论
收起资源包目录
基于springboot+redis+mysql的支付系统源码+数据库.zip (480个子文件)
PayServiceImpl.class 12KB
TradePaymentServiceImpl.class 11KB
TradePaymentOrder.class 10KB
TradePaymentRecord.class 9KB
UserPayConfig.class 9KB
NetBankPayDto.class 8KB
AlipayApiTest.class 7KB
PayResultCustomer.class 7KB
NoticeRecordServiceImpl.class 6KB
WechatRequestDto.class 6KB
WechatApiTest.class 6KB
WechatUtil.class 6KB
AlipayServiceImpl.class 6KB
Account.class 5KB
AlipayNotifyController.class 5KB
PayController.class 5KB
WechatServiceImpl.class 5KB
SignUtil.class 5KB
WechatNotifyController.class 5KB
TestApi.class 5KB
AlipayFrontConfig.class 5KB
CashierController.class 5KB
RedisConfig.class 4KB
XPayApplicationTests.class 4KB
PayResultDto.class 4KB
MchServiceImpl.class 4KB
PayNotifyCustomer.class 4KB
PayWay.class 4KB
UserPayConfigServiceImpl.class 3KB
WechatFrontConfig.class 3KB
NoticeServiceImpl.class 3KB
MqConfig.class 3KB
XCashierApplicationTests.class 3KB
TradeQueryDto.class 3KB
UserInfo.class 3KB
AlipayController.class 3KB
PayProduct.class 3KB
WechatQrcodePayService.class 3KB
ReponseDto.class 3KB
XPayApplication.class 3KB
AlipayPagePayServiceImpl.class 3KB
NoticeRecord.class 3KB
AlipayRequestDto.class 3KB
PayWayInfo.class 3KB
PayInfo.class 3KB
XWecatFrontApplication.class 3KB
PayWayEnum.class 2KB
WechatController.class 2KB
RestConfig.class 2KB
PayStatusEnum.class 2KB
PayResponseDto.class 2KB
CashierServiceImpl.class 2KB
XxlJobConfig.class 2KB
XWecatFrontApplicationTests.class 2KB
RespBody.class 2KB
NoticeRule.class 2KB
PayQueryJob.class 2KB
AlipayQrcodePayService.class 2KB
TestController.class 2KB
PayProductEnum.class 2KB
StatusEnum.class 2KB
SignEnum.class 2KB
NetBankRespData.class 1KB
UserInfo.class 1KB
AliapyFrontClientImpl.class 1KB
WXPayXmlUtil.class 1KB
IAliapyFrontClient.class 1KB
PayCallBackController.class 1KB
MyMessagePostProcessor.class 1KB
WechatFrontClientImpl.class 1015B
PayStrategyFactory.class 958B
ITradePaymentService.class 954B
XAlipayFrontApplication.class 833B
IWechatFrontClient.class 794B
XPayCommonApplication.class 757B
XCashierApplication.class 745B
PayTaskApplication.class 742B
IPayService.class 693B
TradeQueryTask.class 678B
BizException.class 636B
INoticeRecordService.class 593B
XAlipayFrontApplicationTests.class 563B
PayTaskApplicationTests.class 540B
IAlipayService.class 526B
TradePaymentRecordMapper.class 422B
IUserPayConfigService.class 422B
RedisKeyConstant.class 420B
TradePaymentOrderMapper.class 419B
UserPayConfigMapper.class 407B
NoticeRecordMapper.class 404B
NoticeRuleMapper.class 398B
IWechatService.class 382B
IPayStrategyService.class 375B
ICashierService.class 329B
PayProductMapper.class 312B
UserInfoMapper.class 306B
AccountMapper.class 303B
PayReconJob.class 300B
PayWayMapper.class 300B
IMchService.class 243B
共 480 条
- 1
- 2
- 3
- 4
- 5
资源评论
- 秋鸿CodinG2023-06-13资源内容详实,描述详尽,解决了我的问题,受益匪浅,学到了。
程序员张小妍
- 粉丝: 1w+
- 资源: 3691
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 博途S7-1200主站与S7-200从站实现RS485通讯程序 S7-200可以当作一个仪表
- C#、C++分别开发的OPC DA CLIENT软件. 1、枚举服务器名称; 2、连接服务器以后枚举出TAG; 3、根据TAG名称自动读取服务器数据; 4、图片内有OPC SERVER和CLIENT实
- python-workspace.zip.005
- 龙门上下料样本程序,四轴 用台达AS228T和台达触摸屏编写 注意软件是用台达新款软件ISPSOFT ,借鉴价值高,程序有注释
- 一款window下的串口监视抓包工具
- 欧姆龙CP1H与3台力士乐VFC-x610变频器通讯程序 功能:原创程序,可直接用于现场程序 欧姆龙CP1H的CIF11通讯板,实现对3台力士乐VFC-x610变频器 设定频率,控制正反转,读取实际
- dp111113333
- CV-密集人群图像数据集(5800张图片).rar
- 福特汽车主观评价规范,性能开发参考,英文原版直译,评价条目、规则描述非常细致 包含平顺舒适性,转向,操稳,NVH,制动,加速感,驾驶性等等性能,并详细描述了评价的准备工作 评价条目细分至第四级,共
- 三菱FX3S两轴标准程序,XZ两轴,包含轴点动,回零,相对与绝对定位,只要弄明白这个程序,就可以非常了解整个项目的程序如何去编写,从哪里开始下手,可提供程序问题解答,程序流程清晰明了,注释完整
- MATLAB代码:考虑P2G与碳捕集机组的多能微网低碳经济调度 关键词:碳交易 阶梯碳交易 碳捕集 多能微网 低碳调度 仿真平台:MATLAB+yalmip+cplex 主要内容:代码主要做的是一个
- 本程序采用matlab编写,主要是实现电流注入型牛拉法 除此之外,本人还编写了很多种关于潮流计算的程序,主要有牛拉法,前推回代法,以还有相和三相潮流计算程序
- 智能门锁架构图,供大家参考
- 三菱FX3U六轴标准程序,程序包含本体3轴控制,扩展3个1PG定位模块,一共六轴 程序有轴点动控制,回零控制,相对定位,绝对定位 另有气缸数个,一个大是DD马达控制的转盘,整个是转盘多工位流水作业
- 批量登录到远程Linux服务器检查服务器时间差的shell
- MATLAB电动车七自由度整车模型 MATLAB Simulink电动车转弯制动abs模型asr转弯制动防抱死abs模型+模糊控制算法+七自由度整车模型+纵向运动+侧向运动+横摆运动+四轮魔术公式+四
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功