# 统一收单交易退款接口 - Python 示例

## 请求示例

```python
import json
from alipay.aop.api.AlipayClientConfig import AlipayClientConfig
from alipay.aop.api.DefaultAlipayClient import DefaultAlipayClient
from alipay.aop.api.request.AlipayTradeRefundRequest import AlipayTradeRefundRequest
from alipay.aop.api.domain.AlipayTradeRefundModel import AlipayTradeRefundModel

# 初始化SDK（Python 使用 PKCS#1 格式私钥，Java 使用 PKCS#8 格式，请勿混用）
config = AlipayClientConfig()
config.server_url = "https://openapi.alipay.com/gateway.do"
# 沙箱环境: config.server_url = "https://openapi-sandbox.dl.alipaydev.com/gateway.do"
config.app_id = "<-- 请填写您的AppId，例如：20190xxxxxx -->"
config.app_private_key = "<-- 请填写您的应用私钥，例如：MIIE...（脱敏示例） -->"
config.alipay_public_key = "<-- 请填写您的支付宝公钥，例如：MIIB...（脱敏示例） -->"
config.charset = "utf-8"
config.sign_type = "RSA2"
client = DefaultAlipayClient(alipay_client_config=config)

request = AlipayTradeRefundRequest()
model = AlipayTradeRefundModel()
model.out_trade_no = "MERCHANT_ORDER_NO_PLACEHOLDER"  # 商户订单号，与 trade_no 二选一
model.refund_amount = "200.12"            # 使用 Decimal 等十进制定点金额；调用前校验累计退款不超过原订单实付金额
model.refund_reason = "正常退款"           # 退款原因，选填
model.out_request_no = "OUT_REQUEST_NO_PLACEHOLDER"  # 新退款使用新编号；同一退款失败重试必须复用原编号和原参数
request.biz_model = model

response_content = client.execute(request)
response = json.loads(response_content)
result = response.get("alipay_trade_refund_response", {})

if result.get("code") == "10000":
    if result.get("fund_change") == "Y":
        print(f"退款资金已发生变化，退款金额: {result.get('refund_fee')}")
    else:
        print("退款结果待确认：使用同一 out_request_no 调用 alipay.trade.fastpay.refund.query")
else:
    print(f"调用失败: {result.get('sub_code')} - {result.get('sub_msg')}")
```

## 响应示例
### 正常示例
```json
{
    "code": "10000",
    "msg": "Success",
    "trade_no": "ALIPAY_TRADE_NO_PLACEHOLDER",
    "out_trade_no": "MERCHANT_ORDER_NO_PLACEHOLDER",
    "buyer_logon_id": "159****5620",
    "fund_change": "Y",
    "refund_fee": "88.88"
}
```
### 异常示例
```json
{
    "code": "20000",
    "msg": "Service Currently Unavailable",
    "sub_code": "isp.unknow-error",
    "sub_msg": "系统繁忙"
}
```
