xiongzhu há 4 anos atrás
pai
commit
6132f6ef78

+ 17 - 0
src/main/java/com/izouma/nineth/dto/Balance.java

@@ -0,0 +1,17 @@
+package com.izouma.nineth.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Balance {
+    private BigDecimal acct_balance;
+    private BigDecimal avl_balance;
+    private BigDecimal frz_balance;
+    private BigDecimal last_avl_balance;
+}

+ 12 - 0
src/main/java/com/izouma/nineth/service/AdapayService.java

@@ -6,6 +6,7 @@ import com.huifu.adapay.core.exception.BaseAdaPayException;
 import com.huifu.adapay.model.AdapayCommon;
 import com.huifu.adapay.model.SettleAccount;
 import com.izouma.nineth.config.AdapayProperties;
+import com.izouma.nineth.dto.Balance;
 import com.izouma.nineth.exception.BusinessException;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -66,6 +67,17 @@ public class AdapayService {
         checkSuccess(settleCount);
     }
 
+    public Balance queryBalance(String memberId, String settleAccountId) throws BaseAdaPayException {
+        Map<String, Object> queryParams = new HashMap<>();
+        queryParams.put("settle_account_id", settleAccountId);
+        queryParams.put("member_id", memberId);
+        queryParams.put("app_id", adapayProperties.getAppId());
+        Map<String, Object> settleCount = SettleAccount.balance(queryParams);
+        String json = JSON.toJSONString(settleCount, SerializerFeature.PrettyFormat);
+        log.info("queryBalance\n{}", JSON.toJSONString(settleCount, SerializerFeature.PrettyFormat));
+        checkSuccess(settleCount);
+        return JSON.parseObject(json, Balance.class);
+    }
 
     public void checkSuccess(Map<String, Object> map) {
         if (!"succeeded".equals(MapUtils.getString(map, "status"))) {

+ 5 - 1
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -15,6 +15,7 @@ import com.izouma.nineth.utils.JpaUtils;
 import com.izouma.nineth.utils.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.context.ApplicationContext;
 import org.springframework.data.domain.Page;
@@ -135,6 +136,10 @@ public class AssetService {
 
     public void consignment(Long id, BigDecimal price) {
         Asset asset = assetRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+        User owner = userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
+        if (StringUtils.isBlank(owner.getSettleAccountId())) {
+            throw new BusinessException("请先绑定银行卡");
+        }
         if (asset.isConsignment()) {
             throw new BusinessException("已寄售,请勿重新操作");
         }
@@ -144,7 +149,6 @@ public class AssetService {
         if (asset.isPublicShow()) {
             cancelPublic(asset);
         }
-        User owner = userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("用户不存在"));
         Collection collection = Collection.builder()
                 .name(asset.getName())
                 .pic(asset.getPic())

+ 69 - 3
src/main/java/com/izouma/nineth/service/OrderService.java

@@ -2,6 +2,7 @@ package com.izouma.nineth.service;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradeWapPayRequest;
 import com.github.binarywang.wxpay.bean.order.WxPayMpOrderResult;
@@ -11,8 +12,12 @@ 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.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.Payment;
+import com.izouma.nineth.config.AdapayProperties;
 import com.izouma.nineth.config.AlipayProperties;
 import com.izouma.nineth.config.WxPayProperties;
+import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.*;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.enums.*;
@@ -38,9 +43,7 @@ import javax.transaction.Transactional;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.time.LocalDateTime;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Optional;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Service
@@ -65,6 +68,7 @@ public class OrderService {
     private CollectionService             collectionService;
     private RedisTemplate<String, Object> redisTemplate;
     private CommissionRecordRepo          commissionRecordRepo;
+    private AdapayProperties              adapayProperties;
 
     public Page<Order> all(PageQuery pageQuery) {
         return orderRepo.findAll(JpaUtils.toSpecification(pageQuery, Order.class), JpaUtils.toPageRequest(pageQuery));
@@ -238,6 +242,68 @@ public class OrderService {
 
     }
 
+    public Object payAdapay(Long id, String payChannel, String openId) throws BaseAdaPayException {
+        Order order = orderRepo.findByIdAndDelFalse(id).orElseThrow(new BusinessException("订单不存在"));
+        Collection collection = collectionRepo.findById(order.getCollectionId())
+                .orElseThrow(new BusinessException("藏品不存在"));
+        User invitor = userRepo.findById(order.getInvitor()).orElse(null);
+        if (order.getStatus() != OrderStatus.NOT_PAID) {
+            throw new BusinessException("订单状态错误");
+        }
+
+        Map<String, Object> paymentParams = new HashMap<>();
+        paymentParams.put("order_no", String.valueOf(new SnowflakeIdWorker(0, 0).nextId()));
+        paymentParams.put("pay_amt", order.getTotalPrice().setScale(2, RoundingMode.HALF_UP).toPlainString());
+        paymentParams.put("app_id", adapayProperties.getAppId());
+        paymentParams.put("pay_channel", payChannel);
+        paymentParams.put("goods_title", collection.getName());
+
+        List<Map<String, Object>> divMembers = new ArrayList<>();
+        BigDecimal restAmount = order.getTotalPrice().setScale(2, RoundingMode.HALF_UP);
+
+        if (collection.getSource().equals(CollectionSource.TRANSFER)) {
+            Asset asset = assetRepo.findById(collection.getAssetId()).orElseThrow(new BusinessException("无记录"));
+            User owner = userRepo.findById(asset.getUserId()).orElseThrow(new BusinessException("拥有者用户不存在"));
+
+            restAmount = divMoney(order.getTotalPrice(), restAmount, divMembers, "0",
+                    collection.getServiceCharge() + collection.getRoyalties(), true);
+            restAmount = divMoney(order.getTotalPrice(), restAmount, divMembers, owner.getMemberId(),
+                    -1, false);
+        } else {
+            if (invitor != null) {
+                restAmount = divMoney(order.getTotalPrice(), restAmount, divMembers, invitor.getMemberId(),
+                        invitor.getShareRatio().intValue(), false);
+            }
+            restAmount = divMoney(order.getTotalPrice(), restAmount, divMembers, "0",
+                    -1, true);
+        }
+        paymentParams.put("div_members", JSON.toJSONString(divMembers));
+        if (restAmount.compareTo(BigDecimal.ZERO) != 0) {
+            log.error("分账出错 {}", JSON.toJSONString(divMembers, SerializerFeature.PrettyFormat));
+            throw new BusinessException("分账出错");
+        }
+
+        Map<String, Object> response = Payment.create(paymentParams);
+        return response;
+    }
+
+    private BigDecimal divMoney(BigDecimal totalAmount, BigDecimal restAmount, List<Map<String, Object>> divMembers,
+                                String memberId, int ratio, boolean feeFlag) {
+        if (ratio == -1 || (ratio > 0 && ratio < 100)) {
+            BigDecimal divAmount = ratio == -1 ? restAmount :
+                    totalAmount.multiply(BigDecimal.valueOf(ratio))
+                            .divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP);
+            Map<String, Object> divMem = new HashMap<>();
+            divMem.put("member_id", memberId);
+            divMem.put("amount", divAmount.toPlainString());
+            divMem.put("fee_flag", feeFlag ? "Y" : "N");
+            divMembers.add(divMem);
+            return restAmount.subtract(divAmount);
+        } else {
+            throw new BusinessException("分账比例错误");
+        }
+    }
+
     @Transactional
     public void notifyOrder(Long orderId, PayMethod payMethod, String transactionId) {
         Order order = orderRepo.findById(orderId).orElseThrow(new BusinessException("订单不存在"));

+ 5 - 6
src/main/java/com/izouma/nineth/service/UserService.java

@@ -410,18 +410,17 @@ public class UserService {
         IdentityAuth identityAuth = identityAuthRepo.findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(userId, AuthStatus.SUCCESS)
                 .orElseThrow(new BusinessException("用户未认证"));
         if (identityAuth.isOrg()) {
-            throw new BusinessException("请绑定对公账户");
+            //throw new BusinessException("企业认证用户请绑定对公账户");
         }
         if (StringUtils.isEmpty(user.getMemberId())) {
-            user.setMemberId(adapayService.createMember(userId, user.getPhone(), identityAuth.getRealName(), identityAuth.getIdNo()));
+            user.setMemberId(adapayService.createMember(userId, user.getPhone(), identityAuth.getRealName(),
+                    identityAuth.getIdNo()));
             userRepo.save(user);
         }
         smsService.verify(phone, code);
-        String accountId = adapayService.createSettleAccount(user.getMemberId(), identityAuth.getRealName(), identityAuth.getIdNo(),
-                phone, bankNo);
-
+        String accountId = adapayService.createSettleAccount(user.getMemberId(), identityAuth.getRealName(),
+                identityAuth.getIdNo(), phone, bankNo);
         user.setSettleAccountId(accountId);
         userRepo.save(user);
     }
-
 }

+ 5 - 0
src/main/java/com/izouma/nineth/web/OrderNotifyController.java

@@ -107,4 +107,9 @@ public class OrderNotifyController {
         }
         return WxPayNotifyResponse.success("OK");
     }
+
+    @PostMapping("/adapay")
+    public void adapayNotify(HttpServletRequest request) {
+        log.info("adapay notify: \n{}", JSON.toJSONString(request.getParameterMap(), PrettyFormat));
+    }
 }

+ 6 - 0
src/main/java/com/izouma/nineth/web/UserController.java

@@ -1,5 +1,6 @@
 package com.izouma.nineth.web;
 
+import com.huifu.adapay.core.exception.BaseAdaPayException;
 import com.izouma.nineth.domain.User;
 import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.dto.UserBankCard;
@@ -214,6 +215,11 @@ public class UserController extends BaseController {
     public List<UserBankCard> myBankCard() {
         return userBankCardRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId());
     }
+
+    @PostMapping("/addBankCard")
+    public void addBankCard(@RequestParam String bankNo, @RequestParam String phone, @RequestParam String code) throws BaseAdaPayException {
+        userService.addBankCard(SecurityUtils.getAuthenticatedUser().getId(), bankNo, phone, code);
+    }
 }
 
 

+ 0 - 25
src/test/java/com/izouma/nineth/AdapayTest.java

@@ -1,25 +0,0 @@
-package com.izouma.nineth;
-
-import com.alibaba.fastjson.JSON;
-import com.huifu.adapay.core.exception.BaseAdaPayException;
-import com.huifu.adapay.model.Payment;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public class AdapayTest extends ApplicationTests {
-    @Test
-    public void testPay() throws BaseAdaPayException {
-        Map<String, Object> paymentParams = new HashMap<String, Object>(10);
-        paymentParams.put("app_id", "app_f8760acc-f4d8-46f6-8f70-d80e36517075");
-        paymentParams.put("order_no", "jsdk_payment" + System.currentTimeMillis());
-        paymentParams.put("pay_channel", "alipay_qr");
-        paymentParams.put("pay_amt", "0.01");
-        paymentParams.put("goods_title", "your goods title");
-        paymentParams.put("goods_desc", "your goods desc");
-        paymentParams.put("div_members", "");
-        Map<String, Object> payment = Payment.create(paymentParams);
-        System.out.println("payment result=" + JSON.toJSONString(payment));
-    }
-}

+ 3 - 3
src/test/java/com/izouma/nineth/CommonTest.java

@@ -1,12 +1,10 @@
 package com.izouma.nineth;
 
-import com.alipay.mychain.sdk.utils.ByteUtils;
 import com.github.kevinsawicki.http.HttpRequest;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.BaseEntity;
 import com.izouma.nineth.domain.BlindBoxItem;
 import com.izouma.nineth.domain.User;
-import com.izouma.nineth.utils.HashUtils;
 import com.izouma.nineth.web.BaseController;
 import io.ipfs.api.IPFS;
 import io.ipfs.api.MerkleNode;
@@ -52,6 +50,8 @@ import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Method;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -369,6 +369,6 @@ public class CommonTest {
 
     @Test
     public void sfsdf() {
-        System.out.println(ByteUtils.hexStringToBytes(HashUtils.Keccak256(UUID.randomUUID().toString())));
+        System.out.println(BigDecimal.valueOf(11111110.5).setScale(2, RoundingMode.HALF_UP).toPlainString());
     }
 }

+ 44 - 1
src/test/java/com/izouma/nineth/service/AdapayServiceTest.java

@@ -1,16 +1,54 @@
 package com.izouma.nineth.service;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.Payment;
 import com.izouma.nineth.ApplicationTests;
 import org.junit.Test;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import static org.junit.Assert.*;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 public class AdapayServiceTest extends ApplicationTests {
     @Autowired
     private AdapayService adapayService;
 
+    @Test
+    public void testPay() throws BaseAdaPayException {
+        Map<String, Object> paymentParams = new HashMap<String, Object>(10);
+        List<Map<String, Object>> divMembers = new ArrayList<>();
+        divMembers.add(new HashMap<>() {{
+            put("member_id", "0");
+            put("amount", BigDecimal.valueOf(0.05));
+            put("fee_flag", "Y");
+        }});
+        divMembers.add(new HashMap<>() {{
+            put("member_id", "1110");
+            put("amount", BigDecimal.valueOf(0.05));
+        }});
+
+        paymentParams.put("app_id", "app_f8760acc-f4d8-46f6-8f70-d80e36517075");
+        paymentParams.put("order_no", "jsdk_payment" + System.currentTimeMillis());
+        paymentParams.put("pay_channel", "wx_pub");
+        paymentParams.put("pay_amt", "0.10");
+        paymentParams.put("goods_title", "your goods title");
+        paymentParams.put("goods_desc", "your goods desc");
+        paymentParams.put("div_members", JSON.toJSONString(divMembers));
+        paymentParams.put("notify_url", "http://9th.frp.izouma.com/notify/adapay");
+
+        Map<String, Object> expend = new HashMap<>();
+        expend.put("open_id", "oWJG55wLnwdVzXoKka1-DzQKOd_Y");
+        paymentParams.put("expend", expend);
+
+        Map<String, Object> payment = Payment.create(paymentParams);
+        System.out.println("payment result=" + JSON.toJSONString(payment, SerializerFeature.PrettyFormat));
+    }
+
     @Test
     public void createMember() throws BaseAdaPayException {
         adapayService.createMember(99999999999999L, "15077886171", "熊竹", "321002199408304614");
@@ -26,4 +64,9 @@ public class AdapayServiceTest extends ApplicationTests {
     public void delSettleAccount() throws BaseAdaPayException {
         adapayService.delSettleAccount("99999999999999", "0288070028826880");
     }
+
+    @Test
+    public void queryBalance() throws BaseAdaPayException {
+        adapayService.queryBalance("1110", "0288514678171392");
+    }
 }