下面是关于“PHP实现微信退款的方法示例”的完整攻略:
1.准备工作
在进行微信退款前,我们需要确保已经完成以下准备工作:
1.1 已经在微信公众平台中创建了应用,并且获得了appid
和mchid
等信息。
1.2 已经生成了证书文件,包括apiclient_cert.pem
和apiclient_key.pem
。
1.3 已经开通了微信支付的退款功能。
2.退款流程
下面介绍一下实现微信退款的流程:
2.1 构造退款数据
首先,我们需要构造退款数据。退款数据需要包括以下信息:
appid
:应用ID,在微信公众平台中获取。mch_id
:商户号,在微信支付中获取。nonce_str
:随机字符串,可以使用PHP的uniqid()
函数生成。sign
:签名,需要使用微信支付提供的算法生成。out_trade_no
:待退款交易的商户订单号。out_refund_no
:退款单号,需要保证唯一性。total_fee
:订单总金额,单位为分。refund_fee
:退款金额,单位为分。
构造完退款数据后,把它转换成xml格式,方便后面进行post请求:
$data = [
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => uniqid(),
'out_trade_no' => $out_trade_no,
'out_refund_no' => $out_refund_no,
'total_fee' => $total_fee,
'refund_fee' => $refund_fee,
];
// 生成签名
$data['sign'] = generateSign($data, $key);
// 转换成xml格式
$xml = toXml($data);
其中,generateSign()
用来生成签名,toXml()
用来将数组转换成xml格式。
2.2 发送退款请求
构造好退款数据后,就可以发送post请求了。需要注意的是,退款接口是需要使用证书进行认证的,需要在请求时将证书和证书密钥一并上传。
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_SSLCERT, 'apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'apiclient_key.pem');
$result = curl_exec($ch);
if ($result === false) {
echo 'Curl error: ' . curl_error($ch);
} else {
echo $result;
}
curl_close($ch);
2.3 处理退款结果
退款请求返回的结果也是xml格式的,需要将其转换成数组后进行处理。
$result = fromXml($result);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
// 退款成功
} else {
// 退款失败
}
其中,fromXml()
函数用来将xml格式的字符串转换成数组。
3.示例说明
以下是两条实现微信退款的示例说明:
3.1 示例一
假设我们要对一个订单进行退款,订单号为20190502152410
,退款金额为1000
元。
$appid = 'your_appid'; // 应用ID
$mch_id = 'your_mch_id'; // 商户号
$key = 'your_key'; // 商户支付密钥
$out_trade_no = '20190502152410'; // 商户订单号
$out_refund_no = '20190502152410_refund'; // 退款单号
$total_fee = 10000; // 订单总金额,单位为分
$refund_fee = 1000; // 退款金额,单位为分
$data = [
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => uniqid(),
'out_trade_no' => $out_trade_no,
'out_refund_no' => $out_refund_no,
'total_fee' => $total_fee,
'refund_fee' => $refund_fee,
];
$data['sign'] = generateSign($data, $key);
$xml = toXml($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_SSLCERT, 'apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'apiclient_key.pem');
$result = curl_exec($ch);
if ($result === false) {
echo 'Curl error: ' . curl_error($ch);
} else {
$result = fromXml($result);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
echo '退款成功';
} else {
echo '退款失败';
}
}
curl_close($ch);
3.2 示例二
假设我们要对一个订单进行部分退款,订单号为20190502152410
,已付款金额为2000
元,退款金额为500
元。
$appid = 'your_appid'; // 应用ID
$mch_id = 'your_mch_id'; // 商户号
$key = 'your_key'; // 商户支付密钥
$out_trade_no = '20190502152410'; // 商户订单号
$out_refund_no = '20190502152410_refund'; // 退款单号
$total_fee = 20000; // 订单总金额,单位为分
$refund_fee = 5000; // 退款金额,单位为分
$data = [
'appid' => $appid,
'mch_id' => $mch_id,
'nonce_str' => uniqid(),
'out_trade_no' => $out_trade_no,
'out_refund_no' => $out_refund_no,
'total_fee' => $total_fee,
'refund_fee' => $refund_fee,
];
$data['sign'] = generateSign($data, $key);
$xml = toXml($data);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.mch.weixin.qq.com/secapi/pay/refund');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_SSLCERT, 'apiclient_cert.pem');
curl_setopt($ch, CURLOPT_SSLKEY, 'apiclient_key.pem');
$result = curl_exec($ch);
if ($result === false) {
echo 'Curl error: ' . curl_error($ch);
} else {
$result = fromXml($result);
if ($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
echo '退款成功';
} else {
echo '退款失败';
}
}
curl_close($ch);
希望这些信息能对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP实现微信退款的方法示例 - Python技术站