php实现退款
PHP 实现退款功能
退款功能通常涉及与支付网关的交互,以下是使用 PHP 实现退款的基本步骤和示例代码。
准备工作
确保已获取支付网关的 API 密钥、商户 ID 和退款接口文档。常见的支付网关如支付宝、微信支付、Stripe 等。

支付宝退款示例
支付宝提供开放平台 API 用于退款操作,需配置商户证书和支付宝公钥。

// 配置参数
$gatewayUrl = 'https://openapi.alipay.com/gateway.do';
$appId = 'your_app_id';
$privateKey = 'your_private_key';
$alipayPublicKey = 'alipay_public_key';
// 退款请求参数
$params = [
'app_id' => $appId,
'method' => 'alipay.trade.refund',
'charset' => 'utf-8',
'sign_type' => 'RSA2',
'timestamp' => date('Y-m-d H:i:s'),
'version' => '1.0',
'biz_content' => json_encode([
'out_trade_no' => '商户订单号',
'refund_amount' => '退款金额',
'out_request_no' => '退款请求号'
])
];
// 签名
ksort($params);
$signStr = '';
foreach ($params as $k => $v) {
$signStr .= $k . '=' . $v . '&';
}
$signStr = rtrim($signStr, '&');
openssl_sign($signStr, $sign, $privateKey, OPENSSL_ALGO_SHA256);
$params['sign'] = base64_encode($sign);
// 发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $gatewayUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// 处理响应
$result = json_decode($response, true);
if ($result['alipay_trade_refund_response']['code'] == '10000') {
echo '退款成功';
} else {
echo '退款失败: ' . $result['alipay_trade_refund_response']['sub_msg'];
}
微信支付退款示例
微信支付退款需要证书文件,通常为 apiclient_cert.pem 和 apiclient_key.pem。
// 配置参数
$url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';
$mchId = '商户号';
$apiKey = 'API密钥';
// 退款请求参数
$params = [
'appid' => 'APPID',
'mch_id' => $mchId,
'nonce_str' => md5(uniqid()),
'out_trade_no' => '商户订单号',
'out_refund_no' => '退款单号',
'total_fee' => '订单金额',
'refund_fee' => '退款金额'
];
// 签名
ksort($params);
$signStr = '';
foreach ($params as $k => $v) {
$signStr .= $k . '=' . $v . '&';
}
$signStr .= 'key=' . $apiKey;
$params['sign'] = strtoupper(md5($signStr));
// XML 格式
$xml = '<xml>';
foreach ($params as $k => $v) {
$xml .= '<' . $k . '>' . $v . '</' . $k . '>';
}
$xml .= '</xml>';
// 发送请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSLCERT, 'path/to/apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'path/to/apiclient_key.pem');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
// 处理响应
$result = simplexml_load_string($response);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS') {
echo '退款成功';
} else {
echo '退款失败: ' . $result->return_msg;
}
Stripe 退款示例
Stripe 提供简单的 API 接口,需安装 Stripe PHP 库。
require_once 'vendor/autoload.php';
\Stripe\Stripe::setApiKey('your_stripe_api_key');
try {
$refund = \Stripe\Refund::create([
'charge' => 'charge_id',
'amount' => '退款金额'
]);
echo '退款成功: ' . $refund->id;
} catch (\Stripe\Exception\ApiErrorException $e) {
echo '退款失败: ' . $e->getMessage();
}
注意事项
- 确保退款请求的唯一性,避免重复退款。
- 处理退款结果时记录日志,便于后续对账。
- 根据业务需求设置退款金额,支持全额或部分退款。
- 遵守支付网关的退款规则和限制,如退款时效和频率。






