@ApiOperation(value = "支付宝支付", notes = "支付宝支付")
@PostMapping(value = "/zfbpay")
public String zfbPrePay(@RequestBody BuyerPayDto buyerPayDto) throws DocumentException {
String collect = buyerPayDto.getIds().replaceAll(",", "-");
double countAmount = buyerPayService.countAmount(Arrays.asList(buyerPayDto.getIds().split(",")));
PayUtils.PayOrderInfo payOrderInfo = PayUtils.generatePayOrderInfo(PayTypeEnum.ALIPAY, "一分钱商品", "商品购买",
BigDecimal.valueOf(countAmount), PayProperty.get("ZFB.notify_url"), collect);
return payOrderInfo.getOrderInfo();
}
@ApiOperation(value = "支付宝支付结果回调", notes = "支付宝支付结果回调")
@RequestMapping(value = "/zfbsuccess", produces = {"application/json;charset=UTF-8"})
@ResponseBody
@ApiIgnore
public String AliNotify(HttpServletRequest request) {
Map requestParams = request.getParameterMap();
/*
* 获取支付宝返回信息
*/
try {
HashMap<String, String> params = new HashMap<String, String>();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ",";
}
if (name.equals("trade_status")) {
System.out.println("交易状态为:" + valueStr);
}
params.put(name, valueStr);
}
// 获取支付宝的通知返回参数
// 商户订单号
String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"), "UTF-8")
.replaceAll("-", ",");
// 支付宝交易号
String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"), "UTF-8");
// 买家登录支付宝id
String buyer_logon_id = new String(request.getParameter("buyer_logon_id").getBytes("ISO-8859-1"), "UTF-8");
// 交易时间
String gmt_payment = new String(request.getParameter("gmt_payment").getBytes("ISO-8859-1"), "UTF-8");
// 交易金额
String invoice_amount = new String(request.getParameter("invoice_amount").getBytes("ISO-8859-1"), "UTF-8");
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = format.parse(gmt_payment);
} catch (Exception e) {
}
PropertiesUtil PAY_PROP = new PropertiesUtil("/configs/pay.properties"); // 这里需使用支付宝的配置
boolean b = AlipaySignature.rsaCheckV1(params, PAY_PROP.getProperty("alipay_public_key"), "UTF-8", "RSA2");
int orderType = getOrderType(out_trade_no);
// 验证通过
if (b) {
// 交易状态为成功
if ("TRADE_SUCCESS".equals(params.get("trade_status"))) {
try {
Arrays.asList(out_trade_no.split(",")).forEach(outTradeNo -> {
userAccountWork(outTradeNo, trade_no, 1, orderType);
});
} catch (Exception e1) {
e1.printStackTrace();
}
return "SUCCESS";
}
}
return "error:验证签名失败";
} catch (Exception e) {
// TODO: handle exception
return "支付异常";
}
}
private int getOrderType(String out_trade_no) {
if (out_trade_no.split(",").length > 1) {
return 0;
}
return 1;
}
public void buildGoodPayOrder(int type, String outTradeNo, BigDecimal payAmount, Integer userId, Integer status,
String tradeNo, int orderType) {
Example example = new Example(GoodsOrderDetail.class);
example.createCriteria().andEqualTo("orderId", outTradeNo);
GoodsOrderDetail goodsOrderDetail = goodsOrderDetailMapper.selectOneByExample(example);
GoodsModel goodsModel = goodsMapper.selectByPrimaryKey(goodsOrderDetail.getGoodsId());
if (goodsModel.getStockNum() > 0) {
goodsModel.setStockNum(goodsModel.getStockNum() - 1);
goodsModel.setBrowseNum(goodsModel.getBrowseNum() == null ? 0 : goodsModel.getBrowseNum() + 1);
goodsModel.setSalesVolume(goodsModel.getSalesVolume() == null ? 0 : goodsModel.getSalesVolume() + 1);
}
userRank.add(goodsModel.getType());
map.put(userId + "", userRank);
goodsMapper.updateByPrimaryKey(goodsModel);
GoodsPayOrder goodsPayOrder = new GoodsPayOrder();
goodsPayOrder.setCreateTime(new Date());
goodsPayOrder.setOrderNum(1);
goodsPayOrder.setOutTradeNo(outTradeNo);
goodsPayOrder.setDeleteFlag(1);
goodsPayOrder.setPayType(type);
goodsPayOrder.setPayAmount(payAmount);
goodsPayOrder.setUserId(userId);
goodsPayOrder.setPayStatus(status);
goodsPayOrder.setOrderType(orderType);
goodsPayOrder.setPayTime(new Date());
goodsPayOrder.setTradeNo(tradeNo);
goodsPayOrderMapper.insert(goodsPayOrder);
}
public void userAccountWork(String outTradeNo, String trade_no, int type, int orderType) {
//更新订单相关 ---------------------------------
GoodsOrder payInfo = buyerPayService.getPayInfo(Integer.parseInt(outTradeNo));
// 第三方防止重复通知
if (payInfo.getOrderStatus() > 0) {
return;
}
buildGoodPayOrder(type, outTradeNo, payInfo.getOrderAmount(), payInfo.getUserId(), 1, trade_no, orderType);
Example example = new Example(GoodsOrderDetail.class);
example.createCriteria().andEqualTo("orderId", outTradeNo);
GoodsOrderDetail goodsOrderDetail = goodsOrderDetailMapper.selectOneByExample(example);
GoodsModel goodsModel = goodsMapper.selectByPrimaryKey(goodsOrderDetail.getGoodsId());
payInfo.setPayOrderNo(trade_no);
if (goodsModel.getType() == 0) {
payInfo.setOrderStatus(1);
} else {
payInfo.setOrderStatus(5);
}
payInfo.setPayTime(new Date());
buyerPayService.updateStatus(payInfo);
// 付款成功业务逻辑处理-减除掉用户的消费卷
UserAccount userAccount = userAccountService.findByUserId(payInfo.getUserId());
User user = userService.findById(payInfo.getUserId());//当前付款用户
User RecommenderUser = userService.findByPhone(user.getUserPhone());//当前用户的推荐人
if (user == null) {
//查无用户
return;
}
//支付明细相关-------------------------------------------
if (type == 2) {
// 分红余额支付及明细生成
DataDividendRecord dataDividendRecord = new DataDividendRecord();
dataDividendRecord.setOrderId(payInfo.getId());
dataDividendRecord.setUserId(payInfo.getUserId());
dataDividendRecord.setBeforeAmount(userAccount.getDividendb());
userAccount.setDividendb(userAccount.getDividendb().subtract(payInfo.getPayAmount()));
dataDividendRecord.setAfterAmount(userAccount.getDividendb());
dataDividendRecord.setDeleteFlag(1);
dataDividendRecord.setAmount(payInfo.getPayAmount());
dataDividendRecord.setType(4);
dataDividendRecord.setCreateTime(new Date());
dataDividendRecord.setUserReceiptId(payInfo.getUserId());
dataDividendRecord.setStatus(1);
dataDividendRecord.setRemark("分红余额消费扣除");
dataDividendRecordMapper.insert(dataDividendRecord);
}
private static final PropertiesUtil PAY_PROP = new PropertiesUtil("/configs/pay.properties");
private static AlipayClient alipayClient;
static {
alipayClient = new DefaultAlipayClient(PAY_PROP.getProperty("alipay_getway"),
PAY_PROP.getProperty("alipay_app.id"),
PAY_PROP.getProperty("alipay_rsa_private_key"),
"JSON",
"UTF-8",
PAY_PROP.getProperty("alipay_public_key"),
"RSA2"
);
}
/**
* 生成支付订单信息(APP支付用)
*
* @param payType 支付类型
* @param orderDesc 订单描述信息
* @param orderTitle 订单标题
* @param orderAmount 订单金额
* @param notifyUrl 回调通知URL
* @return 支付订单信息
*/
public static PayOrderInfo generatePayOrderInfo(PayTypeEnum payType, String orderDesc, String orderTitle, BigDecimal orderAmount, String notifyUrl, String orderNo) throws DocumentException {
//若订单号为空,则自动生成支付订单号
if (StringUtils.isBlank(orderNo)) {
orderNo = generateOrderNo(payType);
}
//若支付回调地址为空,则自动生成支付回调地址
if (StringUtils.isBlank(notifyUrl)) {
notifyUrl = generatePayNotifyUrl(payType);
}
//根据支付类型生成支付订单信息
String orderInfo = "";
switch (payType) {
case ALIPAY:
orderInfo = generateAlipayOrderInfo(orderDesc, orderTitle, orderAmount, orderNo, notifyUrl);
break;
default:
break;
}
return new PayOrderInfo(orderNo, orderInfo);
}
/**
* 生成支付宝支付订单信息(支付宝APP支付-预下单)
*
* @param orderDesc 订单描述信息
* @param orderTitle 订单标题
* @param orderAmount 订单金额
* @param orderNo 订单号
* @param notifyUrl 回调通知URL
* @return 支付宝支付订单信息
*/
private static String generateAlipayOrderInfo(String orderDesc, String orderTitle, BigDecimal orderAmount, String orderNo, String notifyUrl) {
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody(orderDesc);
model.setSubject(orderTitle);
model.setOutTradeNo(orderNo);
model.setTotalAmount(orderAmount.setScale(2, BigDecimal.ROUND_DOWN) + "");
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
request.setBizModel(model);
request.setNotifyUrl(notifyUrl);
try {
AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
return response.getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
return "";
}
网友评论