package com.jsowell.adapay.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.PropertyNamingStrategies; import com.google.common.collect.Maps; import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.model.Member; import com.huifu.adapay.model.SettleAccount; import com.jsowell.adapay.dto.AdapayMemberInfoDTO; import com.jsowell.adapay.vo.AdapayAccountBalanceVO; import com.jsowell.adapay.vo.AdapayMemberInfoVO; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; import com.jsowell.pile.domain.AdapayMemberInfo; import com.jsowell.pile.domain.AdapaySettleAccount; import com.jsowell.pile.service.AdapayMemberInfoService; import com.jsowell.pile.service.IAdapaySettleAccountService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.Map; @Slf4j @Service public class AdapayMemberService { @Value("${adapay.appId}") private String ADAPAY_APP_ID; @Autowired private AdapayMemberInfoService adapayMemberInfoService; @Autowired private IAdapaySettleAccountService adapaySettleAccountService; /** * 创建汇付会员 * @param dto * @throws Exception */ public void createMember(AdapayMemberInfoDTO dto) throws Exception { AdapayMemberInfo adapayMemberInfo = adapayMemberInfoService.selectByMerchantId(dto.getMerchantId()); if (adapayMemberInfo != null) { return; } log.info("=======execute CreateMember begin======="); Map memberParams = Maps.newHashMap(); memberParams.put("member_id", "AM" + IdUtils.getMemberId()); memberParams.put("app_id", ADAPAY_APP_ID); memberParams.put("location", dto.getLocation()); memberParams.put("email", dto.getEmail()); memberParams.put("gender", dto.getGender()); memberParams.put("nickname", dto.getNickname()); log.info("创建用户,请求参数:" + JSON.toJSONString(memberParams)); Map member = Member.create(memberParams); log.info("创建用户,返回参数:" + JSON.toJSONString(member)); log.info("=======execute CreateMember end======="); if (member == null || StringUtils.equals((String) member.get("status"), "failed")) { String errorMsg = member == null ? "创建汇付用户失败" : (String) member.get("error_msg"); throw new BusinessException("00500001", errorMsg); } // 创建成功保存到数据库 JSONObject jsonObject = JSON.parseObject(String.valueOf(member)); ObjectMapper mapper = new ObjectMapper(); mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE); adapayMemberInfo = mapper.readValue(jsonObject.toJSONString(), AdapayMemberInfo.class); adapayMemberInfo.setMerchantId(dto.getMerchantId()); adapayMemberInfoService.insert(adapayMemberInfo); dto.setAdapayMemberId(adapayMemberInfo.getMemberId()); // 创建结算账户 createSettleAccount(dto); } /** * 查询汇付会员信息 * @param merchantId * @return */ public AdapayMemberInfoVO selectAdapayMember(String merchantId) { AdapayMemberInfo adapayMemberInfo = adapayMemberInfoService.selectByMerchantId(merchantId); if (adapayMemberInfo == null) { return null; } AdapayMemberInfoVO resultVO = new AdapayMemberInfoVO(); BeanUtils.copyProperties(adapayMemberInfo, resultVO); return resultVO; } /** * 创建结算账户 */ public void createSettleAccount(AdapayMemberInfoDTO dto) throws BaseAdaPayException { Map accountInfo = Maps.newHashMap(); // 银行卡号 accountInfo.put("card_id", dto.getCardId()); // 银行卡对应的户名 accountInfo.put("card_name", dto.getCardName()); // 证件号,银行账户类型为对私时,必填 accountInfo.put("cert_id", dto.getCertId()); // 证件类型,仅支持:00-身份证,银行账户类型为对私时,必填 accountInfo.put("cert_type", "00"); // 手机号 accountInfo.put("tel_no", dto.getTelNo()); // 银行编码,详见附录 银行代码,银行账户类型对公时,必填 accountInfo.put("bank_code", dto.getBankCode()); // 银行账户类型:1-对公;2-对私 accountInfo.put("bank_acct_type", dto.getBankAcctType()); // 银行账户开户银行所在省份编码 (省市编码),银行账户类型为对公时,必填 accountInfo.put("prov_code", dto.getAreaCode()); // 银行账户开户银行所在地区编码(省市编码),银行账户类型为对公时,必填 accountInfo.put("area_code", dto.getAreaCode()); Map settleCountParams = Maps.newHashMap(); settleCountParams.put("member_id", dto.getAdapayMemberId()); settleCountParams.put("app_id", ADAPAY_APP_ID); // channel String Y 目前仅支持:bank_account(银行卡) settleCountParams.put("channel", "bank_account"); settleCountParams.put("account_info", accountInfo); Map settleCount = SettleAccount.create(settleCountParams); log.info("创建汇付结算账户result:{}", settleCount); if (settleCount != null && "succeeded".equals(settleCount.get("status"))) { AdapaySettleAccount adapaySettleAccount = new AdapaySettleAccount(); adapaySettleAccount.setSettleAccountId((String) settleCount.get("id")); adapaySettleAccount.setMerchantId(dto.getMerchantId()); adapaySettleAccount.setAdapayMemberId(dto.getAdapayMemberId()); adapaySettleAccount.setCardId(dto.getCardId()); adapaySettleAccount.setCardName(dto.getCardName()); adapaySettleAccount.setCertId(dto.getCertId()); adapaySettleAccount.setCertType("00"); adapaySettleAccount.setTelNo(dto.getTelNo()); adapaySettleAccount.setBankCode(dto.getBankCode()); adapaySettleAccount.setBankAcctType(dto.getBankAcctType()); adapaySettleAccount.setProvCode(dto.getProvCode()); adapaySettleAccount.setAreaCode(dto.getAreaCode()); adapaySettleAccountService.insertAdapaySettleAccount(adapaySettleAccount); } } /** * 查询汇付会员账户余额 */ public AdapayAccountBalanceVO queryAdapayAccountBalance(String merchantId) throws BaseAdaPayException { AdapayAccountBalanceVO vo = AdapayAccountBalanceVO.builder().build(); // 通过merchantId 查询出汇付会员id 和 结算账户id,用来查询余额 AdapaySettleAccount adapaySettleAccount = adapaySettleAccountService.selectByMerchantId(merchantId); if (adapaySettleAccount == null) { return vo; } String settle_account_id = adapaySettleAccount.getAdapayMemberId(); String member_id = adapaySettleAccount.getAdapayMemberId(); Map queryParams = Maps.newHashMap(); queryParams.put("settle_account_id", settle_account_id); queryParams.put("member_id", member_id); queryParams.put("app_id", ADAPAY_APP_ID); Map settleCount = SettleAccount.balance(queryParams); if (settleCount == null || settleCount.isEmpty() || "succeeded".equals(settleCount.get("status"))) { return vo; } vo.setFrzBalance(new BigDecimal((String) settleCount.get("frz_balance"))); vo.setAcctBalance(new BigDecimal((String) settleCount.get("acct_balance"))); vo.setAvlBalance(new BigDecimal((String) settleCount.get("avl_balance"))); vo.setLastAvlBalance(new BigDecimal((String) settleCount.get("last_avl_balance"))); return vo; } }