Browse Source

Merge branch 'dev'

xiongzhu 4 years ago
parent
commit
4b5ca195e2

BIN
src/main/comos/src/assets/close.png


BIN
src/main/comos/src/assets/share1.png


BIN
src/main/comos/src/assets/share2.jpg


+ 12 - 1
src/main/comos/src/views/account/Register.vue

@@ -89,6 +89,7 @@
                 placeholder="请输入邀请码"
                 v-model="form.inviteCode"
                 :disabled="!!$store.state.inviteCode"
+                v-if="!invitor"
             >
                 <template #left-icon>
                     <img :src="require('@assets/svgs/login_icon_yao qingma.svg')" class="icon" />
@@ -122,9 +123,13 @@
 </template>
 
 <script>
+import { mapState } from 'vuex';
 import phone from '../../mixins/phone';
 export default {
     mixins: [phone],
+    computed: {
+        ...mapState(['invitor'])
+    },
     data() {
         return {
             active: 'phone',
@@ -133,11 +138,17 @@ export default {
                 password: '',
                 password2: '',
                 code: '',
-                inviteCode: this.$store.state.inviteCode || ''
+                inviteCode: this.$store.state.inviteCode || '',
+                invitor: ''
             },
             checked: false
         };
     },
+    mounted() {
+        if (this.invitor) {
+            this.form.invitor = this.invitor;
+        }
+    },
     methods: {
         sendPhone() {
             this.$refs.form.validate('手机号码').then(() => {

+ 121 - 6
src/main/comos/src/views/user/Share.vue

@@ -1,9 +1,12 @@
 <template>
     <div class="page">
+        <div class="share-img">
+            <img src="../../assets/share1.png" alt="" />
+        </div>
         <div class="share-btn">
-            <van-button type="primary" round block>立即邀请</van-button>
+            <van-button type="primary" @click="share" round block>立即邀请</van-button>
         </div>
-        <div class="code">
+        <!-- <div class="code">
             <div class="code-top">
                 <div class="text1">我的邀请码</div>
                 <div class="text2">7474448585955505057578578</div>
@@ -12,21 +15,21 @@
             <div class="code-btn">
                 <van-button type="primary" round block>领取奖励</van-button>
             </div>
-        </div>
+        </div> -->
 
         <div class="panel">
             <div class="panel-title">我的邀请</div>
             <div class="panel-box">
                 <div class="panel-item">
                     <div class="text1">
-                        <span>3</span>
+                        <span>{{ userInfo.inviteAirDrop || 0 }}</span>
                         <small>个</small>
                     </div>
                     <div class="text2">已获得藏品</div>
                 </div>
                 <div class="panel-item">
                     <div class="text1">
-                        <span>1</span>
+                        <span>{{ userInfo.inviteNum || 0 }}</span>
                         <small>人</small>
                     </div>
                     <div class="text2">邀请好友</div>
@@ -40,11 +43,69 @@
             2.在活动期间,参与活动的用户(以下称用“用户”“您”) 每邀请一位新用户(“新用户”系指从未注册过“第九空
             间”的用户,是否为新用户以平台判断为准),在注册当 日绑定您的邀请码,在三个工作日后您可获得平台空投。
         </div>
+
+        <van-overlay :show="show" @click="show = false">
+            <div class="wrapper">
+                <img :src="img" class="wrapper-img" v-if="img" alt="" />
+                <div class="wrapper-box" v-else ref="post" @click.stop>
+                    <img class="share2" src="../../assets/share2.jpg" alt="" />
+                    <vue-qrcode :value="url" :options="{ width: 70, margin: 3 }" class="share-code"></vue-qrcode>
+                    <div class="title">国内领先的泛文娱数字藏品集换平台</div>
+                </div>
+
+                <img src="../../assets/close.png" alt="" class="close" />
+            </div>
+        </van-overlay>
     </div>
 </template>
 
 <script>
-export default {};
+import { mapState } from 'vuex';
+import resolveUrl from 'resolve-url';
+import vueQrcode from '@chenfengyuan/vue-qrcode';
+import html2canvas from 'html2canvas';
+export default {
+    computed: {
+        ...mapState(['userInfo']),
+        url() {
+            return resolveUrl(this.$baseUrl, 'cosmos/register?invitor=' + this.userInfo.id);
+        }
+    },
+    components: {
+        vueQrcode
+    },
+    data() {
+        return {
+            show: false,
+            img: ''
+        };
+    },
+    methods: {
+        share() {
+            this.show = true;
+            if (!this.img) {
+                this.$toast.loading({
+                    message: '加载中...',
+                    forbidClick: true
+                });
+                setTimeout(() => {
+                    this.loadImg();
+                }, 500);
+            }
+        },
+        loadImg() {
+            html2canvas(this.$refs.post, {
+                useCORS: true,
+                allowTaint: true,
+                backgroundColor: null,
+                scale: 3
+            }).then(canvas => {
+                this.$toast.clear();
+                this.img = canvas.toDataURL('image/png');
+            });
+        }
+    }
+};
 </script>
 
 <style lang="less" scoped>
@@ -144,4 +205,58 @@ export default {};
     color: #939599;
     margin: 25px 16px;
 }
+
+.share-img {
+    padding: 19px 16px 0;
+    img {
+        width: 100%;
+    }
+}
+.wrapper {
+    position: absolute;
+    left: 50%;
+    top: 50%;
+    transform: translate(-50%, -50%);
+    .flex-col();
+    align-items: center;
+    justify-content: center;
+}
+.share2 {
+    width: 300px;
+    height: 364px;
+    display: block;
+}
+.share-code {
+    position: absolute;
+    bottom: 52px;
+    right: 7px;
+    border-radius: 6px;
+}
+
+.wrapper-box {
+    border-radius: 10px;
+    overflow: hidden;
+    position: relative;
+    .title {
+        font-size: 16px;
+        line-height: 24px;
+        color: #26273c;
+        opacity: 1;
+        text-align: center;
+        padding: 9px;
+        background-color: #fff;
+    }
+}
+
+.wrapper-img {
+    width: 300px;
+    display: block;
+}
+
+.close {
+    width: 40px;
+    height: 40px;
+    display: block;
+    margin-top: 12px;
+}
 </style>

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

@@ -133,4 +133,7 @@ public class User extends BaseEntity implements Serializable {
 
     @ApiModelProperty(value = "邀请数量")
     private int inviteNum;
+
+    @ApiModelProperty(value = "获得得空投数量")
+    private int inviteAirDrop;
 }

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

@@ -0,0 +1,17 @@
+package com.izouma.nineth.dto.adapay;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+@Data
+public class DivMembersItem {
+
+    @JSONField(name = "member_id")
+    private String memberId;
+
+    @JSONField(name = "amount")
+    private String amount;
+
+    @JSONField(name = "fee_flag")
+    private String feeFlag;
+}

+ 88 - 0
src/main/java/com/izouma/nineth/dto/adapay/PaymentItem.java

@@ -0,0 +1,88 @@
+package com.izouma.nineth.dto.adapay;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PaymentItem {
+
+    @JSONField(name = "order_no")
+    private String orderNo;
+
+    @JSONField(name = "created_time")
+    private String createdTime;
+
+    @JSONField(name = "pay_amt")
+    private String payAmt;
+
+    @JSONField(name = "open_id")
+    private String openId;
+
+    @JSONField(name = "confirmed_amt")
+    private String confirmedAmt;
+
+    @JSONField(name = "end_time")
+    private String endTime;
+
+    @JSONField(name = "fee_mode")
+    private String feeMode;
+
+    @JSONField(name = "coupon_infos")
+    private String couponInfos;
+
+    @JSONField(name = "discount_amt")
+    private String discountAmt;
+
+    @JSONField(name = "cash_pay_amt")
+    private String cashPayAmt;
+
+    @JSONField(name = "reserved_amt")
+    private String reservedAmt;
+
+    @JSONField(name = "out_trans_id")
+    private String outTransId;
+
+    @JSONField(name = "party_order_id")
+    private String partyOrderId;
+
+    @JSONField(name = "pay_mode")
+    private String payMode;
+
+    @JSONField(name = "div_members")
+    private List<DivMembersItem> divMembers;
+
+    @JSONField(name = "refunded_amt")
+    private String refundedAmt;
+
+    @JSONField(name = "prod_mode")
+    private String prodMode;
+
+    @JSONField(name = "pay_channel")
+    private String payChannel;
+
+    @JSONField(name = "has_more")
+    private boolean hasMore;
+
+    @JSONField(name = "id")
+    private String id;
+
+    @JSONField(name = "app_id")
+    private String appId;
+
+    @JSONField(name = "fee_amt")
+    private String feeAmt;
+
+    @JSONField(name = "object")
+    private String object;
+
+    @JSONField(name = "status")
+    private String status;
+
+    @JSONField(name = "error_msg")
+    private String errorMsg;
+
+    @JSONField(name = "error_code")
+    private String errorCode;
+}

+ 28 - 0
src/main/java/com/izouma/nineth/dto/adapay/PaymentList.java

@@ -0,0 +1,28 @@
+package com.izouma.nineth.dto.adapay;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PaymentList {
+
+    @JSONField(name = "payments")
+    private List<PaymentItem> payments;
+
+    @JSONField(name = "prod_mode")
+    private String prodMode;
+
+    @JSONField(name = "has_more")
+    private boolean hasMore;
+
+    @JSONField(name = "app_id")
+    private String appId;
+
+    @JSONField(name = "object")
+    private String object;
+
+    @JSONField(name = "status")
+    private String status;
+}

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

@@ -97,4 +97,7 @@ public class AdapayService {
             throw new BusinessException(errMsg + "(" + errCode + ")");
         }
     }
+
+    public void divRefund(String merchant, String appId) {
+    }
 }

+ 41 - 13
src/main/java/com/izouma/nineth/service/UserService.java

@@ -42,12 +42,14 @@ import org.springframework.context.event.EventListener;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
 import org.springframework.data.jpa.domain.Specification;
+import org.springframework.scheduling.annotation.Async;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 import org.springframework.stereotype.Service;
 
 import javax.persistence.criteria.Predicate;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -179,26 +181,19 @@ public class UserService {
         if (invitor != null) {
             userRepo.findByIdAndDelFalse(invitor).ifPresent(user1 -> {
                 user1.setInviteNum(user1.getInviteNum() + 1);
-                userRepo.save(user1);
-                if (user1.getInviteNum() >= 15) {
-                    airDropService.create(AirDrop.builder()
-                            .name("宇宙熊-致敬奥运-纯金款")
-                            .type(AirDropType.asset)
-                            .collectionId(8472L)
-                            .phone(List.of(user1.getPhone()))
-                            .userIds(List.of(invitor))
-                            .projectId(1)
-                            .build());
-                } else if (user1.getInviteNum() >= 5) {
+
+                if (user1.getInviteNum() / 10 > user1.getInviteAirDrop()) {
                     airDropService.create(AirDrop.builder()
-                            .name("宇宙熊-致敬奥运-纯黄款")
+                            .name("邀请新人得空投奖励")
                             .type(AirDropType.asset)
-                            .collectionId(8406L)
+                            .collectionId(1187810L)
                             .phone(List.of(user1.getPhone()))
                             .userIds(List.of(invitor))
                             .projectId(1)
                             .build());
+                    user1.setInviteAirDrop(user1.getInviteAirDrop() + 1);
                 }
+                userRepo.save(user1);
             });
         }
         return user;
@@ -650,4 +645,37 @@ public class UserService {
         }
         return MapUtils.getString(res, "id");
     }
+
+    @Async
+    public void checkSettleAccountAsync() {
+        checkSettleAccount();
+    }
+
+    public void checkSettleAccount() {
+        List<User> list = userRepo.findBySettleAccountIdIsNotNull();
+        AtomicInteger count = new AtomicInteger();
+        list.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("未绑卡"));
+                adapayMerchantService.createMemberForAll(
+                        user.getId().toString(), Optional.ofNullable(userBankCard.getPhone()).orElse(user.getPhone()),
+                        identityAuth.getRealName(), identityAuth.getIdNo());
+                adapayMerchantService.createSettleAccountForAll(
+                        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());
+            }
+            count.getAndIncrement();
+            log.info("checkSettleAccount {}/{}", count.get(), list.size());
+        });
+    }
 }

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

