当前位置:首页 > PHP

php实现退款

2026-01-29 23:10:05PHP

PHP 实现退款功能

退款功能通常涉及与支付网关的交互,以下是使用 PHP 实现退款的基本步骤和示例代码。

准备工作

确保已获取支付网关的 API 密钥、商户 ID 和退款接口文档。常见的支付网关如支付宝、微信支付、Stripe 等。

php实现退款

支付宝退款示例

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

php实现退款

// 配置参数
$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.pemapiclient_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();
}

注意事项

  • 确保退款请求的唯一性,避免重复退款。
  • 处理退款结果时记录日志,便于后续对账。
  • 根据业务需求设置退款金额,支持全额或部分退款。
  • 遵守支付网关的退款规则和限制,如退款时效和频率。

标签: php
分享给朋友:

相关文章

php实现表单

php实现表单

PHP 表单基础实现 创建一个简单的 PHP 表单需要 HTML 表单结构和 PHP 处理脚本。以下是一个完整的示例: HTML 表单部分 (form.html) <form action=…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…

php 实现mvc

php 实现mvc

PHP 实现 MVC 架构的方法 MVC(Model-View-Controller)是一种常见的软件设计模式,用于分离业务逻辑、用户界面和用户输入。以下是 PHP 实现 MVC 架构的关键步骤:…

php session实现购物车

php session实现购物车

PHP Session 实现购物车 初始化 Session 确保在使用 Session 前调用 session_start() 函数。通常放在 PHP 文件的最顶部。 <?php sessio…

php 实现锁

php 实现锁

PHP 实现锁的常见方法 文件锁(flock) 利用 flock 函数对文件进行独占锁定,适用于单机环境。 $fp = fopen("lockfile.lock", "w+"); if (flock…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…