创建实名用户、创建结算账户

This commit is contained in:
HH 2022-05-05 21:39:37 +08:00
parent 2b6c510f42
commit a00e9f6b96
4 changed files with 1819 additions and 12 deletions

View File

@ -95,6 +95,16 @@
<groupId>com.ghy</groupId> <groupId>com.ghy</groupId>
<artifactId>ghy-worker</artifactId> <artifactId>ghy-worker</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>

View File

@ -154,8 +154,10 @@ qiniu:
mediaUrl: 'http://gqz.opsoul.com/' mediaUrl: 'http://gqz.opsoul.com/'
adapay: adapay:
debug: true
prod-mode: false
appId: 'app_01af32e7-6173-414f-88e5-79cae64d5e24' appId: 'app_01af32e7-6173-414f-88e5-79cae64d5e24'
notifyUrl: 'http://www.opsoul.com/adapay/callback' notifyUrl: 'https://www.opsoul.com/adapay/callback'
apiKey: 'api_live_93a2fb4f-a74a-416f-967d-68557bcde43f' apiKey: 'api_live_93a2fb4f-a74a-416f-967d-68557bcde43f'
mockApiKey: 'api_test_88bf2958-583d-41cd-a987-01fe767ff056' mockApiKey: 'api_test_88bf2958-583d-41cd-a987-01fe767ff056'
rsaPrivateKey: 'MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMTk5xzz3KXA+waawr1DbU/SaSXZN8tY/22qHON7AAsp+yJ1/JCt+sD6/mpIUGittBS4n69t/9R5+2uHtD5/tVH7hYpJpVixLQw8/lonLPbeLFLgTMBHKJwSytBZXC2delnewHO/Zg6WlTWkdQB7gr73m7/wu2Ss+FDwGq6Q8sXdAgMBAAECgYEAtl8LTr72DjWsjdaFMEcnFftf12XWjyx1Ev+xWGcSiESvT6EXem8bxun1Az7N89eI6HSFvDlX8Fe4MEZ3BjjGGXSEXh3BYg5jI9YY/x4NdPvCxxVf9gGmBo2uBjkPoqYE8IGfpxnF+C4CBEyI5FPjhQRYB7aPKL7hImoCFkaFG4UCQQDojfLHd2ON2sgZdeAML9jxNzf1CBsGVfDrI7GOj+enWG+lWjG5tav/essfDOlZ6rZslyquLQZAGQqZz06cVCMzAkEA2L6WuCiEop9gsnGk03UcO8u54jFC68+2IA4bJeqicFmqMgs73PzsnNZ7t31q51iGsKxvCm3hziTGHGGH9TZyrwJATda1XG5ptCF2uI7r3yhkxNhmsm10HjrF2O6pj747G5hORlpaKn7Ugz7mng4ETURyqwYuEv6fCPVYxwLMnSbMYQJBAMggMkoYH1+IiWA6TlZw64DKuvd/RKs3PpKac7auzw2tvNg4Ry3k2xR1dgYWZ3703miCzoRysOwGSGYsJ7ziaUECQQC1RqZ0UBtEbKSr9fRYxo/lg28ioTlxoMjSL2OumEyJk+2t0S3gPQq5Wz+ylcwnK3Md0kGTyYs5kkTWPyPm9V1F' rsaPrivateKey: 'MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAMTk5xzz3KXA+waawr1DbU/SaSXZN8tY/22qHON7AAsp+yJ1/JCt+sD6/mpIUGittBS4n69t/9R5+2uHtD5/tVH7hYpJpVixLQw8/lonLPbeLFLgTMBHKJwSytBZXC2delnewHO/Zg6WlTWkdQB7gr73m7/wu2Ss+FDwGq6Q8sXdAgMBAAECgYEAtl8LTr72DjWsjdaFMEcnFftf12XWjyx1Ev+xWGcSiESvT6EXem8bxun1Az7N89eI6HSFvDlX8Fe4MEZ3BjjGGXSEXh3BYg5jI9YY/x4NdPvCxxVf9gGmBo2uBjkPoqYE8IGfpxnF+C4CBEyI5FPjhQRYB7aPKL7hImoCFkaFG4UCQQDojfLHd2ON2sgZdeAML9jxNzf1CBsGVfDrI7GOj+enWG+lWjG5tav/essfDOlZ6rZslyquLQZAGQqZz06cVCMzAkEA2L6WuCiEop9gsnGk03UcO8u54jFC68+2IA4bJeqicFmqMgs73PzsnNZ7t31q51iGsKxvCm3hziTGHGGH9TZyrwJATda1XG5ptCF2uI7r3yhkxNhmsm10HjrF2O6pj747G5hORlpaKn7Ugz7mng4ETURyqwYuEv6fCPVYxwLMnSbMYQJBAMggMkoYH1+IiWA6TlZw64DKuvd/RKs3PpKac7auzw2tvNg4Ry3k2xR1dgYWZ3703miCzoRysOwGSGYsJ7ziaUECQQC1RqZ0UBtEbKSr9fRYxo/lg28ioTlxoMjSL2OumEyJk+2t0S3gPQq5Wz+ylcwnK3Md0kGTyYs5kkTWPyPm9V1F'

