xiongzhu 3 jaren geleden
bovenliggende
commit
c96ec8c0db

+ 1 - 1
src/main/java/com/izouma/nineth/domain/Collection.java

@@ -141,7 +141,7 @@ public class Collection extends BaseEntity {
 
     private Integer currentNumber;
 
-    @Formula(value = "if(stock = 0, 1, 0)")
+    @Formula(value = "if(stock <= 0, 1, 0)")
     private int soldOut;
 
     @ApiModelProperty("限购数量")

+ 1 - 0
src/main/java/com/izouma/nineth/domain/User.java

@@ -32,6 +32,7 @@ import java.util.Set;
         @Index(columnList = "collectionInvitor"),
         @Index(columnList = "admin"),
         @Index(columnList = "minter"),
+        @Index(columnList = "settleAccountId")
 })
 @AllArgsConstructor
 @NoArgsConstructor

+ 2 - 0
src/main/java/com/izouma/nineth/dto/UserBankCard.java

@@ -26,4 +26,6 @@ public class UserBankCard extends BaseEntity {
     private String cardTypeDesc;
 
     private String bankNo;
+
+    private String phone;
 }

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

@@ -178,4 +178,6 @@ public interface UserRepo extends JpaRepository<User, Long>, JpaSpecificationExe
     List<User> findAllByCreatedAtBetweenAndAuthoritiesContains(LocalDateTime start, LocalDateTime end, Authority authorities);
 
     List<User> findAllByCreatedAtIsAfterAndAuthoritiesContains(LocalDateTime createdAt, Authority authorities);
+
+    List<User> findBySettleAccountIdIsNotNull();
 }

+ 78 - 0
src/main/java/com/izouma/nineth/service/UserService.java

@@ -3,8 +3,13 @@ package com.izouma.nineth.service;
 import cn.binarywang.wx.miniapp.api.WxMaService;
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.AdapayCommon;
+import com.huifu.adapay.model.SettleAccount;
 import com.izouma.nineth.TokenHistory;
+import com.izouma.nineth.config.AdapayProperties;
 import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.domain.Collection;
 import com.izouma.nineth.domain.Follow;
@@ -32,6 +37,7 @@ import me.chanjar.weixin.common.error.WxErrorException;
 import me.chanjar.weixin.mp.api.WxMpService;
 import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken;
 import me.chanjar.weixin.mp.bean.result.WxMpUser;
