|
@@ -15,9 +15,11 @@ import org.apache.commons.lang3.StringUtils;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
import shop.alien.entity.store.LifeUser;
|
|
import shop.alien.entity.store.LifeUser;
|
|
|
|
|
+import shop.alien.entity.store.StoreAliPayErrorLog;
|
|
|
import shop.alien.entity.store.StoreAliPayLog;
|
|
import shop.alien.entity.store.StoreAliPayLog;
|
|
|
import shop.alien.entity.store.StoreUser;
|
|
import shop.alien.entity.store.StoreUser;
|
|
|
import shop.alien.store.service.LifeUserService;
|
|
import shop.alien.store.service.LifeUserService;
|
|
|
|
|
+import shop.alien.store.service.StoreAliPayErrorLogService;
|
|
|
import shop.alien.store.service.StoreAliPayLogService;
|
|
import shop.alien.store.service.StoreAliPayLogService;
|
|
|
import shop.alien.store.service.StoreUserService;
|
|
import shop.alien.store.service.StoreUserService;
|
|
|
import shop.alien.util.common.RandomCreateUtil;
|
|
import shop.alien.util.common.RandomCreateUtil;
|
|
@@ -46,6 +48,8 @@ public class AliApi {
|
|
|
|
|
|
|
|
private final LifeUserService lifeUserService;
|
|
private final LifeUserService lifeUserService;
|
|
|
|
|
|
|
|
|
|
+ private final StoreAliPayErrorLogService storeAliPayErrorLogService;
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* 商家端appId
|
|
* 商家端appId
|
|
|
*/
|
|
*/
|
|
@@ -167,13 +171,14 @@ public class AliApi {
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 退款
|
|
* 退款
|
|
|
|
|
+ *
|
|
|
* @param outTradeNo
|
|
* @param outTradeNo
|
|
|
* @param refundAmount
|
|
* @param refundAmount
|
|
|
* @param refundReason
|
|
* @param refundReason
|
|
|
* @return
|
|
* @return
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
- public String processRefund(String outTradeNo, String refundAmount, String refundReason,String partialRefundCode) {
|
|
|
|
|
|
|
+ public String processRefund(String outTradeNo, String refundAmount, String refundReason, String partialRefundCode) {
|
|
|
try {
|
|
try {
|
|
|
// TODO 部分退款支付宝接口修改
|
|
// TODO 部分退款支付宝接口修改
|
|
|
AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig(null));
|
|
AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig(null));
|
|
@@ -182,7 +187,7 @@ public class AliApi {
|
|
|
model.setOutTradeNo(outTradeNo);
|
|
model.setOutTradeNo(outTradeNo);
|
|
|
model.setRefundAmount(refundAmount);
|
|
model.setRefundAmount(refundAmount);
|
|
|
model.setRefundReason(refundReason);
|
|
model.setRefundReason(refundReason);
|
|
|
- if(StringUtils.isNotBlank(partialRefundCode)){
|
|
|
|
|
|
|
+ if (StringUtils.isNotBlank(partialRefundCode)) {
|
|
|
model.setOutRequestNo(partialRefundCode);
|
|
model.setOutRequestNo(partialRefundCode);
|
|
|
}
|
|
}
|
|
|
request.setBizModel(model);
|
|
request.setBizModel(model);
|
|
@@ -190,9 +195,20 @@ public class AliApi {
|
|
|
String refundReslut = "";
|
|
String refundReslut = "";
|
|
|
if (response.isSuccess()) {
|
|
if (response.isSuccess()) {
|
|
|
refundReslut = "调用成功";
|
|
refundReslut = "调用成功";
|
|
|
|
|
+ // 保存退款信息进入到支付宝记录表
|
|
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(response.getBody()).getJSONObject("alipay_fund_trans_uni_transfer_response");
|
|
|
|
|
+ StoreAliPayLog storeAliPayLog = new StoreAliPayLog();
|
|
|
|
|
+ storeAliPayLog.setTransAmount(refundAmount);
|
|
|
|
|
+ storeAliPayLog.setOutBizNo(jsonObject.getString("out_biz_no"));
|
|
|
|
|
+ storeAliPayLog.setOrderId(jsonObject.getString("order_id"));
|
|
|
|
|
+ storeAliPayLog.setPayFundOrderId(jsonObject.getString("pay_fund_order_id"));
|
|
|
|
|
+ storeAliPayLog.setTransDate(jsonObject.getString("trans_date"));
|
|
|
|
|
+ storeAliPayLogService.save(storeAliPayLog);
|
|
|
|
|
+
|
|
|
} else {
|
|
} else {
|
|
|
log.warn("AliPayConfig.processRefund ERROR Msg={}", response.getBody());
|
|
log.warn("AliPayConfig.processRefund ERROR Msg={}", response.getBody());
|
|
|
- refundReslut = "调用失败";
|
|
|
|
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(response.getBody()).getJSONObject("alipay_trade_refund_response");
|
|
|
|
|
+ refundReslut = jsonObject.getString("sub_msg");
|
|
|
}
|
|
}
|
|
|
return refundReslut;
|
|
return refundReslut;
|
|
|
} catch (AlipayApiException e) {
|
|
} catch (AlipayApiException e) {
|
|
@@ -311,6 +327,120 @@ public class AliApi {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
|
|
+ * 单笔转账接口 提现使用
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param name 收款人姓名
|
|
|
|
|
+ * @param idCard 收款人身份证号
|
|
|
|
|
+ * @param account 收款人支付宝账号
|
|
|
|
|
+ * @param money 收款金额
|
|
|
|
|
+ * @param phone 收款金额
|
|
|
|
|
+ * @return 是否成功
|
|
|
|
|
+ */
|
|
|
|
|
+ public StoreAliPayLog payAccount(String name, String idCard, String account, String money, String phone) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ log.info("AliPayConfig.pay?name={}&idCard={}&account={}&money={}&phone={}", name, idCard, account, money, phone);
|
|
|
|
|
+ // 初始化SDK
|
|
|
|
|
+ AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig(null));
|
|
|
|
|
+ // 构造请求参数以调用接口
|
|
|
|
|
+ AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
|
|
|
|
|
+ AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel();
|
|
|
|
|
+ // 设置商家侧唯一订单号
|
|
|
|
|
+ model.setOutBizNo("pay_" + createOrderNo());
|
|
|
|
|
+ // 设置订单总金额
|
|
|
|
|
+ model.setTransAmount(money);
|
|
|
|
|
+ // 设置描述特定的业务场景
|
|
|
|
|
+ model.setBizScene("DIRECT_TRANSFER");
|
|
|
|
|
+ // 设置业务产品码
|
|
|
|
|
+ model.setProductCode("TRANS_ACCOUNT_NO_PWD");
|
|
|
|
|
+ // 设置转账业务的标题
|
|
|
|
|
+ model.setOrderTitle("商家转账");
|
|
|
|
|
+ // 设置收款方信息
|
|
|
|
|
+ Participant payeeInfo = new Participant();
|
|
|
|
|
+ payeeInfo.setCertType("IDENTITY_CARD");
|
|
|
|
|
+ payeeInfo.setCertNo(idCard);
|
|
|
|
|
+ payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
|
|
|
|
|
+ if(account!=null){
|
|
|
|
|
+ payeeInfo.setIdentity(account);
|
|
|
|
|
+ }else{
|
|
|
|
|
+ payeeInfo.setIdentity(phone);
|
|
|
|
|
+ }
|
|
|
|
|
+ payeeInfo.setName(name);
|
|
|
|
|
+ model.setPayeeInfo(payeeInfo);
|
|
|
|
|
+ // 设置业务备注
|
|
|
|
|
+ model.setRemark("爱丽恩提现业务");
|
|
|
|
|
+ // 设置转账业务请求的扩展参数
|
|
|
|
|
+ model.setBusinessParams("{\"payer_show_name_use_alias\":\"true\"}");
|
|
|
|
|
+ request.setBizModel(model);
|
|
|
|
|
+ AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
|
|
|
|
|
+ if (response.isSuccess()) {
|
|
|
|
|
+ //查询用户
|
|
|
|
|
+ LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(StoreUser::getIdCard, idCard);
|
|
|
|
|
+ queryWrapper.eq(StoreUser::getPhone, phone);
|
|
|
|
|
+ queryWrapper.eq(StoreUser::getName, name);
|
|
|
|
|
+ StoreUser one = storeUserService.getOne(queryWrapper);
|
|
|
|
|
+ JSONObject jsonObject = JSONObject.parseObject(response.getBody()).getJSONObject("alipay_fund_trans_uni_transfer_response");
|
|
|
|
|
+ StoreAliPayLog storeAliPayLog = new StoreAliPayLog();
|
|
|
|
|
+ storeAliPayLog.setTransAmount(money);
|
|
|
|
|
+ storeAliPayLog.setOutBizNo(jsonObject.getString("out_biz_no"));
|
|
|
|
|
+ storeAliPayLog.setOrderId(jsonObject.getString("order_id"));
|
|
|
|
|
+ storeAliPayLog.setPayFundOrderId(jsonObject.getString("pay_fund_order_id"));
|
|
|
|
|
+ storeAliPayLog.setTransDate(jsonObject.getString("trans_date"));
|
|
|
|
|
+ if (null == one) {
|
|
|
|
|
+ LambdaQueryWrapper<LifeUser> userQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ userQueryWrapper.eq(LifeUser::getIdCard, idCard);
|
|
|
|
|
+ userQueryWrapper.eq(LifeUser::getUserPhone, phone);
|
|
|
|
|
+ userQueryWrapper.eq(LifeUser::getRealName, name);
|
|
|
|
|
+ LifeUser userOne = lifeUserService.getOne(userQueryWrapper);
|
|
|
|
|
+ storeAliPayLog.setStoreUserId(userOne.getId());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ storeAliPayLog.setStoreUserId(one.getId());
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ storeAliPayLogService.save(storeAliPayLog);
|
|
|
|
|
+ return storeAliPayLog;
|
|
|
|
|
+ } else if(response.getCode().equals("40004")){
|
|
|
|
|
+ StoreAliPayLog storeAliPayLog = new StoreAliPayLog();
|
|
|
|
|
+ StoreAliPayErrorLog storeAliPayErrorLog = new StoreAliPayErrorLog();
|
|
|
|
|
+ LambdaQueryWrapper<StoreUser> queryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ queryWrapper.eq(StoreUser::getIdCard, idCard);
|
|
|
|
|
+ queryWrapper.eq(StoreUser::getPhone, phone);
|
|
|
|
|
+ queryWrapper.eq(StoreUser::getName, name);
|
|
|
|
|
+ StoreUser one = storeUserService.getOne(queryWrapper);
|
|
|
|
|
+ String subInfo = getMassage(response.getSubCode());
|
|
|
|
|
+ storeAliPayErrorLog.setTransAmount(money);
|
|
|
|
|
+ String bizContentStr = (String) response.getParams().get("biz_content");
|
|
|
|
|
+ storeAliPayErrorLog.setSubCode(response.getSubCode());
|
|
|
|
|
+ storeAliPayErrorLog.setSubMsg(response.getSubMsg());
|
|
|
|
|
+ storeAliPayErrorLog.setBizContent(bizContentStr);
|
|
|
|
|
+ storeAliPayErrorLog.setInformation(subInfo);
|
|
|
|
|
+ if (null == one) {
|
|
|
|
|
+ LambdaQueryWrapper<LifeUser> userQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
|
|
+ userQueryWrapper.eq(LifeUser::getIdCard, idCard);
|
|
|
|
|
+ userQueryWrapper.eq(LifeUser::getUserPhone, phone);
|
|
|
|
|
+ userQueryWrapper.eq(LifeUser::getRealName, name);
|
|
|
|
|
+ LifeUser userOne = lifeUserService.getOne(userQueryWrapper);
|
|
|
|
|
+ storeAliPayErrorLog.setLifeUserId(userOne.getId());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ storeAliPayErrorLog.setStoreUserId(one.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+ storeAliPayErrorLogService.save(storeAliPayErrorLog);
|
|
|
|
|
+ storeAliPayLog.setStoreAliPayErrorLog(storeAliPayErrorLog);
|
|
|
|
|
+ return storeAliPayLog;
|
|
|
|
|
+ }else{
|
|
|
|
|
+ StoreAliPayLog storeAliPayLog = new StoreAliPayLog();
|
|
|
|
|
+ StoreAliPayErrorLog storeAliPayErrorLog = new StoreAliPayErrorLog();
|
|
|
|
|
+ storeAliPayErrorLog.setInformation("支付宝异常: 请稍后再试");
|
|
|
|
|
+ storeAliPayLog.setStoreAliPayErrorLog(storeAliPayErrorLog);
|
|
|
|
|
+ return storeAliPayLog;
|
|
|
|
|
+ }
|
|
|
|
|
+ } catch (AlipayApiException e) {
|
|
|
|
|
+ log.error("AliPayConfig.pay ERROR Msg={}", e.getErrMsg());
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
* 银行卡核验
|
|
* 银行卡核验
|
|
|
*
|
|
*
|
|
|
* @param name 姓名
|
|
* @param name 姓名
|
|
@@ -559,4 +689,44 @@ public class AliApi {
|
|
|
return sdf.format(new Date()) + RandomCreateUtil.getRandomNum(4);
|
|
return sdf.format(new Date()) + RandomCreateUtil.getRandomNum(4);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
|
|
+ private String getMassage(String subCode) {
|
|
|
|
|
+ switch (subCode) {
|
|
|
|
|
+ case "ACCOUNT_NOT_EXIST":
|
|
|
|
|
+ return "收款账户不存在";
|
|
|
|
|
+ case "ACCOUNT_FROZEN":
|
|
|
|
|
+ return "收款账户被冻结";
|
|
|
|
|
+ case "AMOUNT_TOO_BIG":
|
|
|
|
|
+ return "转账金额过大(超过单笔 / 单日限额)";
|
|
|
|
|
+ case "AMOUNT_TOO_SMALL":
|
|
|
|
|
+ return "转账金额过小(低于最低限额)";
|
|
|
|
|
+ case "INSUFFICIENT_BALANCE":
|
|
|
|
|
+ return "付款方账户余额不足";
|
|
|
|
|
+ case "RECEIVER_ID_INVALID":
|
|
|
|
|
+ return "收款人身份标识无效(如支付宝账号 / 手机号错误)";
|
|
|
|
|
+ case "RECEIVER_NAME_INVALID":
|
|
|
|
|
+ return "收款人姓名无效(如姓名与账号不匹配)";
|
|
|
|
|
+ case "INVALID_PARAMETER":
|
|
|
|
|
+ return "请求参数无效(如格式错误、必填字段缺失)";
|
|
|
|
|
+ case "PAYEE_NOT_EXIST":
|
|
|
|
|
+ return "收款账号不存在或姓名有误";
|
|
|
|
|
+ case "ACQ.TOTAL_FEE_EXCEED":
|
|
|
|
|
+ return "订单金额超过商户设置的限额";
|
|
|
|
|
+ case "ACQ.TRADE_NOT_EXIS":
|
|
|
|
|
+ return "请求的交易不存在";
|
|
|
|
|
+ case "ACQ.ACCOUNT_RISK":
|
|
|
|
|
+ return "账户存在风险";
|
|
|
|
|
+ case "ACQ.PAYER_STATUS_ABNORMAL":
|
|
|
|
|
+ return "账户状态异常";
|
|
|
|
|
+ case "ACQ.BIZ_SCENE_NOT_ALLOWED":
|
|
|
|
|
+ return "当前业务场景不支持该操作";
|
|
|
|
|
+ case "ACQ.PRODUCT_NOT_ALLOWED":
|
|
|
|
|
+ return "商户未开通该产品权限(如未申请 “单笔转账” 功能)";
|
|
|
|
|
+ case "ACQ.FREQUENCY_LIMIT":
|
|
|
|
|
+ return "交易频率超限(短时间内多次调用,触发风控限制)";
|
|
|
|
|
+ default:
|
|
|
|
|
+ }
|
|
|
|
|
+ return "支付宝请求错误";
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|