支付业务模块
Posted Panda_Java
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了支付业务模块相关的知识,希望对你有一定的参考价值。
支付业务逻辑
- 1. 生成订单信息
- 2. 通过订单id获取订单
- 3. 通过账户id获取订单列表
- 4. 取消订单
- 5. 查询订单支付状态
- 6. 提供调用的查询订单结果类
- 7. 申请退款
- 8. 支付宝支付 输出支付宝支付页面
- 9. 支付宝支付 回调
- 10. 微信支付 输出二维码图片
- 11. 微信支付 回调
- 12. 获取微信回调的请求数据内容
1. 生成订单信息
@ApiOperation("生成订单信息")
@RequestMapping(value = "/saveOrder")
@ResponseBody
@Transactional
public ApiResult<Long> saveOrder(@Valid @RequestBody OrderRequest request)
PaymentOrder order = new PaymentOrder();
order.setAccountId(request.getAccountId());
order.setTeamId(request.getTeamId());
order.setTotalAmount(request.getTotalAmount());
order.setPayType(0);
order.setDescription(request.getDescription());
order.setOrderType(request.getOrderType());
order.setCompany(request.getCompany());
order.setRemarks(request.getRemarks());
order.setPayStatus(PaymentStatusEnum.NOT_PAID.getType());
order.setCreateTime(LocalDateTime.now());
Long id = paymentOrderService.saveOrder(order);
List<OrderProductRequest> orderProductRequestList = request.getOrderProductList();
if (orderProductRequestList == null)
throw new PaymentException(ResponseContants.NOT_EXISTS, ResponseContants.NOT_EXIST_MSG);
Boolean b = paymentOrderService.checkMoney(orderProductRequestList, request.getTotalAmount());
List<PaymentOrderProduct> orderProductList = new ArrayList<>();
for (OrderProductRequest orderProductRequest : orderProductRequestList)
PaymentOrderProduct orderProduct = new PaymentOrderProduct();
BeanUtil.copyProperties(orderProductRequest, orderProduct);
orderProduct.setOrderId(id);
orderProductList.add(orderProduct);
paymentOrderProductService.saveOrderProductList(orderProductList);
//获得支付方式
// Integer payType = request.getPayType();
// switch (payType)
// case 1:
// //微信
//
// break;
// case 2:
// //支付宝
// String s = paymentOrderService.aliPayPage(id);
// System.out.println(s);
// break;
//
return ApiResult.success(id);
2. 通过订单id获取订单
@ApiOperation("通过订单id获取订单信息")
@RequestMapping(value = "/getOrderById")
@ResponseBody
public ApiResult<OrderVo> getOrderById(@RequestBody @Valid OrderByIdQuery query)
PaymentOrder order = paymentOrderService.getOrderById(query.getId());
if (order == null)
return ApiResult.resultIsEmpty();
OrderVo vo = new OrderVo();
BeanUtil.copyProperties(order, vo);
List<PaymentOrderProduct> orderProductList = paymentOrderProductService.getOrderProductList(query.getId());
List<OrderProductVo> orderProductVoList = new ArrayList<>();
for (PaymentOrderProduct orderProduct : orderProductList)
OrderProductVo orderProductVo = new OrderProductVo();
BeanUtil.copyProperties(orderProduct, orderProductVo);
//具体的商品类
Object obj = paymentOrderProductService.getProductObject(orderProductVo.getProductType(), orderProductVo.getProductId());
orderProductVo.setProductObject(obj);
orderProductVoList.add(orderProductVo);
vo.setOrderProductList(orderProductVoList);
return ApiResult.success(vo);
3. 通过账户id获取订单列表
@ApiOperation("通过账户id获取订单列表")
@RequestMapping(value = "/getOrderListByAccountId")
@ResponseBody
public ApiResult<List<OrderVo>> getOrderListByAccountId(@RequestBody @Valid OrderByAccountIdQuery query)
List<PaymentOrder> orderList = paymentOrderService.getOrderListByAccountId(query.getAccountId());
if (orderList == null)
return ApiResult.resultIsEmpty();
List<OrderVo> orderVoList = new ArrayList<>();
for (PaymentOrder order : orderList)
OrderVo vo = new OrderVo();
BeanUtil.copyProperties(order, vo);
List<PaymentOrderProduct> orderProductList = paymentOrderProductService.getOrderProductList(order.getId());
List<OrderProductVo> orderProductVoList = new ArrayList<>();
for (PaymentOrderProduct orderProduct : orderProductList)
OrderProductVo orderProductVo = new OrderProductVo();
BeanUtil.copyProperties(orderProduct, orderProductVo);
//具体的商品类
Object obj = paymentOrderProductService.getProductObject(orderProductVo.getProductType(), orderProductVo.getProductId());
orderProductVo.setProductObject(obj);
orderProductVoList.add(orderProductVo);
vo.setOrderProductList(orderProductVoList);
orderVoList.add(vo);
return ApiResult.success(orderVoList);
4. 取消订单
@RequestMapping(value = "/cancelOrder")
@ResponseBody
public ApiResult<Boolean> cancelOrder(@RequestBody @Valid OrderByIdRequest request)
Boolean status = paymentOrderService.cancelOrder(request.getId());
System.out.println(status);
return ApiResult.success(status);
5. 查询订单支付状态
@RequestMapping(value = "/getPaymentStatus")
@ResponseBody
public ApiResult<PaymentStatusVo> getPaymentStatus(@RequestBody @Valid OrderByIdQuery query)
PaymentOrder order = paymentOrderService.getOrderById(query.getId());
PaymentStatusVo vo = new PaymentStatusVo();
vo.setOrderId(order.getId());
vo.setPayStatus(order.getPayStatus());
vo.setPayType(order.getPayType());
vo.setRemarks(order.getRemarks());
//PaymentStatusVo paymentStatusVo = paymentOrderService.getPaymentStatus(query.getId());
return ApiResult.success(vo);
6. 提供调用的查询订单结果类
@RequestMapping(value = "/getPaymentResult")
@ResponseBody
public ApiResult<List<PaymentResultVo>> getPaymentResult(@RequestBody @Valid PaymentResultQuery query)
List<PaymentResult> paymentResultList = paymentOrderService.getPaymentResult(query.getAccountId(), query.getProductType(), query.getProductId(), query.getTeamId(), query.getSecondaryId());
List<PaymentResultVo> paymentResultVoList = new ArrayList<>();
for (PaymentResult paymentResult : paymentResultList)
PaymentResultVo vo = new PaymentResultVo();
BeanUtil.copyProperties(paymentResult, vo);
paymentResultVoList.add(vo);
return ApiResult.success(paymentResultVoList);
@RequestMapping(value = "/usePaymentResult")
@ResponseBody
public ApiResult<Boolean> usePaymentResult(@RequestBody @Valid PaymentResultRequest request)
Boolean b = paymentOrderService.usePaymentResult(request.getId(), request.getNum());
return ApiResult.success(b);
7. 申请退款
@RequestMapping(value = "/refundOrder")
@ResponseBody
public ApiResult<Boolean> refundOrder(@RequestBody @Valid OrderByIdRequest request) throws Exception
//更改订单状态,返回支付方式
RefundDto refundDto = paymentOrderService.refundOrder(request.getId());
//查看是否符合退款条件,可以提供可退款的金额
//TODO
//退款操作
//TODO
Integer payType = refundDto.getPayType();
Boolean back = null;
//微信
if (PaymentTypeEnum.WEPAY.getType() == payType)
back = paymentOrderService.refundMoneyWePay(refundDto);
//支付宝
if (PaymentTypeEnum.ALIPAY.getType() == payType)
back = paymentOrderService.refundMoneyAli(refundDto);
return ApiResult.success(back);
8. 支付宝支付 输出支付宝支付页面
@RequestMapping(value = "/aliPay")
@ResponseBody
public ApiResult<String> aliPay(@RequestBody @Valid OrderByIdQuery query)
//是一个支付的form表单
String payPage = paymentOrderService.aliPayPage(query.getId());
System.out.println(payPage);
return ApiResult.success(payPage);
9. 支付宝支付 回调
@RequestMapping(value = "/aliPayNotify")
public void aliPayNotify(HttpServletRequest request, HttpServletResponse response)
System.out.println("begin aliPay notify---");
//将异步通知中收到的所有参数都存放到params中
Map<String, String> params = new HashMap<>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); )
String name = iter.next();
String[] values = requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++)
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
params.put(name, valueStr);
//调用SDK验证签名
boolean signVerified = false;
try
signVerified = AlipaySignature.rsaCheckV1(params, alipayPublicKey, charset, signType);
// 返回结果集
Map<String, String> outMap = new TreeMap<String, String>();
if (signVerified)
// TODO 验签成功后,按照支付结果异步通知中的描述,对支付结果中的业务内容进行二次校验,校验成功后在response中返回success并继续商户自身业务处理,校验失败返回failure
//商户订单号
String outTradeNo = request.getParameter("out_trade_no");
//支付宝交易号
String trade_no = request.getParameter("trade_no");
//交易状态
String trade_status = request.getParameter("trade_status");
String trade_success = "TRADE_SUCCESS";
if (trade_success.equals(trade_status))
paymentOrderService.handlePayNotify(Long.valueOf(outTradeNo), PaymentTypeEnum.ALIPAY);
outMap.put("return_code", "SUCCESS");
outMap.put("return_msg", "OK");
//当商户收到服务器异步通知并打印出 success 时,服务器异步通知参数 notify_id 才会失效
response.getWriter().print("success");
System.out.println("success");
log.info("支付宝支付成功!out_trade_no:" + outTradeNo + ", trade_status:" + trade_status);
else
outMap.put("trade_status", trade_status);
log.error("支付宝支付通信失败!" + trade_status);
else
// TODO 验签失败则记录异常日志,并在response中返回failure.
outMap.put("return_code", "FAILURE");
outMap.put("return_msg", "验签失败");
log.error("验签失败");
String respMessage = null;
respMessage = XMLUtil.mapToXml(outMap);
PrintWriter out = response.getWriter();
out.print(respMessage);
out.flush();
out.close();
catch (Exception e)
e.printStackTrace();
10. 微信支付 输出二维码图片
@RequestMapping(value = "/wePayQR")
@ResponseBody
public ApiResult<Boolean> wePayQR(@RequestBody @Valid OrderByIdQuery query, HttpServletResponse response) throws IOException
String codeUrl = paymentOrderService.wePayUrl(query.getId());
response.setContentType("image/jpeg;charset=UTF-8");
response.setHeader("Pragma", "No-cache");
response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0);
try
String size = "300";
int qrCodeSize = QRCodeUtil.QRCODE_SIZE;
if (Validator.isNotNull(size))
qrCodeSize = Integer.parseInt(size);
OutputStream out = response.getOutputStream();
BufferedImage bi = QRCodeUtil.createImage(codeUrl, qrCodeSize);
ImageIO.write(bi, "JPEG", out);
out.flush();
out.close();
catch (IOException | WriterException e)
e.printStackTrace();
log.error("error:::", e);
return ApiResult.success(true);
@RequestMapping(value = "/wePayCodeUrl")
@ResponseBody以上是关于支付业务模块的主要内容,如果未能解决你的问题,请参考以下文章