package com.walker.pay.allinpaycloud; import com.allinpay.sdk.OpenClient; import com.allinpay.sdk.bean.BizParameter; import com.allinpay.sdk.bean.OpenConfig; import com.allinpay.sdk.bean.OpenResponse; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.walker.infrastructure.utils.JsonUtils; import com.walker.infrastructure.utils.KeyValue; import com.walker.infrastructure.utils.StringUtils; import com.walker.pay.Order; import com.walker.pay.ResponsePay; import com.walker.pay.SplitAccount; import com.walker.pay.allinpaycloud.pojo.BankCardInfo; import com.walker.pay.allinpaycloud.pojo.MemberEnterprise; import com.walker.pay.allinpaycloud.pojo.MemberPerson; import com.walker.pay.allinpaycloud.pojo.RequestApplyBindBankCard; import com.walker.pay.allinpaycloud.pojo.RequestBalance; import com.walker.pay.allinpaycloud.pojo.RequestBindAcct; import com.walker.pay.allinpaycloud.pojo.RequestBindBankCard; import com.walker.pay.allinpaycloud.pojo.RequestBindPhone; import com.walker.pay.allinpaycloud.pojo.RequestConfirmPay; import com.walker.pay.allinpaycloud.pojo.RequestMember; import com.walker.pay.allinpaycloud.pojo.RequestRealName; import com.walker.pay.allinpaycloud.pojo.RequestSendVerifyCode; import com.walker.pay.allinpaycloud.pojo.RequestSetCompany; import com.walker.pay.allinpaycloud.pojo.RequestSignAcct; import com.walker.pay.allinpaycloud.pojo.RequestSignContractQuery; import com.walker.pay.allinpaycloud.pojo.RequestUnbindBankCard; import com.walker.pay.allinpaycloud.pojo.RequestUploadGather; import com.walker.pay.allinpaycloud.pojo.ResponseApplyBindBankCard; import com.walker.pay.allinpaycloud.pojo.ResponseBalance; import com.walker.pay.allinpaycloud.pojo.ResponseBindAcct; import com.walker.pay.allinpaycloud.pojo.ResponseBindBankCard; import com.walker.pay.allinpaycloud.pojo.ResponseBindPhone; import com.walker.pay.allinpaycloud.pojo.ResponseCardBinInfo; import com.walker.pay.allinpaycloud.pojo.ResponseConfirmPay; import com.walker.pay.allinpaycloud.pojo.ResponseMember; import com.walker.pay.allinpaycloud.pojo.ResponseMemberInfo; import com.walker.pay.allinpaycloud.pojo.ResponseRealName; import com.walker.pay.allinpaycloud.pojo.ResponseSetCompany; import com.walker.pay.allinpaycloud.pojo.ResponseUnBindPhone; import com.walker.pay.allinpaycloud.pojo.ResponseUnbindBankCard; import com.walker.pay.allinpaycloud.pojo.ResponseUploadGather; import com.walker.pay.allinpaycloud.pojo.ResponseWithdraw; import com.walker.pay.allinpaycloud.util.MemberUtils; import com.walker.pay.allinpaycloud.util.OrderUtils; import com.walker.pay.response.OrderStatusResponsePay; import com.walker.pay.support.BankCardOrder; import com.walker.pay.support.allinpaycloud.AlipayServiceOrder; import com.walker.pay.support.allinpaycloud.CouponOrder; import com.walker.pay.support.allinpaycloud.ScanWechatOrder; import com.walker.pay.support.allinpaycloud.WechatJsOrder; import com.walker.pay.support.allinpaycloud.WechatMiniProgramOrder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashMap; import java.util.List; /** * 通商云 SDK 封装。 * @author 时克英 * @date 2023-02-17 */ public class SdkClient { private final transient Logger logger = LoggerFactory.getLogger(getClass()); private OpenConfig openConfig = null; private OpenClient openClient = null; public SdkClient(OpenConfig openConfig){ if(openConfig == null){ throw new IllegalArgumentException("OpenConfig 必须提供!"); } this.openConfig = openConfig; this.createOpenClient(); } public OpenClient getOpenClient() { return openClient; } /** * 验证签名 * @param signedValue 请求原始内容 * @param sign 签名字段内容 * @return */ public boolean checkSign(String signedValue, String sign){ return this.openClient.checkSign(signedValue, sign); } /** * 消费订单(预下单) * @param order * @return * @date 2023-02-21 */ public OpenResponse consumeApply(Order order){ BizParameter param = new BizParameter(); param.put("payerId", order.getBuyerId()); param.put("recieverId", order.getReceiverId()); // param.put("bizOrderNo", String.valueOf(order.getId())); param.put("bizOrderNo", order.getIdString()); param.put("amount", order.getTotalMoney()); param.put("fee", order.getFee()); // 0 无验证,1 短信验证,2 支付密码 // param.put("validationType", 0L); param.put("validateType", 0L); // *** split rule // 2023-04-03 消费分账添加。 List splitAccountList = order.getSplitAccountList(); if(!StringUtils.isEmptyList(splitAccountList)){ Object splitAccountJsonArray = OrderUtils.acquireSplitAccountParam(splitAccountList); if(this.logger.isDebugEnabled()){ this.logger.debug(splitAccountJsonArray.toString()); } param.put("splitRule", splitAccountJsonArray); } param.put("backUrl", order.getNotifyUrl()); param.put("orderExpireDatetime", OrderUtils.getOrderExpireDateTime()); param.put("goodsName", order.getTitle()); // param.put("industryCode", this.industryInfo.getKey()); param.put("industryName", this.industryInfo.getValue()); param.put("source", 1L); // 1 Mobile, 2 PC param.put("extendInfo", order.getAttach()); HashMap payMethod = null; if(order instanceof BankCardOrder){ // 银行卡(快捷支付)订单 BankCardOrder bankCardOrder = (BankCardOrder)order; payMethod = OrderUtils.getBankCardPayMethod(this.openClient.encrypt(bankCardOrder.getBankCardNo()), order.getTotalMoney()); } else if(order instanceof WechatMiniProgramOrder){ // 微信小程序订单,注意:这里必须放在'WechatJsOrder'前面,否则放下面会因为类型找不到小程序支付 // 2023-03-13 WechatMiniProgramOrder wechatJsOrder = (WechatMiniProgramOrder) order; payMethod = OrderUtils.getWechatJsPayMethod(wechatJsOrder.getAcct(), wechatJsOrder.getTotalMoney() , wechatJsOrder.getLimitPay(), wechatJsOrder.getIdNo(), wechatJsOrder.getName(), wechatJsOrder.getSubAppid(), true); } else if(order instanceof WechatJsOrder){ WechatJsOrder wechatJsOrder = (WechatJsOrder) order; payMethod = OrderUtils.getWechatJsPayMethod(wechatJsOrder.getAcct(), wechatJsOrder.getTotalMoney() , wechatJsOrder.getLimitPay(), wechatJsOrder.getIdNo(), wechatJsOrder.getName(), wechatJsOrder.getSubAppid(), false); } else if(order instanceof AlipayServiceOrder){ AlipayServiceOrder alipayServiceOrder = (AlipayServiceOrder) order; payMethod = OrderUtils.getAlipayJsPayMethod(alipayServiceOrder.getAcct(), alipayServiceOrder.getTotalMoney() , alipayServiceOrder.getLimitPay(), alipayServiceOrder.getIdNo(), alipayServiceOrder.getName()); } else if(order instanceof CouponOrder){ CouponOrder couponOrder = (CouponOrder) order; payMethod = OrderUtils.getCouponPayMethod(couponOrder.getAccountSetNo(), couponOrder.getTotalMoney()); } else if(order instanceof ScanWechatOrder){ ScanWechatOrder scanWechatOrder = (ScanWechatOrder) order; payMethod = OrderUtils.getScanWechatPayMethod(scanWechatOrder); } else { // 默认订单类型 throw new UnsupportedOperationException("未实现代码!"); } param.put("payMethod", payMethod); return this.openClient.execute(Constants.METHOD_CONSUME_APPLY, param); } /** * 返回提现签约请求URL(包括参数) * @param requestSignAcct * @return * @date 2023-02-27 */ public String getSignAcctProtocolParams(RequestSignAcct requestSignAcct){ final BizParameter param = new BizParameter(); param.put("bizUserId", requestSignAcct.getBizUserId()); param.put("signAcctName", requestSignAcct.getSignAcctName()); param.put("jumpUrl", requestSignAcct.getJumpUrl()); param.put("backUrl", requestSignAcct.getBackUrl()); param.put("jumpPageType", requestSignAcct.getJumpPageType()); param.put("source", requestSignAcct.getSource()); return this.openClient.concatUrlParams(Constants.METHOD_MEMBER_SIGN_ACCT_PROTOCOL, param); } /** * 查询账户余额。 * @param requestBalance * @return */ public ResponseBalance queryBalance(RequestBalance requestBalance){ final BizParameter param = new BizParameter(); param.put("bizUserId", requestBalance.getBizUserId()); param.put("accountSetNo", requestBalance.getAccountSetNo()); final OpenResponse response = this.openClient.execute(Constants.METHOD_ORDER_QUERY_BALANCE, param); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("'查询余额'错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'查询余额'错误,msg = {}", error); return ResponsePay.error(ResponseBalance.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseBalance.class); } catch (Exception e) { throw new RuntimeException("转换'查询余额'json错误:" + e.getMessage(), e); } } /** * 查询订单状态,返回状态结果。 * @param bizOrderNo * @return * @date 2023-02-23 */ public OrderStatusResponsePay searchOrderStatus(String bizOrderNo){ final BizParameter param = new BizParameter(); param.put("bizOrderNo", bizOrderNo); final OpenResponse response = this.openClient.execute(Constants.METHOD_ORDER_GET_STATUS, param); OrderStatusResponsePay orderStatusResponsePay = new OrderStatusResponsePay(); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { String msg = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("查询订单状态错误,msg = {}", msg); orderStatusResponsePay.setStatus(false); orderStatusResponsePay.setMessage(msg); return orderStatusResponsePay; } try { ObjectNode info = JsonUtils.jsonStringToObjectNode(response.getData()); return OrderUtils.obtainOrderStatusResponsePay(info, orderStatusResponsePay); } catch (Exception e) { throw new RuntimeException("转换'查询订单状态'json错误:" + e.getMessage(), e); } } /** * 提现申请(到银行卡) * @param order * @return * @date 2023-02-23 */ public ResponseWithdraw withdrawApply(WithdrawOrder order){ final BizParameter param = new BizParameter(); param.put("bizUserId", order.getBuyerId()); // param.put("bizOrderNo", String.valueOf(order.getId())); param.put("bizOrderNo", order.getIdString()); param.put("accountSetNo", order.getAccountSetNo()); param.put("amount", order.getTotalMoney()); param.put("fee", order.getFee()); param.put("validateType", 0L); param.put("backUrl", order.getNotifyUrl()); param.put("orderExpireDatetime", OrderUtils.getOrderExpireDateTime()); param.put("bankCardNo", this.openClient.encrypt(order.getBankCardNo())); param.put("bankCardPro", order.getBankCardPro()); param.put("withdrawType", order.getWithdrawType()); param.put("industryCode", this.industryInfo.getKey()); param.put("industryName", this.industryInfo.getValue()); param.put("source", 1L); // param.put("summary", "withdraw"); param.put("extendInfo", order.getAttach()); OpenResponse response = this.openClient.execute(Constants.METHOD_ORDER_WITHDRAW_APPLY, param); if(response == null){ throw new RuntimeException("调用'通商云'提现申请返回空数据, orderId = " + order.getId()); } if (!Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("'提现申请'调用返回错误: " + response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'提现申请'错误,msg = {}", error); return ResponsePay.error(ResponseWithdraw.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseWithdraw.class); } catch (Exception e) { throw new RuntimeException("转换'提现申请'json错误:" + e.getMessage(), e); } } /** * 获取carBin信息。 * @param cardNo 银行卡号 * @return * @date 2023-02-23 */ public ResponseCardBinInfo getCardBinInfo(String cardNo){ final BizParameter param = new BizParameter(); param.put("cardNo", this.openClient.encrypt(cardNo)); final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_GET_CARD_BIN_INFO, param); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("carBin查询错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'carBin查询'错误,msg = {}", error); return ResponsePay.error(ResponseCardBinInfo.class, error); } try { ObjectNode info = JsonUtils.jsonStringToObjectNode(response.getData()); String cardBinInfo = info.get("cardBinInfo").toString(); return JsonUtils.jsonStringToObject(cardBinInfo, ResponseCardBinInfo.class); } catch (Exception e) { throw new RuntimeException("转换'carBin查询'json错误:" + e.getMessage(), e); } } /** * 获取会员信息。 * @param bizUserId * @return */ public ResponseMemberInfo getMemberInfo(String bizUserId){ final BizParameter param = new BizParameter(); param.put("bizUserId", bizUserId); final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_GET_INFO, param); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("'查询会员'错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'查询会员'错误,msg = {}", error); return ResponsePay.error(ResponseMemberInfo.class, error); } try { ObjectNode info = JsonUtils.jsonStringToObjectNode(response.getData()); ResponseMemberInfo responseMemberInfo = new ResponseMemberInfo(); String memberInfo = info.get("memberInfo").toString(); System.out.println(memberInfo); // 判断是个人或企业会员 if(info.get("memberType").asLong() == 3){ MemberPerson memberPerson = ResponseMemberInfo.toMemberPerson(memberInfo); responseMemberInfo.setMemberPerson(memberPerson); } else { MemberEnterprise memberEnterprise = ResponseMemberInfo.toMemberEnterprise(memberInfo); responseMemberInfo.setMemberEnterprise(memberEnterprise); } // return JsonUtils.jsonStringToObject(response.getData(), ResponseMemberInfo.class); return responseMemberInfo; } catch (Exception e) { throw new RuntimeException("转换'查询会员'json错误:" + e.getMessage(), e); } } /** * 签约查询。

* @param request * @return */ // public ResponseSignContractQuery signContractQuery(RequestSignContractQuery request) throws SdkException{ // final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_SIGN_CONTRACT_QUERY, MemberUtils.acquireSignContractQuery(request)); // if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); // logger.error("签约查询错误,msg = {}", error); // throw new SdkException(error, "签约查询错误", null); // } // try { // return JsonUtils.jsonStringToObject(response.getData(), ResponseSignContractQuery.class); // } catch (Exception e) { // throw new RuntimeException("转换'签约查询'json错误:" + e.getMessage(), e); // } // } public String signContractQuery(RequestSignContractQuery request) throws SdkException{ final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_SIGN_CONTRACT_QUERY, MemberUtils.acquireSignContractQuery(request)); if (response == null) { // String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); // logger.error("签约查询错误,msg = {}", error); throw new SdkException("", "签约查询错误", null); } if(response.getCode().equals(Constants.CODE_OK)){ return response.getData(); } else { logger.error(response.getMsg()); return null; } } /** * 支付确认(短信验证码),该方法在测试使用。
* 正式环境会申请开通'无验证支付'方式。 * @param request * @return * @date 2023-02-22 */ public ResponseConfirmPay confirmPay(RequestConfirmPay request){ final OpenResponse response = this.openClient.execute(Constants.METHOD_ORDER_CONFIRM_PAY, MemberUtils.acquireConfirmPay(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("支付确认(短信验证)错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'支付确认(短信验证)'错误,msg = {}", error); return ResponsePay.error(ResponseConfirmPay.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseConfirmPay.class); } catch (Exception e) { throw new RuntimeException("转换'支付确认(短信验证)'json错误:" + e.getMessage(), e); } } /** * 上传影音采集信息。

*
     *     1-营业执照(必传)
     * 2-组织机构代码证(三证时必传)
     * 3-税务登记证(三证时必传)
     * 4-银行开户证明(非必传,上传《银行开户许可证》或《基本存款账户信息》等可证明平台银行账号和户名的文件)
     * 5-机构信用代码(非必传)
     * 6-ICP备案许可(非必传)
     * 7-行业许可证(非必传)
     * 8-身份证正面(人像面)(必传)
     * 9-身份证反面(国徽面)(必传)
     * 
* @param request * @return */ public ResponseUploadGather uploadGather(RequestUploadGather request){ final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_IDCARD_COLLECT, MemberUtils.acquireUploadGather(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("影音采集错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'影音采集'错误,msg = {}", error); return ResponsePay.error(ResponseUploadGather.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseUploadGather.class); } catch (Exception e) { throw new RuntimeException("转换'影音采集'json错误:" + e.getMessage(), e); } } /** * 设置企业信息。 * @param request * @return */ public ResponseSetCompany setCompany(RequestSetCompany request){ request.setLegalIds(this.openClient.encrypt(request.getLegalIds())); request.setAccountNo(this.openClient.encrypt(request.getAccountNo())); final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_SET_COMPANY, MemberUtils.acquireSetCompany(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("设置企业错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'设置企业'错误,msg = {}", error); return ResponsePay.error(ResponseSetCompany.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseSetCompany.class); } catch (Exception e) { throw new RuntimeException("转换'设置企业'json错误:" + e.getMessage(), e); } } /** * 绑定手机确认 * @param request * @return */ public ResponseBindPhone bindPhone(RequestBindPhone request){ final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_BIND_PHONE, MemberUtils.acquireBindPhone(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("绑定手机错误,msg = {}", error); return ResponsePay.error(ResponseBindPhone.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseBindPhone.class); } catch (Exception e) { throw new RuntimeException("转换'绑定手机'json错误:" + e.getMessage(), e); } } /** * 解绑手机号(确认),之前必须先调用发送验证码。 * @param request * @return * @date 2023-02-27 */ public ResponseUnBindPhone unbindPhone(RequestBindPhone request){ final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_UNBIND_PHONE, MemberUtils.acquireBindPhone(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'解绑手机'错误,msg = {}", error); return ResponsePay.error(ResponseUnBindPhone.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseUnBindPhone.class); } catch (Exception e) { throw new RuntimeException("转换'解绑手机'json错误:" + e.getMessage(), e); } } /** * 绑定手机(发送验证码) * @param request * @return */ public ResponseBindPhone sendVerifyCode(RequestSendVerifyCode request){ final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_SEND_VERIFY_CODE, MemberUtils.acquireSendVerifyCode(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("绑定手机(发送验证码)错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'绑定手机(发送验证码)'错误,msg = {}", error); return ResponsePay.error(ResponseBindPhone.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseBindPhone.class); } catch (Exception e) { throw new RuntimeException("转换'绑定手机(发送验证码)'json错误:" + e.getMessage(), e); } } /** * 解除绑定银行卡 * @param request * @return */ public ResponseUnbindBankCard unbindBankCard(RequestUnbindBankCard request){ request.setCardNo(this.openClient.encrypt(request.getCardNo())); final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_UNBIND_BANKCARD, MemberUtils.acquireUnbindBankCard(request)); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { // logger.error("解除绑定银行卡错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); String error = response == null? StringUtils.EMPTY_STRING : response.getSubMsg(); logger.error("'解除绑定银行卡'错误,msg = {}", error); return ResponsePay.error(ResponseUnbindBankCard.class, error); } try { return JsonUtils.jsonStringToObject(response.getData(), ResponseUnbindBankCard.class); } catch (Exception e) { throw new RuntimeException("转换'解除绑定银行卡'json错误:" + e.getMessage(), e); } } /** * 查询个人绑卡列表 * @param bizUserId 业务用户ID * @param cardNo 卡号,如果不提供则返回所有卡集合。 * @return * @date 2023-02-23 */ public List getBindCardList(String bizUserId, String cardNo) throws SdkException{ final BizParameter param = new BizParameter(); param.put("bizUserId", bizUserId); if(StringUtils.isNotEmpty(cardNo)){ param.put("cardNo", this.openClient.encrypt(cardNo)); } final OpenResponse response = this.openClient.execute(Constants.METHOD_MEMBER_GET_CARD_BIND, param); if (response == null || !Constants.SUB_CODE_OK.equals(response.getSubCode())) { logger.error("'查询绑卡'错误,msg = {}", response == null? StringUtils.EMPTY_STRING : response.getSubMsg()); throw new SdkException(response.getSubMsg(), "查询绑卡调用sdk错误", null); } try { ObjectNode info = JsonUtils.jsonStringToObjectNode(response.getData()); String cardListInfo = info.get("bindCardList").toString(); ArrayNode arrayNode = JsonUtils.toJsonArray(cardListInfo); if(arrayNode == null || arrayNode.size() <= 0){ return null; } List bankCardInfos = new ArrayList<>(4); String one = null; BankCardInfo bankCardInfo = null; for(int i=0; i industryInfo) { this.industryInfo = industryInfo; } private KeyValue industryInfo = new KeyValue<>("2422", "其他"); }