浏览代码

微信支付

xiongzhu 4 年之前
父节点
当前提交
160b996853

+ 5 - 51
src/main/java/com/izouma/nineth/config/WxPayProperties.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.config;
 
+import lombok.Data;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 import org.springframework.boot.context.properties.ConfigurationProperties;
@@ -10,6 +11,7 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
  * @author Binary Wang
  */
 @ConfigurationProperties(prefix = "wx.pay")
+@Data
 public class WxPayProperties {
   /**
    * 设置微信公众号或者小程序等的appid
@@ -41,57 +43,9 @@ public class WxPayProperties {
    */
   private String keyPath;
 
-  public String getAppId() {
-    return this.appId;
-  }
+  private String notifyUrl;
 
-  public void setAppId(String appId) {
-    this.appId = appId;
-  }
+  private String refundNotifyUrl;
 
-  public String getMchId() {
-    return mchId;
-  }
-
-  public void setMchId(String mchId) {
-    this.mchId = mchId;
-  }
-
-  public String getMchKey() {
-    return mchKey;
-  }
-
-  public void setMchKey(String mchKey) {
-    this.mchKey = mchKey;
-  }
-
-  public String getSubAppId() {
-    return subAppId;
-  }
-
-  public void setSubAppId(String subAppId) {
-    this.subAppId = subAppId;
-  }
-
-  public String getSubMchId() {
-    return subMchId;
-  }
-
-  public void setSubMchId(String subMchId) {
-    this.subMchId = subMchId;
-  }
-
-  public String getKeyPath() {
-    return this.keyPath;
-  }
-
-  public void setKeyPath(String keyPath) {
-    this.keyPath = keyPath;
-  }
-
-  @Override
-  public String toString() {
-    return ToStringBuilder.reflectionToString(this,
-        ToStringStyle.MULTI_LINE_STYLE);
-  }
+  private String returnUrl;
 }

+ 64 - 2
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -5,7 +5,14 @@ import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradeWapPayRequest;
+import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
+import com.github.binarywang.wxpay.bean.order.WxPayMwebOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.constant.WxPayConstants;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.izouma.nineth.config.AlipayProperties;
+import com.izouma.nineth.config.WxPayProperties;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.NFTAccount;
 import com.izouma.nineth.dto.PageQuery;
@@ -17,10 +24,15 @@ import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.repo.UserAddressRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
+import com.izouma.nineth.utils.JsonUtils;
+import com.izouma.nineth.utils.SecurityUtils;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.EncoderException;
+import org.apache.commons.codec.net.URLCodec;
 import org.apache.commons.collections.MapUtils;
+import org.apache.http.client.utils.URLEncodedUtils;
 import org.springframework.core.env.Environment;
 import org.springframework.data.domain.Page;
 import org.springframework.stereotype.Service;
