diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java b/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java index 04a73ab1..c2b3a23b 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/customer/CustomerBankController.java @@ -45,22 +45,30 @@ public class CustomerBankController { for (Merchant merchant : merchants) { String memberId = AdapayUtils.getCustomerMemberId(request.getCustomerId(), merchant.getDeptId()); - //TODO 需要先检查一次memberId是否已存在,如果已存在则只需要绑卡即可 - - // 先在Adapay创建实名用户 - Map result1 = adapayService.createMember(merchant.getDeptId(), memberId, request.getPhone(), - request.getName(), request.getCertId()); - if (!AdapayStatusEnum.succeeded.code.equals(result1.get("status"))) { - log.error("实名认证失败[{}]", JSON.toJSONString(result1)); -// return AjaxResult.error("个人信息不正确"); + // 需要先检查一次memberId是否已存在,如果已存在则只需要绑卡即可 + Map member = adapayService.queryMember(merchant.getDeptId(), memberId); + if (AdapayStatusEnum.succeeded.code.equals(member.get("status")) && memberId.equals(member.get("member_id"))) { + log.info("用户[memberId={}]已存在 跳过实名直接绑卡", memberId); + } else { + // 先在Adapay创建实名用户 + Map result1 = adapayService.createMember(merchant.getDeptId(), memberId, request.getPhone(), + request.getName(), request.getCertId()); + if (!AdapayStatusEnum.succeeded.code.equals(result1.get("status"))) { + log.error("实名认证失败[{}]", JSON.toJSONString(result1)); + return AjaxResult.error("个人信息不正确"); + } } // 开始创建结算账户 Map result2 = adapayService.createSettleAccount(merchant.getDeptId(), memberId, request.getBankNum(), request.getName(), "2", request.getCertId(), request.getPhone(), null, null, null); if (!AdapayStatusEnum.succeeded.code.equals(result2.get("status"))) { - log.error("创建结算账户失败[{}]", JSON.toJSONString(result2)); - return AjaxResult.error("个人信息与银行卡不匹配"); + if ("account_exists".equals(result2.get("error_code"))) { + log.info("用户[memberId={}]结算账户已存在 跳过", memberId); + } else { + log.error("创建结算账户失败[{}]", JSON.toJSONString(result2)); + return AjaxResult.error("个人信息与银行卡不匹配"); + } } CustomerBank customerBank = new CustomerBank(); @@ -68,8 +76,12 @@ public class CustomerBankController { customerBank.setName(request.getName()); customerBank.setCertId(request.getCertId()); customerBank.setBankNum(request.getBankNum()); + customerBank.setPhone(request.getPhone()); + customerBank.setDeptId(merchant.getDeptId()); + customerBank.setAdapayMemberId(memberId); + customerBank.setSettleAccount(1); + customerBankService.insertCustomerBank(customerBank); - // TODO 入库 } return AjaxResult.success(); } diff --git a/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java b/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java index c8511f5e..d206a699 100644 --- a/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java +++ b/ghy-common/src/main/java/com/ghy/common/adapay/AdapayService.java @@ -40,6 +40,7 @@ public class AdapayService { * 适用于延时分账的场景。只有已支付完成且延时分账的Payment对象,才支持调用创建支付确认对象。 * 支持一次全额或多次部分确认,多次部分确认时,当前确认金额 + 已确认金额 + 已撤销金额不能大于原支付金额。 * + * @param deptId [必填]商户ID * @param paymentId [必填] String(64) Adapay生成的支付对象id * @param orderNo [必填] String(64) 请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 * @param confirmAmt [必填] String(14) 确认金额,必须大于0,保留两位小数点,如0.10、100.05等。必须小于等于原支付金额-已确认金额-已撤销金额 @@ -54,6 +55,7 @@ public class AdapayService { * 适用于延时分账的场景。只有已支付完成且延时分账的Payment对象,才支持调用创建支付确认对象。 * 支持一次全额或多次部分确认,多次部分确认时,当前确认金额 + 已确认金额 + 已撤销金额不能大于原支付金额。 * + * @param deptId [必填]商户ID * @param paymentId [必填] String(64) Adapay生成的支付对象id * @param orderNo [必填] String(64) 请求订单号,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 * @param confirmAmt [必填] String(14) 确认金额,必须大于0,保留两位小数点,如0.10、100.05等。必须小于等于原支付金额-已确认金额-已撤销金额 @@ -296,6 +298,7 @@ public class AdapayService { * 退款对象同步返回成功,表示Adapay受理成功,退款结果以异步通知为准。支持退款最长时间为178天, * 若返回码是“order_id_not_exists 订单记录不存在”,既超过退款期限,无法退款成功。 * + * @param deptId [必填]商户ID * @param callback [必填项]处理退款结果的回调接口 * @param paymentId [必填项]支付确认对象的id * @param refundOrderNo [必填项]订单号 @@ -324,6 +327,7 @@ public class AdapayService { * 4.支付宝正扫接口,如果用户没有扫码,订单不能关闭成功(二维码给用户展示,如果用户没有用手机去扫码,那这笔就不能关单; 如果用户扫过了的话(无需支付成功)就可以关单了)—-微信正扫无此条限制 * 5.网银和快捷类交易都不支持关单操作 * + * @param deptId [必填]商户ID * @param paymentId [必填项]由 Adapay 生成的支付对象 id * @param reason 关单描述 * @param expend 扩展域 @@ -338,4 +342,19 @@ public class AdapayService { return Payment.close(paymentParams, deptId.toString()); } + /** + * 查询已创建的单个用户对象 + * https://docs.adapay.tech/api/trade.html#id41 + * + * @param deptId [必填]商户ID + * @param memberId [必填]商户下的用户id,只能为英文、数字或者下划线的一种或多种组合,保证在app_id下唯一 + * @return 成功时同步返回一个包含 Member对象的JSON。 + */ + public Map queryMember(@NotNull Long deptId, @NotNull String memberId) throws BaseAdaPayException { + Map memberParams = new HashMap<>(2); + memberParams.put("member_id", memberId); + memberParams.put("app_id", AdapayConfig.getAppId(deptId)); + return Member.query(memberParams, deptId.toString()); + } + } \ No newline at end of file