package com.sinata.rest.modular.system.controller;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.jpay.ext.kit.HttpKit;
|
import com.jpay.ext.kit.PaymentKit;
|
import com.sinata.common.enums.EnumPayType;
|
import com.sinata.common.enums.mall.EnumMallOrderPrefix;
|
import com.sinata.rest.common.ApiUtils;
|
import com.sinata.rest.common.model.AlipayNotifyParam;
|
import com.sinata.rest.modular.member.model.MemOrderAuth;
|
import com.sinata.rest.modular.member.model.MemUser;
|
import com.sinata.rest.modular.member.service.IMemOrderAuthService;
|
import com.sinata.rest.modular.member.service.IMemUserService;
|
import com.sinata.rest.modular.member.service.IMyUserCouponOrderService;
|
import com.sinata.rest.modular.system.controller.common.vo.PayCheck;
|
import com.sinata.rest.modular.system.model.AlipayUrl;
|
import com.sinata.rest.modular.system.service.IAlipayUrlService;
|
import io.swagger.annotations.ApiImplicitParam;
|
import io.swagger.annotations.ApiImplicitParams;
|
import io.swagger.annotations.ApiOperation;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RestController;
|
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.math.BigDecimal;
|
import java.util.Map;
|
|
@Slf4j
|
@RestController
|
@RequestMapping("/pay")
|
//@Api(tags = "微信支付回调", description = "微信方支付成功后,通知接口")
|
public class PayNotifyController extends AuthController {
|
|
@Autowired
|
private IMemOrderAuthService orderAuthService;
|
|
@Autowired
|
private IMemUserService userService;
|
|
@Autowired
|
private IAlipayUrlService alipayUrlService;
|
|
@Autowired
|
IMyUserCouponOrderService couponOrderService;
|
|
/**
|
* 微信-支付回调(参考财付通回调接口)
|
*/
|
@RequestMapping("/wxpay/notify")
|
public void notifyWxPaid(HttpServletRequest request, HttpServletResponse response) {
|
//支付结果通用通知文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
|
String xmlMsg = HttpKit.readData(request);
|
log.debug("微信支付回调通知:{}", xmlMsg);
|
Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
|
String result_code = params.get("result_code");
|
//校验返回来的支付结果,根据已经配置的密钥
|
if (("SUCCESS").equals(result_code)) {
|
//校验通过. 更改订单状态为已支付 修改库存
|
String totalFee = params.get("total_fee");
|
String orderNo = params.get("out_trade_no");
|
String transactionId = params.get("transaction_id");
|
BigDecimal payFee = new BigDecimal(params.get("total_fee")).divide(BigDecimal.valueOf(100));
|
Integer code = null;
|
if(orderNo.contains(EnumMallOrderPrefix
|
.COUPON_ORDER.index)){
|
couponOrderService.paySuccess(orderNo);
|
}else {
|
code = handleRealNamePay(EnumPayType.WECHAT.index, orderNo, transactionId, payFee, null);
|
}
|
if(code == null || code != 0) {
|
// 交易处理,终止!
|
return;
|
}
|
|
final String xml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
|
try {
|
response.getWriter().write(xml);
|
} catch (Exception e) {
|
System.out.println("微信回调返回失败!" + e.getMessage());
|
} finally {
|
|
}
|
}
|
}
|
|
@GetMapping(value = "/check_pay")
|
@ApiOperation(value = "查询是否支付实名认证订单", notes = "查询是否支付实名认证订单", response = PayCheck.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "int", paramType = "query", required = true)
|
})
|
public Object checkPayResult(Integer userId, HttpServletRequest request) {
|
/************************ 拦截Token校验-begin ******************************/
|
// 验证用户ID
|
int authCode = authUserId(request, userId);
|
if(authCode != 0) {
|
return ApiUtils.returnNG(null, "系统繁忙.请稍候再试..");
|
}
|
/************************ 拦截Token校验-end ********************************/
|
|
|
LambdaQueryWrapper<MemOrderAuth> wrapper = new LambdaQueryWrapper();
|
wrapper.eq(MemOrderAuth::getUserId, userId);
|
MemOrderAuth order = orderAuthService.getOne(wrapper);
|
PayCheck c = new PayCheck();
|
if (order == null) {
|
c.setSuccess(false);
|
return ApiUtils.returnOK(c);
|
}
|
if (userId == null) {
|
c.setSuccess(false);
|
return ApiUtils.returnOK(c);
|
}
|
MemUser user = userService.getById(userId);
|
if (user == null) {
|
c.setSuccess(false);
|
return ApiUtils.returnOK(c);
|
}
|
boolean paid = orderAuthService.checkOrderAndSet(order.getOrderNo(), order.getPayType());
|
c.setType(order.getPayType());
|
c.setSuccess(paid);
|
return ApiUtils.returnOK(c);
|
}
|
|
@GetMapping(value = "/alipay_url")
|
@ApiOperation(value = "获取支付宝支付跳转链接", notes = "获取支付宝支付跳转链接", response = ApiUtils.class)
|
@ApiImplicitParams({
|
@ApiImplicitParam(name = "userId", value = "用户id", dataType = "int", paramType = "query", required = true),
|
@ApiImplicitParam(name = "orderNo", value = "订单号", dataType = "String", paramType = "query", required = true)
|
})
|
public Object getAlipayUrl(Integer userId, String orderNo, HttpServletRequest request) {
|
/************************ 拦截Token校验-begin ******************************/
|
// 验证用户ID
|
int authCode = authUserId(request, userId);
|
if(authCode != 0) {
|
return ApiUtils.returnNG(null, "系统繁忙.请稍候再试..");
|
}
|
/************************ 拦截Token校验-end ********************************/
|
|
|
LambdaQueryWrapper<AlipayUrl> wr = new LambdaQueryWrapper<>();
|
wr.eq(AlipayUrl::getOrderNo, orderNo).eq(AlipayUrl::getUserId, userId);
|
AlipayUrl url = alipayUrlService.getOne(wr);
|
if (url == null) {
|
return ApiUtils.returnNG(null, "没有对应地址");
|
}
|
return ApiUtils.returnOK(url.getAlipayUrl());
|
}
|
|
private AlipayNotifyParam buildAlipayNotifyParam(Map<String, String> params) {
|
String json = JSON.toJSONString(params);
|
return JSON.parseObject(json, AlipayNotifyParam.class);
|
}
|
|
/**
|
* 交易处理
|
* @return code:-1订单不存在,-2交易金额错误,-3用户信息错误
|
*/
|
private Integer handleRealNamePay(Integer payType, String orderNo, String transactionId, BigDecimal buyerPayAmount, Map<String, String> params) {
|
LambdaQueryWrapper<MemOrderAuth> wrapper = new LambdaQueryWrapper();
|
wrapper.eq(MemOrderAuth::getOrderNo, orderNo);
|
MemOrderAuth order = orderAuthService.getOne(wrapper);
|
if (order == null ) {
|
return -1;
|
}
|
if (buyerPayAmount.doubleValue() != order.getPayMoney().doubleValue()) {
|
log.error("订单{}交易{}支付金额{}错误!", orderNo, transactionId, buyerPayAmount);
|
return -2;
|
}
|
MemUser user = userService.getById(order.getUserId());
|
if (user == null) {
|
return -3;
|
}
|
order.setState(1);
|
order.setTransactionId(transactionId);
|
order.updateById();
|
return 0;
|
}
|
|
}
|