xiongzhu пре 4 година
родитељ
комит
ba0c078b75

+ 21 - 0
src/main/java/com/izouma/nineth/domain/AdaTrade.java

@@ -0,0 +1,21 @@
+package com.izouma.nineth.domain;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+@Data
+public class AdaTrade {
+    private String 交易时间;
+    private String 订单号;
+    private String 支付流水号;
+    private String 账户号;
+    private String 应用;
+    private String 支付渠道;
+    private String 交易状态;
+    private String 交易金额;
+    private String 手续费金额;
+    private String 第三方订单号;
+    @ExcelProperty("支付宝/微信订单号")
+    private String 支付宝_微信订单号;
+    private String 备注描述;
+}

+ 3 - 0
src/main/java/com/izouma/nineth/repo/AssetRepo.java

@@ -52,4 +52,7 @@ public interface AssetRepo extends JpaRepository<Asset, Long>, JpaSpecificationE
 
     Asset findFirstByTokenId(String tokenId);
 
+    Asset findFirstByTxHashIsNullAndTokenIdNotNullAndStatusOrderByCreatedAt(AssetStatus status);
+
+    List<Asset> findByTxHashIsNullAndTokenIdNotNullAndCreatedAtBefore(LocalDateTime time);
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/GiftOrderRepo.java

@@ -10,4 +10,6 @@ import java.util.List;
 
 public interface GiftOrderRepo extends JpaRepository<GiftOrder, Long>, JpaSpecificationExecutor<GiftOrder> {
     List<GiftOrder> findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus status, LocalDateTime time);
+
+    GiftOrder findByTransactionId(String txId);
 }

+ 2 - 0
src/main/java/com/izouma/nineth/repo/OrderRepo.java

@@ -36,4 +36,6 @@ public interface OrderRepo extends JpaRepository<Order, Long>, JpaSpecificationE
             "where c.minterId = ?1 and c.source = 'OFFICIAL' and o.status <> 'NOT_PAID' and o.status <> 'CANCELLED'")
     long countSales(Long userId);
 
+    Order findByTransactionId(String txId);
+
 }

+ 0 - 1
src/main/java/com/izouma/nineth/security/JwtAuthorizationTokenFilter.java

@@ -78,7 +78,6 @@ public class JwtAuthorizationTokenFilter extends OncePerRequestFilter {
             if (jwtTokenUtil.validateToken(authToken, userDetails)) {
                 UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
                 authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
-                log.info("authorized user '{}', setting security context", username);
                 SecurityContextHolder.getContext().setAuthentication(authentication);
             }
         }

+ 9 - 0
src/main/java/com/izouma/nineth/service/AssetService.java

@@ -24,6 +24,7 @@ import org.springframework.data.domain.Page;
 import org.springframework.data.domain.Pageable;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestParam;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
@@ -371,4 +372,12 @@ public class AssetService {
             return userHistory;
         });
     }
+
+    public String mint() {
+        for (Asset asset : assetRepo.findByTxHashIsNullAndTokenIdNotNullAndCreatedAtBefore(LocalDateTime.now())) {
+            assetMintService.mint(asset);
+        }
+        return "ok";
+    }
+
 }

+ 3 - 0
src/main/java/com/izouma/nineth/service/GiftOrderService.java

