|
@@ -1,333 +1,333 @@
|
|
|
-package org.ruoyi.system.controller.system;
|
|
|
-
|
|
|
-import cn.hutool.core.bean.BeanUtil;
|
|
|
-import cn.hutool.core.collection.CollectionUtil;
|
|
|
-import cn.hutool.extra.qrcode.QrCodeUtil;
|
|
|
-import cn.hutool.json.JSONObject;
|
|
|
-import cn.hutool.json.JSONUtil;
|
|
|
-import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
|
|
|
-import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
|
|
|
-import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
|
|
|
-import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
|
|
|
-import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
|
|
|
-import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
-import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
-import com.stripe.Stripe;
|
|
|
-import com.stripe.exception.StripeException;
|
|
|
-import com.stripe.model.Event;
|
|
|
-import com.stripe.model.Price;
|
|
|
-import com.stripe.model.Product;
|
|
|
-import com.stripe.model.checkout.Session;
|
|
|
-import com.stripe.net.Webhook;
|
|
|
-import com.stripe.param.checkout.SessionCreateParams;
|
|
|
-import jakarta.servlet.http.HttpServletRequest;
|
|
|
-import lombok.RequiredArgsConstructor;
|
|
|
-import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.ruoyi.common.config.PayConfig;
|
|
|
-import org.ruoyi.common.core.domain.R;
|
|
|
-import org.ruoyi.common.core.exception.base.BaseException;
|
|
|
-import org.ruoyi.common.core.service.ConfigService;
|
|
|
-import org.ruoyi.common.core.utils.StringUtils;
|
|
|
-import org.ruoyi.common.oss.core.OssClient;
|
|
|
-import org.ruoyi.common.oss.entity.UploadResult;
|
|
|
-import org.ruoyi.common.oss.factory.OssFactory;
|
|
|
-import org.ruoyi.common.response.PayResponse;
|
|
|
-import org.ruoyi.common.service.PayService;
|
|
|
-import org.ruoyi.common.utils.MD5Util;
|
|
|
-import org.ruoyi.system.domain.bo.PaymentOrdersBo;
|
|
|
-import org.ruoyi.system.domain.bo.SysUserBo;
|
|
|
-import org.ruoyi.system.domain.request.OrderRequest;
|
|
|
-import org.ruoyi.system.domain.vo.PaymentOrdersVo;
|
|
|
-import org.ruoyi.system.domain.vo.SysUserVo;
|
|
|
-import org.ruoyi.system.service.IPaymentOrdersService;
|
|
|
-import org.ruoyi.system.service.ISysUserService;
|
|
|
-import org.springframework.web.bind.annotation.*;
|
|
|
-
|
|
|
-import java.io.ByteArrayOutputStream;
|
|
|
-import java.io.InputStream;
|
|
|
-import java.math.BigDecimal;
|
|
|
-import java.math.RoundingMode;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-
|
|
|
-
|
|
|
-@RequiredArgsConstructor
|
|
|
-@RestController
|
|
|
-@RequestMapping("/pay")
|
|
|
-@Slf4j
|
|
|
-public class PayController {
|
|
|
-
|
|
|
- private final PayService payService;
|
|
|
-
|
|
|
- private final ISysUserService userService;
|
|
|
-
|
|
|
- private final IPaymentOrdersService paymentOrdersService;
|
|
|
-
|
|
|
- private final PayConfig payConfig;
|
|
|
-
|
|
|
- private final WxPayService wxService;
|
|
|
-
|
|
|
- private final ConfigService configService;
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取支付二维码
|
|
|
- *
|
|
|
- * @Date 2023/7/3
|
|
|
- * @return void
|
|
|
- **/
|
|
|
- @PostMapping("/payUrl")
|
|
|
- public R<PaymentOrdersVo> payUrl(@RequestBody OrderRequest orderRequest) {
|
|
|
- PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
|
|
|
- PaymentOrdersVo paymentOrdersVo = new PaymentOrdersVo();
|
|
|
- if(!Boolean.parseBoolean(getKey("enabled"))){
|
|
|
- String payUrl = payService.getPayUrl(payOrder.getOrderNo(), orderRequest.getName(), Double.parseDouble(orderRequest.getMoney()), "192.168.1.6");
|
|
|
- byte[] bytes = QrCodeUtil.generatePng(payUrl, 300, 300);
|
|
|
- OssClient storage = OssFactory.instance();
|
|
|
- UploadResult upload=storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
|
|
|
- BeanUtil.copyProperties(payOrder,paymentOrdersVo);
|
|
|
- paymentOrdersVo.setUrl(upload.getUrl());
|
|
|
- }else {
|
|
|
- WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
|
|
|
- request.setTradeType("NATIVE");
|
|
|
- request.setBody(orderRequest.getName());
|
|
|
- request.setOutTradeNo(payOrder.getOrderNo());
|
|
|
- request.setTotalFee(BaseWxPayRequest.yuanToFen(orderRequest.getMoney()));
|
|
|
- request.setSpbillCreateIp("127.0.0.1");
|
|
|
- request.setNotifyUrl(getKey("notifyUrl"));
|
|
|
- request.setProductId(payOrder.getId().toString());
|
|
|
- try {
|
|
|
- WxPayNativeOrderResult order = wxService.createOrder(request);
|
|
|
- byte[] bytes = QrCodeUtil.generatePng(order.getCodeUrl(), 300, 300);
|
|
|
- OssClient storage = OssFactory.instance();
|
|
|
- UploadResult upload = storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
|
|
|
- BeanUtil.copyProperties(payOrder,paymentOrdersVo);
|
|
|
- paymentOrdersVo.setUrl(upload.getUrl());
|
|
|
- } catch (WxPayException e) {
|
|
|
- throw new BaseException("获取微信支付二维码发生错误:{}"+e.getMessage());
|
|
|
- }
|
|
|
- }
|
|
|
- return R.ok(paymentOrdersVo);
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 回调通知地址
|
|
|
- *
|
|
|
- * @Date 2023/7/3
|
|
|
- * @param
|
|
|
- * @return void
|
|
|
- **/
|
|
|
- @GetMapping("/notifyUrl")
|
|
|
- public String notifyUrl(PayResponse payResponse) {
|
|
|
- // 校验签名
|
|
|
- String mdString = "money=" + payResponse.getMoney() + "&name=" + payResponse.getName() +
|
|
|
- "&out_trade_no=" + payResponse.getOut_trade_no() + "&pid=" + payConfig.getPid() +
|
|
|
- "&trade_no=" + payResponse.getTrade_no() + "&trade_status=" + payResponse.getTrade_status() +
|
|
|
- "&type=" + payResponse.getType() + payConfig.getKey();
|
|
|
- String sign = MD5Util.GetMD5Code(mdString);
|
|
|
- if(!sign.equals(payResponse.getSign())){
|
|
|
- throw new BaseException("校验签名失败!");
|
|
|
- }
|
|
|
- double money = Double.parseDouble(payResponse.getMoney());
|
|
|
- log.info("支付订单号{}",payResponse);
|
|
|
- PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
|
|
|
- paymentOrdersBo.setOrderNo(payResponse.getOut_trade_no());
|
|
|
- List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
|
|
|
- if (CollectionUtil.isEmpty(paymentOrdersList)){
|
|
|
- throw new BaseException("订单不存在!");
|
|
|
- }
|
|
|
- // 订单状态修改为已支付
|
|
|
- PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
|
|
|
- paymentOrdersVo.setPaymentStatus("2");
|
|
|
- paymentOrdersVo.setPaymentMethod(payResponse.getType());
|
|
|
- BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
|
|
|
- paymentOrdersService.updateByBo(paymentOrdersBo);
|
|
|
-
|
|
|
- SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
|
|
|
- sysUserVo.setUserBalance(sysUserVo.getUserBalance() + money);
|
|
|
- SysUserBo sysUserBo = new SysUserBo();
|
|
|
- BeanUtil.copyProperties(sysUserVo,sysUserBo);
|
|
|
- // 设置为付费用户
|
|
|
- sysUserBo.setUserGrade("1");
|
|
|
- userService.updateUser(sysUserBo);
|
|
|
- return "success";
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 跳转通知地址
|
|
|
- *
|
|
|
- * @Date 2023/7/3
|
|
|
- * @param
|
|
|
- * @return void
|
|
|
- **/
|
|
|
- @GetMapping("/return_url")
|
|
|
- public void returnUrl() {
|
|
|
- log.info("return_url===========");
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- @PostMapping("/notify/wxOrder")
|
|
|
- public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
|
|
|
- WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
|
|
|
- // TODO 根据自己业务场景需要构造返回对象
|
|
|
- PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
|
|
|
- paymentOrdersBo.setOrderNo(notifyResult.getOutTradeNo());
|
|
|
- List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
|
|
|
- PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
|
|
|
- paymentOrdersVo.setPaymentStatus("2");
|
|
|
- paymentOrdersVo.setPaymentMethod("wx");
|
|
|
- BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
|
|
|
- paymentOrdersService.updateByBo(paymentOrdersBo);
|
|
|
- SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
|
|
|
- sysUserVo.setUserBalance(sysUserVo.getUserBalance() + convertCentsToYuan(notifyResult.getTotalFee()));
|
|
|
- SysUserBo sysUserBo = new SysUserBo();
|
|
|
- BeanUtil.copyProperties(sysUserVo,sysUserBo);
|
|
|
- // 设置为付费用户
|
|
|
- sysUserBo.setUserGrade("1");
|
|
|
- userService.updateUser(sysUserBo);
|
|
|
- return WxPayNotifyResponse.success("success");
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 将分转换为元,并保留精度。
|
|
|
- *
|
|
|
- * @param cents 分的金额,类型为Integer
|
|
|
- * @return 转换后的元金额,类型为double
|
|
|
- */
|
|
|
- public static double convertCentsToYuan(Integer cents) {
|
|
|
- // 处理空输入
|
|
|
- if (cents == null) {
|
|
|
- throw new IllegalArgumentException("输入的分金额不能为空");
|
|
|
- }
|
|
|
-
|
|
|
- // 100分 = 1元
|
|
|
- BigDecimal centsBigDecimal = new BigDecimal(cents);
|
|
|
- BigDecimal yuan = centsBigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
|
|
|
- // 转换为double并返回
|
|
|
- return yuan.doubleValue();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取订单信息
|
|
|
- *
|
|
|
- */
|
|
|
- @PostMapping("/orderInfo")
|
|
|
- public R<PaymentOrdersVo> orderInfo(@RequestBody OrderRequest orderRequest) {
|
|
|
- if(StringUtils.isEmpty(orderRequest.getOrderNo())){
|
|
|
- throw new BaseException("订单号不能为空!");
|
|
|
- }
|
|
|
- PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
|
|
|
- paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
|
|
|
- List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
|
|
|
- if (CollectionUtil.isEmpty(paymentOrdersList)){
|
|
|
- throw new BaseException("订单不存在!");
|
|
|
- }
|
|
|
- PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
|
|
|
- return R.ok(paymentOrdersVo);
|
|
|
- }
|
|
|
-
|
|
|
- // 获取支付链接
|
|
|
-// static {
|
|
|
-// Stripe.apiKey = "sk_test_51PMMj2KcfX4oNioqXkoKpScTsgmR55xQki2tg8MEZJYc0gjhYV85t2FzDasE06eqZb0sqyYhOp3UXhcGGQLWI4A9008aq8SOnb";
|
|
|
+//package org.ruoyi.system.controller.system;
|
|
|
+//
|
|
|
+//import cn.hutool.core.bean.BeanUtil;
|
|
|
+//import cn.hutool.core.collection.CollectionUtil;
|
|
|
+//import cn.hutool.extra.qrcode.QrCodeUtil;
|
|
|
+//import cn.hutool.json.JSONObject;
|
|
|
+//import cn.hutool.json.JSONUtil;
|
|
|
+//import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
|
|
|
+//import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
|
|
|
+//import com.github.binarywang.wxpay.bean.order.WxPayNativeOrderResult;
|
|
|
+//import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
|
|
|
+//import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
|
|
|
+//import com.github.binarywang.wxpay.exception.WxPayException;
|
|
|
+//import com.github.binarywang.wxpay.service.WxPayService;
|
|
|
+//import com.stripe.Stripe;
|
|
|
+//import com.stripe.exception.StripeException;
|
|
|
+//import com.stripe.model.Event;
|
|
|
+//import com.stripe.model.Price;
|
|
|
+//import com.stripe.model.Product;
|
|
|
+//import com.stripe.model.checkout.Session;
|
|
|
+//import com.stripe.net.Webhook;
|
|
|
+//import com.stripe.param.checkout.SessionCreateParams;
|
|
|
+//import jakarta.servlet.http.HttpServletRequest;
|
|
|
+//import lombok.RequiredArgsConstructor;
|
|
|
+//import lombok.extern.slf4j.Slf4j;
|
|
|
+//import org.ruoyi.common.config.PayConfig;
|
|
|
+//import org.ruoyi.common.core.domain.R;
|
|
|
+//import org.ruoyi.common.core.exception.base.BaseException;
|
|
|
+//import org.ruoyi.common.core.service.ConfigService;
|
|
|
+//import org.ruoyi.common.core.utils.StringUtils;
|
|
|
+//import org.ruoyi.common.oss.core.OssClient;
|
|
|
+//import org.ruoyi.common.oss.entity.UploadResult;
|
|
|
+//import org.ruoyi.common.oss.factory.OssFactory;
|
|
|
+//import org.ruoyi.common.response.PayResponse;
|
|
|
+//import org.ruoyi.common.service.PayService;
|
|
|
+//import org.ruoyi.common.utils.MD5Util;
|
|
|
+//import org.ruoyi.system.domain.bo.PaymentOrdersBo;
|
|
|
+//import org.ruoyi.system.domain.bo.SysUserBo;
|
|
|
+//import org.ruoyi.system.domain.request.OrderRequest;
|
|
|
+//import org.ruoyi.system.domain.vo.PaymentOrdersVo;
|
|
|
+//import org.ruoyi.system.domain.vo.SysUserVo;
|
|
|
+//import org.ruoyi.system.service.IPaymentOrdersService;
|
|
|
+//import org.ruoyi.system.service.ISysUserService;
|
|
|
+//import org.springframework.web.bind.annotation.*;
|
|
|
+//
|
|
|
+//import java.io.ByteArrayOutputStream;
|
|
|
+//import java.io.InputStream;
|
|
|
+//import java.math.BigDecimal;
|
|
|
+//import java.math.RoundingMode;
|
|
|
+//import java.util.HashMap;
|
|
|
+//import java.util.List;
|
|
|
+//import java.util.Map;
|
|
|
+//
|
|
|
+//
|
|
|
+//@RequiredArgsConstructor
|
|
|
+//@RestController
|
|
|
+//@RequestMapping("/pay")
|
|
|
+//@Slf4j
|
|
|
+//public class PayController {
|
|
|
+//
|
|
|
+// private final PayService payService;
|
|
|
+//
|
|
|
+// private final ISysUserService userService;
|
|
|
+//
|
|
|
+// private final IPaymentOrdersService paymentOrdersService;
|
|
|
+//
|
|
|
+// private final PayConfig payConfig;
|
|
|
+//
|
|
|
+// private final WxPayService wxService;
|
|
|
+//
|
|
|
+// private final ConfigService configService;
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取支付二维码
|
|
|
+// *
|
|
|
+// * @Date 2023/7/3
|
|
|
+// * @return void
|
|
|
+// **/
|
|
|
+// @PostMapping("/payUrl")
|
|
|
+// public R<PaymentOrdersVo> payUrl(@RequestBody OrderRequest orderRequest) {
|
|
|
+// PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
|
|
|
+// PaymentOrdersVo paymentOrdersVo = new PaymentOrdersVo();
|
|
|
+// if(!Boolean.parseBoolean(getKey("enabled"))){
|
|
|
+// String payUrl = payService.getPayUrl(payOrder.getOrderNo(), orderRequest.getName(), Double.parseDouble(orderRequest.getMoney()), "192.168.1.6");
|
|
|
+// byte[] bytes = QrCodeUtil.generatePng(payUrl, 300, 300);
|
|
|
+// OssClient storage = OssFactory.instance();
|
|
|
+// UploadResult upload=storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
|
|
|
+// BeanUtil.copyProperties(payOrder,paymentOrdersVo);
|
|
|
+// paymentOrdersVo.setUrl(upload.getUrl());
|
|
|
+// }else {
|
|
|
+// WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
|
|
|
+// request.setTradeType("NATIVE");
|
|
|
+// request.setBody(orderRequest.getName());
|
|
|
+// request.setOutTradeNo(payOrder.getOrderNo());
|
|
|
+// request.setTotalFee(BaseWxPayRequest.yuanToFen(orderRequest.getMoney()));
|
|
|
+// request.setSpbillCreateIp("127.0.0.1");
|
|
|
+// request.setNotifyUrl(getKey("notifyUrl"));
|
|
|
+// request.setProductId(payOrder.getId().toString());
|
|
|
+// try {
|
|
|
+// WxPayNativeOrderResult order = wxService.createOrder(request);
|
|
|
+// byte[] bytes = QrCodeUtil.generatePng(order.getCodeUrl(), 300, 300);
|
|
|
+// OssClient storage = OssFactory.instance();
|
|
|
+// UploadResult upload = storage.upload(bytes, storage.getPath("qrCode",".png"), "image/png");
|
|
|
+// BeanUtil.copyProperties(payOrder,paymentOrdersVo);
|
|
|
+// paymentOrdersVo.setUrl(upload.getUrl());
|
|
|
+// } catch (WxPayException e) {
|
|
|
+// throw new BaseException("获取微信支付二维码发生错误:{}"+e.getMessage());
|
|
|
+// }
|
|
|
+// }
|
|
|
+// return R.ok(paymentOrdersVo);
|
|
|
// }
|
|
|
-
|
|
|
- /**
|
|
|
- * 去支付
|
|
|
- * 1、创建产品
|
|
|
- * 2、设置价格
|
|
|
- * 3、创建支付信息 得到url
|
|
|
- * @return
|
|
|
- */
|
|
|
- @PostMapping("/stripePay")
|
|
|
- public String pay(@RequestBody OrderRequest orderRequest) throws StripeException {
|
|
|
-
|
|
|
- String enabled = configService.getConfigValue("stripe", "enabled");
|
|
|
- if(!Boolean.parseBoolean(enabled)){
|
|
|
- String prompt = configService.getConfigValue("stripe", "prompt");
|
|
|
- throw new BaseException(prompt);
|
|
|
- }
|
|
|
-
|
|
|
- // 获取支付链接
|
|
|
- Stripe.apiKey = configService.getConfigValue("stripe", "key");
|
|
|
-
|
|
|
- // 获取金额字符串并解析为 double
|
|
|
- double moneyDouble = Double.parseDouble(orderRequest.getMoney());
|
|
|
-
|
|
|
- // 将金额转换为以分为单位的整数
|
|
|
- int randMoney = (int) (moneyDouble * 100);
|
|
|
-
|
|
|
- Map<String, Object> params = new HashMap<>();
|
|
|
- params.put("name", orderRequest.getName());
|
|
|
- Product product = Product.create(params);
|
|
|
-
|
|
|
- Map<String, Object> recurring = new HashMap<>();
|
|
|
- recurring.put("interval", "month");
|
|
|
- Map<String, Object> params2 = new HashMap<>();
|
|
|
- params2.put("unit_amount", randMoney);
|
|
|
- params2.put("currency", "usd");
|
|
|
- params2.put("recurring", recurring);
|
|
|
- params2.put("product", product.getId());
|
|
|
- Price price = Price.create(params2);
|
|
|
-
|
|
|
- // 创建支付订单
|
|
|
- PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
|
|
|
-
|
|
|
- //创建支付信息 得到url
|
|
|
- SessionCreateParams params3 = SessionCreateParams.builder()
|
|
|
- .setMode(SessionCreateParams.Mode.SUBSCRIPTION)
|
|
|
- .setSuccessUrl(configService.getConfigValue("stripe", "success"))
|
|
|
- .setCancelUrl(configService.getConfigValue("stripe", "cancel"))
|
|
|
- .addLineItem(
|
|
|
- SessionCreateParams.LineItem.builder()
|
|
|
- .setQuantity(1L)
|
|
|
- .setPrice(price.getId())
|
|
|
- .build()).putMetadata("orderId", payOrder.getOrderNo())
|
|
|
- .build();
|
|
|
- Session session = Session.create(params3);
|
|
|
- return session.getUrl();
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 支付回调
|
|
|
- *
|
|
|
- */
|
|
|
- @PostMapping("/stripe_events")
|
|
|
- public R<String> stripeEvent(HttpServletRequest request) {
|
|
|
- try {
|
|
|
- String endpointSecret = configService.getConfigValue("stripe", "secret");//webhook秘钥签名
|
|
|
- InputStream inputStream = request.getInputStream();
|
|
|
- ByteArrayOutputStream output = new ByteArrayOutputStream();
|
|
|
- byte[] buffer = new byte[1024*4];
|
|
|
- int n = 0;
|
|
|
- while (-1 != (n = inputStream.read(buffer))) {
|
|
|
- output.write(buffer, 0, n);
|
|
|
- }
|
|
|
- byte[] bytes = output.toByteArray();
|
|
|
- String payload = new String(bytes, "UTF-8");
|
|
|
- String sigHeader = request.getHeader("Stripe-Signature");
|
|
|
- Event event = Webhook.constructEvent(payload, sigHeader, endpointSecret);//验签,并获取事件
|
|
|
- if("checkout.session.completed".equals(event.getType())){
|
|
|
- // 解析 JSON 字符串为 JSONObject
|
|
|
- JSONObject jsonObject = JSONUtil.parseObj(event);
|
|
|
- // 获取 metadata 对象
|
|
|
- JSONObject metadata = jsonObject.getJSONObject("data")
|
|
|
- .getJSONObject("object")
|
|
|
- .getJSONObject("metadata");
|
|
|
-
|
|
|
- OrderRequest orderRequest = new OrderRequest();
|
|
|
- orderRequest.setPayType("stripe");
|
|
|
- orderRequest.setOrderNo(metadata.getStr("orderId"));
|
|
|
- paymentOrdersService.updatePayOrder(orderRequest);
|
|
|
- }
|
|
|
- } catch (Exception e) {
|
|
|
- System.out.println("stripe异步通知(webhook事件)"+e);
|
|
|
- }
|
|
|
- return R.ok();
|
|
|
- }
|
|
|
-
|
|
|
- public String getKey(String key) {
|
|
|
- return configService.getConfigValue("weixin", key);
|
|
|
- }
|
|
|
-
|
|
|
-}
|
|
|
-
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 回调通知地址
|
|
|
+// *
|
|
|
+// * @Date 2023/7/3
|
|
|
+// * @param
|
|
|
+// * @return void
|
|
|
+// **/
|
|
|
+// @GetMapping("/notifyUrl")
|
|
|
+// public String notifyUrl(PayResponse payResponse) {
|
|
|
+// // 校验签名
|
|
|
+// String mdString = "money=" + payResponse.getMoney() + "&name=" + payResponse.getName() +
|
|
|
+// "&out_trade_no=" + payResponse.getOut_trade_no() + "&pid=" + payConfig.getPid() +
|
|
|
+// "&trade_no=" + payResponse.getTrade_no() + "&trade_status=" + payResponse.getTrade_status() +
|
|
|
+// "&type=" + payResponse.getType() + payConfig.getKey();
|
|
|
+// String sign = MD5Util.GetMD5Code(mdString);
|
|
|
+// if(!sign.equals(payResponse.getSign())){
|
|
|
+// throw new BaseException("校验签名失败!");
|
|
|
+// }
|
|
|
+// double money = Double.parseDouble(payResponse.getMoney());
|
|
|
+// log.info("支付订单号{}",payResponse);
|
|
|
+// PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
|
|
|
+// paymentOrdersBo.setOrderNo(payResponse.getOut_trade_no());
|
|
|
+// List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
|
|
|
+// if (CollectionUtil.isEmpty(paymentOrdersList)){
|
|
|
+// throw new BaseException("订单不存在!");
|
|
|
+// }
|
|
|
+// // 订单状态修改为已支付
|
|
|
+// PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
|
|
|
+// paymentOrdersVo.setPaymentStatus("2");
|
|
|
+// paymentOrdersVo.setPaymentMethod(payResponse.getType());
|
|
|
+// BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
|
|
|
+// paymentOrdersService.updateByBo(paymentOrdersBo);
|
|
|
+//
|
|
|
+// SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
|
|
|
+// sysUserVo.setUserBalance(sysUserVo.getUserBalance() + money);
|
|
|
+// SysUserBo sysUserBo = new SysUserBo();
|
|
|
+// BeanUtil.copyProperties(sysUserVo,sysUserBo);
|
|
|
+// // 设置为付费用户
|
|
|
+// sysUserBo.setUserGrade("1");
|
|
|
+// userService.updateUser(sysUserBo);
|
|
|
+// return "success";
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 跳转通知地址
|
|
|
+// *
|
|
|
+// * @Date 2023/7/3
|
|
|
+// * @param
|
|
|
+// * @return void
|
|
|
+// **/
|
|
|
+// @GetMapping("/return_url")
|
|
|
+// public void returnUrl() {
|
|
|
+// log.info("return_url===========");
|
|
|
+// }
|
|
|
+//
|
|
|
+//
|
|
|
+// @PostMapping("/notify/wxOrder")
|
|
|
+// public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
|
|
|
+// WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData);
|
|
|
+// // TODO 根据自己业务场景需要构造返回对象
|
|
|
+// PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
|
|
|
+// paymentOrdersBo.setOrderNo(notifyResult.getOutTradeNo());
|
|
|
+// List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
|
|
|
+// PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
|
|
|
+// paymentOrdersVo.setPaymentStatus("2");
|
|
|
+// paymentOrdersVo.setPaymentMethod("wx");
|
|
|
+// BeanUtil.copyProperties(paymentOrdersVo,paymentOrdersBo);
|
|
|
+// paymentOrdersService.updateByBo(paymentOrdersBo);
|
|
|
+// SysUserVo sysUserVo = userService.selectUserById(paymentOrdersVo.getUserId());
|
|
|
+// sysUserVo.setUserBalance(sysUserVo.getUserBalance() + convertCentsToYuan(notifyResult.getTotalFee()));
|
|
|
+// SysUserBo sysUserBo = new SysUserBo();
|
|
|
+// BeanUtil.copyProperties(sysUserVo,sysUserBo);
|
|
|
+// // 设置为付费用户
|
|
|
+// sysUserBo.setUserGrade("1");
|
|
|
+// userService.updateUser(sysUserBo);
|
|
|
+// return WxPayNotifyResponse.success("success");
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 将分转换为元,并保留精度。
|
|
|
+// *
|
|
|
+// * @param cents 分的金额,类型为Integer
|
|
|
+// * @return 转换后的元金额,类型为double
|
|
|
+// */
|
|
|
+// public static double convertCentsToYuan(Integer cents) {
|
|
|
+// // 处理空输入
|
|
|
+// if (cents == null) {
|
|
|
+// throw new IllegalArgumentException("输入的分金额不能为空");
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 100分 = 1元
|
|
|
+// BigDecimal centsBigDecimal = new BigDecimal(cents);
|
|
|
+// BigDecimal yuan = centsBigDecimal.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
|
|
|
+// // 转换为double并返回
|
|
|
+// return yuan.doubleValue();
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 获取订单信息
|
|
|
+// *
|
|
|
+// */
|
|
|
+// @PostMapping("/orderInfo")
|
|
|
+// public R<PaymentOrdersVo> orderInfo(@RequestBody OrderRequest orderRequest) {
|
|
|
+// if(StringUtils.isEmpty(orderRequest.getOrderNo())){
|
|
|
+// throw new BaseException("订单号不能为空!");
|
|
|
+// }
|
|
|
+// PaymentOrdersBo paymentOrdersBo = new PaymentOrdersBo();
|
|
|
+// paymentOrdersBo.setOrderNo(orderRequest.getOrderNo());
|
|
|
+// List<PaymentOrdersVo> paymentOrdersList = paymentOrdersService.queryList(paymentOrdersBo);
|
|
|
+// if (CollectionUtil.isEmpty(paymentOrdersList)){
|
|
|
+// throw new BaseException("订单不存在!");
|
|
|
+// }
|
|
|
+// PaymentOrdersVo paymentOrdersVo = paymentOrdersList.get(0);
|
|
|
+// return R.ok(paymentOrdersVo);
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 获取支付链接
|
|
|
+//// static {
|
|
|
+//// Stripe.apiKey = "sk_test_51PMMj2KcfX4oNioqXkoKpScTsgmR55xQki2tg8MEZJYc0gjhYV85t2FzDasE06eqZb0sqyYhOp3UXhcGGQLWI4A9008aq8SOnb";
|
|
|
+//// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 去支付
|
|
|
+// * 1、创建产品
|
|
|
+// * 2、设置价格
|
|
|
+// * 3、创建支付信息 得到url
|
|
|
+// * @return
|
|
|
+// */
|
|
|
+// @PostMapping("/stripePay")
|
|
|
+// public String pay(@RequestBody OrderRequest orderRequest) throws StripeException {
|
|
|
+//
|
|
|
+// String enabled = configService.getConfigValue("stripe", "enabled");
|
|
|
+// if(!Boolean.parseBoolean(enabled)){
|
|
|
+// String prompt = configService.getConfigValue("stripe", "prompt");
|
|
|
+// throw new BaseException(prompt);
|
|
|
+// }
|
|
|
+//
|
|
|
+// // 获取支付链接
|
|
|
+// Stripe.apiKey = configService.getConfigValue("stripe", "key");
|
|
|
+//
|
|
|
+// // 获取金额字符串并解析为 double
|
|
|
+// double moneyDouble = Double.parseDouble(orderRequest.getMoney());
|
|
|
+//
|
|
|
+// // 将金额转换为以分为单位的整数
|
|
|
+// int randMoney = (int) (moneyDouble * 100);
|
|
|
+//
|
|
|
+// Map<String, Object> params = new HashMap<>();
|
|
|
+// params.put("name", orderRequest.getName());
|
|
|
+// Product product = Product.create(params);
|
|
|
+//
|
|
|
+// Map<String, Object> recurring = new HashMap<>();
|
|
|
+// recurring.put("interval", "month");
|
|
|
+// Map<String, Object> params2 = new HashMap<>();
|
|
|
+// params2.put("unit_amount", randMoney);
|
|
|
+// params2.put("currency", "usd");
|
|
|
+// params2.put("recurring", recurring);
|
|
|
+// params2.put("product", product.getId());
|
|
|
+// Price price = Price.create(params2);
|
|
|
+//
|
|
|
+// // 创建支付订单
|
|
|
+// PaymentOrdersBo payOrder = paymentOrdersService.createPayOrder(orderRequest);
|
|
|
+//
|
|
|
+// //创建支付信息 得到url
|
|
|
+// SessionCreateParams params3 = SessionCreateParams.builder()
|
|
|
+// .setMode(SessionCreateParams.Mode.SUBSCRIPTION)
|
|
|
+// .setSuccessUrl(configService.getConfigValue("stripe", "success"))
|
|
|
+// .setCancelUrl(configService.getConfigValue("stripe", "cancel"))
|
|
|
+// .addLineItem(
|
|
|
+// SessionCreateParams.LineItem.builder()
|
|
|
+// .setQuantity(1L)
|
|
|
+// .setPrice(price.getId())
|
|
|
+// .build()).putMetadata("orderId", payOrder.getOrderNo())
|
|
|
+// .build();
|
|
|
+// Session session = Session.create(params3);
|
|
|
+// return session.getUrl();
|
|
|
+// }
|
|
|
+//
|
|
|
+// /**
|
|
|
+// * 支付回调
|
|
|
+// *
|
|
|
+// */
|
|
|
+// @PostMapping("/stripe_events")
|
|
|
+// public R<String> stripeEvent(HttpServletRequest request) {
|
|
|
+// try {
|
|
|
+// String endpointSecret = configService.getConfigValue("stripe", "secret");//webhook秘钥签名
|
|
|
+// InputStream inputStream = request.getInputStream();
|
|
|
+// ByteArrayOutputStream output = new ByteArrayOutputStream();
|
|
|
+// byte[] buffer = new byte[1024*4];
|
|
|
+// int n = 0;
|
|
|
+// while (-1 != (n = inputStream.read(buffer))) {
|
|
|
+// output.write(buffer, 0, n);
|
|
|
+// }
|
|
|
+// byte[] bytes = output.toByteArray();
|
|
|
+// String payload = new String(bytes, "UTF-8");
|
|
|
+// String sigHeader = request.getHeader("Stripe-Signature");
|
|
|
+// Event event = Webhook.constructEvent(payload, sigHeader, endpointSecret);//验签,并获取事件
|
|
|
+// if("checkout.session.completed".equals(event.getType())){
|
|
|
+// // 解析 JSON 字符串为 JSONObject
|
|
|
+// JSONObject jsonObject = JSONUtil.parseObj(event);
|
|
|
+// // 获取 metadata 对象
|
|
|
+// JSONObject metadata = jsonObject.getJSONObject("data")
|
|
|
+// .getJSONObject("object")
|
|
|
+// .getJSONObject("metadata");
|
|
|
+//
|
|
|
+// OrderRequest orderRequest = new OrderRequest();
|
|
|
+// orderRequest.setPayType("stripe");
|
|
|
+// orderRequest.setOrderNo(metadata.getStr("orderId"));
|
|
|
+// paymentOrdersService.updatePayOrder(orderRequest);
|
|
|
+// }
|
|
|
+// } catch (Exception e) {
|
|
|
+// System.out.println("stripe异步通知(webhook事件)"+e);
|
|
|
+// }
|
|
|
+// return R.ok();
|
|
|
+// }
|
|
|
+//
|
|
|
+// public String getKey(String key) {
|
|
|
+// return configService.getConfigValue("weixin", key);
|
|
|
+// }
|
|
|
+//
|
|
|
+//}
|
|
|
+//
|