Przeglądaj źródła

商户提现 增加支付宝返回错误记录

qxy 1 miesiąc temu
rodzic
commit
8c681a48b7

+ 76 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreAliPayErrorLog.java

@@ -0,0 +1,76 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 支付宝转账记录错误信息表
+ * qxy
+ */
+@Data
+@JsonInclude
+@ApiModel(value = "StoreAliPayErrorLog对象", description = "支付宝转账记录错误信息表")
+public class StoreAliPayErrorLog extends Model<StoreAliPayErrorLog> {
+
+    @ApiModelProperty(value = "主键")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    @ApiModelProperty(value = "商户ID")
+    @TableField("store_user_id")
+    private Integer storeUserId;
+
+    @ApiModelProperty(value = "用户ID")
+    @TableField("life_user_id")
+    private Integer lifeUserId;
+
+    @ApiModelProperty(value = "订单总金额")
+    @TableField("trans_amount")
+    private String transAmount;
+
+    @ApiModelProperty(value = "阿里返回错误信息")
+    @TableField("sub_msg")
+    private String subMsg;
+
+    @ApiModelProperty(value = "阿里返回状态码")
+    @TableField("sub_code")
+    private String subCode;
+
+    @ApiModelProperty(value = "阿里返回参数具体内容")
+    @TableField("biz_content")
+    private String bizContent;
+
+    @ApiModelProperty(value = "错误信息")
+    @TableField("information")
+    private String information;
+
+    @ApiModelProperty(value = "删除标记, 0:未删除, 1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty(value = "创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty(value = "修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty(value = "修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 2 - 0
alien-entity/src/main/java/shop/alien/entity/store/StoreAliPayLog.java

@@ -74,4 +74,6 @@ public class StoreAliPayLog extends Model<StoreAliPayLog> {
     @TableField("updated_user_id")
     private Integer updatedUserId;
 
+    private StoreAliPayErrorLog storeAliPayErrorLog;
+
 }

+ 15 - 0
alien-entity/src/main/java/shop/alien/mapper/StoreAliPayErrorLogMapper.java

@@ -0,0 +1,15 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.StoreAliPayErrorLog;
+
+/**
+ * <p>
+ * 支付宝转账错误记录表 Mapper 接口
+ * </p>
+ *
+ * @author qxy
+ * @since 2025-10-27
+ */
+public interface StoreAliPayErrorLogMapper extends BaseMapper<StoreAliPayErrorLog> {
+}

+ 15 - 0
alien-store/src/main/java/shop/alien/store/service/StoreAliPayErrorLogService.java

@@ -0,0 +1,15 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.store.StoreAliPayErrorLog;
+
+/**
+ * <p>
+ * 支付宝转账错误记录表 服务类
+ * </p>
+ *
+ * @author qxy
+ * @since 2025-10-27
+ */
+public interface StoreAliPayErrorLogService extends IService<StoreAliPayErrorLog> {
+}

+ 13 - 0
alien-store/src/main/java/shop/alien/store/service/impl/StoreAliPayLogErrorServiceImpl.java

@@ -0,0 +1,13 @@
+package shop.alien.store.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.store.StoreAliPayErrorLog;
+import shop.alien.mapper.StoreAliPayErrorLogMapper;
+import shop.alien.store.service.StoreAliPayErrorLogService;
+
+@Service
+public class StoreAliPayLogErrorServiceImpl extends ServiceImpl<StoreAliPayErrorLogMapper, StoreAliPayErrorLog> implements StoreAliPayErrorLogService {
+
+}

+ 3 - 3
alien-store/src/main/java/shop/alien/store/service/impl/StoreIncomeDetailsRecordServiceImpl.java

@@ -143,11 +143,11 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                 if(StringUtils.isNotBlank(storeUser.getAlipayAccount())){
                     pay = aliApi.payAccount(storeUser.getName(), storeUser.getIdCard(), storeUser.getAlipayAccount(), divide.toString(), storeUser.getPhone());
                 }else{
-                    pay = aliApi.pay(storeUser.getName(), storeUser.getIdCard(), storeUser.getPhone(), divide.toString());
+                    pay = aliApi.payAccount(storeUser.getName(), storeUser.getIdCard(), null, divide.toString(), storeUser.getPhone());
                 }
                 //增加提现记录
                 StoreCashOutRecord storeCashOutRecord = new StoreCashOutRecord();
-                if(pay != null){
+                if(pay.getStoreAliPayErrorLog() == null){
                     storeCashOutRecord.setStoreId(storeId);
                     storeCashOutRecord.setOrderNo(pay.getOutBizNo());
                     storeCashOutRecord.setMoney(withdrawalMoney);
@@ -176,7 +176,7 @@ public class StoreIncomeDetailsRecordServiceImpl extends ServiceImpl<StoreIncome
                     storeCashOutRecord.setPayDate(new Date());//支付时间
                     storeCashOutRecord.setStoreUserId(storeUser.getId());
                     storeCashOutRecordMapper.insert(storeCashOutRecord);
-                    return R.fail("提现失败");
+                    return R.fail(pay.getStoreAliPayErrorLog().getInformation());
                 }
             }
             return R.fail("余额不足");

+ 93 - 12
alien-store/src/main/java/shop/alien/store/util/ali/AliApi.java

@@ -15,9 +15,11 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Component;
 import shop.alien.entity.store.LifeUser;
+import shop.alien.entity.store.StoreAliPayErrorLog;
 import shop.alien.entity.store.StoreAliPayLog;
 import shop.alien.entity.store.StoreUser;
 import shop.alien.store.service.LifeUserService;
+import shop.alien.store.service.StoreAliPayErrorLogService;
 import shop.alien.store.service.StoreAliPayLogService;
 import shop.alien.store.service.StoreUserService;
 import shop.alien.util.common.RandomCreateUtil;
@@ -46,6 +48,8 @@ public class AliApi {
 
     private final LifeUserService lifeUserService;
 
+    private final StoreAliPayErrorLogService storeAliPayErrorLogService;
+
     /**
      * 商家端appId
      */
@@ -167,13 +171,14 @@ public class AliApi {
 
     /**
      * 退款
+     *
      * @param outTradeNo
      * @param refundAmount
      * @param refundReason
      * @return
      */
 
-    public String processRefund(String outTradeNo, String refundAmount, String refundReason,String partialRefundCode) {
+    public String processRefund(String outTradeNo, String refundAmount, String refundReason, String partialRefundCode) {
         try {
             // TODO 部分退款支付宝接口修改
             AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig(null));
@@ -182,7 +187,7 @@ public class AliApi {
             model.setOutTradeNo(outTradeNo);
             model.setRefundAmount(refundAmount);
             model.setRefundReason(refundReason);
-            if(StringUtils.isNotBlank(partialRefundCode)){
+            if (StringUtils.isNotBlank(partialRefundCode)) {
                 model.setOutRequestNo(partialRefundCode);
             }
             request.setBizModel(model);
@@ -322,18 +327,18 @@ public class AliApi {
     }
 
     /**
-     * 单笔转账接口
+     * 单笔转账接口 提现使用
      *
-     * @param name   收款人姓名
-     * @param idCard 收款人身份证号
-     * @param account  收款人支付宝账号
-     * @param money  收款金额
-     * @param phone  收款金额
+     * @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={}&phone={}&money={}", name, idCard, account, money);
+            log.info("AliPayConfig.pay?name={}&idCard={}&account={}&money={}&phone={}", name, idCard, account, money, phone);
             // 初始化SDK
             AlipayClient alipayClient = new DefaultAlipayClient(setAlipayConfig(null));
             // 构造请求参数以调用接口
@@ -354,7 +359,11 @@ public class AliApi {
             payeeInfo.setCertType("IDENTITY_CARD");
             payeeInfo.setCertNo(idCard);
             payeeInfo.setIdentityType("ALIPAY_LOGON_ID");
-            payeeInfo.setIdentity(account);
+            if(account!=null){
+                payeeInfo.setIdentity(account);
+            }else{
+                payeeInfo.setIdentity(phone);
+            }
             payeeInfo.setName(name);
             model.setPayeeInfo(payeeInfo);
             // 设置业务备注
@@ -390,8 +399,40 @@ public class AliApi {
                 }
                 storeAliPayLogService.save(storeAliPayLog);
                 return storeAliPayLog;
-            } else {
-                return null;
+            } 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());
@@ -648,4 +689,44 @@ public class AliApi {
         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 "支付宝请求错误";
+    }
+
 }