From 26cd8c7b2bc7a725a3de28d3ed883a6f54da84f1 Mon Sep 17 00:00:00 2001 From: DESKTOP-71BH0QO\L、ming <172680469@qq.com> Date: 星期二, 20 四月 2021 16:59:42 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/model/dos/ComShopOrderPayDO.java | 8 springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/WxPayNotifyOrderDTO.java | 25 + springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopGoodsDTO.java | 3 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/dao/ComShopGoodsDAO.java | 2 springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/SercuritFilter.java | 3 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOrderServiceImpl.java | 154 +++++++++- springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/service/community/CommunityService.java | 15 + springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/OrderPayDTO.java | 21 + springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/PayUtil.java | 191 ++++++++++++ springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/constants/PayCpmstant.java | 20 + springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxMaProperties.java | 15 + springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/HttpClientUtil.java | 44 ++ springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOperLogServiceImpl.java | 6 springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxPayUtils.java | 79 +++++ springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/shop/ComShopOrderVO.java | 3 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopGoodsService.java | 2 springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopOrderCreateDTO.java | 3 springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/ShopApi.java | 21 + springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/api/ShopApi.java | 17 + springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopGoodsServiceImpl.java | 2 springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/GoodsApi.java | 84 +++++ springcloud_k8s_panzhihuazhihuishequ/common/pom.xml | 10 springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopOrderService.java | 13 springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java | 3 springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/WxCallbackApi.java | 100 ++++++ 25 files changed, 807 insertions(+), 37 deletions(-) diff --git a/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/ShopApi.java b/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/ShopApi.java index 4d5f529..0f28c5c 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/ShopApi.java +++ b/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/ShopApi.java @@ -1,17 +1,24 @@ package com.panzhihua.applets.api; +import com.panzhihua.applets.config.WxMaProperties; import com.panzhihua.common.controller.BaseController; import com.panzhihua.common.model.dtos.shop.*; import com.panzhihua.common.model.vos.LoginUserInfoVO; import com.panzhihua.common.model.vos.R; import com.panzhihua.common.model.vos.shop.*; import com.panzhihua.common.service.community.CommunityService; +import com.panzhihua.common.utlis.PayUtil; import io.swagger.annotations.*; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; import java.util.List; +import java.util.Map; /** * @auther lyq @@ -26,6 +33,8 @@ @Resource private CommunityService communityService; + @Resource + private WxMaProperties properties; @ApiOperation(value = "分页查询店铺" , response = PageShopStoreVO.class) @PostMapping("pageshopstore") @@ -148,6 +157,7 @@ } orderCreateDTO.setUserId(loginUserInfo.getUserId()); orderCreateDTO.setPhone(loginUserInfo.getPhone()); + orderCreateDTO.setOpenId(loginUserInfo.getOpenid()); return communityService.orderCreate(orderCreateDTO); } @@ -206,5 +216,16 @@ return communityService.orderStatistics(loginUserInfo.getUserId()); } + @ApiOperation(value = "小程序微信调起支付") + @PostMapping("wxpay") + public R wxPay(@RequestBody OrderPayDTO orderPayDTO){ + LoginUserInfoVO loginUserInfo = this.getLoginUserInfo(); + if(loginUserInfo == null){ + return R.fail("请重新登陆"); + } + orderPayDTO.setOpenId(loginUserInfo.getOpenid()); + return communityService.wxPay(orderPayDTO); + } + } diff --git a/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/WxCallbackApi.java b/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/WxCallbackApi.java new file mode 100644 index 0000000..19d8662 --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/WxCallbackApi.java @@ -0,0 +1,100 @@ +package com.panzhihua.applets.api; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.panzhihua.common.model.dtos.shop.WxPayNotifyOrderDTO; +import com.panzhihua.common.service.community.CommunityService; +import com.panzhihua.common.utlis.StringUtils; +import lombok.extern.slf4j.Slf4j; +import org.json.XML; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +/** + * @auther lyq + * @create 2021-04-14 15:02:49 + * @describe 微信支付回到函数 + */ +@Slf4j +@RestController +@RequestMapping("/wx/") +public class WxCallbackApi { + + @Resource + private CommunityService communityService; + + @PostMapping("wxNotify") + public void payCallback(HttpServletRequest request, HttpServletResponse response) { + log.info("微信支付回调start"); + String inputLine = ""; + String notityXml = ""; + try { + while((inputLine = request.getReader().readLine()) != null){ + notityXml += inputLine; + } + //关闭流 + request.getReader().close(); + log.info("微信回调内容信息:"+notityXml); + //解析成Json + org.json.JSONObject xmlJson = XML.toJSONObject(notityXml); + if(StringUtils.isNotEmpty(xmlJson.toString())){ + JSONObject resultData = JSON.parseObject(xmlJson.get("xml").toString()); + //成功支付订单 + if(resultData.getString("result_code").equals("SUCCESS") && resultData.getString("return_code").equals("SUCCESS")){ + WxPayNotifyOrderDTO notifyOrderDTO = new WxPayNotifyOrderDTO(); + //订单号 + String orderTradeNo = resultData.getString("out_trade_no"); + notifyOrderDTO.setOrderTradeNo(orderTradeNo); + //微信支付订单号 + String wxTradeNo = resultData.getString("transaction_id"); + notifyOrderDTO.setWxTradeNo(wxTradeNo); + //订单金额 + String totalFee = resultData.getString("total_fee"); + notifyOrderDTO.setTotalFee(totalFee); + //支付完成时间 + String payTime = resultData.getString("time_end"); + notifyOrderDTO.setPayTime(payTime); + //现金支付金额 + String cashFee = resultData.getString("cash_fee"); + notifyOrderDTO.setCashFee(cashFee); + + //根据订单号修改订单信息 + communityService.wxOrderPayNotify(notifyOrderDTO); + + //封装 返回值 + StringBuffer buffer = new StringBuffer(); + buffer.append("<xml>"); + buffer.append("<return_code>SUCCESS</return_code>"); + buffer.append("<return_msg>OK</return_msg>"); + buffer.append("</xml>"); + + //给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功 + PrintWriter writer = response.getWriter(); + //返回 + writer.print(buffer.toString()); + }else{//未成功支付订单 + //封装 返回值 + StringBuffer buffer = new StringBuffer(); + buffer.append("<xml>"); + buffer.append("<return_code>FAIL</return_code>"); + buffer.append("<return_msg>FAIL</return_msg>"); + buffer.append("</xml>"); + + //给微信服务器返回 成功标示 否则会一直询问 咱们服务器 是否回调成功 + PrintWriter writer = response.getWriter(); + //返回 + writer.print(buffer.toString()); + } + } + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxMaProperties.java b/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxMaProperties.java index 6ff4b0c..a10e9e4 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxMaProperties.java +++ b/springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/config/WxMaProperties.java @@ -40,4 +40,19 @@ * 消息格式,XML或者JSON */ private String msgDataFormat; + + /** + * 商户号 + */ + private String mchId; + + /** + * 微信支付密钥 + */ + private String payKey; + + /** + * 微信支付回调地址 + */ + private String notifyUrl; } diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml b/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml index e853291..3b2ea5f 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml +++ b/springcloud_k8s_panzhihuazhihuishequ/common/pom.xml @@ -114,6 +114,16 @@ <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> + <dependency> + <groupId>org.jdom</groupId> + <artifactId>jdom2</artifactId> + <version>2.0.5</version> + </dependency> + <dependency> + <groupId>org.json</groupId> + <artifactId>json</artifactId> + <version>20160810</version> + </dependency> </dependencies> diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/constants/PayCpmstant.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/constants/PayCpmstant.java new file mode 100644 index 0000000..ddd29b3 --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/constants/PayCpmstant.java @@ -0,0 +1,20 @@ +package com.panzhihua.common.constants; + +/** + * 微信支付通用常量 + * + * @author LYQ + */ +public class PayCpmstant { + + //微信支付统一下单url地址 + public static final String UNIFIEDORDER_URL="https://api.mch.weixin.qq.com/pay/unifiedorder"; + //微信支付默认编码格式 + public static final String DEFAULT_ENCODING="UTF-8"; + //微信支付返回支付成功CODE + public static final String RETURN_CODE="SUCCESS"; + //微信支付返回支付成功MSG + public static final String RETURN_MSG="OK"; + //微信支付默认加密格式 + public static final String SIGN_TYPE="MD5"; +} diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopGoodsDTO.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopGoodsDTO.java index 074b47d..470074e 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopGoodsDTO.java +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopGoodsDTO.java @@ -30,4 +30,7 @@ @ApiModelProperty("配送方式(1.商家配送 2.快递物流)") private Integer deliveryType; + + @ApiModelProperty(hidden = true) + private Long userId; } diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopOrderCreateDTO.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopOrderCreateDTO.java index 410477e..139325c 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopOrderCreateDTO.java +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/ComShopOrderCreateDTO.java @@ -21,6 +21,9 @@ @ApiModelProperty(value = "用户手机号",hidden = true) private String phone; + @ApiModelProperty(value = "用户openId",hidden = true) + private String openId; + @ApiModelProperty(value = "用户收货地址id",required = true) private Long receiverId; diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/OrderPayDTO.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/OrderPayDTO.java new file mode 100644 index 0000000..dadc021 --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/OrderPayDTO.java @@ -0,0 +1,21 @@ +package com.panzhihua.common.model.dtos.shop; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @auther lyq + * @create 2021-04-14 15:02:14 + * @describe 订单支付请求参数 + */ +@Data +@ApiModel("订单支付请求参数") +public class OrderPayDTO { + + @ApiModelProperty(value = "订单号") + private String orderNo; + + @ApiModelProperty(value = "订单号",hidden = true) + private String openId; +} diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/WxPayNotifyOrderDTO.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/WxPayNotifyOrderDTO.java new file mode 100644 index 0000000..474beb1 --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/WxPayNotifyOrderDTO.java @@ -0,0 +1,25 @@ +package com.panzhihua.common.model.dtos.shop; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +@ApiModel("微信支付回调修改订单参数") +public class WxPayNotifyOrderDTO { + + @ApiModelProperty(value = "订单号") + private String orderTradeNo; + + @ApiModelProperty(value = "微信交易订单号") + private String wxTradeNo; + + @ApiModelProperty(value = "订单金额") + private String totalFee; + + @ApiModelProperty(value = "支付完成时间") + private String payTime; + + @ApiModelProperty(value = "现金支付金额") + private String cashFee; +} diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/shop/ComShopOrderVO.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/shop/ComShopOrderVO.java index 69b5446..69ae345 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/shop/ComShopOrderVO.java +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/vos/shop/ComShopOrderVO.java @@ -16,4 +16,7 @@ @ApiModelProperty(value = "订单金额") private BigDecimal orderTotal; + @ApiModelProperty(value = "请求支付返回参数") + private String payResult; + } diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/service/community/CommunityService.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/service/community/CommunityService.java index 7b6f962..a7bf930 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/service/community/CommunityService.java +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/service/community/CommunityService.java @@ -2101,4 +2101,19 @@ */ @PostMapping("/shop/pageShopFunds") R pageShopFunds(@RequestBody PageComShopFundsSearchDTO pageComShopFundsSearchDTO); + + /** + * 微信支付订单回调 + * @param wxPayNotifyOrderDTO 订单支付回调参数 + */ + @PostMapping("/shop/wxOrderPayNotify") + void wxOrderPayNotify(@RequestBody WxPayNotifyOrderDTO wxPayNotifyOrderDTO); + + /** + * 点击去支付订单 + * @param orderPayDTO 请求参数 + * @return 支付对象 + */ + @PostMapping("/shop/wxPay") + R wxPay(@RequestBody OrderPayDTO orderPayDTO); } diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/HttpClientUtil.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/HttpClientUtil.java index a477862..7b7b08f 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/HttpClientUtil.java +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/HttpClientUtil.java @@ -13,7 +13,13 @@ import org.apache.http.util.EntityUtils; import org.springframework.util.ObjectUtils; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.net.MalformedURLException; +import java.net.URL; +import java.net.URLConnection; /** * @program: springcloud_k8s_panzhihuazhihuishequ @@ -86,5 +92,43 @@ } + /** + * 使用http请求调用接口,参数类型为xml + * @param urlStr 请求地址 + * @param data 请求参数 + * @return 调用结果 + */ + public static String httpsRequest(String urlStr,String data) { + try { + URL url = new URL(urlStr); + URLConnection con = url.openConnection(); + con.setDoOutput(true); +// con.setRequestProperty("Pragma:", "no-cache"); + con.setRequestProperty("Cache-Control", "no-cache"); + con.setRequestProperty("Content-Type", "text/xml"); + + OutputStreamWriter out = new OutputStreamWriter(con + .getOutputStream()); + log.info("urlStr=" + urlStr); + log.info("xmlInfo=" + data); + out.write(new String(data.getBytes("UTF-8"))); + out.flush(); + out.close(); + BufferedReader br = new BufferedReader(new InputStreamReader(con + .getInputStream())); + String line = ""; + StringBuffer sb = new StringBuffer(); + for (line = br.readLine(); line != null; line = br.readLine()) { + sb.append(line); + } + return sb.toString(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return ""; + } + } diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/PayUtil.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/PayUtil.java new file mode 100644 index 0000000..ea59469 --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/PayUtil.java @@ -0,0 +1,191 @@ +package com.panzhihua.common.utlis; + +import org.jdom2.input.SAXBuilder; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.math.BigDecimal; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.security.MessageDigest; +import java.text.SimpleDateFormat; +import java.util.*; + +public class PayUtil { + + /** + * 获取当前机器的ip + */ + public static String getLocalIp() { + InetAddress ia = null; + String localip = null; + try { + ia = ia.getLocalHost(); + localip = ia.getHostAddress(); + } catch (UnknownHostException e) { + e.printStackTrace(); + } + return localip; + } + @SuppressWarnings("rawtypes") + public static String getRequestXml(SortedMap<Object, Object> parameters) { + StringBuffer sb = new StringBuffer(); + sb.append("<xml>"); + Set es = parameters.entrySet(); + Iterator it = es.iterator(); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry) it.next(); + String k = (String) entry.getKey(); + String v = (String) entry.getValue(); + if ("attach".equalsIgnoreCase(k) || "body".equalsIgnoreCase(k) || "sign".equalsIgnoreCase(k)) { + sb.append("<" + k + ">" + "<![CDATA[" + v + "]]></" + k + ">"); + } else { + sb.append("<" + k + ">" + v + "</" + k + ">"); + } + } + sb.append("</xml>"); + return sb.toString(); + } + /** + * 创建签名Sign + */ + @SuppressWarnings("rawtypes") + public static String createSign(String characterEncoding,SortedMap<Object, Object> parameters, String key) { + StringBuffer sb = new StringBuffer(); + Set es = parameters.entrySet(); + Iterator<?> it = es.iterator(); + while (it.hasNext()) { + Map.Entry entry = (Map.Entry) it.next(); + String k = (String) entry.getKey(); + if (entry.getValue() != null || !"".equals(entry.getValue())) { + String v = String.valueOf(entry.getValue()); + if (null != v && !"".equals(v) && !"sign".equals(k) && !"key".equals(k)) { + sb.append(k + "=" + v + "&"); + } + } + } + sb.append("key=" + key); + String sign = ""; + try { + sign = MD5(sb.toString()); + }catch (Exception e){ + return e.getMessage(); + } + return sign; + } + /** + * 生成随机数 + */ + public static String makeUUID(int len) { + return UUID.randomUUID().toString().replaceAll("-", "").substring(0, len); + } + /** + * 生成订单号 + */ + public static String generateOrderNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd"); + return sdf.format(new Date()) + makeUUID(16); + } + /** + * 解析xml + */ + public static Map doXMLParse(String strxml) throws Exception { + strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\""); + if (StringUtils.isNotEmpty(strxml)) { + return null; + } + Map m = new HashMap(); + InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8")); + SAXBuilder builder = new SAXBuilder(); + org.jdom2.Document doc = builder.build(in); + org.jdom2.Element root = doc.getRootElement(); + List list = root.getChildren(); + Iterator it = list.iterator(); + while (it.hasNext()) { + org.jdom2.Element e = (org.jdom2.Element) it.next(); + String k = e.getName(); + String v = ""; + List children = e.getChildren(); + if (children.isEmpty()) { + v = e.getTextNormalize(); + } else { + v = getChildrenText(children); + } + m.put(k, v); + } + //关闭流 + in.close(); + return m; + } + /** + * 获取子节点的xml + */ + public static String getChildrenText(List children) { + StringBuffer sb = new StringBuffer(); + if (!children.isEmpty()) { + Iterator it = children.iterator(); + while (it.hasNext()) { + org.jdom2.Element e = (org.jdom2.Element) it.next(); + String name = e.getName(); + String value = e.getTextNormalize(); + List list = e.getChildren(); + sb.append("<" + name + ">"); + if (!list.isEmpty()) { + sb.append(getChildrenText(list)); + } + sb.append(value); + sb.append("</" + name + ">"); + } + } + return sb.toString(); + } + /** + * 转换金额到整型 + */ + public static String moneyToIntegerStr(BigDecimal money) { + int amount = money.multiply(new BigDecimal((100))) + .setScale(0, BigDecimal.ROUND_HALF_UP).intValue(); + return String.valueOf(amount); + } + /** + * 微信下单,map to xml + * @param params 参数 + * @return String + */ + public static String mapToXml(Map<String, String> params) { + StringBuilder xml = new StringBuilder(); + xml.append("<xml>"); + for (Map.Entry<String, String> entry : params.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + // 略过空值 + if (StringUtils.isEmpty(value)) continue; + xml.append("<").append(key).append("><![CDATA["); + xml.append(entry.getValue()); + xml.append("]]></").append(key).append(">"); + } + xml.append("</xml>"); + return xml.toString(); + } + + /** + * 生成 MD5 + * + * @param data 待处理数据 + * @return MD5结果 + */ + public static String MD5(String data) throws Exception { + java.security.MessageDigest md = MessageDigest.getInstance("MD5"); + byte[] array = md.digest(data.getBytes("UTF-8")); + StringBuilder sb = new StringBuilder(); + for (byte item : array) { + sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3)); + } + return sb.toString().toUpperCase(); + } + + + public static String create_timestamp() { + return Long.toString(System.currentTimeMillis() / 1000); + } +} diff --git a/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxPayUtils.java b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxPayUtils.java new file mode 100644 index 0000000..6200822 --- /dev/null +++ b/springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxPayUtils.java @@ -0,0 +1,79 @@ +package com.panzhihua.common.utlis; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.panzhihua.common.constants.PayCpmstant; +import lombok.extern.slf4j.Slf4j; +import org.json.XML; + +import java.math.BigDecimal; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; + +@Slf4j +public class WxPayUtils { + + public static String getUnifiedorder(String appid, String mchId, String payKey, String notifyUrl, String body, String openid, String outTradeNo, BigDecimal money){ + String nonceStr = PayUtil.makeUUID(32); + SortedMap<Object, Object> params = new TreeMap<>(); + params.put("appid", appid); + params.put("body", body); + params.put("mch_id", mchId); + params.put("nonce_str",nonceStr); + params.put("notify_url", notifyUrl); + params.put("openid", openid); + params.put("out_trade_no", outTradeNo);//商品订单号 + params.put("spbill_create_ip", PayUtil.getLocalIp());//服务部署的ip + params.put("total_fee", PayUtil.moneyToIntegerStr(money));//费用的参数转型 + params.put("trade_type", "JSAPI");//对接类型 + params.put("sign", PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, params, payKey));//MD5签名 + //转换成xml + String xmlData = PayUtil.getRequestXml(params); + //请求微信后台,获取支付id + String resXml = HttpClientUtil.httpsRequest(PayCpmstant.UNIFIEDORDER_URL, xmlData); + log.info("请求微信支付返回参数:" + resXml); + + org.json.JSONObject resultData = XML.toJSONObject(resXml); + JSONObject data = JSON.parseObject(resultData.get("xml").toString()); + JSONObject result = new JSONObject(); + if(data.get("return_msg").equals(PayCpmstant.RETURN_MSG) && data.get("return_code").equals(PayCpmstant.RETURN_CODE)){ + //将微信统一下单成功的参数拼接再签名 + //统一下单返回prepay_id + String prepayId = "prepay_id=" + data.getString("prepay_id"); + //时间戳 + Long timeStamp = System.currentTimeMillis()/1000; + //封装需要签名的字段 + SortedMap<Object, Object> payParams = new TreeMap<>(); + payParams.put("appId", appid); + payParams.put("nonceStr",nonceStr); + payParams.put("package",prepayId); + payParams.put("signType",PayCpmstant.SIGN_TYPE); + payParams.put("timeStamp",timeStamp); + //将参数以及签名计算完成封装返回给前端 + result.put("timeStamp",timeStamp); + result.put("nonceStr",nonceStr); + result.put("package",prepayId); + result.put("signType",PayCpmstant.SIGN_TYPE); + result.put("paySign",PayUtil.createSign(PayCpmstant.DEFAULT_ENCODING, payParams, payKey)); + } + return result.toJSONString(); + } + + public static SortedMap<Object, Object> prepayId(Map<String, String> map) { + SortedMap<Object, Object> parameters = new TreeMap<>(); + parameters.put("appId", ""); + parameters.put("timeStamp", PayUtil.create_timestamp()); + parameters.put("nonceStr", map.get("nonce_str")); + parameters.put("package", "prepay_id=" + map.get("prepay_id")); + parameters.put("signType", "MD5"); + String sign = PayUtil.createSign("UTF-8", parameters, "商户秘钥"); + parameters.put("prepay_id", "prepay_id=" + map.get("prepay_id")); + parameters.put("paySign", sign); + return parameters; + } + + + + +} diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/api/ShopApi.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/api/ShopApi.java index d93dacc..3a701af 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/api/ShopApi.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/api/ShopApi.java @@ -468,5 +468,22 @@ return comShopOrderService.pageShopFunds(pageComShopFundsSearchDTO); } + /** + * 微信支付订单回调 + * @param wxPayNotifyOrderDTO 订单支付回调参数 + */ + @PostMapping("/wxOrderPayNotify") + public void wxOrderPayNotify(@RequestBody WxPayNotifyOrderDTO wxPayNotifyOrderDTO){ + comShopOrderService.wxOrderPayNotify(wxPayNotifyOrderDTO); + } + /** + * 点击去支付订单 + * @param orderPayDTO 请求参数 + * @return 支付对象 + */ + @PostMapping("/wxPay") + public R wxPay(@RequestBody OrderPayDTO orderPayDTO){ + return comShopOrderService.wxPay(orderPayDTO); + } } diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/dao/ComShopGoodsDAO.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/dao/ComShopGoodsDAO.java index 58b0647..c638931 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/dao/ComShopGoodsDAO.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/dao/ComShopGoodsDAO.java @@ -80,6 +80,6 @@ " </if> " + " order by sale desc,create_at desc " + " </script>") - IPage<ComShopGoodsVO> pageShopGoods(Page page, @Param("comShopGoodsDTO") ComShopGoodsDTO comShopGoodsDTO); + IPage<ComShopGoodsVO> pageShopGoodByApps(Page page, @Param("comShopGoodsDTO") ComShopGoodsDTO comShopGoodsDTO); } diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/model/dos/ComShopOrderPayDO.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/model/dos/ComShopOrderPayDO.java index 58a2f95..6a010d2 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/model/dos/ComShopOrderPayDO.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/model/dos/ComShopOrderPayDO.java @@ -73,6 +73,14 @@ @TableField(fill = FieldFill.UPDATE) private Date updateAt; + /** + * 支付状态(1.未支付 2.已支付) + */ + public interface payStatus{ + int no = 1; + int yes = 2; + } + @Override public String toString() { return "ComShopOrderPayDO{" + diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopGoodsService.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopGoodsService.java index 1c95958..ecf1acd 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopGoodsService.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopGoodsService.java @@ -42,8 +42,6 @@ */ R pageGoodsList(PageComShopGoodsDTO pageComShopGoodsDTO); - - /** * 编辑商品 * diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopOrderService.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopOrderService.java index d484a53..ca2e9de 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopOrderService.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopOrderService.java @@ -133,4 +133,17 @@ * @return 资金订单数据 */ R pageShopFunds(PageComShopFundsSearchDTO pageComShopFundsSearchDTO); + + /** + * 微信支付订单回调 + * @param wxPayNotifyOrderDTO 订单支付回调参数 + */ + void wxOrderPayNotify(WxPayNotifyOrderDTO wxPayNotifyOrderDTO); + + /** + * 用户点击去支付 + * @param orderPayDTO 请求参数 + * @return 返回支付对象 + */ + R wxPay(OrderPayDTO orderPayDTO); } diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopGoodsServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopGoodsServiceImpl.java index 13603c2..37b06f7 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopGoodsServiceImpl.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopGoodsServiceImpl.java @@ -185,7 +185,7 @@ @Override public R pageShopGoods(ComShopGoodsDTO comShopGoodsDTO){ Page page = new Page<>(comShopGoodsDTO.getPageNum(),comShopGoodsDTO.getPageSize()); - return R.ok(this.baseMapper.pageShopGoods(page,comShopGoodsDTO)); + return R.ok(this.baseMapper.pageShopGoodByApps(page,comShopGoodsDTO)); } /** diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOperLogServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOperLogServiceImpl.java index 21d40a5..7495cb0 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOperLogServiceImpl.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOperLogServiceImpl.java @@ -1,21 +1,15 @@ package com.panzhihua.service_community.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.panzhihua.common.model.dtos.PageDTO; import com.panzhihua.common.model.vos.R; -import com.panzhihua.common.model.vos.shop.PageShopStoreVO; import com.panzhihua.common.model.vos.shop.ShopOperLogVO; import com.panzhihua.service_community.dao.ComShopOperLogDAO; -import com.panzhihua.service_community.dao.ComShopOrderDAO; import com.panzhihua.service_community.model.dos.ComShopOperLogDO; -import com.panzhihua.service_community.model.dos.ComShopOrderDO; -import com.panzhihua.service_community.model.dos.ComShopStoreDO; import com.panzhihua.service_community.service.ComShopOperLogService; -import com.panzhihua.service_community.service.ComShopOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOrderServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOrderServiceImpl.java index dc59a90..cbc7636 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOrderServiceImpl.java +++ b/springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/impl/ComShopOrderServiceImpl.java @@ -8,6 +8,7 @@ import com.panzhihua.common.model.dtos.PageDTO; import com.panzhihua.common.model.dtos.shop.*; import com.panzhihua.common.model.vos.R; +import com.panzhihua.common.utlis.WxPayUtils; import com.panzhihua.service_community.dao.ComShopOrderDAO; import com.panzhihua.service_community.model.dos.ComShopOrderDO; import com.panzhihua.common.model.vos.R; @@ -19,11 +20,13 @@ import com.panzhihua.service_community.service.ComShopOrderService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -53,6 +56,18 @@ private ComShopOrderGoodsDAO comShopOrderGoodsDAO; @Resource private ComShopOrderDAO comShopOrderDAO; + @Resource + private ComShopOrderPayDAO comShopOrderPayDAO; + @Value("${min.app.isTest}") + private Boolean isTest; + @Value("${min.app.appid}") + private String appid; + @Value("${min.app.payKey}") + private String payKey; + @Value("${min.app.mchId}") + private String mchId; + @Value("${min.app.notifyUrl}") + private String notifyUrl; /** * 订单预览 @@ -161,11 +176,12 @@ } }else{//查询到用户上一笔订单 ComShopUserAddressDO userAddressDO = comShopUserAddressDAO.selectById(shopOrders.get(0).getReceiverId()); - ComShopUserAddressVO userAddressVO = new ComShopUserAddressVO(); - BeanUtils.copyProperties(userAddressDO,userAddressVO); - orderPreviewVO.setUserAddressVO(userAddressVO); + if(userAddressDO != null){ + ComShopUserAddressVO userAddressVO = new ComShopUserAddressVO(); + BeanUtils.copyProperties(userAddressDO,userAddressVO); + orderPreviewVO.setUserAddressVO(userAddressVO); + } } - return R.ok(orderPreviewVO); } @@ -179,7 +195,6 @@ public R orderCreate(ComShopOrderCreateDTO orderCreateDTO){ //创建返回参数 ComShopOrderVO shopOrderVO = new ComShopOrderVO(); - //查询用户收货地址 ComShopUserAddressDO userAddressDO = comShopUserAddressDAO.selectById(orderCreateDTO.getReceiverId()); if(userAddressDO == null){ @@ -193,10 +208,8 @@ String orderNo = OrderNoUtils.NextOrderNo(userId); //配送方式 Integer deliveryType = 0; - //订单总金额 BigDecimal orderTotal = BigDecimal.ZERO; - //创建订单商品信息 List<ComShopOrderGoodsDO> orderGoodsDOList = new ArrayList<>(); if(!orderCreateDTO.getOrderGoodsList().isEmpty()){ @@ -232,12 +245,10 @@ orderTotal = orderTotal.add(orderGoodsDO.getGoodsAttrPrice().multiply(BigDecimal.valueOf(orderGoodsDO.getAmount()))); } } - //如果是购物车提交,需要将购物车内商品移除 if(orderCreateDTO.getSubmitType().equals(ComShopOrderCreateDTO.submitType.cart)){ comShopCartDAO.deleteBatchIds(orderCreateDTO.getCartIds()); } - //创建订单信息 ComShopOrderDO shopOrderDO = new ComShopOrderDO(); shopOrderDO.setOrderNo(orderNo); @@ -254,18 +265,15 @@ shopOrderDO.setRemark(orderCreateDTO.getRemark()); } this.baseMapper.insert(shopOrderDO); - if(!orderGoodsDOList.isEmpty()){ orderGoodsDOList.forEach(orderGoods ->{ orderGoods.setOrderId(shopOrderDO.getId()); comShopOrderGoodsDAO.insert(orderGoods); }); } - //创建订单操作记录 ComShopOrderOperateDO orderOperateDO = new ComShopOrderOperateDO(); orderOperateDO.setOrderNo(orderNo); - orderOperateDO.setOperationType(ComShopOrderOperateDO.operationType.create); orderOperateDO.setOperationTime(new Date()); if(StringUtils.isNotEmpty(orderCreateDTO.getPhone())){ @@ -276,9 +284,21 @@ orderOperateDO.setOperationBy("用户"); } comShopOrderOperateDAO.insert(orderOperateDO); - shopOrderVO.setOrderNo(orderNo); shopOrderVO.setOrderTotal(orderTotal); + + try { + BigDecimal money = orderTotal; + if(isTest){ + money = BigDecimal.valueOf(0.01); + } + //调用wx支付 + String xml = WxPayUtils.getUnifiedorder(appid,mchId,payKey,notifyUrl,"商品购买",orderCreateDTO.getOpenId(),orderNo,money); + log.info("微信支付返回参数:" + xml); + shopOrderVO.setPayResult(xml); + }catch (Exception e){ + log.error("调用微信支付异常,异常原因:" + e.getMessage()); + } return R.ok(shopOrderVO); } @@ -638,9 +658,6 @@ return R.ok(ipage); } - - - @Override public R capitalDetailByStore(Long id) { if(id==null){ @@ -649,4 +666,109 @@ CapitalDetailVO vo = this.baseMapper.capitalDetailByStore(id); return R.ok(vo); } + + /** + * 微信支付订单回调 + * @param wxPayNotifyOrderDTO 订单支付回调参数 + */ + @Transactional(rollbackFor = Exception.class) + @Override + public void wxOrderPayNotify(WxPayNotifyOrderDTO wxPayNotifyOrderDTO){ + if(StringUtils.isEmpty(wxPayNotifyOrderDTO.getOrderTradeNo())){ + log.error("微信支付回调失败,订单号为空"); + return; + } + + //查询订单 + ComShopOrderDO shopOrderDO = this.baseMapper.selectOne(new QueryWrapper<ComShopOrderDO>().lambda().eq(ComShopOrderDO::getOrderNo,wxPayNotifyOrderDTO.getOrderTradeNo())); + if(shopOrderDO == null){ + log.error("未查询到支付订单,订单回调失败,订单号:" + wxPayNotifyOrderDTO.getOrderTradeNo()); + return; + } + shopOrderDO.setStatus(ComShopOrderDO.status.dfh); + shopOrderDO.setPayType(ComShopOrderDO.payType.wx); + shopOrderDO.setPayStatus(ComShopOrderDO.payStatus.yes); + shopOrderDO.setPayAmount(BigDecimal.valueOf(Integer.parseInt(wxPayNotifyOrderDTO.getCashFee()) * 100)); + shopOrderDO.setWxTardeNo(wxPayNotifyOrderDTO.getWxTradeNo()); + shopOrderDO.setPayTime(new Date(Long.parseLong(wxPayNotifyOrderDTO.getPayTime()))); + this.baseMapper.updateById(shopOrderDO); + + //查询订单商品 + List<ComShopOrderGoodsDO> orderGoodsList = comShopOrderGoodsDAO.selectList(new QueryWrapper<ComShopOrderGoodsDO>().lambda().eq(ComShopOrderGoodsDO ::getOrderNo,shopOrderDO.getOrderNo())); + if(!orderGoodsList.isEmpty()){ + int goodsNub = 0; + for (ComShopOrderGoodsDO orderGood:orderGoodsList) { + goodsNub += orderGood.getAmount(); + //更新商品信息 + ComShopGoodsDO goodsDO = comShopGoodsDAO.selectById(orderGood.getGoodsId()); + if(goodsDO != null){ + goodsDO.setSale(goodsDO.getSale() + orderGood.getAmount()); + comShopGoodsDAO.updateById(goodsDO); + } + + //更新商品规格 + ComShopGoodsAttrDO goodsAttrDO = comShopGoodsAttrDAO.selectById(orderGood.getGoodsAttrId()); + if(goodsAttrDO != null){ + goodsAttrDO.setSale(goodsAttrDO.getSale() + orderGood.getAmount()); + comShopGoodsAttrDAO.updateById(goodsAttrDO); + } + } + + //更新店铺销量以及销售额 + ComShopStoreDO storeDO = comShopStoreDAO.selectById(shopOrderDO.getStoreId()); + if(storeDO != null){ + storeDO.setSale(storeDO.getSale() + goodsNub); + storeDO.setSaleVolume(storeDO.getSaleVolume().add(shopOrderDO.getTotalAmount())); + comShopStoreDAO.updateById(storeDO); + } + } + + + //添加订单操作记录 + ComShopOrderOperateDO orderOperateDO = new ComShopOrderOperateDO(); + orderOperateDO.setOrderNo(shopOrderDO.getOrderNo()); + orderOperateDO.setOperationType(ComShopOrderOperateDO.operationType.pay); + orderOperateDO.setOperationTime(new Date()); + orderOperateDO.setOperationContent("用户支付订单"); + orderOperateDO.setOperationBy("用户"); + comShopOrderOperateDAO.insert(orderOperateDO); + + //添加订单支付记录表 + ComShopOrderPayDO orderPayDO = new ComShopOrderPayDO(); + orderPayDO.setOrderNo(shopOrderDO.getOrderNo()); + orderPayDO.setOrderAmount(shopOrderDO.getTotalAmount()); + orderPayDO.setWxTradeNo(wxPayNotifyOrderDTO.getWxTradeNo()); + orderPayDO.setPayStatus(ComShopOrderPayDO.payStatus.yes); + orderPayDO.setPayAmount(shopOrderDO.getPayAmount()); + orderPayDO.setPayTime(shopOrderDO.getPayTime()); + comShopOrderPayDAO.insert(orderPayDO); + } + + /** + * 订单去支付 + * @param orderPayDTO 请求参数 + * @return 支付对象 + */ + public R wxPay(OrderPayDTO orderPayDTO){ + //创建返回参数 + ComShopOrderVO shopOrderVO = new ComShopOrderVO(); + //查询订单 + ComShopOrderDO orderDO = comShopOrderDAO.selectOne(new QueryWrapper<ComShopOrderDO>().lambda().eq(ComShopOrderDO::getOrderNo,orderPayDTO.getOrderNo())); + if(orderDO == null){ + return R.fail("订单不存在"); + } + try { + BigDecimal money = orderDO.getTotalAmount(); + if(isTest){ + money = BigDecimal.valueOf(0.01); + } + //调用wx支付 + String xml = WxPayUtils.getUnifiedorder(appid,mchId,payKey,notifyUrl,"商品购买",orderPayDTO.getOpenId(),orderDO.getOrderNo(),money); + log.info("微信支付返回参数:" + xml); + shopOrderVO.setPayResult(xml); + }catch (Exception e){ + log.error("调用微信支付异常,异常原因:" + e.getMessage()); + } + return R.ok(shopOrderVO); + } } diff --git a/springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/GoodsApi.java b/springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/GoodsApi.java index b60f53c..80a3931 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/GoodsApi.java +++ b/springcloud_k8s_panzhihuazhihuishequ/shop_backstage/src/main/java/com/panzhihua/shop_backstage/api/GoodsApi.java @@ -1,5 +1,7 @@ package com.panzhihua.shop_backstage.api; +import com.alibaba.fastjson.JSONObject; +import com.panzhihua.common.constants.FtpConstants; import com.panzhihua.common.controller.BaseController; import com.panzhihua.common.model.dtos.shop.ComShopGoodsDTO; import com.panzhihua.common.model.vos.R; @@ -8,15 +10,26 @@ import com.panzhihua.common.model.vos.shop.ComShopOrderSearchVO; import com.panzhihua.common.model.vos.shop.ShopStoreVO; import com.panzhihua.common.service.community.CommunityService; +import com.panzhihua.common.utlis.ClazzUtils; +import com.panzhihua.common.utlis.SFTPUtil; import com.panzhihua.common.validated.PageGroup; import com.panzhihua.common.interfaces.ShopOperLog; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.UUID; /** * @ClasssName GoodsApi 商品API @@ -34,17 +47,36 @@ @Resource private CommunityService communityService; + // FTP 登录用户名 + @Value("${ftp.username}") + private String userName; + // FTP 登录密码 + @Value("${ftp.password}") + private String password; + // FTP 服务器地址IP地址 + @Value("${ftp.host}") + private String host; + // FTP 端口 + @Value("${ftp.port}") + private int port; + @Value("${ftp.url}") + private String url; @ApiOperation(value = "商品分页搜索", response = ComShopGoodsVO.class) @PostMapping("/page") public R search(@RequestBody @Validated(PageGroup.class) ComShopGoodsDTO comShopGoodsDTO){ R<ShopStoreVO> storeInfoR = communityService.getUserStoreInfo(getUserId()); - ShopStoreVO shopStoreVO = storeInfoR.getData(); - if(shopStoreVO==null){ - return R.fail("用户无关联店铺"); + if(R.isOk(storeInfoR)) { + ShopStoreVO shopStoreVO = JSONObject.parseObject(JSONObject.toJSONString(storeInfoR.getData()), ShopStoreVO.class); + if (shopStoreVO == null) { + return R.fail("用户无关联店铺"); + } + comShopGoodsDTO.setStoreId(shopStoreVO.getId()); + ClazzUtils.setIfStringIsEmpty(comShopGoodsDTO); + return communityService.pageShopGoods(comShopGoodsDTO); + }else{ + return R.fail(); } - comShopGoodsDTO.setStoreId(shopStoreVO.getId()); - return communityService.pageShopGoods(comShopGoodsDTO); } @ApiOperation(value = "添加商品") @@ -52,10 +84,18 @@ @PostMapping("/add") public R search(@RequestBody AddShopGoodsVO addShopGoodsVO){ R<ShopStoreVO> storeInofR = communityService.getUserStoreInfo(getUserId()); - ShopStoreVO shopStoreVO = storeInofR.getData(); - addShopGoodsVO.setStoreId(shopStoreVO.getId()); - addShopGoodsVO.setName(shopStoreVO.getName()); - return communityService.saveShopGoods(addShopGoodsVO); + + if(R.isOk(storeInofR)) { + ShopStoreVO shopStoreVO = JSONObject.parseObject(JSONObject.toJSONString(storeInofR.getData()), ShopStoreVO.class); + if (shopStoreVO == null) { + return R.fail("用户无关联店铺"); + } + addShopGoodsVO.setStoreId(shopStoreVO.getId()); + //addShopGoodsVO.setName(shopStoreVO.getName()); + return communityService.saveShopGoods(addShopGoodsVO); + }else{ + return R.fail(); + } } @ApiOperation(value = "编辑商品") @@ -86,4 +126,30 @@ return communityService.deleteShopGoods(id); } + @ApiOperation(value = "上传图片") + @PostMapping(value = "uploadimage", consumes = "multipart/*", headers = "content-type=multipart/form-date") + public R uploadImage(@RequestParam MultipartFile file, HttpServletRequest request) { + String name = file.getOriginalFilename(); + List<String> formateList = Arrays.asList( + "avi", "flv", "mpg", "mpeg", "mpe", "m1v", "m2v", "mpv2", "mp2v", "dat", "ts", "tp", "tpr", "pva", "pss", "mp4", "m4v", + "m4p", "m4b", "3gp", "3gpp", "3g2", "3gp2", "ogg", "mov", "qt", "amr", "rm", "ram", "rmvb", "rpm"); + String nameStr = name.split("\\.")[1]; + if (formateList.contains(nameStr)) { + name = UUID.randomUUID().toString().replaceAll("-", "") + ".mp4"; + } else { + name = UUID.randomUUID().toString().replaceAll("-", "") + ".jpg"; + } + try { + SFTPUtil sftp = new SFTPUtil(userName, password, host, port); + sftp.login(); + InputStream is = file.getInputStream(); + sftp.uploadMore(FtpConstants.FTPFILEPATH_IDCARD, name, is); + sftp.logout(); + return R.ok(url + "/idcard/" + name); + } catch (Exception e) { + log.error("上传照片失败【{}】", e.getMessage()); + return R.fail(); + } + + } } diff --git a/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java b/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java index b55a731..07219e6 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java +++ b/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/JWTAuthenticationTokenFilter.java @@ -76,8 +76,9 @@ boolean useragreement = requestURI.contains("useragreement"); boolean refreshToken = requestURI.contains("refreshToken"); boolean logout = requestURI.contains("logout"); + boolean wxPay = requestURI.contains("wxNotify"); SafeboxRequestWrapper safeboxRequestWrapper = new SafeboxRequestWrapper(request); - if (login||doc||css||js||ui||swagger||ico||docs||error||refreshToken||useragreement) { + if (login||doc||css||js||ui||swagger||ico||docs||error||refreshToken||useragreement||wxPay) { //什么也不做 } else { // 获取请求头中JWT的Token diff --git a/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/SercuritFilter.java b/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/SercuritFilter.java index 8adb26e..8014cbe 100644 --- a/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/SercuritFilter.java +++ b/springcloud_k8s_panzhihuazhihuishequ/zuul/src/main/java/com/panzhihua/zuul/filters/SercuritFilter.java @@ -75,9 +75,10 @@ boolean contains = requestUrl.contains("/api/applets/"); boolean docs = !requestUrl.contains("docs"); boolean login = !requestUrl.contains("login"); + boolean wxNotify = !requestUrl.contains("wxNotify"); boolean refreshToken = !requestUrl.contains("refreshToken"); boolean useragreement = !requestUrl.contains("useragreement"); - if (contains&&docs&&login&&refreshToken&&useragreement) { + if (contains&&docs&&login&&refreshToken&&useragreement&&wxNotify) { configAttributes.add(new SecurityConfig(SecurityConstants.ROLE_APPLETS)); } return configAttributes; -- Gitblit v1.7.1