张延森 4 yıl önce
ebeveyn
işleme
1f88a64918

+ 5
- 0
src/main/java/com/yunzhi/niucai/common/CommConstants.java Dosyayı Görüntüle

@@ -51,4 +51,9 @@ public class CommConstants {
51 51
      * 支付成功
52 52
      */
53 53
     public final static String TRADE_STATUS_SUCCESS = "TRADE_SUCCESS";
54
+
55
+    /**
56
+     * 支付成功
57
+     */
58
+    public final static String WX_TRADE_STATUS_SUCCESS = "SUCCESS";
54 59
 }

+ 22
- 80
src/main/java/com/yunzhi/niucai/controller/TaWxpayController.java Dosyayı Görüntüle

@@ -1,24 +1,21 @@
1 1
 package com.yunzhi.niucai.controller;
2 2
 
3
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
-import com.baomidou.mybatisplus.core.metadata.IPage;
5
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
3
+import com.github.binarywang.wxpay.exception.WxPayException;
6 4
 import com.yunzhi.niucai.common.BaseController;
7 5
 import com.yunzhi.niucai.common.ResponseBean;
6
+import com.yunzhi.niucai.entity.TaOrder;
7
+import com.yunzhi.niucai.service.ITaWxpayService;
8 8
 import io.swagger.annotations.Api;
9 9
 import io.swagger.annotations.ApiOperation;
10 10
 import io.swagger.annotations.ApiParam;
11
+import org.apache.commons.io.IOUtils;
11 12
 import org.slf4j.Logger;
12 13
 import org.slf4j.LoggerFactory;
13 14
 import org.springframework.beans.factory.annotation.Autowired;
14
-import org.springframework.web.bind.annotation.PathVariable;
15
-import org.springframework.web.bind.annotation.RequestBody;
16
-import org.springframework.web.bind.annotation.RequestMapping;
17
-import org.springframework.web.bind.annotation.RequestMethod;
18
-import org.springframework.web.bind.annotation.RequestParam;
19
-import com.yunzhi.niucai.service.ITaWxpayService;
20
-import com.yunzhi.niucai.entity.TaWxpay;
21
-import org.springframework.web.bind.annotation.RestController;
15
+import org.springframework.web.bind.annotation.*;
16
+
17
+import javax.servlet.http.HttpServletRequest;
18
+import java.io.IOException;
22 19
 
23 20
 /**
24 21
  * <p>
@@ -39,81 +36,26 @@ public class TaWxpayController extends BaseController {
39 36
     @Autowired
40 37
     public ITaWxpayService iTaWxpayService;
41 38
 
42
-
43
-    /**
44
-     * 分页查询列表
45
-     * @param pageNum
46
-     * @param pageSize
47
-     * @return
48
-     */
49
-    @RequestMapping(value="/taWxpay",method= RequestMethod.GET)
50
-    @ApiOperation(value="列表", notes = "列表", httpMethod = "GET", response = ResponseBean.class)
51
-    public ResponseBean taWxpayList(@ApiParam("页码") @RequestParam(value ="pageNum",defaultValue = "1") Integer pageNum,
52
-									 @ApiParam("单页数据量") @RequestParam(value ="pageSize",defaultValue = "10") Integer pageSize) throws Exception{
53
-
54
-		    IPage<TaWxpay> pg = new Page<>(pageNum, pageSize);
55
-            QueryWrapper<TaWxpay> queryWrapper = new QueryWrapper<>();
56
-            queryWrapper.orderByDesc("create_date");
57
-
58
-            IPage<TaWxpay> result = iTaWxpayService.page(pg, queryWrapper);
59
-            return ResponseBean.success(result);
60
-    }
61
-
62 39
     /**
63
-     * 保存对象
64
-     * @param taWxpay 实体对象
40
+     * 手机app获取唤醒支付宝的参数
41
+     * @param request
42
+     * @param taOrder
65 43
      * @return
44
+     * @throws Exception
66 45
      */