+import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
@@ -75,6 +81,7 @@ public class UserService {
     private ApplicationContext context;
     private TokenHistoryRepo   tokenHistoryRepo;
     private CollectionRepo     collectionRepo;
+    private AdapayProperties   adapayProperties;
 
     public User update(User user) {
         User orig = userRepo.findById(user.getId()).orElseThrow(new BusinessException("无记录"));
@@ -502,6 +509,7 @@ public class UserService {
                 .cardType(bankValidate.getCardType())
                 .cardTypeDesc(bankValidate.getCardTypeDesc())
                 .userId(userId)
+                .phone(phone)
                 .build());
     }
 
@@ -590,4 +598,74 @@ public class UserService {
         map.put("total", total);
         return map;
     }
+
+
+    public void switchAccount() {
+        switchAccount(adapayProperties.getAppId());
+    }
+
+    public void switchAccount(String appId) {
+        userRepo.findBySettleAccountIdIsNotNull().parallelStream().forEach(user -> {
+            try {
+                IdentityAuth identityAuth = identityAuthRepo.findFirstByUserIdAndStatusAndDelFalseOrderByCreatedAtDesc(user.getId(), AuthStatus.SUCCESS)
+                        .orElseThrow(new BusinessException("用户未认证"));
+                UserBankCard userBankCard = userBankCardRepo.findByUserId(user.getId()).stream().findAny()
+                        .orElseThrow(new BusinessException("未绑卡"));
+                createMember(appId, user.getId().toString(), Optional.ofNullable(userBankCard.getPhone())
+                        .orElse(user.getPhone()), identityAuth.getRealName(), identityAuth.getIdNo());
+                createSettleAccount(appId, user.getId()
+                        .toString(), identityAuth.getRealName(), identityAuth.getIdNo(), Optional.ofNullable(userBankCard.getPhone())
+                        .orElse(user.getPhone()), userBankCard.getBankNo());
+                userBankCard.setPhone(Optional.ofNullable(userBankCard.getPhone()).orElse(user.getPhone()));
+                userBankCardRepo.save(userBankCard);
+            } catch (Exception e) {
+//                user.setSettleAccountId(null);
+//                userRepo.save(user);
+//                userBankCardRepo.deleteByUserId(user.getId());
+            }
+        });
+    }
+
+    public void createMember(String appId, String memberId, String tel, String realName, String idno) throws BaseAdaPayException {
+        Map<String, Object> memberParams = new HashMap<>();
+        memberParams.put("adapay_func_code", "members.realname");
+        memberParams.put("member_id", memberId);
+        memberParams.put("app_id", appId);
+        memberParams.put("tel_no", tel);
+        memberParams.put("user_name", realName);
+        memberParams.put("cert_type", "00");
+        memberParams.put("cert_id", idno);
+        Map<String, Object> res = AdapayCommon.requestAdapay(memberParams);
+        log.info("createMember\n{}", JSON.toJSONString(res, SerializerFeature.PrettyFormat));
+        if (!("succeeded".equals(MapUtils.getString(res, "status"))
+                || "member_id_exists".equals(MapUtils.getString(res, "error_code")))) {
+            String errMsg = MapUtils.getString(res, "error_msg");
+            String errCode = MapUtils.getString(res, "error_code");
+            throw new BusinessException(errMsg + "(" + errCode + ")");
+        }
+    }
+
+    public String createSettleAccount(String appId, String memberId, String realName, String idNo, String phone, String bankNo) throws BaseAdaPayException {
+        Map<String, Object> settleCountParams = new HashMap<>();
+        Map<String, Object> accountInfo = new HashMap<>();
+        accountInfo.put("card_id", bankNo);
+        accountInfo.put("card_name", realName);
+        accountInfo.put("cert_id", idNo);
+        accountInfo.put("cert_type", "00");
+        accountInfo.put("tel_no", phone);
+        accountInfo.put("bank_acct_type", "2");
+        settleCountParams.put("member_id", memberId);
+        settleCountParams.put("app_id", appId);
+        settleCountParams.put("channel", "bank_account");
+        settleCountParams.put("account_info", accountInfo);
+        Map<String, Object> res = SettleAccount.create(settleCountParams);
+        log.info("createSettleAccount\n{}", JSON.toJSONString(res, SerializerFeature.PrettyFormat));
+        if (!("succeeded".equals(MapUtils.getString(res, "status"))
+                || "account_exists".equals(MapUtils.getString(res, "error_code")))) {
+            String errMsg = MapUtils.getString(res, "error_msg");
+            String errCode = MapUtils.getString(res, "error_code");
+            throw new BusinessException(errMsg + "(" + errCode + ")");
+        }
+        return MapUtils.getString(res, "id");
+    }
 }

+ 28 - 0
src/main/java/com/izouma/nineth/utils/AdapayUtils.java

@@ -0,0 +1,28 @@
+package com.izouma.nineth.utils;
+
+import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.core.exception.FailureCode;
+import com.izouma.nineth.exception.BusinessException;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.Map;
+
+public class AdapayUtils {
+    public static String packageRequestUrl(Map<String, Object> requestParams) throws BaseAdaPayException {
+        String adapayFuncCode = (String) requestParams.get("adapay_func_code");
+        if (StringUtils.isBlank(adapayFuncCode)) {
+            throw new BaseAdaPayException(FailureCode.ADAPAY_FUNC_CODE_NOT_BLANK.getFailureCode());
+        }
+        String adapayApiVersion = (String) requestParams.getOrDefault("adapay_api_version", "v1");
+        return "/" + adapayApiVersion + "/" + StringUtils.replace(adapayFuncCode, ".", "/");
+    }
+
+    public static void checkSuccess(Map<String, Object> map) {
+        if (!"succeeded".equals(MapUtils.getString(map, "status"))) {
+            String errMsg = MapUtils.getString(map, "error_msg");
+            String errCode = MapUtils.getString(map, "error_code");
+            throw new BusinessException(errMsg + "(" + errCode + ")");
+        }
+    }
+}

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

@@ -262,6 +262,13 @@ public class UserController extends BaseController {
         return userRepo.findAllByCollectionIdAndCollectionInvitor(collectionId, SecurityUtils.getAuthenticatedUser()
                 .getId());
     }
+
+    @PreAuthorize("hasAnyRole('ADMIN')")
+    @GetMapping("/switchAccount")
+    public String switchAccount() {
+        userService.switchAccount();
+        return "ok";
+    }
 }
 
 

