欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

支付宝支付 Java+uniapp 支付宝小程序

最编程 2024-10-13 21:26:03
...
/** * 会员卡支付 */ @PostMapping("/pay") @RepeatSubmit public R<Object> pay(@RequestBody AppVipPayVo pay) { long tradeId = payTradeService.save(pay.payWay(), pay.getPayAmount(), pay.getVipId(), TradeTypeEnum.VIP.getCode());//创建自己的交易订单 if (StrUtil.equals(payWay, PayWayEnum.MIN_ALIPAY.getCode()) || StrUtil.equals(payWay, PayWayEnum.ALIPAY.getCode())) { return aliPayRequest(tradeId, pay.getPayAmount(), pay.payWay(), "https://xxx.xxx.xxx/vip/alipayCallback","会员卡"); } return R.fail(); } //发起支付宝支付 private Object aliPayRequest(Long tradeId, BigDecimal payMoney, String payWay, String notifyUrl, String subject) { AliPayConfig ali = new AliPayConfig();//获取商户的支付配置 AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do" , ali.getAppId(), ali.getPrivateSign(), "json", StandardCharsets.UTF_8.name(), ali.getPublicKey(), ali.getSignType()); if (StrUtil.equals(payWay, PayWayEnum.MIN_ALIPAY.getCode())) {//支付宝小程序 AlipayTradePayModel bizContent = new AlipayTradePayModel(); bizContent.setBuyerOpenId(LoginHelper.getLoginUser().getToken()); bizContent.setOutTradeNo(String.valueOf(tradeId));//存入我们自己的流水号 bizContent.setTotalAmount(String.valueOf(payMoney)); bizContent.setSubject(subject); AlipayTradeCreateRequest aliRequest = new AlipayTradeCreateRequest(); aliRequest.setNotifyUrl(notifyUrl); aliRequest.setBizModel(bizContent); try { AlipayTradeCreateResponse response = alipayClient.execute(aliRequest); if (response.isSuccess()) { return response; } throw new ServiceException(response.getSubMsg()); } catch (AlipayApiException e) { throw new ServiceException(e.getErrMsg()); } } if (StrUtil.equals(payWay, PayWayEnum.ALIPAY.getCode())) {//支付宝 AlipayTradeAppPayModel bizContent = new AlipayTradeAppPayModel(); bizContent.setOutTradeNo(String.valueOf(tradeId));//存入我们自己的流水号 bizContent.setTotalAmount(String.valueOf(payMoney)); bizContent.setSubject(subject); AlipayTradeAppPayRequest aliRequest = new AlipayTradeAppPayRequest(); aliRequest.setNotifyUrl(notifyUrl); aliRequest.setBizModel(bizContent); try { AlipayTradeAppPayResponse response = alipayClient.sdkExecute(aliRequest); if (response.isSuccess()) { return response.getBody(); } throw new ServiceException(response.getSubMsg()); } catch (AlipayApiException e) { throw new ServiceException(e.getErrMsg()); } } return R.ok(); } /** * 回调 */ @PostMapping("/alipayCallback") @SaIgnore public String alipayCallback(HttpServletRequest request) { Map<String, String> params = ServletUtils.getParamMap(request); StaticLog.info("支付宝支付回调={}", JSONObject.toJSONString(params)); String outTradeNo = params.get("out_trade_no");//拿到我们自己的流水号 String tradeNo = params.get("trade_no"); String tradeStatus = params.get("trade_status"); String gmtPayment = params.get("gmt_payment"); LambdaQueryWrapper<PayTrade> eq = Wrappers.<PayTrade>lambdaQuery() .eq(PayTrade::getId, outTradeNo) .isNull(PayTrade::getOutTradeNo) .eq(PayTrade::getTradeStatus, TradeStatusEnum.WAIT_PAY.getCode()); PayTrade trade = PayTradeMapper.selectOne(eq); if (ObjectUtil.isNull(trade) || !"TRADE_SUCCESS".equals(tradeStatus)) { StaticLog.info("支付信息不存在或支付失败"); return "failure"; } AliPayConfig ali = new AliPayConfig();//获取商户的支付配置 boolean signVerified = AlipaySignature.rsaCheckV1(params, ali.getPublicKey(), StandardCharsets.UTF_8.name(), ali.getSignType()); if (!signVerified) { StaticLog.info("验签失败"); return "failure"; } long orderId = trade.getOrderId();//这个是业务订单ID,也就是VIP表的ID long payTime = DateUtil.parse(gmtPayment, NORM_DATETIME_FORMATTER).getTime() / 1000; paySuccess(tradeNo, payTime, outTradeNo, orderId, trade.getUserId()); return "success"; } //支付成功业务逻辑 private void paySuccess(String tradeNo, long payTime, String outTradeNo, long orderId, Long userId) { //修改订单状态 payTradeMapper.update(null, new LambdaUpdateWrapper<PayTrade>() .set(PayTrade::getTradeStatus, TradeStatusEnum.PAY_SUCCESS.getCode()) .set(PayTrade::getOutTradeNo, tradeNo) .set(PayTrade::getPayTime, payTime) .set(PayTrade::getHasNotify, true) .eq(PayTrade::getId, outTradeNo)); }