67
-    @RequestMapping(value="/taWxpay",method= RequestMethod.POST)
68
-    @ApiOperation(value="保存", notes = "保存", httpMethod = "POST", response = ResponseBean.class)
69
-    public ResponseBean taWxpayAdd(@ApiParam("保存内容") @RequestBody TaWxpay taWxpay) throws Exception{
70
-
71
-        if (iTaWxpayService.save(taWxpay)){
72
-            return ResponseBean.success(taWxpay);
73
-        }else {
74
-            return ResponseBean.error("保存失败, 请重试", ResponseBean.ERROR_UNAVAILABLE);
75
-        }
76
-    }
77
-
78
-    /**
79
-     * 根据id删除对象
80
-     * @param id  实体ID
81
-     */
82
-    @RequestMapping(value="/taWxpay/{id}", method= RequestMethod.DELETE)
83
-    @ApiOperation(value="删除", notes = "删除", httpMethod = "DELETE", response = ResponseBean.class)
84
-    public ResponseBean taWxpayDelete(@ApiParam("对象ID") @PathVariable Integer id) throws Exception{
85
-        if(iTaWxpayService.removeById(id)){
86
-            return ResponseBean.success("success");
87
-        }else {
88
-            return ResponseBean.error("删除失败, 请重试", ResponseBean.ERROR_UNAVAILABLE);
89
-        }
90
-    }
91
-
92
-    /**
93
-     * 修改对象
94
-     * @param id  实体ID
95
-     * @param taWxpay 实体对象
96
-     * @return
97
-     */
98
-    @RequestMapping(value="/taWxpay/{id}",method= RequestMethod.PUT)
99
-    @ApiOperation(value="更新", notes = "更新", httpMethod = "PUT", response = ResponseBean.class)
100
-    public ResponseBean taWxpayUpdate(@ApiParam("对象ID") @PathVariable Integer id,
101
-                                        @ApiParam("更新内容") @RequestBody TaWxpay taWxpay) throws Exception{
102
-
103
-        if (iTaWxpayService.updateById(taWxpay)){
104
-            return ResponseBean.success(iTaWxpayService.getById(id));
105
-        }else {
106
-            return ResponseBean.error("修改失败, 请重试", ResponseBean.ERROR_UNAVAILABLE);
107
-        }
46
+    @PostMapping("/app/wxpay/order")
47
+    @ApiOperation(value = "创建订单", notes = "创建订单", httpMethod = "POST", response = ResponseBean.class)
48
+    public ResponseBean create(HttpServletRequest request,@ApiParam("下单记录") @RequestBody TaOrder taOrder) throws Exception {
49
+        return iTaWxpayService.orderPaying(taOrder,request.getRemoteAddr(),request.getHeader("user-agent"));
108 50
     }
109 51
 
110 52
     /**
111
-     * 根据id查询对象
112
-     * @param id  实体ID
53
+     * 支付成功回调
54
+     * @param request
113 55
      */
114
-    @RequestMapping(value="/taWxpay/{id}",method= RequestMethod.GET)
115
-    @ApiOperation(value="详情", notes = "详情", httpMethod = "GET", response = ResponseBean.class)
116
-    public ResponseBean taWxpayGet(@ApiParam("对象ID") @PathVariable Integer id) throws Exception{
117
-        return ResponseBean.success(iTaWxpayService.getById(id));
56
+    @GetMapping("/app/callback/wxpay/pay")
57
+    public String callback(HttpServletRequest request) throws IOException, WxPayException {
58
+        String xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
59
+        return iTaWxpayService.payCallback(xmlResult);
118 60
     }
119 61
 }

+ 6
- 2
src/main/java/com/yunzhi/niucai/entity/TaOrder.java Dosyayı Görüntüle

@@ -1,8 +1,8 @@
1 1
 package com.yunzhi.niucai.entity;
2 2
 
3 3
 import com.baomidou.mybatisplus.annotation.IdType;
4
-import java.time.LocalDateTime;
5 4
 
5
+import java.time.LocalDateTime;
6 6
 import com.baomidou.mybatisplus.annotation.TableField;
7 7
 import com.baomidou.mybatisplus.annotation.TableId;
8 8
 import java.io.Serializable;
@@ -14,6 +14,7 @@ import lombok.Data;
14 14
 import lombok.EqualsAndHashCode;
15 15
 import lombok.experimental.Accessors;
16 16
 
17
+
17 18
 /**
18 19
  * <p>
19 20
  * 订单主表 
@@ -55,9 +56,12 @@ public class TaOrder implements Serializable {
55 56
     @ApiModelProperty(value = "创建时间")
56 57
     private LocalDateTime createDate;
57 58
 
58
-    @ApiModelProperty(value = "状态 1已支付,3支付中,0未支付")
59
+    @ApiModelProperty(value = "状态")
59 60
     private Integer status;
60 61
 
62
+    @ApiModelProperty(value = "支付状态 1已支付,3支付中,0未支付")
63
+    private Integer payStatus;
64
+
61 65
     @ApiModelProperty(value = "商户网站唯一订单号")
62 66
     private String outTradeNo;
63 67
 

+ 7
- 3
src/main/java/com/yunzhi/niucai/entity/TaShopApp.java Dosyayı Görüntüle

@@ -2,14 +2,15 @@ package com.yunzhi.niucai.entity;
2 2
 
3 3
 import com.baomidou.mybatisplus.annotation.IdType;
4 4
 import com.baomidou.mybatisplus.annotation.TableId;
5
-import java.time.LocalDateTime;
6
-import java.io.Serializable;
7 5
 import io.swagger.annotations.ApiModel;
8 6
 import io.swagger.annotations.ApiModelProperty;
9 7
 import lombok.Data;
10 8
 import lombok.EqualsAndHashCode;
11 9
 import lombok.experimental.Accessors;
12 10
 
11
+import java.io.Serializable;
12
+import java.time.LocalDateTime;
13
+
13 14
 /**
14 15
  * <p>
15 16
  * 门店应用表 
@@ -54,9 +55,12 @@ public class TaShopApp implements Serializable {
54 55
     @ApiModelProperty(value = "支付宝应用刷新token最后使用时间")
55 56
     private LocalDateTime updateTokenDate;
56 57
 
57
-    @ApiModelProperty(value = "对应的alipay应用")
58
+    @ApiModelProperty(value = "支付宝主键id")
58 59
     private String alipayId;
59 60
 
60 61
     @ApiModelProperty(value = "Token 有效期, 单位秒")
61 62
     private String expiresIn;
63
+
64
+    @ApiModelProperty(value = "微信子商户id")
65
+    private String subMchId;
62 66
 }

+ 6
- 2
src/main/java/com/yunzhi/niucai/entity/TaWxpay.java Dosyayı Görüntüle

@@ -2,11 +2,12 @@ package com.yunzhi.niucai.entity;
2 2
 
3 3
 import com.baomidou.mybatisplus.annotation.IdType;
4 4
 import com.baomidou.mybatisplus.annotation.TableId;
5
-import java.io.Serializable;
6 5
 import lombok.Data;
7 6
 import lombok.EqualsAndHashCode;
8 7
 import lombok.experimental.Accessors;
9 8
 
9
+import java.io.Serializable;
10
+
10 11
 /**
11 12
  * <p>
12 13
  * 微信商户应用信息 
@@ -38,5 +39,8 @@ public class TaWxpay implements Serializable {
38 39
      */
39 40
     private String mchId;
40 41
 
41
-
42
+    /**
43
+     * 回调地址
44
+     */
45
+    private String notifyUrl;
42 46
 }