+ 14 - 3
src/main/resources/application.yaml

@@ -176,12 +176,23 @@ alipay:
   root-cert-path: classpath:cert/alipayRootCert.crt
   notify-url: https://test.raex.vip/notify/order/alipay
   return-url: https://test.raex.vip/9th/home
+#adapay:
+#  app-id: app_0e8d3acb-3d95-4ebb-8445-e470c378a787
+#  debug: true
+#  prod: true
+#  api-key: api_live_dc298e47-c0be-4acf-a962-a2c2988e4cae
+#  mock-key: api_test_26e9eee7-6695-4169-90a1-203c6d2cf196
+#  public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi3khLvAl4OIsKUbQGqSBqW7qCXcgIdxNhYCKjiUjBP9Pg7HLiFFc30MzFoF0/fGXfGikC5o01h8ek4OtAwhScyQZCEmWGqhfTnPmHT3teUyDaaebMig5O9lnlBFv45V4i8Csnhccwr3nW6W3QFItHD+uFEvy7JRqIRxllK4I/1gUd974MANjQB0fs4hqfCIRVFx6FrV3QY8BrFrmelrfZljlXhiBz+jslGM4ZFbg8hTGesJQOtD6sTwEK72Rt1T9pkpaVk7O8UBzPZ5PEZ9qUA1JnsR5ikv8J+F2b5d0vSkbOv5fMA6pQVuUIZhGTUcIjhvJ/xaasVDCIRRY+EkqtQIDAQAB
+#  priv-key: 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=
+#  app-public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwN6xgd6Ad8v2hIIsQVnbt8a3JituR8o4Tc3B5WlcFR55bz4OMqrG/356Ur3cPbc2Fe8ArNd/0gZbC9q56Eb16JTkVNA/fye4SXznWxdyBPR7+guuJZHc/VW2fKH2lfZ2P3Tt0QkKZZoawYOGSMdIvO+WqK44updyax0ikK6JlNQIDAQAB
+#  wx-app-id:
+#  notify-url: https://testorder.raex.vip/notify/adapay
 adapay:
-  app-id: app_0e8d3acb-3d95-4ebb-8445-e470c378a787
+  app-id: app_4c00a390-70c0-44ac-b3f0-f6dd25f6a364
   debug: true
   prod: true
-  api-key: api_live_dc298e47-c0be-4acf-a962-a2c2988e4cae
-  mock-key: api_test_26e9eee7-6695-4169-90a1-203c6d2cf196
+  api-key: api_live_dfc6a4b3-cd8b-453c-a1b2-d7440f1d73b5
+  mock-key: api_test_f398b9d5-ebeb-4c59-a6ac-c44755927b56
   public-key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAi3khLvAl4OIsKUbQGqSBqW7qCXcgIdxNhYCKjiUjBP9Pg7HLiFFc30MzFoF0/fGXfGikC5o01h8ek4OtAwhScyQZCEmWGqhfTnPmHT3teUyDaaebMig5O9lnlBFv45V4i8Csnhccwr3nW6W3QFItHD+uFEvy7JRqIRxllK4I/1gUd974MANjQB0fs4hqfCIRVFx6FrV3QY8BrFrmelrfZljlXhiBz+jslGM4ZFbg8hTGesJQOtD6sTwEK72Rt1T9pkpaVk7O8UBzPZ5PEZ9qUA1JnsR5ikv8J+F2b5d0vSkbOv5fMA6pQVuUIZhGTUcIjhvJ/xaasVDCIRRY+EkqtQIDAQAB
   priv-key: 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=
   app-public-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwN6xgd6Ad8v2hIIsQVnbt8a3JituR8o4Tc3B5WlcFR55bz4OMqrG/356Ur3cPbc2Fe8ArNd/0gZbC9q56Eb16JTkVNA/fye4SXznWxdyBPR7+guuJZHc/VW2fKH2lfZ2P3Tt0QkKZZoawYOGSMdIvO+WqK44updyax0ikK6JlNQIDAQAB

+ 5 - 0
src/test/java/com/izouma/nineth/service/UserServiceTest.java

@@ -117,4 +117,9 @@ public class UserServiceTest extends ApplicationTests {
         // 2022-01-14T15:53:58 504 第一次查询
         phone.forEach(user -> System.out.print(user.getPhone() + " "));
     }
+
+    @Test
+    public void switchAccount() {
+        userService.switchAccount();
+    }
 }