File diff suppressed because it is too large Load Diff

View File

@ -9,15 +9,15 @@ import com.ghy.common.adapay.callback.mapping.RefundReplyMapping;
import com.ghy.common.adapay.callback.model.Expend; import com.ghy.common.adapay.callback.model.Expend;
import com.ghy.common.adapay.callback.model.WxLiteExpend; import com.ghy.common.adapay.callback.model.WxLiteExpend;
import com.huifu.adapay.core.exception.BaseAdaPayException; import com.huifu.adapay.core.exception.BaseAdaPayException;
import com.huifu.adapay.model.Drawcash; import com.huifu.adapay.model.*;
import com.huifu.adapay.model.Payment;
import com.huifu.adapay.model.Refund;
import lombok.Setter; import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -29,9 +29,95 @@ public class AdapayService {
protected final Logger logger = LoggerFactory.getLogger(this.getClass()); protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired @Resource
private AdapayProperties adapayProperties; private AdapayProperties adapayProperties;
/**
* 创建结算账户对象 https://docs.adapay.tech/api/trade.html#settle-account-create
* 创建结算账户对象是为一个已创建用户对象创建结算账户用于对用户分账金额的结算目前仅支持绑定银行卡结算账户
* 用户创建对私结算账户时会对银行卡号银行卡开户姓名身份证号三要素认证若认证失败则创建结算账户失败
* 每个结算账户对象 Adapay 系统会生成一个唯一的 id可用于查询结算账户对象或者删除结算账户对象
*
* @param memberId [必填]商户下的用户id只能为英文数字或者下划线的一种或多种组合保证在app_id下唯一
* @param cardId [必填]银行卡号
* @param cardName [必填]银行卡对应的户名
* @param telNo [必填]手机号
* @param bankAcctType [必填]银行账户类型1-对公2-对私
* @param certId 证件号银行账户类型为对私时必填
* @param bankCode 银行编码银行账户类型对公时必填详见附录 银行代码 https://docs.adapay.tech/api/appendix.html#id3
* @param provCode 银行账户开户银行所在省份编码 省市编码银行账户类型为对公时必填省市编码详见area.json
* @param areaCode 银行账户开户银行所在地区编码省市编码银行账户类型为对公时必填省市编码详见area.json
* @return 成功时同步返回一个包含 SettleAccount对象 JSON
*/
public Map<String, Object> createSettleAccount(@NotNull String memberId, @NotNull String cardId, @NotNull String cardName,
@NotNull String bankAcctType, String certId, String telNo,
String bankCode, String provCode, String areaCode) throws BaseAdaPayException {
// 结算账户信息 参见结算账户信息(AccountInfo)对象 https://docs.adapay.tech/api/appendix.html#accountinfo
Map<String, Object> accountInfo = new HashMap<>(9);
switch (bankAcctType) {
case "1":
Assert.isTrue(StringUtils.isNoneBlank(bankCode, provCode, areaCode),
"[bankCode, provCode, areaCode] cannot be empty !");
case "2":
Assert.hasText(cardId, "cardId is blank !");
accountInfo.put("cert_type", "00");
accountInfo.put("cert_id", certId);
break;
default:
throw new BaseAdaPayException("Wrong bankAcctType !");
}
accountInfo.put("card_id", cardId);
accountInfo.put("card_name", cardName);
accountInfo.put("tel_no", telNo);
accountInfo.put("bank_code", bankCode);
accountInfo.put("bank_acct_type", bankAcctType);
accountInfo.put("prov_code", provCode);
accountInfo.put("area_code", areaCode);
Map<String, Object> settleCountParams = new HashMap<>(4);
settleCountParams.put("member_id", memberId);
settleCountParams.put("app_id", adapayProperties.getAppId());
// 目前仅支持bank_account银行卡
settleCountParams.put("channel", "bank_account");
settleCountParams.put("account_info", accountInfo);
return SettleAccount.create(settleCountParams);
}
/**
* 创建实名用户 https://docs.adapay.tech/api/trade.html#member-realname
*
* @param memberId [必填]商户下的用户id只能为英文数字或者下划线的一种或多种组合保证在app_id下唯一
* @param telNo [必填]用户手机号
* @param username [必填]用户姓名
* @param certId [必填]证件号
* @param location 用户地址
* @param email 用户邮箱
* @param gender MALEFEMALE为空时表示未填写
* @param nickname 用户昵称
* @return 成功时同步返回一个包含Member对象的JSON
*/
public Map<String, Object> createMember(String memberId, String telNo, String username, String certId,
String location, String email, String gender, String nickname) throws BaseAdaPayException {
Map<String, Object> memberParams = new HashMap<>(7);
memberParams.put("member_id", memberId);
memberParams.put("app_id", adapayProperties.getAppId());
memberParams.put("location", location);
memberParams.put("email", email);
memberParams.put("gender", gender);
memberParams.put("nickname", nickname);
memberParams.put("tel_no", telNo);
memberParams.put("user_name", username);
// 证件类型仅支持00-身份证
memberParams.put("cert_type", "00");
// 接口功能号
memberParams.put("adapay_func_code", "members.realname");
memberParams.put("cert_id", certId);
return AdapayCommon.requestAdapay(memberParams);
}
/** /**
* 对指定商户或者商户下用户的结算账户可用余额发起主动取现操作金额从账户中提到绑定的结算银行卡中 * 对指定商户或者商户下用户的结算账户可用余额发起主动取现操作金额从账户中提到绑定的结算银行卡中
* *
@ -67,9 +153,9 @@ public class AdapayService {
/** /**
* 支付宝正扫支付 * 支付宝正扫支付
*/ */
public Map<String, Object> alipayQrPay(PayCallback callback, WxLiteExpend expend, String orderNo, String payAmt, public Map<String, Object> alipayQrPay(PayCallback callback, String orderNo, String payAmt,
String goodsTittle, String goodsDesc, String divMembers, String description) throws BaseAdaPayException { String goodsTittle, String goodsDesc, String divMembers, String description) throws BaseAdaPayException {
return pay(callback, PayChannelEnum.ALIPAY_QR.getCode(), expend, orderNo, payAmt, goodsTittle, goodsDesc, divMembers, description); return pay(callback, PayChannelEnum.ALIPAY_QR.getCode(), null, orderNo, payAmt, goodsTittle, goodsDesc, divMembers, description);
} }
/** /**
@ -114,10 +200,7 @@ public class AdapayService {
paymentParams.put("description", description); paymentParams.put("description", description);
paymentParams.put("expend", expend); paymentParams.put("expend", expend);
PayReplyMapping.putCallback(orderNo, callback); PayReplyMapping.putCallback(orderNo, callback);
logger.info("paymentParams=" + paymentParams);
paymentParams.forEach((key, value) -> {
logger.info("key is " + key + ", value is " + value);
});
return Payment.create(paymentParams); return Payment.create(paymentParams);
} }