+ 12
- 0
src/main/java/com/yunzhi/niucai/service/ITaWxpayService.java Dosyayı Görüntüle

@@ -1,5 +1,8 @@
1 1
 package com.yunzhi.niucai.service;
2 2
 
3
+import com.github.binarywang.wxpay.exception.WxPayException;
4
+import com.yunzhi.niucai.common.ResponseBean;
5
+import com.yunzhi.niucai.entity.TaOrder;
3 6
 import com.yunzhi.niucai.entity.TaWxpay;
4 7
 import com.baomidou.mybatisplus.extension.service.IService;
5 8
 
@@ -13,4 +16,13 @@ import com.baomidou.mybatisplus.extension.service.IService;
13 16
  */
14 17
 public interface ITaWxpayService extends IService<TaWxpay> {
15 18
 
19
+    /**
20
+     * 微信支付H5下单操作
21
+     * @param taOrder
22
+     * @param remoteAddr
23
+     * @return
24
+     */
25
+    ResponseBean orderPaying(TaOrder taOrder, String remoteAddr, String agent) throws WxPayException;
26
+
27
+    String payCallback(String xmlResult) throws WxPayException;
16 28
 }

+ 3
- 3
src/main/java/com/yunzhi/niucai/service/impl/TaAlipayServiceImpl.java Dosyayı Görüntüle

