ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -128,6 +128,12 @@ public void chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) { log.error("远程启动失败后退款通知失败:" + throwable.getMessage()); } @Override public void shoppingOrderWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) { log.error("购物订单退款回调通知失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -163,4 +163,16 @@ @RequestParam("out_trade_no") String refund_id, @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time); /** * 管理后台取消购物订单后退款回调 * @param out_refund_no * @param refund_id * @param tradeState * @param success_time */ @PostMapping("/t-shopping-order/shoppingOrderWxRefund") void shoppingOrderWxRefund(@RequestParam("out_trade_no") String out_refund_no, @RequestParam("out_trade_no") String refund_id, @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TOrderInvoice.java
@@ -112,6 +112,7 @@ @ApiModelProperty(value = "添加时间") @TableField("create_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @ApiModelProperty(value = "开票时间") ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AlipayOpenAppQrcodeCreate.java
New file @@ -0,0 +1,59 @@ package com.ruoyi.account.controller; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.AlipayConfig; import com.alipay.api.response.AlipayOpenAppQrcodeCreateResponse; import com.alipay.api.request.AlipayOpenAppQrcodeCreateRequest; import com.alipay.api.domain.AlipayOpenAppQrcodeCreateModel; import com.alipay.api.FileItem; import java.util.Base64; import java.util.ArrayList; import java.util.List; /** * 生成支付宝小程序二维码 */ public class AlipayOpenAppQrcodeCreate { public static void main(String[] args) throws AlipayApiException { // 初始化SDK AlipayClient alipayClient = new DefaultAlipayClient(getAlipayConfig()); // 构造请求参数以调用接口 AlipayOpenAppQrcodeCreateRequest request = new AlipayOpenAppQrcodeCreateRequest(); AlipayOpenAppQrcodeCreateModel model = new AlipayOpenAppQrcodeCreateModel(); // 设置跳转小程序的页面路径 model.setUrlParam("pages/index/index"); // 设置小程序的启动参数 model.setQueryParam("x=1"); // 设置码描述 model.setDescribe("二维码描述"); request.setBizModel(model); AlipayOpenAppQrcodeCreateResponse response = alipayClient.execute(request); System.out.println(response.getBody()); String qrCodeUrl = response.getQrCodeUrl(); System.err.println(qrCodeUrl); if (response.isSuccess()) { System.out.println("调用成功"); } else { System.out.println("调用失败"); } } private static AlipayConfig getAlipayConfig() { String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCxWgLykkSXsj6zz5kVohKb6yAaOK8d4wnbWLrabBQSHZg+UZj9HknzQvgrSdfiMd6Dlv70OYQBRynWb2OSGaIKpWLbDKQDT+hDBcbZQ3nVTKExC7w8t/5mUc0CH4DkMsMMDcDW2synh9Lv4fmw7eNnRgd6g6csGIZyOUgt34eMcmCUBP58bEkYhuPm9rLBMw7fCRl9zZbKNAiE5j9FNL1/oAWhET6BCHRqKpiDHvKLQDZdXUwI+sA/JSolNlU+x052YBPGxjH9zqD8mpRLZRTPCb5pV5wCG+EqQkiCauyhAJSCVo2Dx3uXe4nP/6UDlQmgxyiZ+uuMtPsDFjKd7EIXAgMBAAECggEBAKXBfufAFSPCkB/2cxlo9QOM6eAYAnNocxnzABCM2uVji5sTIG3SFUOq3891oLPj8BgE1BzmdJ3NKSklymYOVwikMpSQZ+pAkM+zYnpFOmVEzZLNaQ1G2ho/cd/+GbUuTGXDpOwqawRZSaiyB3B5pgQry2mSCniII4A2UWOuez2jR7R6kXh2UL4DGDPYjDj2Gx3WfYEeuarjdbaeKU6ngdArkYqNtsbpmaR9aOUhNyo6ltOWh7pKjdjApAEtoEqqYjr1uQ4E0wfF4noiU1hR7gTG8FjvWHy1/piPWM4CihUbhJemC5xKuVKltI0zMtR+uAx609sz6gOYlZkrYAXL0uECgYEA8Gqq/Jc1w6I5FTGImnoadKr1VWXBFKdU00p6EMX6FaY9uD41+YtaOtfBeNyAUZ20UlP+t9EsUbHunaMVb64N2wYMbSwy9ibNAse/KxT3XCT659lsyFyVPtbGxALXLu6sNH7VIljJv7KRm6slBqLKSdac2qZX/LwVvjIGjNz7p8MCgYEAvNjhFEn9KE8eOCK+qGEITVoR8k26lFGG0XsjRoinkgAUeUL2R6HFscOqUT31DvvQ7lNfopM+Sksmi/c64wXjcT49iHZwqCs6FNYHvY9HS0StVckLGliUg0U7FNWX0dwZyehpYamV4Eh9O/yZN+p07zAmDohTYmdsMWyqoieJqx0CgYEA6iiKZ0CDbgrXnCvFh+e7Uryb/NQBjbM4rB6S6zlYTbO/025MNcQjWsJ/vs7M8DEwyyriIXjKuLsb1E9d9otJFXU7ry1oaVT7QmT4beaa0hV2h1C+YhvChRS9PXYizaRK90o9HpnpzhsHNN4pTuBJNEeiOFfhxNgQOVISDSrCtO8CgYBMCnRPLB/A3GLJrcvhlvi11N/HFl9bm5xSu2eP3jTDSD72OO1cGJq3IpdxESac+u69GFs45ls9pRcHYuyWP2e+0JYMXcytGoLPowMI5CmL+EJneYV7/VEHrpfEouD4As1rjKbqSVPtNKMgxWyYpFKjgVrBnUkeJZDeMehfVNZNTQKBgAfhnhQgDk61C3KmgzKJ0hCogjTUL6AdjgC5bfV1AsV9yesh0q1bgHDrlMkS2aKYSF9wNeKYCYl2/ZYhilom4Mst/uxAl/8aLwDM9Cg29KfmMakst521IXv2Jrk2MiXXJMV5wowE8kbdb4Hkzsn1km2tBnng7Jyyek2HH737Jd1R"; String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAh+tCVKqUmlHDL8Ki1TUJtzE5IKV1irJuoHWZTvndJCKJJ8bdWxL9mu5xsy8KkfrnS6wJIKBMLTxMoYQHG7l2Gt07YyUCYHS5+yvbHtTkyFFy2KRPeUEWXz1Tm4juvInDvvr+n7v9ETepToGhC+UDlQcBvuSppw8N+463E+1GRrC4APwXYGLzaIvYvDHcQAULkWhXsjzxJSmeSi12kqWKlgnVJC1y0FT8xQtvhwShfaIqKwzErn9S2z7JjdXboJMUYQHoqF1A4SmWY8c0qawqvx2hGP36W3RDQ4cczzFwUHS1Cylhsbgh1COc4OdANCX4Np2NUzaRDCNzN0WVFKtK+QIDAQAB"; AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.setServerUrl("https://openapi.alipay.com/gateway.do"); alipayConfig.setAppId("2021004173610331"); alipayConfig.setPrivateKey(privateKey); alipayConfig.setFormat("json"); alipayConfig.setAlipayPublicKey(alipayPublicKey); alipayConfig.setCharset("UTF-8"); alipayConfig.setSignType("RSA2"); return alipayConfig; } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -349,7 +349,6 @@ Page<TAppUser> page = appUserService.lambdaQuery() .like(userListQueryDto.getUserPhone() != null && !"".equals(userListQueryDto.getUserPhone()), TAppUser::getPhone, userListQueryDto.getUserPhone()) .eq(userListQueryDto.getCityCode() != null && !"".equals(userListQueryDto.getCityCode()), TAppUser::getCityCode, userListQueryDto.getCityCode()) .eq(userListQueryDto.getProvinceCode() != null && !"".equals(userListQueryDto.getProvinceCode()), TAppUser::getProvinceCode, userListQueryDto.getProvinceCode()) .in(!userIds.isEmpty(),TAppUser::getId,userIds) .eq(TAppUser::getStatus,1) .page(Page.of(userListQueryDto.getPageCurr(), userListQueryDto.getPageSize())); ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/WxLoginController.java
@@ -102,11 +102,9 @@ public static MultipartFile convertInputStreamToMultipartFile(InputStream inputStream, String fileName, String contentType) throws IOException { return new MockMultipartFile(fileName, fileName, contentType, inputStream); } /** * 获取微信小程序二维码 */ public void getQRCode() { @ApiOperation(value = "获取微信小程序二维码",tags = {"获取微信小程序二维码"}) @PostMapping("/getQRCode") public AjaxResult getQRCode() { InputStream inputStream = null; OutputStream outputStream = null; WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig); @@ -137,8 +135,7 @@ MultipartFile multipartFile = convertInputStreamToMultipartFile(inputStream, finalFileName, "image/jpeg"); String name = FileUploadUtils.upload(localFilePath, multipartFile); System.err.println(name); // 保存文件到本地 // String s = ossService.uploadFile2OSS(inputStream, objectName); return AjaxResult.success(name); } catch (Exception e) { System.err.println("调用小程序生成微信永久小程序码URL接口异常" + e); } finally { @@ -157,5 +154,7 @@ } } } return AjaxResult.success(); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/filter/AuthFilter.java
@@ -44,6 +44,11 @@ @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; @@ -83,9 +88,13 @@ } filterChain.doFilter(request, response); } @Override public void destroy() { } private void unauthorizedResponse(HttpServletResponse response, String msg) { response.setStatus(HttpStatus.OK.value()); response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_UTF8_VALUE); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TOrderInvoiceController.java
@@ -75,6 +75,7 @@ @RequestParam("invoiceUrl") String invoiceUrl){ TOrderInvoice orderInvoice = orderInvoiceService.getById(id); orderInvoice.setInvoiceUrl(invoiceUrl); orderInvoice.setStatus(3); orderInvoiceService.updateById(orderInvoice); // 发送邮箱 // 收件人电子邮箱,TODO 换成自己的收件箱 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TShoppingOrderController.java
@@ -1,6 +1,7 @@ package com.ruoyi.order.controller; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDateTime; @@ -15,10 +16,13 @@ import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.model.TExchangeOrder; import com.ruoyi.order.api.model.TShoppingOrder; import com.ruoyi.order.api.model.TShoppingOrderRefund; import com.ruoyi.order.api.query.ShoppingOrderQuery; import com.ruoyi.order.dto.*; import com.ruoyi.order.service.TShoppingOrderRefundService; import com.ruoyi.order.service.TShoppingOrderService; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TGoods; @@ -40,6 +44,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.time.format.DateTimeFormatter; import java.util.*; /** @@ -73,7 +78,31 @@ private AppCouponClient appCouponClient; @Resource private SysUserClient sysUserClient; @Resource private TShoppingOrderRefundService shoppingOrderRefundService; /** * 远程管理后台取消订单后退款回调 */ @ResponseBody @PostMapping(value = "/shoppingOrderWxRefund") public void shoppingOrderWxRefund(@RequestParam("out_trade_no") String out_refund_no, @RequestParam("out_trade_no") String refund_id, @RequestParam("out_trade_no") String tradeState, @RequestParam("out_trade_no") String success_time){ if("SUCCESS".equals(tradeState)){ TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, out_refund_no)); one.setRefundSerialNumber(refund_id); one.setRefundStatus(2); one.setRefundTime(LocalDateTime.parse(success_time, DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE"))); shoppingOrderRefundService.updateById(one); TShoppingOrder byId = shoppingOrderService.getById(one.getShoppingOrderId()); byId.setStatus(4); shoppingOrderService.updateById(byId); if (byId.getAppCouponId() != null) { appCouponClient.refund(byId.getAppCouponId().toString()); } } } @PostMapping("/getShoppingOrderList") @ApiOperation(value = "列表查询", tags = {"管理后台-购物订单"}) @@ -144,7 +173,7 @@ shoppingOrderService.removeBatchByIds(Arrays.asList(ids.split(","))); return AjaxResult.success(); } @GetMapping("/cancelShoppingOrder") @ApiOperation(value = "取消订单", tags = {"管理后台-购物订单"}) public AjaxResult cancelShoppingOrder(String id) { @@ -154,6 +183,21 @@ byId.setCancellationId(userid); byId.setCancellationTime(LocalDateTime.now()); byId.setStatus(4); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); TShoppingOrderRefund tShoppingOrderRefund = new TShoppingOrderRefund(); tShoppingOrderRefund.setPayTime(byId.getPayTime()); tShoppingOrderRefund.setPayCode(byId.getSerialNumber()); tShoppingOrderRefund.setPayAmount(byId.getPaymentAmount()); tShoppingOrderRefund.setPayType(1); tShoppingOrderRefund.setShoppingOrderId(byId.getId()); tShoppingOrderRefund.setRefundAmount(byId.getPaymentAmount()); tShoppingOrderRefund.setRefundStatus(1); tShoppingOrderRefund.setCode("GWF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue()); tShoppingOrderRefund.setRefundTitle("后台取消订单"); tShoppingOrderRefund.setRefundContent("后台取消订单"); tShoppingOrderRefund.setRefundReason("后台取消订单"); tShoppingOrderRefund.setRefundRemark("全额退款"); tShoppingOrderRefund.setRefundTotalAmount(byId.getPaymentAmount()); switch (byId.getPaymentType()) { case 1: // 微信 @@ -163,8 +207,6 @@ wxPaymentRefundModel.setOut_refund_no(OrderCodeUtil.getOrderCode("GWTK")); wxPaymentRefundModel.setReason("后台购物订单退款"); wxPaymentRefundModel.setNotify_url("/payment/wx/refund/notify"); // todo 部署到线上之后写回调地址 String string = byId.getPaymentAmount().multiply(new BigDecimal("100")).toString(); if (string.contains(".")) { string = string.substring(0, string.indexOf(".")); @@ -175,28 +217,37 @@ refundAmount.setCurrency("CNY"); refundAmount.setRefund(i); wxPaymentRefundModel.setAmount(refundAmount); wxPaymentClient.refundOrderR(wxPaymentRefundModel); R<String> stringR = wxPaymentClient.refundOrderR(wxPaymentRefundModel); if(200 == stringR.getCode()){ shoppingOrderRefundService.save(tShoppingOrderRefund); } break; case 2: // 支付宝 RefundReq refundReq = new RefundReq(); refundReq.setOutTradeNo(byId.getSerialNumber()); String gw = OrderCodeUtil.getOrderCode("GWTK"); String gw = OrderCodeUtil.getOrderCode("GWF"); refundReq.setOutRequestNo(gw); refundReq.setRefundAmount(byId.getPaymentAmount().toString()); refundReq.setRefundReason("后台购物订单退款"); RefundResp data = aliPaymentClient.refund(refundReq).getData(); if (data != null) { // 退款成功 回退优惠券 byId.setStatus(4); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE"); TShoppingOrderRefund one = shoppingOrderRefundService.getOne(new LambdaQueryWrapper<TShoppingOrderRefund>().eq(TShoppingOrderRefund::getRefundCode, data.getOutTradeNo())); one.setRefundSerialNumber(data.getTradeNo()); one.setRefundStatus(2); one.setRefundTime(LocalDateTime.parse(sdf1.format(new Date()), DateTimeFormatter.ofPattern("yyyy-MM-DDTHH:mm:ss+TIMEZONE"))); shoppingOrderRefundService.updateById(one); if (byId.getAppCouponId() != null) { // 退款成功 回退优惠券 appCouponClient.refund(byId.getAppCouponId().toString()); byId.setRefundCode(gw); byId.setRefundAmount(byId.getPaymentAmount()); byId.setRefundStatus(2); byId.setRefundSerialNumber(data.getTradeNo()); shoppingOrderService.updateById(byId); } byId.setRefundCode(gw); byId.setRefundAmount(byId.getPaymentAmount()); byId.setRefundStatus(2); byId.setRefundSerialNumber(data.getTradeNo()); shoppingOrderService.updateById(byId); } break; } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -285,7 +285,7 @@ e.setElectrovalence(orderInvoiceDetailList.stream().filter(t->t.getElectrovalence()!=null).map(TOrderInvoiceDetail::getElectrovalence).reduce(BigDecimal::add).get()); e.setServiceCharge(orderInvoiceDetailList.stream().filter(t->t.getServiceCharge()!=null).map(TOrderInvoiceDetail::getServiceCharge).reduce(BigDecimal::add).get()); if (e.getBillingUserId()!=null){ e.setUserPhone(finalTAppUsers.stream().filter(t->t.getId()!=null).filter(m->m.getId().equals(Long.parseLong(e.getBillingUserId().toString()))).findFirst().get().getPhone()); e.setUserPhone(finalTAppUsers.stream().filter(t->t.getId()!=null).filter(m->m.getId().equals(Long.parseLong(e.getAppUserId().toString()))).findFirst().get().getPhone()); } }); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java
@@ -1,6 +1,7 @@ package com.ruoyi.other.controller; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.common.core.enums.status.AdvertisingStatusEnum; import com.ruoyi.common.core.web.domain.AjaxResult; @@ -64,7 +65,16 @@ @ApiOperation(tags = {"管理后台-广告管理"},value = "广告修改") @Log(title = "【广告管理】修改广告", businessType = BusinessType.UPDATE,operatorType = OperatorType.MANAGE) public AjaxResult updateVip(@RequestBody TAdvertising dto) { advertisingService.updateById(dto); if (dto.getJumpType() == 2){ // 清空跳转地址 advertisingService.updateById(dto); LambdaUpdateWrapper<TAdvertising> tAdvertisingLambdaUpdateWrapper = new LambdaUpdateWrapper<>(); tAdvertisingLambdaUpdateWrapper.eq(TAdvertising::getId,dto.getId()) .set(TAdvertising::getJumpUrl,null); advertisingService.update(tAdvertisingLambdaUpdateWrapper); }else{ advertisingService.updateById(dto); } return AjaxResult.success(); } @GetMapping("/getInfo") ruoyi-service/ruoyi-payment/src/main/java/com/ruoyi/payment/controller/WxPayController.java
@@ -196,6 +196,11 @@ chargingOrderClient.chargingOrderStartupFailureWxRefund(out_refund_no, refund_id, tradeState, success_time); System.err.println("----充电启动失败退款回调通知"); break; //充电订单 case "GWF": chargingOrderClient.shoppingOrderWxRefund(out_refund_no, refund_id, tradeState, success_time); System.err.println("----管理后台取消购物订单退款回调通知"); break; } WxRefundNotifyResp resp = new WxRefundNotifyResp();