Authored by tanling

支付

... ... @@ -4,6 +4,7 @@ import com.yohoufo.common.ApiResponse;
import com.yohoufo.common.utils.WXUtil;
import com.yohoufo.order.model.NotifyResponse;
import com.yohoufo.order.model.PaymentData;
import com.yohoufo.order.model.PaymentOrderQueryBO;
import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.model.response.PaymentConfirmRsp;
import com.yohoufo.order.model.response.PrepayResponse;
... ... @@ -85,6 +86,21 @@ public class PaymentController {
/**
* 退款结果确认
* @return
*/
@RequestMapping(params = "method=ufo.order.refund")
public ApiResponse refund(@RequestParam(name = "orderCode") long orderCode){
PaymentRequest request = PaymentRequest.builder().orderCode(orderCode).build();
PaymentOrderQueryBO payConfirm = paymentService.refund(request);
return new ApiResponse.ApiResponseBuilder().code(PrepayResponse.SUCCESS).data(payConfirm).message("退款成功").build();
}
/**
* 微信支付 回调接口
* @param request
* @return
... ...
... ... @@ -4,6 +4,7 @@ package com.yohoufo.order.service;
import com.yohoufo.order.model.PaymentData;
import com.yohoufo.order.model.PaymentOrderQueryBO;
import com.yohoufo.order.model.request.PaymentRequest;
import com.yohoufo.order.model.response.PaymentConfirmRsp;
import com.yohoufo.order.model.response.PrepayResponse;
... ... @@ -18,7 +19,6 @@ public interface IPaymentService {
PrepayResponse payment(PaymentRequest request);
/**
* 订单支付结果确认
* @param request
... ... @@ -31,5 +31,15 @@ public interface IPaymentService {
* 订单支付成功处理
* @param paymentData
*/
public void paySuccess(PaymentData paymentData);
void paySuccess(PaymentData paymentData);
/**
* 订单退款
* 使用场景: [卖家发布商品]页面的[不卖了],
* 后台[鉴定中心]页面的[鉴定通过],保证金退还给卖家
*
* @param request
*/
PaymentOrderQueryBO refund(PaymentRequest request);
}
... ...
... ... @@ -44,7 +44,7 @@ import java.util.Date;
@Service
public class PaymentServiceImpl implements IPaymentService {
private final Logger logger = LoggerFactory.getLogger(getClass());
private static final Logger logger = LoggerFactory.getLogger("payConfirmLog");
@Autowired
BuyerOrderMetaMapper buyerOrderMetaMapper;
... ... @@ -290,8 +290,6 @@ public class PaymentServiceImpl implements IPaymentService {
return paymentOrderQueryBO;
}
Payment payment = checkPaymentRequest(request);
// 退款
AbstractPayService payService = getPayService(orderInfo.getPayment());
... ...
... ... @@ -89,7 +89,7 @@ public class ShoppingServiceImpl implements IShoppingService {
// 不可售
if (skupGood.getStatus() == null
|| skupGood.getStatus().intValue() == SkupStatus.CAN_NOT_SELL.getCode()){
|| skupGood.getStatus().intValue() != SkupStatus.CAN_SELL.getCode()){
logger.warn("payment skup status, skup is {}", skup);
throw new ServiceException(ServiceError.ORDER_SKUP_CANNOT_SELL);
}
... ...
... ... @@ -9,6 +9,7 @@ import com.yohoufo.common.utils.TimeUtils;
import com.yohoufo.common.utils.WXUtils;
import com.yohoufo.order.common.Payment;
import com.yohoufo.order.config.WeixinPayConfig;
import com.yohoufo.order.constants.RefundContant;
import com.yohoufo.order.model.OrderInfo;
import com.yohoufo.order.model.PayQueryBo;
import com.yohoufo.order.model.PayRefundBo;
... ... @@ -208,8 +209,66 @@ public abstract class AbstractWeixinPayService extends AbstractPayService {
}
public PayRefundBo refundOpenApi(PayRefundBo refundBo){
return null;
public PayRefundBo refundOpenApi(PayRefundBo refundBo){
Map<String, String> queryParams = buildRefundParams(refundBo);
String requestXml = WXUtils.createWXPayXml(queryParams);
String respXml = sendRefundRequest(String.valueOf(refundBo.getPayOrderCode()), requestXml);
return refundConvert(respXml, refundBo);
}
private PayRefundBo refundConvert(String responseXml, PayRefundBo bo) {
//PayRefundBo bo = new PayRefundBo();
if (StringUtils.isEmpty(responseXml)) {
bo.setRefundStatus(RefundContant.PAYMENT_REFUND_RESULTCODE_REQERR);
bo.setRefundMsg("退款申请请求失败");
return bo;
}
Map<String, String> reponseMap = WXUtils.parseWXPayXml(responseXml);
if(!"SUCCESS".equals(reponseMap.get("return_code"))) {
bo.setRefundStatus(RefundContant.PAYMENT_REFUND_RESULTCODE_REQERR);
bo.setRefundMsg(reponseMap.get("return_msg"));
return bo;
}
if(!"SUCCESS".equals(reponseMap.get("result_code"))) {
bo.setRefundStatus(RefundContant.PAYMENT_REFUND_RESULTCODE_FAIL);
bo.setRefundMsg(reponseMap.get("err_code") + ": " + reponseMap.get("err_code_des"));
return bo;
}
bo.setRefundStatus(RefundContant.PAYMENT_REFUND_RESULTCODE_SUCCESS);
bo.setSerialNo(reponseMap.get("refund_id"));
bo.setRefundMsg("退款成功");
return bo;
}
/**
* 退款请求
* @param orderCode
* @param requestXml
* @return
*/
private String sendRefundRequest(String tradeNo, String requestXml) {
logger.info("WeixinRefunder request tradeNo: {}, request: {}", tradeNo, requestXml);
String respXml = "";
HttpClient httpClient = getSslHttpClient();
if(httpClient == null) {
logger.error("init weixin ssl httpclient faild, unable refund weixinpay");
return respXml;
}
try {
respXml = httpClient.post(WeixinPayConfig.WEIXIN_PAY_REFUND_URL, requestXml);
} catch (Exception e) {
logger.error("WeixinRefunder request failed, orderCode:{}, ex: {}", tradeNo, e.getMessage());
}
logger.info("WeixinRefunder response: {}", respXml);
return respXml;
}
... ... @@ -234,6 +293,29 @@ public abstract class AbstractWeixinPayService extends AbstractPayService {
return prepayJson;
}
private Map<String, String> buildRefundParams(PayRefundBo refundBo) {
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("appid", getAppId());
paramMap.put("mch_id", getMchId());
paramMap.put("nonce_str", WXUtils.getNonceStr());
paramMap.put("out_trade_no", WeixinPayConfig.WECHAT_TRADE_NO_PREFIX + refundBo.getPayOrderCode());
paramMap.put("out_refund_no", refundBo.getRefundOrderCode());
//String totalFee = String.valueOf((int)YHMath.mul(amount, 100)); //微信金额必须以分为单位,且不能包含小数点
paramMap.put("total_fee", String.valueOf((int)YHMath.mul(refundBo.getOrderTotalFee(), 100)));
paramMap.put("refund_fee", String.valueOf((int)YHMath.mul(refundBo.getAmount(), 100)));
paramMap.put("op_user_id", getMchId());
//签名
//md5签名
String sign = WXUtils.signMd5(paramMap, getMchKey());
paramMap.put(WeixinPayConfig.ApiConstants.SIGN, sign);
return paramMap;
}
/**
* 获取预支付的返回数据
... ...