@@ -74,7 +74,7 @@ public class TaAlipayServiceImpl extends ServiceImpl<TaAlipayMapper, TaAlipay> i
74 74
         }
75 75
 
76 76
         taOrder.setOutTradeNo(outTradeNo);
77
-        taOrder.setStatus(CommConstants.SRTATUS_PAYING);
77
+        taOrder.setPayStatus(CommConstants.SRTATUS_PAYING);
78 78
         return taOrderService.updateById(taOrder);
79 79
     }
80 80
 
@@ -90,12 +90,12 @@ public class TaAlipayServiceImpl extends ServiceImpl<TaAlipayMapper, TaAlipay> i
90 90
         taOrder.setUpdateDate(LocalDateTime.now());
91 91
         // 支付失败
92 92
         if (!tradeStatus.equals(CommConstants.TRADE_STATUS_SUCCESS)){
93
-            taOrder.setStatus(CommConstants.SRTATUS_UNPAYED);
93
+            taOrder.setPayStatus(CommConstants.SRTATUS_UNPAYED);
94 94
             taOrderService.updateById(taOrder);
95 95
             return;
96 96
         }
97 97
         //支付成功 更新为已支付状态
98
-        taOrder.setStatus(CommConstants.SRTATUS_EFFECTIVE);
98
+        taOrder.setPayStatus(CommConstants.SRTATUS_EFFECTIVE);
99 99
         taOrder.setTradeNo(tradeNo);
100 100
         taOrderService.updateById(taOrder);
101 101
     }

+ 87
- 1
src/main/java/com/yunzhi/niucai/service/impl/TaWxpayServiceImpl.java Dosyayı Görüntüle

@@ -1,11 +1,28 @@
1 1
 package com.yunzhi.niucai.service.impl;
2 2
 
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
5
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
6
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
7
+import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
8
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
9
+import com.github.binarywang.wxpay.exception.WxPayException;
10
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
11
+import com.yunzhi.niucai.common.CommConstants;
12
+import com.yunzhi.niucai.common.ResponseBean;
13
+import com.yunzhi.niucai.entity.TaOrder;
3 14
 import com.yunzhi.niucai.entity.TaWxpay;
4 15
 import com.yunzhi.niucai.mapper.TaWxpayMapper;
16
+import com.yunzhi.niucai.service.ITaOrderService;
5 17
 import com.yunzhi.niucai.service.ITaWxpayService;
6
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
18
+import com.yunzhi.niucai.wxPay.WxpayFactory;
19
+import org.springframework.beans.factory.annotation.Autowired;
7 20
 import org.springframework.stereotype.Service;
8 21
 
