支付与回调保存支付记录 修改财务单状态

This commit is contained in:
HH 2022-05-27 11:12:54 +08:00
parent 70872cbb1f
commit 04b8c0637c
20 changed files with 358 additions and 147 deletions

View File

@ -1,18 +1,20 @@
package com.ghy.web.controller.pay;
import com.ghy.common.adapay.AdapayService;
import com.ghy.common.adapay.callback.PayCallback;
import com.ghy.common.adapay.model.PayParam;
import com.ghy.common.core.controller.BaseController;
import com.ghy.common.core.domain.AjaxResult;
import com.ghy.order.domain.OrderMaster;
import com.ghy.order.service.OrderMasterService;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.service.FinancialMasterService;
import com.huifu.adapay.core.exception.BaseAdaPayException;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Map;
/**
@ -24,31 +26,32 @@ import java.util.Map;
@RequestMapping("pay/ali")
public class AlipayController extends BaseController {
@Resource
private PayCallback payCallback;
@Resource
private AdapayService adapayService;
@Resource
private OrderMasterService orderMasterService;
@Resource
private FinancialMasterService financialMasterService;
/**
* 支付宝正扫支付
*/
@PostMapping("qr")
public AjaxResult qrPay(String orderMasterCode) {
OrderMaster orderMaster = orderMasterService.selectByCode(orderMasterCode);
if (orderMaster == null) {
public AjaxResult qrPay(Long orderMasterId) {
OrderMaster om = orderMasterService.selectById(orderMasterId);
FinancialMaster fm = financialMasterService.selectByOrderMasterId(orderMasterId);
if (om == null || fm == null) {
return AjaxResult.error("订单不存在");
}
Map<String, Object> map;
String payMoney = fm.getPayMoney().setScale(2, BigDecimal.ROUND_UNNECESSARY).toString();
// TODO 这里需要补充商品标题和商品描述信息
PayParam payParam = PayParam.createDelayPay(om.getCode(), payMoney, "商品标题", "商品描述信息");
try {
// TODO 订单里需要补充支付金额tittle简要描述分账信息description
PayParam payParam = new PayParam(orderMaster.getCode(),
"orderMaster.get支付金额", "orderMaster.getTittle()", "orderMaster.get商品描述信息");
map = adapayService.alipayQrPay(orderMaster.getDeptId(), payParam, payCallback, null, null, null);
map = adapayService.alipayQrPay(om.getDeptId(), payParam, null, null, null);
} catch (BaseAdaPayException e) {
logger.error("获取微信用户信息失败", e);
return AjaxResult.error();
logger.error("创建支付失败", e);
return AjaxResult.error("网络不佳 请稍后再试");
}
return AjaxResult.success(map);
}

View File

@ -1,15 +1,12 @@
package com.ghy.web.controller.pay;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.AdapayService;
import com.ghy.common.adapay.callback.PayCallback;
import com.ghy.common.adapay.model.PayParam;
import com.ghy.common.adapay.model.WxpayExpend;
import com.ghy.common.config.WxConfig;
import com.ghy.common.core.controller.BaseController;
import com.ghy.common.core.domain.AjaxResult;
import com.ghy.common.utils.ExceptionUtil;
import com.ghy.common.utils.WxUtils;
import com.ghy.order.domain.OrderMaster;
import com.ghy.order.service.OrderMasterService;
import com.huifu.adapay.core.exception.BaseAdaPayException;
@ -33,8 +30,6 @@ public class WxPayController extends BaseController {
private AdapayService adapayService;
@Resource
private OrderMasterService orderMasterService;
@Resource
private PayCallback payCallback;
/**
* 微信小程序支付
@ -56,7 +51,7 @@ public class WxPayController extends BaseController {
// TODO 订单里需要补充支付金额tittle简要描述分账信息description
PayParam payParam = new PayParam(orderMaster.getCode(),
"0.01", "工圈子测试", "工圈子测试描述");
map = adapayService.wxLitePay(orderMaster.getDeptId(), payParam, payCallback, expend, null, null);
map = adapayService.wxLitePay(orderMaster.getDeptId(), payParam, expend, null, null);
} catch (BaseAdaPayException e) {
logger.error("获取微信用户信息失败", e);
return AjaxResult.error();
@ -88,7 +83,7 @@ public class WxPayController extends BaseController {
expend.setOpenId(openId);
Map<String, Object> map;
PayParam payParam = new PayParam(orderMaster.getCode(), "0.01", "工圈子测试", "工圈子测试描述");
map = adapayService.wxPubPay(orderMaster.getDeptId(), payParam, payCallback, expend, null, null);
map = adapayService.wxPubPay(orderMaster.getDeptId(), payParam, expend, null, null);
return AjaxResult.success(map);
} catch (Exception e) {
e.printStackTrace();

View File

@ -1,42 +0,0 @@
package com.ghy.web.core;
import com.ghy.common.adapay.callback.PayCallback;
import com.ghy.common.adapay.model.AdapayStatusEnum;
import com.ghy.common.adapay.model.PayReply;
import com.ghy.order.service.OrderMasterService;
import com.ghy.payment.service.FinancialMasterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
/**
* 用户支付后
*/
@Configuration
public class AfterPay {
private static final Logger logger = LoggerFactory.getLogger(AfterPay.class);
@Resource
FinancialMasterService financialMasterService;
@Bean
public PayCallback payCallback() {
return new PayCallback() {
@Override
public void onReply(PayReply reply) {
if (AdapayStatusEnum.succeeded.code.equals(reply.getStatus())) {
// TODO 保存支付结果到 adapay_callback_log
// 修改财务单状态为支付成功
financialMasterService.paySucceeded(reply.getOrderNo(), reply.getPayChannel());
} else {
logger.warn("支付失败:{}", reply);
}
}
};
}
}

View File

@ -0,0 +1,23 @@
package com.ghy.web.core.adapay;
import com.ghy.common.adapay.callback.IDrawCashCallback;
import com.ghy.common.adapay.model.DrawCashReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 处理提现结果
*
* @author HH 2022/5/27
*/
@Component
public class DrawCashCallback implements IDrawCashCallback {
private static final Logger logger = LoggerFactory.getLogger(DrawCashCallback.class);
@Override
public void onCallback(DrawCashReply reply) {
logger.info("提现结果:{}", reply);
}
}

View File

@ -1,4 +1,4 @@
package com.ghy.web.core;
package com.ghy.web.core.adapay;
import com.ghy.common.adapay.AdapayConfig;
import com.ghy.common.adapay.AdapayProperties;

View File

@ -0,0 +1,62 @@
package com.ghy.web.core.adapay;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.callback.IPayCallback;
import com.ghy.common.adapay.model.AdapayStatusEnum;
import com.ghy.common.adapay.model.PayReply;
import com.ghy.common.adapay.model.PaymentDTO;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.service.FinancialMasterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
/**
* 处理支付结果
*
* @author HH 2022/5/27
*/
@Component
public class PayCallback implements IPayCallback {
private static final Logger logger = LoggerFactory.getLogger(PayCallback.class);
@Resource
FinancialMasterService financialMasterService;
@Override
public void onCallback(PayReply reply) {
// 更新交易记录
PaymentDTO payment = new PaymentDTO();
payment.setId(reply.getId());
payment.setStatus(reply.getStatus());
payment.setPayTime(reply.getPayTime());
financialMasterService.updatePayment(payment);
if (AdapayStatusEnum.succeeded.code.equals(reply.getStatus())) {
// 修改主财务单状态
financialMasterService.paySucceeded(reply.getOrderNo(), reply.getPayChannel());
} else {
logger.warn("支付失败 : {}", reply);
}
}
@Override
public void onResponse(JSONObject response) {
// 保存一条支付记录
PaymentDTO payment = response.toJavaObject(PaymentDTO.class);
payment.setStatus("pending");
financialMasterService.insertPayment(payment);
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) {
FinancialMaster update = new FinancialMaster();
update.setId(response.getLong("order_no"));
update.setPaymentId(response.getString("id"));
financialMasterService.updateFinancialMaster(update);
} else {
logger.warn("请求支付失败 : {}", response.toJSONString());
}
}
}

View File

@ -0,0 +1,23 @@
package com.ghy.web.core.adapay;
import com.ghy.common.adapay.callback.IRefundCallback;
import com.ghy.common.adapay.model.RefundReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* 处理退款结果
*
* @author HH 2022/5/27
*/
@Component
public class RefundCallback implements IRefundCallback {
private static final Logger logger = LoggerFactory.getLogger(RefundCallback.class);
@Override
public void onCallback(RefundReply reply) {
logger.info("退款结果:{}", reply);
}
}

View File

@ -1,9 +1,9 @@
package com.ghy.common.adapay;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.callback.DrawCashCallback;
import com.ghy.common.adapay.callback.PayCallback;
import com.ghy.common.adapay.callback.RefundCallback;
import com.ghy.common.adapay.callback.IDrawCashCallback;
import com.ghy.common.adapay.callback.IPayCallback;
import com.ghy.common.adapay.callback.IRefundCallback;
import com.ghy.common.adapay.callback.mapping.DrawCashReplyMapping;
import com.ghy.common.adapay.callback.mapping.PayReplyMapping;
import com.ghy.common.adapay.callback.mapping.RefundReplyMapping;
@ -20,9 +20,7 @@ import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author HH 2022/3/25
@ -32,6 +30,12 @@ public class AdapayService {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@Resource
private IPayCallback payCallback;
@Resource
private IDrawCashCallback drawCashCallback;
@Resource
private IRefundCallback refundCallback;
@Resource
private AdapayProperties adapayProperties;
@ -46,7 +50,7 @@ public class AdapayService {
* @param confirmAmt [必填] String(14) 确认金额必须大于0保留两位小数点如0.10100.05等必须小于等于原支付金额-已确认金额-已撤销金额
* @return 成功时同步返回一个包含 支付确认对象的JSON https://docs.adapay.tech/api/trade.html#id54
*/
public Map<String, Object> paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo, @NotNull String confirmAmt) throws BaseAdaPayException {
public JSONObject paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo, @NotNull String confirmAmt) throws BaseAdaPayException {
return paymentConfirm(deptId, paymentId, orderNo, confirmAmt, null, null, null);
}
@ -64,17 +68,17 @@ public class AdapayService {
* @param description String(128) 附加说明
* @return 成功时同步返回一个包含 支付确认对象的JSON https://docs.adapay.tech/api/trade.html#id54
*/
public Map<String, Object> paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo,
public JSONObject paymentConfirm(@NotNull Long deptId, @NotNull String paymentId, @NotNull String orderNo,
@NotNull String confirmAmt, List<DivMember> divMembers,
String feeMode, String description) throws BaseAdaPayException {
Map<String, Object> confirmParams = new HashMap<>();
JSONObject confirmParams = new JSONObject();
confirmParams.put("payment_id", paymentId);
confirmParams.put("order_no", orderNo);
confirmParams.put("confirm_amt", confirmAmt);
confirmParams.put("div_members", divMembers);
confirmParams.put("fee_mode", feeMode);
confirmParams.put("description", description);
return PaymentConfirm.create(confirmParams, deptId.toString());
return (JSONObject) PaymentConfirm.create(confirmParams, deptId.toString());
}
/**
@ -94,12 +98,12 @@ public class AdapayService {
* @param divMembers 分账对象信息列表最多仅支持7个分账方
* @return 成功时同步返回交易结果的 JSON
*/
public Map<String, Object> balancePay(@NotNull Long deptId, @NotNull String orderNo, @NotNull String outMemberId,
public JSONObject balancePay(@NotNull Long deptId, @NotNull String orderNo, @NotNull String outMemberId,
@NotNull String inMemberId, @NotNull String transAmt, @NotNull String goodsTitle,
@NotNull String goodsDesc, String payMode, Collection<DivMember> divMembers) throws BaseAdaPayException {
// 获取商户的appId
String appId = AdapayConfig.getAppId(deptId);
Map<String, Object> balanceParam = new HashMap<>(10);
JSONObject balanceParam = new JSONObject();
balanceParam.put("app_id", appId);
balanceParam.put("adapay_func_code", "settle_accounts.balancePay");
balanceParam.put("order_no", orderNo);
@ -112,7 +116,7 @@ public class AdapayService {
if (!CollectionUtils.isEmpty(divMembers)) {
balanceParam.put("div_members", divMembers);
}
return AdapayCommon.requestAdapay(balanceParam, deptId.toString());
return (JSONObject) AdapayCommon.requestAdapay(balanceParam, deptId.toString());
}
/**
@ -133,14 +137,14 @@ public class AdapayService {
* @param areaCode 银行账户开户银行所在地区编码省市编码银行账户类型为对公时必填省市编码详见area.json
* @return 成功时同步返回一个包含 SettleAccount对象 JSON
*/
public Map<String, Object> createSettleAccount(@NotNull Long deptId, @NotNull String memberId, @NotNull String cardId,
public JSONObject createSettleAccount(@NotNull Long deptId, @NotNull String memberId, @NotNull String cardId,
@NotNull String cardName, @NotNull String bankAcctType, String certId, String telNo,
String bankCode, String provCode, String areaCode) throws BaseAdaPayException {
// 获取商户的appId
String appId = AdapayConfig.getAppId(deptId);
// 结算账户信息 参见结算账户信息(AccountInfo)对象 https://docs.adapay.tech/api/appendix.html#accountinfo
Map<String, Object> accountInfo = new HashMap<>(9);
JSONObject accountInfo = new JSONObject();
switch (bankAcctType) {
case "1":
@ -164,13 +168,13 @@ public class AdapayService {
accountInfo.put("prov_code", provCode);
accountInfo.put("area_code", areaCode);
Map<String, Object> settleCountParams = new HashMap<>(4);
JSONObject settleCountParams = new JSONObject();
settleCountParams.put("member_id", memberId);
settleCountParams.put("app_id", appId);
// 目前仅支持bank_account银行卡
settleCountParams.put("channel", "bank_account");
settleCountParams.put("account_info", accountInfo);
return SettleAccount.create(settleCountParams, deptId.toString());
return (JSONObject) SettleAccount.create(settleCountParams, deptId.toString());
}
/**
@ -183,11 +187,11 @@ public class AdapayService {
* @param certId [必填]证件号
* @return 成功时同步返回一个包含Member对象的JSON
*/
public Map<String, Object> createMember(@NotNull Long deptId, @NotNull String memberId, @NotNull String telNo,
public JSONObject createMember(@NotNull Long deptId, @NotNull String memberId, @NotNull String telNo,
@NotNull String username, @NotNull String certId) throws BaseAdaPayException {
// 获取商户的appId
String appId = AdapayConfig.getAppId(deptId);
Map<String, Object> memberParams = new HashMap<>();
JSONObject memberParams = new JSONObject();
memberParams.put("member_id", memberId);
memberParams.put("app_id", appId);
memberParams.put("tel_no", telNo);
@ -197,14 +201,13 @@ public class AdapayService {
// 接口功能号
memberParams.put("adapay_func_code", "members.realname");
memberParams.put("cert_id", certId);
return AdapayCommon.requestAdapay(memberParams, deptId.toString());
return (JSONObject) AdapayCommon.requestAdapay(memberParams, deptId.toString());
}
/**
* 对指定商户或者商户下用户的结算账户可用余额发起主动取现操作金额从账户中提到绑定的结算银行卡中
*
* @param deptId [必填]商户ID
* @param callback [必填项]处理提现结果的接口
* @param orderNo [必填项]请求订单号只能为英文数字或者下划线的一种或多种组合保证在app_id下唯一
* @param cashType [必填项]取现类型T1-T+1取现D1-D+1取现D0-即时取现
* @param cashAmt [必填项]取现金额必须大于0人民币为元保留两位小数点"0.10""100.05"
@ -213,16 +216,15 @@ public class AdapayService {
* @param feeMode 手续费收取模式O-商户手续费账户扣取手续费I-交易金额中扣取手续费值为空时默认值为I
* @return https://docs.adapay.tech/api/wallet.html#cash-response
*/
public Map<String, Object> drawCash(@NotNull Long deptId, DrawCashCallback callback, String orderNo, String cashType, String cashAmt,
public JSONObject drawCash(@NotNull Long deptId, String orderNo, String cashType, String cashAmt,
String memberId, String remark, String feeMode) throws BaseAdaPayException {
// 获取商户的appId
String appId = AdapayConfig.getAppId(deptId);
Assert.notNull(callback, "callback is null!");
Assert.hasText(orderNo, "orderNo is blank!");
Assert.hasText(cashType, "cashType is blank!");
Assert.hasText(cashAmt, "cashAmt is blank!");
Assert.hasText(memberId, "memberId is blank!");
Map<String, Object> cashParam = new HashMap<>(5);
JSONObject cashParam = new JSONObject();
cashParam.put("order_no", orderNo);
cashParam.put("app_id", appId);
cashParam.put("cash_type", cashType);
@ -231,35 +233,35 @@ public class AdapayService {
cashParam.put("notify_url", adapayProperties.getNotifyUrl());
cashParam.put("remark", remark);
cashParam.put("fee_mode", feeMode);
DrawCashReplyMapping.putCallback(orderNo, callback);
return Drawcash.create(cashParam, deptId.toString());
DrawCashReplyMapping.putCallback(orderNo, drawCashCallback);
return (JSONObject) Drawcash.create(cashParam, deptId.toString());
}
/**
* 支付宝正扫支付
*/
public Map<String, Object> alipayQrPay(@NotNull Long deptId, PayParam payParam, PayCallback callback,
public JSONObject alipayQrPay(@NotNull Long deptId, PayParam payParam,
AlipayExpend expend, DeviceInfo deviceInfo,
Collection<DivMember> divMembers) throws BaseAdaPayException {
return pay(deptId, "alipay_qr", payParam, callback, expend, deviceInfo, divMembers);
return pay(deptId, "alipay_qr", payParam, expend, deviceInfo, divMembers);
}
/**
* 微信公众号支付
*/
public Map<String, Object> wxPubPay(@NotNull Long deptId, PayParam payParam, PayCallback callback,
public JSONObject wxPubPay(@NotNull Long deptId, PayParam payParam,
WxpayExpend expend, DeviceInfo deviceInfo,
Collection<DivMember> divMembers) throws BaseAdaPayException {
return pay(deptId, "wx_pub", payParam, callback, expend, deviceInfo, divMembers);
return pay(deptId, "wx_pub", payParam, expend, deviceInfo, divMembers);
}
/**
* 微信小程序支付
*/
public Map<String, Object> wxLitePay(@NotNull Long deptId, PayParam payParam, PayCallback callback,
public JSONObject wxLitePay(@NotNull Long deptId, PayParam payParam,
WxpayExpend expend, DeviceInfo deviceInfo,
Collection<DivMember> divMembers) throws BaseAdaPayException {
return pay(deptId, "wx_lite", payParam, callback, expend, deviceInfo, divMembers);
return pay(deptId, "wx_lite", payParam, expend, deviceInfo, divMembers);
}
/**
@ -268,14 +270,13 @@ public class AdapayService {
* @param deptId [必填]商户ID
* @param payChannel [必填项]支付渠道详见 https://docs.adapay.tech/api/appendix.html#id2
* @param payParam [必填项]支付参数
* @param callback [必填项]处理支付结果的回调接口
* @param expend 支付渠道额外参数 https://docs.adapay.tech/api/appendix.html#expend
* @param deviceInfo 前端设备信息 https://docs.adapay.tech/api/appendix.html#deviceinfo
* @param divMembers 分账对象信息列表 https://docs.adapay.tech/api/appendix.html#divmembers
* @return 同步返回一个 支付对象详见 https://docs.adapay.tech/api/trade.html#id2
*/
public Map<String, Object> pay(@NotNull Long deptId, @NotNull String payChannel, @NotNull PayParam payParam,
@NotNull PayCallback callback, Expend expend, DeviceInfo deviceInfo,
public JSONObject pay(@NotNull Long deptId, @NotNull String payChannel, @NotNull PayParam payParam,
Expend expend, DeviceInfo deviceInfo,
Collection<DivMember> divMembers) throws BaseAdaPayException {
// 获取商户的appId
String appId = AdapayConfig.getAppId(deptId);
@ -286,9 +287,11 @@ public class AdapayService {
paymentParams.put("div_members", divMembers);
paymentParams.put("device_info", deviceInfo);
paymentParams.put("expend", expend);
PayReplyMapping.putCallback(payParam.getOrderNo(), callback);
logger.debug("paymentParams: {}", paymentParams.toJSONString());
return Payment.create(paymentParams, deptId.toString());
JSONObject response = (JSONObject) Payment.create(paymentParams, deptId.toString());
payCallback.onResponse(response);
PayReplyMapping.putCallback(payParam.getOrderNo(), payCallback);
return response;
}
/**
@ -300,23 +303,21 @@ public class AdapayService {
* 若返回码是order_id_not_exists 订单记录不存在既超过退款期限无法退款成功
*
* @param deptId [必填]商户ID
* @param callback [必填项]处理退款结果的回调接口
* @param paymentId [必填项]支付确认对象的id
* @param refundOrderNo [必填项]订单号
* @param refundAmt [必填项]退款金额若退款金额小于原交易金额则认为是部分退款必须大于0保留两位小数点如0.10100.05等
* @return 同步返回一个 退款对象 https://docs.adapay.tech/api/trade.html#create-refund-params
*/
public Map<String, Object> refund(@NotNull Long deptId, @NotNull RefundCallback callback, @NotNull String paymentId,
public JSONObject refund(@NotNull Long deptId, @NotNull String paymentId,
@NotNull String refundOrderNo, @NotNull String refundAmt) throws BaseAdaPayException {
Assert.notNull(callback, "callback is null!");
Assert.hasText(paymentId, "paymentId is blank!");
Assert.hasText(refundOrderNo, "refundOrderNo is blank!");
Assert.hasText(refundAmt, "refundAmt is blank!");
Map<String, Object> refundParams = new HashMap<>(4);
JSONObject refundParams = new JSONObject();
refundParams.put("refund_amt", refundAmt);
refundParams.put("refund_order_no", refundOrderNo);
RefundReplyMapping.putCallback(paymentId, callback);
return Refund.create(paymentId, refundParams, deptId.toString());
RefundReplyMapping.putCallback(paymentId, refundCallback);
return (JSONObject) Refund.create(paymentId, refundParams, deptId.toString());
}
/**
@ -334,13 +335,13 @@ public class AdapayService {
* @param expend 扩展域
* @return 关单的结果将通过一个 JSON 同步返回 https://docs.adapay.tech/api/trade.html#close-payment-response
*/
public Map<String, Object> close(@NotNull Long deptId, String paymentId, String reason, String expend) throws BaseAdaPayException {
public JSONObject close(@NotNull Long deptId, String paymentId, String reason, String expend) throws BaseAdaPayException {
Assert.hasText(paymentId, "paymentId is blank!");
Map<String, Object> paymentParams = new HashMap<>(4);
JSONObject paymentParams = new JSONObject();
paymentParams.put("payment_id", paymentId);
paymentParams.put("reason", reason);
paymentParams.put("expend", expend);
return Payment.close(paymentParams, deptId.toString());
return (JSONObject) Payment.close(paymentParams, deptId.toString());
}
/**
@ -351,11 +352,11 @@ public class AdapayService {
* @param memberId [必填]商户下的用户id只能为英文数字或者下划线的一种或多种组合保证在app_id下唯一
* @return 成功时同步返回一个包含 Member对象的JSON
*/
public Map<String, Object> queryMember(@NotNull Long deptId, @NotNull String memberId) throws BaseAdaPayException {
Map<String, Object> memberParams = new HashMap<>(2);
public JSONObject queryMember(@NotNull Long deptId, @NotNull String memberId) throws BaseAdaPayException {
JSONObject memberParams = new JSONObject();
memberParams.put("member_id", memberId);
memberParams.put("app_id", AdapayConfig.getAppId(deptId));
return Member.query(memberParams, deptId.toString());
return (JSONObject) Member.query(memberParams, deptId.toString());
}
}

View File

@ -7,8 +7,8 @@ import com.ghy.common.adapay.model.DrawCashReply;
*
* @author HH 2022/4/1
*/
public interface DrawCashCallback {
public interface IDrawCashCallback {
void onReply(DrawCashReply reply);
void onCallback(DrawCashReply reply);
}

View File

@ -1,5 +1,6 @@
package com.ghy.common.adapay.callback;
import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.model.PayReply;
/**
@ -7,7 +8,9 @@ import com.ghy.common.adapay.model.PayReply;
*
* @author HH 2022/3/25
*/
public interface PayCallback {
public interface IPayCallback {
void onReply(PayReply reply);
void onCallback(PayReply reply);
void onResponse(JSONObject response);
}

View File

@ -7,7 +7,7 @@ import com.ghy.common.adapay.model.RefundReply;
*
* @author HH 2022/3/29
*/
public interface RefundCallback {
public interface IRefundCallback {
void onReply(RefundReply reply);
void onCallback(RefundReply reply);
}

View File

@ -1,7 +1,7 @@
package com.ghy.common.adapay.callback.mapping;
import com.alibaba.fastjson.JSON;
import com.ghy.common.adapay.callback.DrawCashCallback;
import com.ghy.common.adapay.callback.IDrawCashCallback;
import com.ghy.common.adapay.callback.Event;
import com.ghy.common.adapay.model.DrawCashReply;
import org.springframework.util.Assert;
@ -20,19 +20,19 @@ public class DrawCashReplyMapping {
* key: orderNo
* value: 处理支付结果的回调接口
*/
private final static ConcurrentHashMap<String, DrawCashCallback> PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024);
private final static ConcurrentHashMap<String, IDrawCashCallback> PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024);
public static void putReply(Event event) {
String data = event.getData();
DrawCashReply reply = JSON.parseObject(data, DrawCashReply.class);
Assert.hasText(reply.getOrderNo(), "orderNo is blank !!!");
DrawCashCallback callback = PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo());
IDrawCashCallback callback = PAY_RESULT_CALLBACK_MAP.remove(reply.getOrderNo());
if (callback != null) {
callback.onReply(reply);
callback.onCallback(reply);
}
}
public static void putCallback(String orderNo, DrawCashCallback callback) {
public static void putCallback(String orderNo, IDrawCashCallback callback) {
Assert.hasText(orderNo, "orderNo is blank !!!");
Assert.notNull(callback, "PayCallback is null !!!");
PAY_RESULT_CALLBACK_MAP.put(orderNo, callback);

View File

@ -2,8 +2,10 @@ package com.ghy.common.adapay.callback.mapping;
import com.alibaba.fastjson.JSON;
import com.ghy.common.adapay.callback.Event;
import com.ghy.common.adapay.callback.PayCallback;
import com.ghy.common.adapay.callback.IPayCallback;
import com.ghy.common.adapay.model.PayReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import java.util.concurrent.ConcurrentHashMap;
@ -15,24 +17,29 @@ import java.util.concurrent.ConcurrentHashMap;
*/
public class PayReplyMapping {
protected static final Logger logger = LoggerFactory.getLogger(PayReplyMapping.class);
/**
* 临时保存支付结果
* key: orderNo
* value: 处理支付结果的回调接口
*/
private final static ConcurrentHashMap<String, PayCallback> PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024);
private final static ConcurrentHashMap<String, IPayCallback> PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024);
public static void putReply(Event event) {
String data = event.getData();
PayReply payment = JSON.parseObject(data, PayReply.class);
Assert.hasText(payment.getOrderNo(), "orderNo is blank !!!");
PayCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo());
payment.setPayTime(event.getCreatedTime());
IPayCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getOrderNo());
if (callback != null) {
callback.onReply(payment);
callback.onCallback(payment);
} else {
logger.warn("PayCallback don't exist! {}", payment);
}
}
public static void putCallback(String orderNo, PayCallback callback) {
public static void putCallback(String orderNo, IPayCallback callback) {
Assert.hasText(orderNo, "orderNo is blank !!!");
Assert.notNull(callback, "PayCallback is null !!!");
PAY_RESULT_CALLBACK_MAP.put(orderNo, callback);

View File

@ -2,7 +2,7 @@ package com.ghy.common.adapay.callback.mapping;
import com.alibaba.fastjson.JSON;
import com.ghy.common.adapay.callback.Event;
import com.ghy.common.adapay.callback.RefundCallback;
import com.ghy.common.adapay.callback.IRefundCallback;
import com.ghy.common.adapay.model.RefundReply;
import org.springframework.util.Assert;
@ -20,19 +20,19 @@ public class RefundReplyMapping {
* key: orderNo
* value: 处理支付结果的回调接口
*/
private final static ConcurrentHashMap<String, RefundCallback> PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024);
private final static ConcurrentHashMap<String, IRefundCallback> PAY_RESULT_CALLBACK_MAP = new ConcurrentHashMap<>(1024);
public static void putReply(Event event) {
String data = event.getData();
RefundReply payment = JSON.parseObject(data, RefundReply.class);
Assert.hasText(payment.getPaymentId(), "paymentId is blank !!!");
RefundCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getPaymentId());
IRefundCallback callback = PAY_RESULT_CALLBACK_MAP.remove(payment.getPaymentId());
if (callback != null) {
callback.onReply(payment);
callback.onCallback(payment);
}
}
public static void putCallback(String paymentId, RefundCallback callback) {
public static void putCallback(String paymentId, IRefundCallback callback) {
Assert.hasText(paymentId, "paymentId is blank !!!");
Assert.notNull(callback, "RefundCallback is null !!!");
PAY_RESULT_CALLBACK_MAP.put(paymentId, callback);

View File

@ -21,6 +21,10 @@ public class PayReply {
*/
@JSONField(name = "created_time")
private Long createdTime;
/**
* 支付时间
*/
private long payTime;
/**
* 必填订单号
*/

View File

@ -0,0 +1,26 @@
package com.ghy.common.adapay.model;
import com.alibaba.fastjson.annotation.JSONField;
import com.huifu.adapay.model.Payment;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class PaymentDTO extends Payment {
/**
* 用户账单上的商户订单号
*/
@JSONField(name = "party_order_id")
private String partyOrderId;
/**
* 当前交易状态
*/
private String status;
/**
* 支付时间
*/
private Long payTime;
}

View File

@ -0,0 +1,15 @@
package com.ghy.payment.mapper;
import com.huifu.adapay.model.Payment;
/**
* 支付记录 Mapper
*
* @author HH 2022/5/27
*/
public interface PaymentMapper {
int insertPayment(Payment payment);
int updatePayment(Payment payment);
}

View File

@ -1,5 +1,6 @@
package com.ghy.payment.service;
import com.ghy.common.adapay.model.PaymentDTO;
import com.ghy.payment.domain.FinancialMaster;
import java.util.List;
@ -61,4 +62,18 @@ public interface FinancialMasterService {
* @param orderMasterId 主订单ID
*/
FinancialMaster selectByOrderMasterId(Long orderMasterId);
/**
* 保存一条支付记录
*
* @param payment 支付对象
*/
int insertPayment(PaymentDTO payment);
/**
* 更新一条支付记录
*
* @param payment 支付对象
*/
int updatePayment(PaymentDTO payment);
}

View File

@ -1,9 +1,12 @@
package com.ghy.payment.service.impl;
import com.ghy.common.adapay.model.PaymentDTO;
import com.ghy.common.core.text.Convert;
import com.ghy.payment.domain.FinancialMaster;
import com.ghy.payment.mapper.FinancialMasterMapper;
import com.ghy.payment.mapper.PaymentMapper;
import com.ghy.payment.service.FinancialMasterService;
import com.huifu.adapay.model.Payment;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -37,6 +40,8 @@ public class FinancialMasterServiceImpl implements FinancialMasterService {
.appendValue(DAY_OF_MONTH, 2).appendValue(HOUR_OF_DAY, 2)
.appendValue(MINUTE_OF_HOUR, 2).appendValue(SECOND_OF_MINUTE, 2).toFormatter();
@Resource
private PaymentMapper paymentMapper;
@Resource
private FinancialMasterMapper financialMasterMapper;
@ -95,4 +100,14 @@ public class FinancialMasterServiceImpl implements FinancialMasterService {
return financialMasterMapper.selectByOrderMasterId(orderMasterId);
}
@Override
public int insertPayment(PaymentDTO payment) {
return paymentMapper.insertPayment(payment);
}
@Override
public int updatePayment(PaymentDTO payment) {
return paymentMapper.updatePayment(payment);
}
}

View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ghy.payment.mapper.PaymentMapper">
<resultMap id="FinancialMasterResult" type="com.ghy.common.adapay.model.PaymentDTO">
<result property="id" column="id"/>
<result property="orderNo" column="order_no"/>
<result property="prodMode" column="prod_mode"/>
<result property="appId" column="app_id"/>
<result property="payChannel" column="pay_channel"/>
<result property="payAmt" column="pay_amt"/>
<result property="partyOrderId" column="party_order_id"/>
<result property="queryUrl" column="query_url"/>
<result property="status" column="status"/>
<result property="createdTime" column="created_time"/>
<result property="payTime" column="pay_time"/>
</resultMap>
<sql id="selectFinancialMaster">
SELECT id, order_no, prod_mode, app_id, pay_channel, pay_amt, party_order_id, query_url,
currency, status, pay_time, created_time, update_time
FROM adapay_pay_log
</sql>
<insert id="insertPayment" parameterType="com.ghy.common.adapay.model.PaymentDTO">
INSERT INTO adapay_pay_log(
<if test="id != null and id != ''">`id`,</if>
<if test="orderNo != null and orderNo != ''">`order_no`,</if>
<if test="prodMode != null and prodMode != ''">`prod_mode`,</if>
<if test="appId != null and appId != ''">`app_id`,</if>
<if test="payChannel != null and payChannel != ''">`pay_channel`,</if>
<if test="payAmt != null and payAmt != ''">`pay_amt`,</if>
<if test="partyOrderId != null and partyOrderId != ''">`party_order_id`,</if>
<if test="queryUrl != null and queryUrl != ''">`query_url`,</if>
<if test="status != null and status != ''">`status`,</if>
created_time
)VALUES(
<if test="id != null and id != ''">#{id},</if>
<if test="orderNo != null and orderNo != ''">#{orderNo},</if>
<if test="prodMode != null and prodMode != ''">#{prodMode},</if>
<if test="appId != null and appId != ''">#{appId},</if>
<if test="payChannel != null and payChannel != ''">#{payChannel},</if>
<if test="payAmt != null and payAmt != ''">#{payAmt},</if>
<if test="partyOrderId != null and partyOrderId != ''">#{partyOrderId},</if>
<if test="queryUrl != null and queryUrl != ''">#{queryUrl},</if>
<if test="status != null and status != ''">#{status},</if>
SYSDATE()
)
</insert>
<update id="updatePayment" parameterType="com.ghy.common.adapay.model.PaymentDTO">
UPDATE adapay_pay_log
<set>
<if test="status != null and status != ''">status = #{status},</if>
<if test="payTime != null and payTime != ''">pay_time = #{payTime},</if>
update_time = SYSDATE()
</set>
WHERE id = #{id}
</update>
</mapper>