@@ -46,6 +58,8 @@ public class OrderService {
     private Environment      env;
     private AlipayClient     alipayClient;
     private AlipayProperties alipayProperties;
+    private WxPayService     wxPayService;
+    private WxPayProperties  wxPayProperties;
     private AssetService     assetService;
 
     public Page<Order> all(PageQuery pageQuery) {
@@ -138,13 +152,61 @@ public class OrderService {
         }
     }
 
-    public Object payOrderWeixin(Long id) {
+    public String payOrderWeixinH5(Long id) throws WxPayException, EncoderException {
         Order order = orderRepo.findByIdAndDelFalse(id).orElseThrow(new BusinessException("订单不存在"));
         if (order.getStatus() != OrderStatus.NOT_PAID) {
             throw new BusinessException("订单状态错误");
         }
 
-        return null;
+        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+        request.setBody(order.getName());
+        request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId()));
+        request.setTotalFee(order.getTotalPrice().multiply(BigDecimal.valueOf(100)).intValue());
+        if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
+            // 测试环境设为1分
+//                    request.setTotalFee(1);
+        }
+        request.setSpbillCreateIp("180.102.110.170");
+        request.setNotifyUrl(wxPayProperties.getNotifyUrl());
+        request.setTradeType(WxPayConstants.TradeType.MWEB);
+        request.setSignType("MD5");
+        JSONObject body = new JSONObject();
+        body.put("action", "payOrder");
+        body.put("userId", order.getUserId());
+        body.put("orderId", order.getId());
+        request.setAttach(body.toJSONString());
+
+        WxPayMwebOrderResult result = wxPayService.createOrder(request);
+
+        return result.getMwebUrl() + "&redirect_url=" + new URLCodec().encode(wxPayProperties.getReturnUrl());
+    }
+
+    public Object payOrderWeixin(Long id) throws WxPayException {
+        Order order = orderRepo.findByIdAndDelFalse(id).orElseThrow(new BusinessException("订单不存在"));
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+
+        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+        request.setBody(order.getName());
+        request.setOutTradeNo(String.valueOf(new SnowflakeIdWorker(1, 1).nextId()));
+        request.setTotalFee(order.getTotalPrice().multiply(BigDecimal.valueOf(100)).intValue());
+        if (Arrays.stream(env.getActiveProfiles()).noneMatch(s -> s.equals("prod"))) {
+            // 测试环境设为1分
+//                    request.setTotalFee(1);
+        }
+        request.setSpbillCreateIp("180.102.110.170");
+        request.setNotifyUrl(wxPayProperties.getNotifyUrl());
+        request.setTradeType(WxPayConstants.TradeType.JSAPI);
+        request.setOpenid(SecurityUtils.getAuthenticatedUser().getOpenId());
+        request.setSignType("MD5");
+        JSONObject body = new JSONObject();
+        body.put("action", "payOrder");
+        body.put("userId", order.getUserId());
+        body.put("orderId", order.getId());
+        request.setAttach(body.toJSONString());
+
+        return wxPayService.<WxPayMpOrderResult>createOrder(request);
     }
 
     public void notifyAlipay(Long orderId, Map<String, String> params) {

+ 11 - 7
src/main/java/com/izouma/nineth/web/OrderPayController.java

@@ -1,14 +1,13 @@
 package com.izouma.nineth.web;
 
+import com.github.binarywang.wxpay.exception.WxPayException;
 import com.izouma.nineth.service.OrderService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.EncoderException;
 import org.springframework.stereotype.Controller;
 import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestHeader;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.*;
 
 import java.util.regex.Pattern;
 
@@ -32,9 +31,14 @@ public class OrderPayController {
         return "AlipayHtml";
     }
 
-    @RequestMapping(value = "/weixin")
-    public Object payOrderWeixin(@RequestParam Long id) {
-        return orderService.payOrderWeixin(id);
+    @RequestMapping(value = "/weixin_h5")
+    public String payOrderWeixinH5(@RequestParam Long id) throws WxPayException, EncoderException {
+        return orderService.payOrderWeixinH5(id);
     }
 
+    @RequestMapping(value = "/weixinh5")
+    @ResponseBody
+    public Object payOrderWeixin(@RequestParam Long id) throws WxPayException {
+        return orderService.payOrderWeixin(id);
+    }
 }

+ 2 - 1
src/main/resources/application.yaml

@@ -69,8 +69,9 @@ wx:
     subAppId: #服务商模式下的子商户公众账号ID
     subMchId: #服务商模式下的子商户号
     keyPath: classpath:/cert/apiclient_cert.p12
-    notifyUrl: http://zmj.izouma.com/wx/payNotify
+    notifyUrl: http://9th.izouma.com/notify/order/weixin
     refundNotifyUrl: http://zmj.izouma.com/wx/refundNotify
+    returnUrl: http://9th.izouma.com/9th/orders
 storage:
   provider: aliyun
   local_path: /var/www/upload/

+ 9 - 1
src/test/java/com/izouma/nineth/CommonTest.java

@@ -7,10 +7,14 @@ import com.izouma.nineth.security.Authority;
 import com.izouma.nineth.utils.UrlUtils;
 import com.izouma.nineth.web.BaseController;
 import lombok.SneakyThrows;
+import org.apache.commons.codec.EncoderException;
+import org.apache.commons.codec.net.URLCodec;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.text.CaseUtils;
+import org.apache.http.client.utils.URLEncodedUtils;
 import org.apache.poi.util.TempFile;
 import org.bouncycastle.util.encoders.Base64;
+import org.bouncycastle.util.encoders.UrlBase64Encoder;
 import org.junit.Test;
 import org.libjpegturbo.turbojpeg.processor.api.ImageProcessInfo;
 import org.libjpegturbo.turbojpeg.processor.api.ImageProcessor;
@@ -181,6 +185,10 @@ public class CommonTest {
 
     @Test
     public void resolveUrl() {
-        System.out.println(UrlUtils.resolve("http://123123/", "/asdfsd/sdf"));
+        try {
+            System.out.println(new URLCodec().encode("http://www.baidu.com"));
+        } catch (EncoderException e) {
+            e.printStackTrace();
+        }
     }
 }