From 3dae7a96124c5d610917b833612566e28c18f2c8 Mon Sep 17 00:00:00 2001 From: litao Date: Wed, 23 Aug 2023 15:06:06 +0800 Subject: [PATCH] =?UTF-8?q?1.=E5=BE=AE=E4=BF=A1=E7=94=A8=E6=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=87=BA=E6=8E=A5=E5=8F=A3=202.=E5=85=B3=E9=97=AD=E8=AE=A2?= =?UTF-8?q?=E5=8D=95=E5=92=8C=E6=9F=A5=E8=AF=A2=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AppEbLoginController.java | 10 +++ .../controller/WeChatUserController.java | 27 ++++++ .../modules/weixin/excel/WeChatUserExcel.java | 44 ++++++++++ .../weixin/service/IWeChatUserService.java | 4 + .../service/impl/WeChatUserServiceImpl.java | 26 +++++- .../modules/weixin/utils/WxPayUtils.java | 86 ++++++++++++++++++- 6 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/springblade/modules/weixin/excel/WeChatUserExcel.java diff --git a/src/main/java/org/springblade/modules/weixin/controller/AppEbLoginController.java b/src/main/java/org/springblade/modules/weixin/controller/AppEbLoginController.java index b3be086..4086459 100644 --- a/src/main/java/org/springblade/modules/weixin/controller/AppEbLoginController.java +++ b/src/main/java/org/springblade/modules/weixin/controller/AppEbLoginController.java @@ -109,7 +109,17 @@ public class AppEbLoginController { Double totalPrice = order.getTotalPrice() * 100; int total = totalPrice.intValue(); +// int total = 1; return R.data(WxPayUtils.getPayParam(openId, outTradeNo, total)); } + @PostMapping("/cloceOrder") + public R cloceOrder(@RequestParam String outTradeNo) { + return R.data(WxPayUtils.cloceOrderJSApiV3(outTradeNo)); + } + + @GetMapping("/getOrder") + public R getOrder(String outTradeNo) { + return R.data(WxPayUtils.getOrderJSApiV3(outTradeNo)); + } } diff --git a/src/main/java/org/springblade/modules/weixin/controller/WeChatUserController.java b/src/main/java/org/springblade/modules/weixin/controller/WeChatUserController.java index 1a3518a..8d404be 100644 --- a/src/main/java/org/springblade/modules/weixin/controller/WeChatUserController.java +++ b/src/main/java/org/springblade/modules/weixin/controller/WeChatUserController.java @@ -1,17 +1,29 @@ package org.springblade.modules.weixin.controller; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; +import org.springblade.common.enums.OrderStatusEnum; +import org.springblade.core.excel.util.ExcelUtil; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.mp.support.Condition; import org.springblade.core.mp.support.Query; import org.springblade.core.tool.api.R; +import org.springblade.core.tool.utils.BeanUtil; +import org.springblade.core.tool.utils.DateUtil; import org.springblade.core.tool.utils.Func; +import org.springblade.modules.desk.entity.Order; +import org.springblade.modules.desk.vo.OrderExcelVO; import org.springblade.modules.weixin.entity.WeChatUser; +import org.springblade.modules.weixin.excel.WeChatUserExcel; import org.springblade.modules.weixin.service.IWeChatUserService; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import java.util.ArrayList; +import java.util.List; + @RestController @AllArgsConstructor @RequestMapping("/weChatUser") @@ -32,6 +44,21 @@ public class WeChatUserController { return R.data(weChatUserService.buyCount(Condition.getPage(query), weChatUser)); } + /** + * 导出 + */ + @GetMapping("/export") + public void export(HttpServletResponse response, WeChatUser weChatUser) { + List weChatUsers = weChatUserService.export(weChatUser); + + List vos = new ArrayList<>(); + weChatUsers.forEach(item -> { + WeChatUserExcel vo = BeanUtil.copy(item, WeChatUserExcel.class); + vos.add(vo); + }); + ExcelUtil.export(response, "微信用户" + DateUtil.time(), "微信用户表", vos, WeChatUserExcel.class); + } + @PostMapping("/save") public R save(@RequestBody WeChatUser weChatUser) { long count = weChatUserService.count(Wrappers.lambdaQuery().eq(WeChatUser::getOpenId, weChatUser.getOpenId())); diff --git a/src/main/java/org/springblade/modules/weixin/excel/WeChatUserExcel.java b/src/main/java/org/springblade/modules/weixin/excel/WeChatUserExcel.java new file mode 100644 index 0000000..56802a2 --- /dev/null +++ b/src/main/java/org/springblade/modules/weixin/excel/WeChatUserExcel.java @@ -0,0 +1,44 @@ +package org.springblade.modules.weixin.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.write.style.ColumnWidth; +import com.alibaba.excel.annotation.write.style.ContentRowHeight; +import com.alibaba.excel.annotation.write.style.HeadRowHeight; +import lombok.Data; + +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class WeChatUserExcel { + + /** + * 微信用户唯一标识 + */ + @ExcelProperty("openId") + private String openId; + + /** + * 昵称 + */ + @ExcelProperty("昵称") + private String username; + + /** + * 手机 + */ + @ExcelProperty("手机") + private String phone; + + /** + * 头像 + */ + @ExcelProperty("头像") + private String avatar; + + /** + * 购买次数 + */ + @ExcelProperty("购买次数") + private Integer count; +} diff --git a/src/main/java/org/springblade/modules/weixin/service/IWeChatUserService.java b/src/main/java/org/springblade/modules/weixin/service/IWeChatUserService.java index 6741a5b..cb783ef 100644 --- a/src/main/java/org/springblade/modules/weixin/service/IWeChatUserService.java +++ b/src/main/java/org/springblade/modules/weixin/service/IWeChatUserService.java @@ -20,6 +20,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import org.springblade.core.mp.base.BaseService; import org.springblade.modules.weixin.entity.WeChatUser; +import java.util.List; + /** * 服务类 * @@ -28,4 +30,6 @@ import org.springblade.modules.weixin.entity.WeChatUser; public interface IWeChatUserService extends BaseService { IPage buyCount(IPage page, WeChatUser weChatUser); + + List export(WeChatUser weChatUser); } diff --git a/src/main/java/org/springblade/modules/weixin/service/impl/WeChatUserServiceImpl.java b/src/main/java/org/springblade/modules/weixin/service/impl/WeChatUserServiceImpl.java index 545e26b..f857adb 100644 --- a/src/main/java/org/springblade/modules/weixin/service/impl/WeChatUserServiceImpl.java +++ b/src/main/java/org/springblade/modules/weixin/service/impl/WeChatUserServiceImpl.java @@ -16,8 +16,10 @@ */ package org.springblade.modules.weixin.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.AllArgsConstructor; import org.springblade.core.mp.base.BaseServiceImpl; @@ -33,6 +35,7 @@ import java.util.stream.Collectors; /** * 服务实现类 + * * @author BladeX */ @Service @@ -43,7 +46,11 @@ public class WeChatUserServiceImpl extends BaseServiceImpl buyCount(IPage page, WeChatUser weChatUser) { - IPage userIPage = this.page(page, Wrappers.lambdaQuery(weChatUser).select(WeChatUser::getUsername, WeChatUser::getPhone)); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(weChatUser); + wrapper.select(WeChatUser::getUsername, WeChatUser::getPhone); + wrapper.like(StringUtils.isNotBlank(weChatUser.getUsername()), WeChatUser::getUsername, weChatUser.getUsername()); + IPage userIPage = this.page(page, wrapper); + List records = userIPage.getRecords(); if (CollectionUtils.isNotEmpty(records)) { List buyCount = weChatUserMapper.buyCount(); @@ -58,5 +65,22 @@ public class WeChatUserServiceImpl extends BaseServiceImpl export(WeChatUser weChatUser) { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery(weChatUser); + wrapper.like(StringUtils.isNotBlank(weChatUser.getUsername()), WeChatUser::getUsername, weChatUser.getUsername()); + List users = this.list(wrapper); + if (CollectionUtils.isNotEmpty(users)) { + List buyCount = weChatUserMapper.buyCount(); + Map collect = buyCount.stream().collect(Collectors.toMap(BuyCount::getPhone, BuyCount::getCount)); + + users.forEach(user -> { + Integer count = collect.get(user.getPhone()); + user.setCount(count != null ? count : 0); + }); + } + return users; + } + } diff --git a/src/main/java/org/springblade/modules/weixin/utils/WxPayUtils.java b/src/main/java/org/springblade/modules/weixin/utils/WxPayUtils.java index 4066e57..1c5fb55 100644 --- a/src/main/java/org/springblade/modules/weixin/utils/WxPayUtils.java +++ b/src/main/java/org/springblade/modules/weixin/utils/WxPayUtils.java @@ -6,6 +6,7 @@ import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; import com.wechat.pay.contrib.apache.httpclient.auth.*; import com.wechat.pay.contrib.apache.httpclient.util.PemUtil; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; @@ -44,6 +45,7 @@ public class WxPayUtils { // JSApi下单url地址 public static String JSApiPayUrl = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi"; + public static String ClocePayUrl = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}/close"; // 商户私钥 获取对应的签名需要 在微信支付商户平台-账户中心-API安全里设置 养宠物那边复制的 // 对应文档 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter2_1.shtml @@ -159,6 +161,89 @@ public class WxPayUtils { return ""; } + /** + * 关闭订单 + * @param outTradeNo + * @return + */ + public static String cloceOrderJSApiV3(String outTradeNo) { + payLoading(); + //请求URL + HttpPost httpPost = new HttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + outTradeNo + "/close"); + // 请求body参数 + JSONObject amountJson = new JSONObject(); + amountJson.put("mchid", mchId); + StringEntity entity = new StringEntity(JSONObject.toJSONString(amountJson), "utf-8"); + entity.setContentType("application/json"); + httpPost.setEntity(entity); + httpPost.setHeader("Accept", "application/json"); + + //完成签名并执行请求 + CloseableHttpResponse response = null; + try { + response = httpClient.execute(httpPost); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode == 200) { + return EntityUtils.toString(response.getEntity()); + } else if (statusCode == 204) { + return ""; + } else { + System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity())); + throw new IOException("request failed"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + assert response != null; + response.close(); + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ""; + } + + /** + * 查询订单 + * @param outTradeNo + * @return + */ + public static String getOrderJSApiV3(String outTradeNo) { + payLoading(); + //请求URL + HttpGet httpGet = new HttpGet("https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/" + outTradeNo + "?mchid=" + mchId); + // 请求body参数 + httpGet.setHeader("Accept", "application/json"); + + //完成签名并执行请求 + CloseableHttpResponse response = null; + try { + response = httpClient.execute(httpGet); + int statusCode = response.getStatusLine().getStatusCode(); + if (statusCode == 200) { + return EntityUtils.toString(response.getEntity()); + } else if (statusCode == 204) { + return ""; + } else { + System.out.println("failed,resp code = " + statusCode + ",return body = " + EntityUtils.toString(response.getEntity())); + throw new IOException("request failed"); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + assert response != null; + response.close(); + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return ""; + } + /** * 第四步:生成支付参数 @@ -202,7 +287,6 @@ public class WxPayUtils { } - /** * 构造下单的json(第三步需要) *