package com.pz.system.service;

import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayRefundQueryRequest;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.bean.result.WxPayRefundQueryResult;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.pz.common.core.domain.PageQuery;
import com.pz.common.core.page.TableDataInfo;
import com.pz.system.domain.bo.CityBo;
import com.pz.system.domain.vo.CityVo;

import java.util.Collection;
import java.util.List;

/**
 * 城市Service接口
 *
 * @author ruoyi
 * @date 2023-09-07
 */
public interface IPayService {

    /**
     * <pre>
     * 查询订单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
     * 该接口提供所有微信支付订单的查询,商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。
     * 需要调用查询接口的情况:
     * ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知;
     * ◆ 调用支付接口后,返回系统错误或未知交易状态情况;
     * ◆ 调用被扫支付API,返回USERPAYING的状态;
     * ◆ 调用关单或撤销接口API之前,需确认支付状态;
     * 接口地址:https://api.mch.weixin.qq.com/pay/orderquery
     * </pre>
     *
     * @param transactionId 微信订单号
     * @param outTradeNo    商户系统内部的订单号,当没提供transactionId时需要传这个。
     */
    WxPayOrderQueryResult queryOrder(String transactionId, String outTradeNo) throws WxPayException;

    /**
     * 统一下单
     * 调用统一下单接口,并组装生成支付所需参数对象.
     *
     * @param request 统一下单请求参数
     * @param <T>     请使用{@link com.github.binarywang.wxpay.bean.order}包下的类
     * @return 返回 {@link com.github.binarywang.wxpay.bean.order}包下的类对象
     */
    <T> T createOrder(WxPayUnifiedOrderRequest request) throws WxPayException;

    /**
     * <pre>
     * 微信支付-申请退款
     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
     * 接口链接:https://api.mch.weixin.qq.com/secapi/pay/refund
     * </pre>
     *
     * @param request 请求对象
     * @return 退款操作结果
     */
    WxPayRefundResult refund(WxPayRefundRequest request) throws WxPayException;

    /**
     * <pre>
     * 微信支付-查询退款
     * 应用场景:
     *  提交退款申请后,通过调用该接口查询退款状态。退款有一定延时,用零钱支付的退款20分钟内到账,
     *  银行卡支付的退款3个工作日后重新查询退款状态。
     * 详见 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_5
     * 接口链接:https://api.mch.weixin.qq.com/pay/refundquery
     * </pre>
     * 以下四个参数四选一
     *
     * @param transactionId 微信订单号
     * @param outTradeNo    商户订单号
     * @param outRefundNo   商户退款单号
     * @param refundId      微信退款单号
     * @return 退款信息
     */
    WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, String outRefundNo, String refundId) throws WxPayException;

    /**
     * 支付回调通知处理
     * 微信请求的接口,要求可以公网访问,要放开token校验
     * @param xmlData 微信提交的请求参数
     */
    WxPayOrderNotifyResult parseOrderNotifyResult(String xmlData) throws WxPayException;

    /**
     * 退款回调通知处理
     * 微信请求的接口,要求可以公网访问,要放开token校验
     * @param xmlData 微信提交的请求参数
     */
    WxPayRefundNotifyResult parseRefundNotifyResult(String xmlData) throws WxPayException;
}