22
+import java.math.BigInteger;
23
+import java.security.SecureRandom;
24
+import java.time.LocalDateTime;
25
+
9 26
 /**
10 27
  * <p>
11 28
  * 微信商户应用信息  服务实现类
@@ -17,4 +34,73 @@ import org.springframework.stereotype.Service;
17 34
 @Service
18 35
 public class TaWxpayServiceImpl extends ServiceImpl<TaWxpayMapper, TaWxpay> implements ITaWxpayService {
19 36
 
37
+    @Autowired
38
+    private WxpayFactory wxpayFactory;
39
+    @Autowired
40
+    private ITaOrderService taOrderService;
41
+
42
+    /**
43
+     * 微信支付H5下单操作
44
+     *
45
+     * @param taOrder
46
+     * @param remoteAddr
47
+     * @return
48
+     */
49
+    @Override
50
+    public ResponseBean orderPaying(TaOrder taOrder, String remoteAddr, String agent) throws WxPayException {
51
+        // 获取微信支付服务
52
+        WxPayServiceImpl wxPayService = wxpayFactory.getService(taOrder.getShopId());
53
+        // 下单
54
+        String outTradeNo = taOrder.getOrderId() + "-" + randomString(3);
55
+        String subject = "微信支付";
56
+        WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
57
+        orderRequest.setBody(subject);
58
+        orderRequest.setOutTradeNo(outTradeNo);
59
+        orderRequest.setTotalFee(taOrder.getCharge());//元转成分
60
+        orderRequest.setOpenid("openId");
61
+        orderRequest.setSpbillCreateIp(remoteAddr);
62
+        orderRequest.setTradeType("MWEB");
63
+        String type = agent.contains("iPhone")||agent.contains("iPod")||agent.contains("iPad") ? "IOS" : "Android";
64
+        orderRequest.setSceneInfo("{\"h5_info\": {\"type\":\""+type+"\",\"app_name\": \"牛彩\",\"bundle_id\": \"com.tencent.wzryIOS\"}}");
65
+        WxPayMwebOrderResult result = wxPayService.createOrder(orderRequest);
66
+
67
+        // 更新状态
68
+        taOrder.setOutTradeNo(outTradeNo);
69
+        taOrder.setPayStatus(CommConstants.SRTATUS_PAYING);
70
+        taOrderService.updateById(taOrder);
71
+        return ResponseBean.success(result);
72
+    }
73
+
74
+    @Override
75
+    public String payCallback(String xmlResult) throws WxPayException {
76
+        // 获取微信支付服务
77
+        WxPayOrderNotifyResult result = WxPayOrderNotifyResult.fromXML(xmlResult);
78
+
79
+        // 加入自己处理订单的业务逻辑,需要判断订单是否已经支付过,否则可能会重复调用
80
+        String outTradeNo = result.getOutTradeNo();
81
+        String tradeNo = result.getTransactionId();
82
+        TaOrder taOrder = taOrderService.getOne(new QueryWrapper<TaOrder>().eq("out_trade_no", outTradeNo));
83
+        taOrder.setUpdateDate(LocalDateTime.now());
84
+        // 支付失败
85
+        if (!result.getResultCode().equals(CommConstants.WX_TRADE_STATUS_SUCCESS)){
86
+            taOrder.setPayStatus(CommConstants.SRTATUS_UNPAYED);
87
+            taOrderService.updateById(taOrder);
88
+            return WxPayNotifyResponse.success("处理成功");
89
+        }
90
+        //支付成功 更新为已支付状态
91
+        taOrder.setPayStatus(CommConstants.SRTATUS_EFFECTIVE);
92
+        taOrder.setTradeNo(tradeNo);
93
+        taOrderService.updateById(taOrder);
94
+        return WxPayNotifyResponse.success("处理成功!");
95
+    }
96
+
97
+    /**
98
+     * 生成随机数
99
+     * @param length
100
+     * @return
101
+     */
102
+    public String randomString(int length) {
103
+        String str = new BigInteger(130, new SecureRandom()).toString(32);
104
+        return str.substring(0, length);
105
+    }
20 106
 }

+ 36
- 0
src/main/java/com/yunzhi/niucai/wxPay/WxpayFactory.java Dosyayı Görüntüle

@@ -0,0 +1,36 @@
1
+package com.yunzhi.niucai.wxPay;
2
+
3
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
4
+import com.github.binarywang.wxpay.config.WxPayConfig;
5
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
6
+import com.yunzhi.niucai.entity.TaShopApp;
7
+import com.yunzhi.niucai.entity.TaWxpay;
8
+import com.yunzhi.niucai.service.ITaShopAppService;
9
+import com.yunzhi.niucai.service.ITaWxpayService;
10
+import org.apache.commons.lang3.StringUtils;
11
+import org.springframework.beans.factory.annotation.Autowired;
12
+import org.springframework.stereotype.Component;
13
+
14
+@Component
15
+public class WxpayFactory {
16
+
17
+    @Autowired
18
+    ITaShopAppService iTaShopAppService;
19
+
20
+    @Autowired
21
+    ITaWxpayService iTaWxpayService;
22
+
23
+    public WxPayServiceImpl getService(Integer shopId) {
24
+        // 写死, 取第一个
25
+        TaWxpay wxpay = iTaWxpayService.getById(1);
26
+        // 获取子商户号
27
+        TaShopApp shopApp = iTaShopAppService.getOne(new QueryWrapper<TaShopApp>().eq("shop_id", shopId));
28
+        final WxPayServiceImpl wxPayService = new WxPayServiceImpl();
29
+        WxPayConfig payConfig = new WxPayConfig();
30
+        payConfig.setAppId(StringUtils.trimToNull(wxpay.getAppid()));
31
+        payConfig.setMchId(StringUtils.trimToNull(wxpay.getMchId()));
32
+        payConfig.setSubMchId(StringUtils.trimToNull(shopApp.getSubMchId()));
33
+        wxPayService.setConfig(payConfig);
34
+        return wxPayService;
35
+    }
36
+}