Browse Source

提现 退款支付宝单笔转账接口记录错误信息

qxy 1 month ago
parent
commit
5533bf2b24
1 changed files with 173 additions and 3 deletions
  1. 173 3
      alien-store/src/main/java/shop/alien/store/util/ali/AliApi.java

+ 173 - 3
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);
@@ -190,9 +195,20 @@ public class AliApi {
             String refundReslut = "";
             if (response.isSuccess()) {
                 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 {
                 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;
         } 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     姓名
@@ -559,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 "支付宝请求错误";
+    }
+
 }