Files
jsowell-charger-web/jsowell-pile/src/main/java/com/jsowell/adapay/service/AdapayMemberService.java
2023-06-13 11:28:15 +08:00

176 lines
8.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> 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<String, Object> settleCount = SettleAccount.create(settleCountParams);
log.info("创建汇付结算账户result:{}", settleCount);
if (settleCount != null && StringUtils.equals((String) settleCount.get("status"), "succeeded")) {
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<String, Object> 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<String, Object> settleCount = SettleAccount.balance(queryParams);
if (settleCount == null || settleCount.isEmpty() || StringUtils.equals((String)settleCount.get("status"), "succeeded")) {
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;
}
}