@@ -258,6 +258,9 @@ public class GiftOrderService {
 
     @Scheduled(fixedRate = 60000)
     public void batchCancel() {
+        if (Arrays.asList(env.getActiveProfiles()).contains("dev")) {
+            return;
+        }
         List<GiftOrder> orders = giftOrderRepo.findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID,
                 LocalDateTime.now().minusMinutes(5));
         orders.forEach(o -> {

+ 5 - 4
src/main/java/com/izouma/nineth/service/NFTService.java

@@ -63,6 +63,7 @@ public class NFTService {
 
     @Retryable(maxAttempts = 10, backoff = @Backoff(delay = 5000), value = BusinessException.class)
     public synchronized NFT createToken(String toAccount, String tokenId) throws Exception {
+        log.info("开始执行EVM合约mint, toAccount: {}, tokenId: {}", toAccount, tokenId);
         JSONArray jsonArray = new JSONArray();
         jsonArray.add(Utils.getIdentityByName(toAccount));
         jsonArray.add(new BigInteger(tokenId, 16));
@@ -81,7 +82,7 @@ public class NFTService {
                 .build();
         BaseResp resp = restClient.bizChainCallWithReceipt(callRestBizParam);
         if (!resp.isSuccess()) {
-            log.info("EVM合约执行失败: " + resp.getCode() + ", " + resp.getData());
+            log.info("EVM合约执行失败: code: {}, data: {}, toAccount: {}, tokenId: {}", resp.getCode(), resp.getData(), toAccount, tokenId);
         }
         if ("200".equals(resp.getCode())) {
             log.info("EVM合约执行成功");
@@ -94,18 +95,18 @@ public class NFTService {
             log.info("NFT生成成功 {}", nft);
             return nft;
         } else if ("211".equals(resp.getCode())) {
-
+            log.error("EVM合约执行限流");
         } else if ("10201".equals(resp.getCode())) {
             // 异步交易未成功需要根据状态码判断交易状态
             ReceiptDecoration txReceipt = JSON.parseObject(resp.getData(), ReceiptDecoration.class);
             String out = new String(matchAndReplaceNonEnglishChar(txReceipt.getOutput()));
             // 异步交易未成功需要根据状态码判断交易状态
-            log.error("EVM合约执行未成功: {}, {}", resp.getCode(), out);
+            log.error("EVM合约执行未成功: code: {}, out: {}, tokenId: {}", resp.getCode(), out, tokenId);
             if (out.endsWith("ERC721: token already minted")) {
                 return new NFT(txReceipt.getHash(), tokenId, txReceipt.getBlockNumber(), txReceipt.getGasUsed());
             }
         }
-        throw new BusinessException("创建nft失败");
+        throw new BusinessException("执行EVM合约mint失败");
     }
 
     public static byte[] matchAndReplaceNonEnglishChar(byte[] data) {

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

@@ -491,6 +491,9 @@ public class OrderService {
 
     @Scheduled(fixedRate = 30000)
     public void batchCancel() {
+        if (Arrays.asList(env.getActiveProfiles()).contains("dev")) {
+            return;
+        }
         List<Order> orders = orderRepo.findByStatusAndCreatedAtBeforeAndDelFalse(OrderStatus.NOT_PAID,
                 LocalDateTime.now().minusSeconds(210));
         orders.forEach(o -> {

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

@@ -115,6 +115,11 @@ public class AssetController extends BaseController {
     public Page<UserHistory> userHistory(Pageable pageable) {
         return assetService.userHistory(SecurityUtils.getAuthenticatedUser().getId(), pageable);
     }
+
+    @GetMapping("/mint")
+    public String mint( ) {
+        return assetService.mint( );
+    }
 }
 
 

+ 9 - 9
src/main/resources/application.yaml

@@ -11,6 +11,15 @@ server:
 spring:
   profiles:
     active: dev
+  redis:
+    host: 120.78.171.194
+    database: 0
+    password: jV%93RtjUx82Tp
+    lettuce:
+      pool:
+        max_active: 50
+        max_idle: 50
+        min_idle: 0
   datasource:
     url: jdbc:mysql://rm-wz9sc79f5255780opqo.mysql.rds.aliyuncs.com/raex_test?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2b8
     username: raex
@@ -76,15 +85,6 @@ spring:
       hibernate:
         enable_lazy_load_no_trans: true
     open-in-view: true
-  redis:
-    host: 120.78.171.194
-    database: 0
-    password: jV%93RtjUx82Tp
-    lettuce:
-      pool:
-        max_active: 50
-        max_idle: 50
-        min_idle: 0
   servlet:
     multipart:
       max_file_size: 100MB

+ 0 - 103
src/main/resources/logback-spring.xml

@@ -11,10 +11,6 @@
         <root level="INFO">
             <appender-ref ref="CONSOLE"/>
         </root>
-        <logger name="org.hibernate.SQL" level="DEBUG"/>
-        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
-        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
-        <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
         <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
         <!--swagger 类型转换异常日志去除-->
         <logger name="io.swagger.models.parameters.AbstractSerializableParameter" level="ERROR"/>
@@ -88,106 +84,7 @@
         <root level="INFO">
             <appender-ref ref="FILE"/>
         </root>
-        <logger name="org.hibernate.SQL" level="DEBUG"/>
-        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
-        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
-        <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
-        <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
-        <logger name="io.swagger.models.parameters.AbstractSerializableParameter" level="ERROR"/>
-    </springProfile>
-
-    <springProfile name="dev_raex">
-        <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
-            <encoder>
-                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            </encoder>
-        </appender>
-        <root level="INFO">
-            <appender-ref ref="CONSOLE"/>
-        </root>
-        <logger name="org.hibernate.SQL" level="DEBUG"/>
-        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
-        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
-        <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
-        <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
-        <!--swagger 类型转换异常日志去除-->
-        <logger name="io.swagger.models.parameters.AbstractSerializableParameter" level="ERROR"/>
-        <logger name="org.freemarker" level="DEBUG"/>
-
-        <!-- dingding log -->
-        <appender name="HTTP_INVOKE_LOGGER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
-            <param name="append" value="true"/>
-            <param name="encoding" value="UTF-8"/>
-            <param name="threshold" value="INFO"/>
-            <encoder>
-                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            </encoder>
-        </appender>
-
-        <!-- ding open sdk log -->
-        <appender name="DING_OPEN_CLIENT_SDK_LOGGER_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
-            <param name="append" value="true"/>
-            <param name="encoding" value="UTF-8"/>
-            <param name="threshold" value="INFO"/>
-            <encoder>
-                <pattern>${CONSOLE_LOG_PATTERN}</pattern>
-            </encoder>
-        </appender>
-        <logger name="HTTP_INVOKE_LOGGER" additivity="false">
-            <level value="WARN"/>
-            <appender-ref ref="HTTP_INVOKE_LOGGER_APPENDER"/>
-        </logger>
-        <logger name="DING_OPEN_CLIENT_SDK_LOGGER" additivity="false">
-            <level value="WARN"/>
-            <appender-ref ref="DING_OPEN_CLIENT_SDK_LOGGER_APPENDER"/>
-        </logger>
-        <!-- end of dingding log -->
-    </springProfile>
-
-    <springProfile name="test_raex">
-        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-            <encoder>
-                <pattern>${FILE_LOG_PATTERN}</pattern>
-            </encoder>
-            <file>/var/www/9th_test/app.log</file>
-            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-                <fileNamePattern>app.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
-                <maxFileSize>10MB</maxFileSize>
-                <maxHistory>60</maxHistory>
-            </rollingPolicy>
-        </appender>
-        <root level="INFO">
-            <appender-ref ref="FILE"/>
-        </root>
-        <logger name="org.hibernate.SQL" level="DEBUG"/>
-        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
-        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
-        <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
-        <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
-        <logger name="io.swagger.models.parameters.AbstractSerializableParameter" level="ERROR"/>
-    </springProfile>
-
-    <springProfile name="prod_raex">
-        <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-            <encoder>
-                <pattern>${FILE_LOG_PATTERN}</pattern>
-            </encoder>
-            <file>/var/www/9th/app.log</file>
-            <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
-                <fileNamePattern>app.log.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
-                <maxFileSize>10MB</maxFileSize>
-                <maxHistory>60</maxHistory>
-            </rollingPolicy>
-        </appender>
-        <root level="INFO">
-            <appender-ref ref="FILE"/>
-        </root>
-        <logger name="org.hibernate.SQL" level="DEBUG"/>
-        <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE"/>
-        <logger name="org.springframework.jdbc.core.JdbcTemplate" level="DEBUG"/>
-        <logger name="org.springframework.jdbc.core.StatementCreatorUtils" level="TRACE"/>
         <logger name="cn.binarywang.wx.miniapp" level="DEBUG"/>
         <logger name="io.swagger.models.parameters.AbstractSerializableParameter" level="ERROR"/>
     </springProfile>
-
 </configuration>

+ 55 - 131
src/test/java/com/izouma/nineth/service/AdapayServiceTest.java

@@ -4,6 +4,7 @@ import com.alibaba.excel.EasyExcel;
 import com.alibaba.excel.annotation.ExcelProperty;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.huifu.adapay.Adapay;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
@@ -11,174 +12,97 @@ import com.huifu.adapay.model.AdapayCommon;
 import com.huifu.adapay.model.MerConfig;
 import com.huifu.adapay.model.Payment;
 import com.huifu.adapay.model.Refund;
+import com.izouma.nineth.ApplicationTests;
+import com.izouma.nineth.domain.AdaTrade;
+import com.izouma.nineth.repo.GiftOrderRepo;
+import com.izouma.nineth.repo.OrderRepo;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.izouma.nineth.utils.excel.BigIntegerConverter;
 import com.izouma.nineth.utils.excel.LocalDateConverter;
 import com.izouma.nineth.utils.excel.LocalDateTimeConverter;
 import lombok.Data;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
+import java.util.stream.Collectors;
 
-public class AdapayServiceTest {
-    private final String appId = "app_0e8d3acb-3d95-4ebb-8445-e470c378a787";
-
-    public AdapayServiceTest() {
-        Adapay.debug = true;
-        Adapay.prodMode = true;
-
-        MerConfig merConfig = new MerConfig();
-        merConfig.setApiKey("api_live_dc298e47-c0be-4acf-a962-a2c2988e4cae");
-        merConfig.setApiMockKey("api_test_26e9eee7-6695-4169-90a1-203c6d2cf196");
-        merConfig.setRSAPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCLeSEu8CXg4iwpRtAapIGpbuoJdyAh3E2FgIqOJSME/0+DscuIUVzfQzMWgXT98Zd8aKQLmjTWHx6Tg60DCFJzJBkISZYaqF9Oc+YdPe15TINpp5syKDk72WeUEW/jlXiLwKyeFxzCvedbpbdAUi0cP64US/LslGohHGWUrgj/WBR33vgwA2NAHR+ziGp8IhFUXHoWtXdBjwGsWuZ6Wt9mWOVeGIHP6OyUYzhkVuDyFMZ6wlA60PqxPAQrvZG3VP2mSlpWTs7xQHM9nk8Rn2pQDUmexHmKS/wn4XZvl3S9KRs6/l8wDqlBW5QhmEZNRwiOG8n/FpqxUMIhFFj4SSq1AgMBAAECggEAVwmWXbZbzQUXzgJ058t1ZwjiYFnI4ZibgA6BaMdgHUQ+mM6hV0Z/EIzdGtRa8AaOJIMgrGTlSCJPcHshwty0p0oFnRhe5e/g2hKVrfXxdlr7PznrLdfQL7syWkKvcnTar0vj7Rw7RIRCFv1JaIhfwlszBVOIG39a46LW+XvJ/Z5Lk5wB8tkt0xWDUghAU1xP10P8OHcr/x3aFhiyAvmWWr7syYKD1rDAtC+n+6Imb8MvTxwk4Gz1wpM+a7gHeYk2n91yR94G6A2wMSeM80T4hCbYKutD5rkdi5i3hoeIiPiq5qbR0rmI/dudVbGkVT+xkh1z1IsKeYiD2ef4Ddy2QQKBgQDIqOuaml9bnJpKie9Z0ysiPWxc771byxhgx7bwsoJey4x5bcLx+G9IAvkGwWFUl+25jgpeVn/LZ6147e9ozeip7WSKvStniND+CB7SvA5ZDRm7CfqFQub//9Q1DWNfl+ThGAXHMlKgS7DanLqvpUsRdhUOceZwwrdkV93v7by8nQKBgQCx8EdYbxNIEnVI3Y98YCAWtvgBCCa8yurL+9IXe9VKCFGdGRZ4b61GWDNyjUAfiboXY4ByzvX4cdlZ1euVmqMYsEv28xXEFdGxSDpa+oeETbv1U2GEGL4Ups3z28Sx4TGGSyvReyQOhZftIF6vCZtZ8dZMEf8IdxyudJkcJp+u+QKBgBFtemkHF1khlNT8felTSd/DbfH0cIHUdd2R+vWUy3XoP98cBV52sVOTzoUjroxmVaNUDtp6sMa9znc+UxjLKXX4xE64d1iarWwi0GqFIsnhNWblSvjgAqghVBD3hLX8v0g9ieLvH/YEHOwfyKcQuCBgHRwQEG+iucLhTslT4JyRAoGAHa25CKwGKEhD3bJuw0z5LTC5btqgM28Y+Ir5AMe7zIxUqIJNuCrQWOJPOnUK0/fR3SLQgtW4OwcqPIysrZhMScrl8Luczsbg4dPtP813mv6oMgQFSNYjpigoQ9tNFGo+K2sQVPFYEz//FiMHB+TvT3JBzxBVXGEZnJOAEizzB2kCgYEAxUFRiJMcmp5IyGcFlmGP219OcEfzt8BV8s3yoPHPpgYX/zPsH9764UMSZb+FRXFLd8HC+UqqppQ4cq2RmMu5X7H/DWoj9FqXgusjOmZUyWiJgTPC4ktFesuhJhCHuk/50/nXmc6O8rWLwXqXf1XNaoNfzDmZNQ20jRZGr8eVc4g=");
-        merConfig.setRSAPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi3khLvAl4OIsKUbQGqSBqW7qCXcgIdxNhYCKjiUjBP9Pg7HLiFFc30MzFoF0/fGXfGikC5o01h8ek4OtAwhScyQZCEmWGqhfTnPmHT3teUyDaaebMig5O9lnlBFv45V4i8Csnhccwr3nW6W3QFItHD+uFEvy7JRqIRxllK4I/1gUd974MANjQB0fs4hqfCIRVFx6FrV3QY8BrFrmelrfZljlXhiBz+jslGM4ZFbg8hTGesJQOtD6sTwEK72Rt1T9pkpaVk7O8UBzPZ5PEZ9qUA1JnsR5ikv8J+F2b5d0vSkbOv5fMA6pQVuUIZhGTUcIjhvJ/xaasVDCIRRY+EkqtQIDAQAB");
-        Adapay.publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwN6xgd6Ad8v2hIIsQVnbt8a3JituR8o4Tc3B5WlcFR55bz4OMqrG/356Ur3cPbc2Fe8ArNd/0gZbC9q56Eb16JTkVNA/fye4SXznWxdyBPR7+guuJZHc/VW2fKH2lfZ2P3Tt0QkKZZoawYOGSMdIvO+WqK44updyax0ikK6JlNQIDAQAB";
-        try {
-            Adapay.initWithMerConfig(merConfig);
-        } catch (Exception e) {
-        }
-    }
+public class AdapayServiceTest extends ApplicationTests {
+    @Autowired
+    private OrderRepo     orderRepo;
+    @Autowired
+    private GiftOrderRepo giftOrderRepo;
 
-    @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", appId);
-        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("notify_url", "http://9th.frp.izouma.com/notify/adapay/order/1");
-        paymentParams.put("description", "orderId=1");
-
-        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));
-    }
+    private final String appId = "app_0e8d3acb-3d95-4ebb-8445-e470c378a787";
 
     @Test
-    public void testWxPay() throws BaseAdaPayException {
-        Map<String, Object> params = new HashMap<String, Object>();
-        params.put("order_no", "host_wx_lite_params_sdk_" + System.currentTimeMillis());
-        params.put("adapay_func_code", "wxpay.createOrder");
-        params.put("pay_amt", "0.02");
-        params.put("app_id", appId);
-        params.put("currency", "cny");
-        params.put("goods_title", "Your goods_title");
-        params.put("goods_desc", "Your goods_desc");
-        params.put("description", "payment Discription");
-        params.put("callback_url", "/9th/orders");
-        Map<String, Object> response = AdapayCommon.requestAdapayUits(params);
-        System.out.println("payment result=" + JSON.toJSONString(response, SerializerFeature.PrettyFormat));
-    }
-
-    @Data
-    public static class RefundOrder {
-        @ExcelProperty("交易时间")
-        private LocalDateTime time;
+    public void queryRefund() throws ExecutionException, InterruptedException {
 
-        @ExcelProperty("订单号")
-        private String id;
+        ForkJoinPool customThreadPool = new ForkJoinPool(100);
+        customThreadPool.submit(() -> {
 
-        @ExcelProperty("支付流水号")
-        private String serial;
+            List<AdaTrade> list = EasyExcel.read("/Users/drew/Downloads/merTransDetail_0284905900625472_20220107_20220108_1641637419.xlsx")
+                    .head(AdaTrade.class).sheet().doReadSync();
+            list = list.parallelStream().filter(adaTrade -> {
+                return adaTrade.get交易金额().equals("1.00")
+                        && orderRepo.findByTransactionId(adaTrade.get订单号()) == null
+                        && giftOrderRepo.findByTransactionId(adaTrade.get订单号()) == null;
+            }).collect(Collectors.toList());
 
-        @ExcelProperty("第三方订单号")
-        private String thirdId;
+            EasyExcel.write("/Users/drew/Downloads/1.xlsx", AdaTrade.class).sheet("模板").doWrite(list);
+            System.out.println(list.size());
 
-        @ExcelProperty("支付宝/微信订单号")
-        private String txId;
 
-        @ExcelProperty("交易金额")
-        private String amount;
+        }).get();
 
-        private String refundId;
     }
 
     @Test
-    public void refund() throws BaseAdaPayException {
-        List<RefundOrder> orders = EasyExcel.read("/Users/drew/Downloads/merTransDetail_0284905900625472_20211201_20211215_1639557451.xlsx")
-                .head(RefundOrder.class)
-                .registerConverter(new LocalDateConverter())
-                .registerConverter(new LocalDateTimeConverter())
-                .registerConverter(new BigIntegerConverter())
-                .sheet().doReadSync();
-        System.out.println(orders.size());
-        for (RefundOrder order : orders) {
-            String refundId = new SnowflakeIdWorker(0, 0).nextId() + "";
+    public void refund() {
+        List<AdaTrade> list = EasyExcel.read("/Users/drew/Downloads/1.xlsx")
+                .head(AdaTrade.class).sheet().doReadSync();
+        for (AdaTrade adaTrade : list) {
             Map<String, Object> refundParams = new HashMap<>();
-            refundParams.put("refund_amt", order.getAmount());
+            refundParams.put("refund_amt", adaTrade.get交易金额());
             refundParams.put("refund_order_no", new SnowflakeIdWorker(0, 0).nextId() + "");
-            Map<String, Object> response = Refund.create(order.getId(), refundParams);
-            order.setRefundId(refundId);
+            try {
+                Map<String, Object> response = Refund.create(adaTrade.get订单号(), refundParams);
+            } catch (BaseAdaPayException e) {
+                e.printStackTrace();
+            }
         }
-        EasyExcel.write("/Users/drew/Desktop/refund.xlsx", RefundOrder.class).sheet("sheet")
-                .registerConverter(new LocalDateConverter())
-                .registerConverter(new LocalDateTimeConverter())
-                .registerConverter(new BigIntegerConverter())
-                .doWrite(orders);
     }
 
-
     @Test
-    public void queryrefund() throws BaseAdaPayException {
-        List<RefundOrder> orders = EasyExcel.read("/Users/drew/Desktop/refund.xlsx")
-                .head(RefundOrder.class)
-                .registerConverter(new LocalDateConverter())
-                .registerConverter(new LocalDateTimeConverter())
-                .registerConverter(new BigIntegerConverter())
-                .sheet().doReadSync();
-        System.out.println(orders.size());
-        List<String> success = new ArrayList<>();
-        List<String> fail = new ArrayList<>();
-        for (RefundOrder order : orders) {
-            Map<String, Object> refundParams = new HashMap<>();
-            refundParams.put("refund_order_no", order.getRefundId());
-            Map<String, Object> refund = Refund.query(refundParams);
-            System.out.println(refund.get("refunds"));
+    public void verifyRefund() throws BaseAdaPayException {
+        List<AdaTrade> list = EasyExcel.read("/Users/drew/Downloads/1.xlsx")
+                .head(AdaTrade.class).sheet().doReadSync();
+        list = list.parallelStream().filter(adaTrade -> {
+            boolean success = false;
             try {
-                if (((JSONArray) refund.get("refunds")).getJSONObject(0).getString("trans_status").equals("S")) {
-                    success.add(order.getId());
-                } else {
-                    fail.add(order.getId());
+                Map<String, Object> refundParams = new HashMap<>(2);
+                refundParams.put("payment_id", adaTrade.get订单号());
+                Map<String, Object> refund = Refund.query(refundParams);
+                JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(refund));
+                if ("S".equals(jsonObject.getJSONArray("refunds").getJSONObject(0).getString("trans_status"))) {
+                    success = true;
                 }
             } catch (Exception e) {
-                fail.add(order.getId());
             }
-        }
-        System.out.println("success:" + success.size());
-        System.out.println("fail:" + fail.size());
-        System.out.println(StringUtils.join(fail, ","));
+            return !success;
+        }).collect(Collectors.toList());
+        EasyExcel.write("/Users/drew/Downloads/2.xlsx", AdaTrade.class).sheet("模板").doWrite(list);
     }
 
-    @Test
-    public void queryList() throws BaseAdaPayException {
-        Map<String, Object> paymentParams = new HashMap<>();
-        paymentParams.put("app_id", appId);
-        paymentParams.put("page_index", "1");
-        paymentParams.put("page_size", "10");
-        paymentParams.put("order_no", "928303191131422720");
-        Map<String, Object> paymentList = Payment.queryList(paymentParams);
-        System.out.println(paymentList);
-    }
 }

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

@@ -0,0 +1,201 @@
+package com.izouma.nineth.service;
+
+import com.alibaba.excel.EasyExcel;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.huifu.adapay.Adapay;
+import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.AdapayCommon;
+import com.huifu.adapay.model.MerConfig;
+import com.huifu.adapay.model.Payment;
+import com.huifu.adapay.model.Refund;
+import com.izouma.nineth.utils.SnowflakeIdWorker;
+import com.izouma.nineth.utils.excel.BigIntegerConverter;
+import com.izouma.nineth.utils.excel.LocalDateConverter;
+import com.izouma.nineth.utils.excel.LocalDateTimeConverter;
+import lombok.Data;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AdapayTest {
+    private final String appId = "app_0e8d3acb-3d95-4ebb-8445-e470c378a787";
+
+    public AdapayTest() {
+        Adapay.debug = false;
+        Adapay.prodMode = true;
+
+        MerConfig merConfig = new MerConfig();
+        merConfig.setApiKey("api_live_dc298e47-c0be-4acf-a962-a2c2988e4cae");
+        merConfig.setApiMockKey("api_test_26e9eee7-6695-4169-90a1-203c6d2cf196");
+        merConfig.setRSAPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCLeSEu8CXg4iwpRtAapIGpbuoJdyAh3E2FgIqOJSME/0+DscuIUVzfQzMWgXT98Zd8aKQLmjTWHx6Tg60DCFJzJBkISZYaqF9Oc+YdPe15TINpp5syKDk72WeUEW/jlXiLwKyeFxzCvedbpbdAUi0cP64US/LslGohHGWUrgj/WBR33vgwA2NAHR+ziGp8IhFUXHoWtXdBjwGsWuZ6Wt9mWOVeGIHP6OyUYzhkVuDyFMZ6wlA60PqxPAQrvZG3VP2mSlpWTs7xQHM9nk8Rn2pQDUmexHmKS/wn4XZvl3S9KRs6/l8wDqlBW5QhmEZNRwiOG8n/FpqxUMIhFFj4SSq1AgMBAAECggEAVwmWXbZbzQUXzgJ058t1ZwjiYFnI4ZibgA6BaMdgHUQ+mM6hV0Z/EIzdGtRa8AaOJIMgrGTlSCJPcHshwty0p0oFnRhe5e/g2hKVrfXxdlr7PznrLdfQL7syWkKvcnTar0vj7Rw7RIRCFv1JaIhfwlszBVOIG39a46LW+XvJ/Z5Lk5wB8tkt0xWDUghAU1xP10P8OHcr/x3aFhiyAvmWWr7syYKD1rDAtC+n+6Imb8MvTxwk4Gz1wpM+a7gHeYk2n91yR94G6A2wMSeM80T4hCbYKutD5rkdi5i3hoeIiPiq5qbR0rmI/dudVbGkVT+xkh1z1IsKeYiD2ef4Ddy2QQKBgQDIqOuaml9bnJpKie9Z0ysiPWxc771byxhgx7bwsoJey4x5bcLx+G9IAvkGwWFUl+25jgpeVn/LZ6147e9ozeip7WSKvStniND+CB7SvA5ZDRm7CfqFQub//9Q1DWNfl+ThGAXHMlKgS7DanLqvpUsRdhUOceZwwrdkV93v7by8nQKBgQCx8EdYbxNIEnVI3Y98YCAWtvgBCCa8yurL+9IXe9VKCFGdGRZ4b61GWDNyjUAfiboXY4ByzvX4cdlZ1euVmqMYsEv28xXEFdGxSDpa+oeETbv1U2GEGL4Ups3z28Sx4TGGSyvReyQOhZftIF6vCZtZ8dZMEf8IdxyudJkcJp+u+QKBgBFtemkHF1khlNT8felTSd/DbfH0cIHUdd2R+vWUy3XoP98cBV52sVOTzoUjroxmVaNUDtp6sMa9znc+UxjLKXX4xE64d1iarWwi0GqFIsnhNWblSvjgAqghVBD3hLX8v0g9ieLvH/YEHOwfyKcQuCBgHRwQEG+iucLhTslT4JyRAoGAHa25CKwGKEhD3bJuw0z5LTC5btqgM28Y+Ir5AMe7zIxUqIJNuCrQWOJPOnUK0/fR3SLQgtW4OwcqPIysrZhMScrl8Luczsbg4dPtP813mv6oMgQFSNYjpigoQ9tNFGo+K2sQVPFYEz//FiMHB+TvT3JBzxBVXGEZnJOAEizzB2kCgYEAxUFRiJMcmp5IyGcFlmGP219OcEfzt8BV8s3yoPHPpgYX/zPsH9764UMSZb+FRXFLd8HC+UqqppQ4cq2RmMu5X7H/DWoj9FqXgusjOmZUyWiJgTPC4ktFesuhJhCHuk/50/nXmc6O8rWLwXqXf1XNaoNfzDmZNQ20jRZGr8eVc4g=");
+        merConfig.setRSAPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi3khLvAl4OIsKUbQGqSBqW7qCXcgIdxNhYCKjiUjBP9Pg7HLiFFc30MzFoF0/fGXfGikC5o01h8ek4OtAwhScyQZCEmWGqhfTnPmHT3teUyDaaebMig5O9lnlBFv45V4i8Csnhccwr3nW6W3QFItHD+uFEvy7JRqIRxllK4I/1gUd974MANjQB0fs4hqfCIRVFx6FrV3QY8BrFrmelrfZljlXhiBz+jslGM4ZFbg8hTGesJQOtD6sTwEK72Rt1T9pkpaVk7O8UBzPZ5PEZ9qUA1JnsR5ikv8J+F2b5d0vSkbOv5fMA6pQVuUIZhGTUcIjhvJ/xaasVDCIRRY+EkqtQIDAQAB");
+        Adapay.publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwN6xgd6Ad8v2hIIsQVnbt8a3JituR8o4Tc3B5WlcFR55bz4OMqrG/356Ur3cPbc2Fe8ArNd/0gZbC9q56Eb16JTkVNA/fye4SXznWxdyBPR7+guuJZHc/VW2fKH2lfZ2P3Tt0QkKZZoawYOGSMdIvO+WqK44updyax0ikK6JlNQIDAQAB";
+        try {
+            Adapay.initWithMerConfig(merConfig);
+        } catch (Exception e) {
+        }
+    }
+
+    @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", appId);
+        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("notify_url", "http://9th.frp.izouma.com/notify/adapay/order/1");
+        paymentParams.put("description", "orderId=1");
+
+        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 testWxPay() throws BaseAdaPayException {
+        Map<String, Object> params = new HashMap<String, Object>();
+        params.put("order_no", "host_wx_lite_params_sdk_" + System.currentTimeMillis());
+        params.put("adapay_func_code", "wxpay.createOrder");
+        params.put("pay_amt", "0.02");
+        params.put("app_id", appId);
+        params.put("currency", "cny");
+        params.put("goods_title", "Your goods_title");
+        params.put("goods_desc", "Your goods_desc");
+        params.put("description", "payment Discription");
+        params.put("callback_url", "/9th/orders");
+        Map<String, Object> response = AdapayCommon.requestAdapayUits(params);
+        System.out.println("payment result=" + JSON.toJSONString(response, SerializerFeature.PrettyFormat));
+    }
+
+    @Data
+    public static class RefundOrder {
+        @ExcelProperty("交易时间")
+        private LocalDateTime time;
+
+        @ExcelProperty("订单号")
+        private String id;
+
+        @ExcelProperty("支付流水号")
+        private String serial;
+
+        @ExcelProperty("第三方订单号")
+        private String thirdId;
+
+        @ExcelProperty("支付宝/微信订单号")
+        private String txId;
+
+        @ExcelProperty("交易金额")
+        private String amount;
+
+        private String refundId;
+    }
+
+    @Test
+    public void refund() throws BaseAdaPayException {
+        List<RefundOrder> orders = EasyExcel.read("/Users/drew/Downloads/merTransDetail_0284905900625472_20211201_20211215_1639557451.xlsx")
+                .head(RefundOrder.class)
+                .registerConverter(new LocalDateConverter())
+                .registerConverter(new LocalDateTimeConverter())
+                .registerConverter(new BigIntegerConverter())
+                .sheet().doReadSync();
+        System.out.println(orders.size());
+        for (RefundOrder order : orders) {
+            String refundId = new SnowflakeIdWorker(0, 0).nextId() + "";
+            Map<String, Object> refundParams = new HashMap<>();
+            refundParams.put("refund_amt", order.getAmount());
+            refundParams.put("refund_order_no", new SnowflakeIdWorker(0, 0).nextId() + "");
+            Map<String, Object> response = Refund.create(order.getId(), refundParams);
+            order.setRefundId(refundId);
+        }
+        EasyExcel.write("/Users/drew/Desktop/refund.xlsx", RefundOrder.class).sheet("sheet")
+                .registerConverter(new LocalDateConverter())
+                .registerConverter(new LocalDateTimeConverter())
+                .registerConverter(new BigIntegerConverter())
+                .doWrite(orders);
+    }
+
+
+    @Test
+    public void queryrefund() throws BaseAdaPayException {
+        List<RefundOrder> orders = EasyExcel.read("/Users/drew/Desktop/refund.xlsx")
+                .head(RefundOrder.class)
+                .registerConverter(new LocalDateConverter())
+                .registerConverter(new LocalDateTimeConverter())
+                .registerConverter(new BigIntegerConverter())
+                .sheet().doReadSync();
+        System.out.println(orders.size());
+        List<String> success = new ArrayList<>();
+        List<String> fail = new ArrayList<>();
+        for (RefundOrder order : orders) {
+            Map<String, Object> refundParams = new HashMap<>();
+            refundParams.put("refund_order_no", order.getRefundId());
+            Map<String, Object> refund = Refund.query(refundParams);
+            System.out.println(refund.get("refunds"));
+            try {
+                if (((JSONArray) refund.get("refunds")).getJSONObject(0).getString("trans_status").equals("S")) {
+                    success.add(order.getId());
+                } else {
+                    fail.add(order.getId());
+                }
+            } catch (Exception e) {
+                fail.add(order.getId());
+            }
+        }
+        System.out.println("success:" + success.size());
+        System.out.println("fail:" + fail.size());
+        System.out.println(StringUtils.join(fail, ","));
+    }
+
+    @Test
+    public void queryList() throws BaseAdaPayException {
+        LocalDateTime start = LocalDateTime.of(2022, 1, 7, 0, 0, 0);
+        LocalDateTime end = LocalDateTime.of(2022, 1, 8, 0, 0, 0);
+
+        Map<String, Object> paymentParams = new HashMap<>();
+        int page = 0;
+        paymentParams.put("app_id", appId);
+        paymentParams.put("page_size", "20");
+        paymentParams.put("created_gte", start.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
+        paymentParams.put("created_lte", end.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
+
+        boolean hasMore = true;
+        JSONArray list = new JSONArray();
+        while (hasMore) {
+            paymentParams.put("page_index", ++page);
+            Map<String, Object> paymentList = Payment.queryList(paymentParams);
+            if (paymentList.get("payments") != null) {
+                list.addAll((JSONArray) paymentList.get("payments"));
+            }
+            hasMore = MapUtils.getBooleanValue(paymentList, "has_more");
+        }
+        System.out.println(list);
+    }
+}

+ 0 - 34
src/test/java/com/izouma/nineth/service/AssetServiceTest.java

@@ -130,38 +130,4 @@ class AssetServiceTest extends ApplicationTests {
         System.out.println(builder);
     }
 
-    @Test
-    public void del() {
-        for (String s : new String[]{"5df454549a0f4373ce6bb81fe7bbb941",
-                "61773ab99f4a402cbe2a667d53fdc11c",
-                "69d43dda0dfdf08dd9ecea3ad1f9d50",
-                "6de0578f99af8ae285b6eefd7e834f22",
-                "7433fedd607cd9df192e4303206ebbf4",
-                "7e4e23b9eebf1ab16d820da5c5eb3064",
-                "86d9437a6551174bf7b8d4c46ba01690",
-                "8e16830b0a36d661b90d5b1d8723f0d5",
-                "953862a50f982d0495edf294c2c0c8c0",
-                "a1da155eb43ef398ea30b4dffad8e184",
-                "b74c8d9d59df3675e26d846892e2dad4",
-                "bc47260b0ef9c3fe2616b80c31385677",
-                "c50f01943fd38ebadb26fb68877477ae",
-                "d0667e1585327bd42c75fd98ca414487",
-                "d646bd4e0357fbe067ab8d0504ed57c4",
-                "e0ddee55cfe14fbc18770631b10386bb",
-                "e398353b6838b6b9ce9c903b448eaeb3",
-                "ee35149d07d34e39adb18dfb1a0c7021",
-                "faebc681f3698bf0da6136d0c8be87ac",
-                "fc38421ee6d402a24e5c25ba2d870831",
-                "43800381853ce6e07bec0fd602a54a69",
-                "48918cf5bd017164ea5d1927708e8b9c",
-                "493f285ae429aa4b1760db3e37e2a76f",
-                "49bfe48771acf39e084e331be79e762d",
-                "52ba65e1416fde9c3e9528e34b587454"
-        }) {
-            Asset asset = assetRepo.findFirstByTokenId(s);
-            if (asset != null) {
-                assetRepo.delete(asset);
-            }
-        }
-    }
 }