Browse Source

Merge branch 'master' of http://git.izouma.com/xiongzhu/9th

panhui 4 năm trước cách đây
mục cha
commit
9e1eaadf12

+ 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;
 }

+ 5 - 0
src/main/java/com/izouma/nineth/domain/Asset.java

@@ -34,6 +34,11 @@ public class Asset extends BaseEntity {
     @Searchable
     private String name;
 
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = Collection.PropertyListConverter.class)
+    @ApiModelProperty("特性")
+    private List<Collection.CollectionProperty> properties;
+
     @ApiModelProperty("铸造者")
     @Searchable
     private String minter;

+ 5 - 0
src/main/java/com/izouma/nineth/domain/Order.java

@@ -46,6 +46,11 @@ public class Order extends BaseEntity {
     @Column(columnDefinition = "TEXT")
     private List<String> pic;
 
+    @Column(columnDefinition = "TEXT")
+    @Convert(converter = Collection.PropertyListConverter.class)
+    @ApiModelProperty("特性")
+    private List<Collection.CollectionProperty> properties;
+
     @ApiModelProperty("铸造者")
     @Searchable
     private String minter;

+ 7 - 3
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.service;
 
 import com.izouma.nineth.domain.Asset;
+import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Order;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.NFT;
@@ -9,6 +10,7 @@ import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.AssetStatus;
 import com.izouma.nineth.exception.BusinessException;
 import com.izouma.nineth.repo.AssetRepo;
+import com.izouma.nineth.repo.CollectionRepo;
 import com.izouma.nineth.repo.UserRepo;
 import com.izouma.nineth.utils.JpaUtils;
 import lombok.AllArgsConstructor;
@@ -23,9 +25,9 @@ import org.springframework.stereotype.Service;
 @Slf4j
 public class AssetService {
 
-    private AssetRepo  assetRepo;
-    private UserRepo   userRepo;
-    private NFTService nftService;
+    private AssetRepo      assetRepo;
+    private UserRepo       userRepo;
+    private NFTService     nftService;
 
     public Page<Asset> all(PageQuery pageQuery) {
         return assetRepo.findAll(JpaUtils.toSpecification(pageQuery, Asset.class), JpaUtils.toPageRequest(pageQuery));
@@ -50,7 +52,9 @@ public class AssetService {
                     .minter(order.getMinter())
                     .minterId(order.getMinterId())
                     .minterAvatar(order.getMinterAvatar())
+                    .name(order.getName())
                     .pic(order.getPic())
+                    .properties(order.getProperties())
                     .tokenId(nft.getTokenId())
                     .blockNumber(nft.getBlockNumber())
                     .txHash(nft.getTxHash())

+ 65 - 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) {
@@ -81,6 +95,7 @@ public class OrderService {
                 .collectionId(collectionId)
                 .name(collection.getName())
                 .pic(collection.getPics())
+                .properties(collection.getProperties())
                 .minter(minter.getNickname())
                 .minterAvatar(minter.getAvatar())
                 .qty(qty)
@@ -137,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) {

+ 10 - 6
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_h5")
+    public String payOrderWeixinH5(@RequestParam Long id) throws WxPayException, EncoderException {
+        return orderService.payOrderWeixinH5(id);
+    }
+
     @RequestMapping(value = "/weixin")
-    public Object payOrderWeixin(@RequestParam Long id) {
+    @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();
+        }
     }
 }