| | |
| | | package com.ruoyi.order.service.impl; |
| | | |
| | | import static com.ruoyi.order.util.tencent.WXPay.requestRefundService; |
| | | import static com.ruoyi.order.util.tencent.WXPay.requestUnifiedorderService; |
| | | |
| | | import com.alipay.api.AlipayClient; |
| | | import com.alipay.api.DefaultAlipayClient; |
| | | import com.alipay.api.request.AlipayTradeRefundRequest; |
| | | import com.alipay.api.response.AlipayTradeRefundResponse; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.common.core.domain.R; |
| | | import com.ruoyi.common.core.utils.StringUtils; |
| | | import com.ruoyi.order.domain.pojo.Paylog; |
| | | import com.ruoyi.order.mapper.PaylogMapper; |
| | | import com.ruoyi.order.service.IPaylogService; |
| | | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
| | | import com.ruoyi.order.util.SinataUtil; |
| | | import com.ruoyi.order.util.alipay.config.AlipayConfig; |
| | | import com.ruoyi.order.util.alipay.util.PayDemoActivity; |
| | |
| | | import com.ruoyi.order.util.tencent.common.XMLParser; |
| | | import com.ruoyi.order.util.tencent.protocol.AppPayReqData; |
| | | import com.ruoyi.order.util.tencent.protocol.UnifiedorderReqData; |
| | | import org.springframework.stereotype.Service; |
| | | import org.springframework.web.bind.annotation.RequestMapping; |
| | | import org.springframework.web.bind.annotation.ResponseBody; |
| | | |
| | | import com.ruoyi.system.api.domain.dto.RefundDTO; |
| | | import java.io.IOException; |
| | | import java.io.PrintWriter; |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | import java.util.ArrayList; |
| | | import java.util.HashMap; |
| | | import java.util.Iterator; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.Objects; |
| | | import java.util.Optional; |
| | | import java.util.Set; |
| | | import java.util.function.Function; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | import java.util.stream.Collectors; |
| | | import javax.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.io.IOException; |
| | | import java.io.PrintWriter; |
| | | import java.time.LocalDateTime; |
| | | import java.util.HashMap; |
| | | import java.util.Iterator; |
| | | import java.util.Map; |
| | | import java.util.regex.Matcher; |
| | | import java.util.regex.Pattern; |
| | | |
| | | import static com.ruoyi.order.util.tencent.WXPay.requestRefundService; |
| | | import static com.ruoyi.order.util.tencent.WXPay.requestUnifiedorderService; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | /** |
| | | * <p> |
| | |
| | | private IPaylogService iPaylogService; |
| | | |
| | | @Override |
| | | public R<Map<String, Object>> getPayInfo(Integer uid, Integer type, String subject, String body, String orderID, |
| | | HttpServletRequest request) { |
| | | public R<Map<String, Object>> getPayInfo(Integer uid, Integer type, String subject, String body, String orderNO,String openId, HttpServletRequest request) { |
| | | Double price = 0.0; |
| | | |
| | | try { |
| | | if(judgeContainsStr(orderID)){ |
| | | if(judgeContainsStr(orderNO)){ |
| | | price= Double.valueOf(1); |
| | | body = "商品支付"; |
| | | subject = "商品支付"; |
| | | body = body; |
| | | subject = subject; |
| | | Map<String, Object> map = new HashMap<String, Object>(); |
| | | if (type == 1) { |
| | | // 支付宝预下单 |
| | | return paylogServiceImpl.alipay("1", subject, body, price, request); |
| | | return paylogServiceImpl.alipay(orderNO, subject, body, price, request); |
| | | } else { |
| | | // 微信预下单 |
| | | return paylogServiceImpl.wxpay(1, "1", body, price, request); |
| | | return paylogServiceImpl.wxpay(2, orderNO, body,openId, price, request); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | * @param request |
| | | * @return |
| | | */ |
| | | public static R<Map<String, Object>> wxpay(Integer apptype, String outTradeNo, String body, Double price, |
| | | public static R<Map<String, Object>> wxpay(Integer apptype, String outTradeNo, String body,String openId, Double price, |
| | | HttpServletRequest request) { |
| | | // 获取预支付接口返回参数 |
| | | Map<String, Object> map = new HashMap<String, Object>(); |
| | | Map<String, Object> appPayMap = new HashMap<String, Object>(); |
| | | try { |
| | | // 构建接口请求参数 |
| | | UnifiedorderReqData unifiedorderReqData = new UnifiedorderReqData(apptype, outTradeNo, body, price, |
| | | Configure.wx_notify_url); |
| | | UnifiedorderReqData unifiedorderReqData = new UnifiedorderReqData(outTradeNo, body, price, Configure.wx_notify_url, |
| | | "JSAPI", openId); |
| | | // 请求接口获取返回接口 |
| | | String result = requestUnifiedorderService(apptype, unifiedorderReqData); |
| | | String result = requestUnifiedorderService(2, unifiedorderReqData); |
| | | System.out.println(result); |
| | | System.out.println("WxpayController.createOrder__result:\n" + result); |
| | | // 获取预支付接口返回参数 |
| | |
| | | (String) map.get("prepay_id"), unifiedorderReqData.getNonce_str()); |
| | | |
| | | // 对获取预支付返回接口参数进行封装(生成支付订单接口数据) |
| | | appPayMap.put("appid", appPay.getAppid());// 公众账号ID |
| | | appPayMap.put("appid", appPay.getAppid());// 小程序ID |
| | | appPayMap.put("nonceStr", appPay.getNoncestr());// 随机字符串(32位) |
| | | appPayMap.put("package", appPay.get_package());// 扩展字段(暂填写固定值Sign=WXPay) |
| | | appPayMap.put("partnerId", appPay.getPartnerid());// 商户号 |
| | |
| | | return m.matches(); |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, Object> refund(List<RefundDTO> refundDTOS) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | Set<String> orderNoList = refundDTOS.stream().map(RefundDTO::getOrderNo) |
| | | .collect(Collectors.toSet()); |
| | | if (StringUtils.isNotEmpty(orderNoList)) { |
| | | Map<String, Paylog> paylogMap = iPaylogService.lambdaQuery() |
| | | .in(Paylog::getOutTradeNo, orderNoList).eq(Paylog::getState, 1).list().stream() |
| | | .collect(Collectors.toMap(Paylog::getOutTradeNo, Function.identity())); |
| | | List<Paylog> updList = new ArrayList<>(); |
| | | for (RefundDTO refundDTO : refundDTOS) { |
| | | String orderNo = refundDTO.getOrderNo(); |
| | | BigDecimal amount = refundDTO.getAmount(); |
| | | Paylog paylog = paylogMap.get(orderNo); |
| | | Optional.of(paylog).ifPresent(pay -> { |
| | | Boolean res = handleRefund(pay, amount, orderNo); |
| | | map.put(orderNo, res); |
| | | if (res) { |
| | | pay.setState(3); |
| | | updList.add(pay); |
| | | } |
| | | }); |
| | | } |
| | | iPaylogService.updateBatchById(updList); |
| | | } |
| | | return map; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | Map<String, Object> map = new HashMap<>(); |
| | | map.put("1", true); |
| | | map.put("2", false); |
| | | map.put("3", true); |
| | | map.put("4", false); |
| | | map.put("5", true); |
| | | List<String> collect = map.entrySet().stream().map(entry -> { |
| | | if (!(boolean) entry.getValue()) { |
| | | return entry.getKey(); |
| | | } |
| | | return null; |
| | | }).filter(Objects::nonNull).collect(Collectors.toList()); |
| | | System.out.println(collect); |
| | | } |
| | | |
| | | private Boolean handleRefund(Paylog paylog, BigDecimal amount, |
| | | String orderNo) { |
| | | boolean res = false; |
| | | if (StringUtils.isNotNull(paylog)) { |
| | | if (paylog.getPayType() == 1) { |
| | | res = paylogServiceImpl.refundForAlipay(paylog.getOutTradeNo(), |
| | | paylog.getTradeNo(), amount.doubleValue()); |
| | | } |
| | | if (paylog.getPayType() == 2) { |
| | | String refundMoney = SinataUtil.doubleRetainTwo( |
| | | amount.doubleValue() * 100d); |
| | | Integer refundFee = Integer.parseInt( |
| | | refundMoney.substring(0, refundMoney.length() - 3)); |
| | | String money = SinataUtil.doubleRetainTwo(paylog.getPayMoney() * 100d); |
| | | Integer totalFee = Integer.parseInt( |
| | | money.substring(0, money.length() - 3)); |
| | | res = paylogServiceImpl.refundForWxpay(2, paylog.getTradeNo(), |
| | | paylog.getOutTradeNo(), orderNo, totalFee, |
| | | refundFee, "4"); |
| | | } |
| | | } |
| | | return res; |
| | | } |
| | | } |