@@ -253,9 +253,9 @@ public class UserController extends BaseController {
 
 
     @PreAuthorize("hasAnyRole('ADMIN')")
-    @GetMapping("/switchAccount")
-    public String switchAccount() {
-        userService.switchAccount();
+    @GetMapping("/checkSettleAccount")
+    public String checkSettleAccount() {
+        userService.checkSettleAccountAsync();
         return "ok";
     }
 }

+ 50 - 58
src/test/java/com/izouma/nineth/service/AdapayTest.java

@@ -7,9 +7,13 @@ 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.*;
-import com.izouma.nineth.dto.adapay.MemberInfo;
-import com.izouma.nineth.dto.adapay.SettleAccountsItem;
+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.dto.adapay.DivMembersItem;
+import com.izouma.nineth.dto.adapay.PaymentList;
+import com.izouma.nineth.dto.adapay.PaymentItem;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
 import com.izouma.nineth.utils.excel.BigIntegerConverter;
 import com.izouma.nineth.utils.excel.LocalDateConverter;
@@ -26,14 +30,23 @@ import java.util.List;
 import java.util.Map;
 
 public class AdapayTest {
-    private final String appId = "app_843a743d-744e-4d73-bd60-3ebbee15d383";
+    private       String     appId    = "app_843a743d-744e-4d73-bd60-3ebbee15d383";
+    private final String[][] accounts = new String[][]{
+            {"mtws-a1", "app_843a743d-744e-4d73-bd60-3ebbee15d383", "api_live_c9db942a-b6d6-4cf7-b1b1-ec1e2873a7e7"},
+            {"mtws-a2", "app_dcf563b9-14cf-4583-a023-b41eb7a88f22", "api_live_ed24cd9d-b188-46dd-97f7-45e1000dc72d"},
+            {"mtws-a3", "app_7c2c29db-72d7-4215-ba56-99eacf28d7ee", "api_live_f77971eb-e816-4523-a41f-d4423526fb06"},
+            {"mtws-a4", "app_8d662b06-27e0-46c0-b7a0-6aaffa014a9b", "api_live_b692f68b-417f-4f1c-b9ff-568e8e9de6f2"},
+            {"mtws-a5", "app_f8760acc-f4d8-46f6-8f70-d80e36517075", "api_live_8818cac1-894b-40bc-ac77-803e02e9c260"},
+    };
 
     public AdapayTest() {
+        int account = 5;
         Adapay.debug = false;
         Adapay.prodMode = true;
 
+        appId = accounts[account - 1][1];
         MerConfig merConfig = new MerConfig();
-        merConfig.setApiKey("api_live_c9db942a-b6d6-4cf7-b1b1-ec1e2873a7e7");
+        merConfig.setApiKey(accounts[account - 1][2]);
         merConfig.setApiMockKey("api_test_0b1b0eb9-30e1-4acd-8e03-10b529de1856");
         merConfig.setRSAPrivateKey("MIIEuwIBADANBgkqhkiG9w0BAQEFAASCBKUwggShAgEAAoIBAQCnIaIrFP598qcf/s3FqXxMTjrVAevnf1w5CAMdJqcRFv0WvdLEmNRxxqAYSLl/iQ8AyU4yqVwkwYqvn/aENBg0iQ5h5qboxb8T6xmrZLctk97TiIuCUwbd7Q5NBHJXzHlaKc1p1KBvTCJDMw8+t0Jh3sBkBvu7l0KPliEQHtPLBDkKvy3NBQD6BMy47kPersjSUH53HBvNpcjcPZGpUX/TmL3SNkS98RkoebFxuorK5UdazYN5xvarjfcYziShIjU3WIZJb52DGUxYWTk6vJKZrJhw7AhWIEQpH7qJxvml/B8RMQ4guHdtp3ojxwkHDtZdPU9rY8i6EHwba4qOYgobAgMBAAECggEAT36L5/oAYl+8ZleIAHBxEspS6WYUkvPdJbNN59uus04/60U2rxQSWFulYmeU87h5TmJxs18i2MjF8msfkhpFORfHo4FV+nm0PQEiIIezKRagcfUMhlx/c6eBmdh3mpNDVUN01NWxyb5ovZXXtnjsNikBUZKQwdVcb3d1GnnPO0xtt6/0xwiduCkA2ihS1tgnsYYDhMHgukIdZ3eczn3stRPQ+QyCt1JWS6DDd1nS3S2RyPZw8P9Z1zzJFVKH8z3bGqk3/98Lw7Hw+rKFnKhIA6/H9ZVORKw5OuGC3Ozy6cVbmUn8tuw3sC0NdR7w56dedB+fjJB8od0nahX1Cc6eQQKBgQDckcenslWqjs2PbncwW1wqlw7FdJX9rzJAg7kp9ItpHCoNi/kSgXeLphHXWJmyj7a1BkWynmTGxO48X3dPXUrDPFKJc42fSbxMgAQdtc/A2z+v7Ga/oUpH8jajKfKmcgeRX026R7gd9W0yi0EW+C0WdFhrzNKKY4shvnYy9lc+QwKBgQDB+mHSllqLqYru0bLrtKOKJXaR3N3INxDBZKnRqba4tUKN35IVIexiEMkHmC51jtjoRyA5Y+fc/8P11i9FbuShtRVGHWeyDibKlwff5zrETveSLTpSULBKZ6MsFSm0Fo1krSUC1QTUGG5VX/wwWm9AB2UKJqG5cMDd3i3RiPeDSQKBgBs1ED+rS83iF5Eduy4H1vKZ94R7wRSty7ERjoGSXK/2fWl2Xp7dwXVEYucBUtQnzg2+XFKQHzY1jH19+SWdCF/UzQmPa2S+n6+ACwHvL1VGtjBpJLN2nccKJZsyzW+imTRhYSEdP6TSZUnay4idzFH8v/tsJHxVkw/ygnn+0PwpAn8uOHsWsrzgioWQYmc/wss1H7ghCX/PNU/IxTOxwb7IRGiXZa5pWqv4sgc0yA5J9L+6mTgUdLnK7ybCbUbWRJY18fAfxOHwi26y10oJEA/wtuBG9H/xHUjkcc1vs5s8TiNi2d73zcpYv3mK3lQ5MVNQ7nIk+Q+QIE3UkBxa0UgpAoGBAMDwg0ebzBEZsV2cr/Er2b25LsXteDJ+V67plBNrv+A1/omA9a52sWek4bY0D+Uu6zPTDaLj9BhHC2wJmThYl0eLRKyDKYQslBR3h253Gsn3If6RH9/tSyDsQ88iAEI1f6QH27bGHL9VDrsLGEFg5E7ZEzFQuJPqoUvBOoURNwa6");
         merConfig.setRSAPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApyGiKxT+ffKnH/7Nxal8TE461QHr539cOQgDHSanERb9Fr3SxJjUccagGEi5f4kPAMlOMqlcJMGKr5/2hDQYNIkOYeam6MW/E+sZq2S3LZPe04iLglMG3e0OTQRyV8x5WinNadSgb0wiQzMPPrdCYd7AZAb7u5dCj5YhEB7TywQ5Cr8tzQUA+gTMuO5D3q7I0lB+dxwbzaXI3D2RqVF/05i90jZEvfEZKHmxcbqKyuVHWs2Decb2q433GM4koSI1N1iGSW+dgxlMWFk5OrySmayYcOwIViBEKR+6icb5pfwfETEOILh3bad6I8cJBw7WXT1Pa2PIuhB8G2uKjmIKGwIDAQAB");
@@ -206,68 +219,47 @@ public class AdapayTest {
 
     @Test
     public void singleQuery() throws BaseAdaPayException {
-        Map<String, Object> map = Payment.query("002112022030111361010344576731466739712");
+        Map<String, Object> map = Payment.query("002112022022700094210343679201843290112");
         System.out.println(JSON.toJSONString(map, SerializerFeature.PrettyFormat));
     }
 
     @Test
-    public void createmember() throws BaseAdaPayException {
-        Map<String, Object> memberParams = new HashMap<String, Object>(7);
-        memberParams.put("member_id", "member_id_test");
-        memberParams.put("app_id", appId);
-        memberParams.put("location", "上海市徐汇区宜山路700号");
-        memberParams.put("email", "123@163.com");
-        memberParams.put("gender", "MALE");
-        memberParams.put("tel_no", "13153333333");
-        memberParams.put("nickname", "nick_name");
-        Map<String, Object> member = Member.create(memberParams);
-        System.out.println(JSON.toJSONString(member, SerializerFeature.PrettyFormat));
-
-        Map<String, Object> settleCountParams = new HashMap<>();
-        Map<String, Object> accountInfo = new HashMap<>();
-        accountInfo.put("card_id", "6222024301070380165");
-        accountInfo.put("card_name", "熊竹");
-        accountInfo.put("cert_id", "321002199408304614");
-        accountInfo.put("cert_type", "00");
-        accountInfo.put("tel_no", "15077886171");
-        accountInfo.put("bank_acct_type", "2");
-        settleCountParams.put("member_id", "member_id_test");
-        settleCountParams.put("app_id", appId);
-        settleCountParams.put("channel", "bank_account");
-        settleCountParams.put("account_info", accountInfo);
-        Map<String, Object> settleCount = SettleAccount.create(settleCountParams);
-        System.out.println(JSON.toJSONString(member, SerializerFeature.PrettyFormat));
+    public void listQuery() throws BaseAdaPayException {
+        Map<String, Object> paymentParams = new HashMap<>();
+        paymentParams.put("app_id", appId);
+        paymentParams.put("payment_id", "002112022022700094210343679201843290112");
+        Map<String, Object> res = Payment.queryList(paymentParams);
+        System.out.println(JSON.toJSONString(res, SerializerFeature.PrettyFormat));
+        PaymentList paymentList = JSON.parseObject(JSON.toJSONString(res), PaymentList.class);
+        if (paymentList.getPayments() != null) {
+            PaymentItem paymentItem = paymentList.getPayments().get(0);
+            if (paymentItem.getDivMembers() != null && paymentItem.getDivMembers().size() > 1) {
+                DivMembersItem item = paymentItem.getDivMembers().stream().filter(d -> !d.getMemberId().equals("0"))
+                        .findAny().get();
+
+
+            }
+        }
     }
 
-    @Test
-    public void queryMember() throws BaseAdaPayException {
-        Map<String, Object> memberParams = new HashMap<String, Object>(2);
-        memberParams.put("member_id", "test0301");
-        memberParams.put("app_id", appId);
-        Map<String, Object> member = Member.query(memberParams);
-        System.out.println(JSON.toJSONString(member, SerializerFeature.PrettyFormat));
-        MemberInfo m = JSON.parseObject(JSON.toJSONString(member), MemberInfo.class);
-        System.out.println(m);
 
+    public void balancePay(String from, String to, String amount) throws BaseAdaPayException {
+        Map<String, Object> balanceParam = new HashMap<String, Object>(4);
+        balanceParam.put("app_id", appId);
+        balanceParam.put("adapay_func_code", "settle_accounts.balancePay");
+        balanceParam.put("order_no", new SnowflakeIdWorker(0, 0).nextId() + "");
+        balanceParam.put("out_member_id", from);
+        balanceParam.put("in_member_id", to);
+        balanceParam.put("trans_amt", amount);
+        balanceParam.put("goods_title", "一双鞋子");
+        balanceParam.put("goods_desc", "一双鞋子啊");
+
+        Map<String, Object> paymentResult = AdapayCommon.requestAdapay(balanceParam);
+        System.out.println(JSON.toJSONString(paymentResult, SerializerFeature.PrettyFormat));
     }
 
     @Test
-    public void delSettleAccount() throws BaseAdaPayException {
-        String memberId = "test0301";
-        Map<String, Object> memberParams = new HashMap<>();
-        memberParams.put("member_id", memberId);
-        memberParams.put("app_id", appId);
-        Map<String, Object> member = Member.query(memberParams);
-        MemberInfo memberInfo = JSON.parseObject(JSON.toJSONString(member), MemberInfo.class);
-        if (memberInfo.getSettleAccounts() != null && memberInfo.getSettleAccounts().size() > 0) {
-            SettleAccountsItem settleAccountsItem = memberInfo.getSettleAccounts().get(0);
-            Map<String, Object> settleCountParams = new HashMap<>();
-            settleCountParams.put("settle_account_id", settleAccountsItem.getId());
-            settleCountParams.put("member_id", memberId);
-            settleCountParams.put("app_id", appId);
-            Map<String, Object> settleCount = SettleAccount.delete(settleCountParams);
-            System.out.println(JSON.toJSONString(settleCount, SerializerFeature.PrettyFormat));
-        }
+    public void testbalancePay() throws BaseAdaPayException {
+        balancePay("8635", "3896", "0.01");
     }
-
 }