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); } } springcloud_k8s_panzhihuazhihuishequ/applets/src/main/java/com/panzhihua/applets/api/WxCallbackApi.java
New file @@ -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(); } } } 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; } 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> springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/constants/PayCpmstant.java
New file @@ -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"; } 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; } 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; springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/OrderPayDTO.java
New file @@ -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; } springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/model/dtos/shop/WxPayNotifyOrderDTO.java
New file @@ -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; } 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; } 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); } 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 ""; } } springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/PayUtil.java
New file @@ -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); } } springcloud_k8s_panzhihuazhihuishequ/common/src/main/java/com/panzhihua/common/utlis/WxPayUtils.java
New file @@ -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; } } 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); } } 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); } 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{" + springcloud_k8s_panzhihuazhihuishequ/service_community/src/main/java/com/panzhihua/service_community/service/ComShopGoodsService.java
@@ -42,8 +42,6 @@ */ R pageGoodsList(PageComShopGoodsDTO pageComShopGoodsDTO); /** * 编辑商品 * 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); } 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)); } /** 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; 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()); 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); } } 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(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(); } } @ApiOperation(value = "添加商品") @@ -52,10 +84,18 @@ @PostMapping("/add") public R search(@RequestBody AddShopGoodsVO addShopGoodsVO){ R<ShopStoreVO> storeInofR = communityService.getUserStoreInfo(getUserId()); ShopStoreVO shopStoreVO = storeInofR.getData(); 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()); //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(); } } } 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 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;