以PHP为例:
参考支付宝官方文档地址:
小程序文档 - 支付宝文档中心支付宝文档中心https://opendocs.alipay.com/open/6c0cdd7d_alipay.trade.refund操作步骤:
一:下载SDK
二:沙箱测试
登录支付宝账号后,使用在线调试工具时,工具自动将沙盒环境的参数配置好了,沙盒环境测试流程通过后,换成正式环境的参数配置即可。
三:正式环境测试
具体实施:
1:应用加签名。
登录支付宝控制台,创建网页/移动应用并检查是否开通了对应的APP支付或网页支付,并配置接口加签方式。
加签主要是使用支付宝开放平台密钥工具 生成 支付宝应用公钥和支付宝应用私钥,
并把应用公钥配置在创建的应用上,此时,支付宝后台会自动生成支付宝公钥,在后面的代码中,会用到支付宝应用私钥和支付宝公钥。
2:sdk下载
需要去支付宝GitHub地址,下载v2版本即可。使用里面的aop模块
https://github.com/alipay/alipay-sdk-php-all
下载解压缩后,将v2复制到自己的项目中,然后在代码中引用即可。 在此,我是把v2放在了sdk/alipay_refund文件夹下,可根据自己的需求创建文件夹,注意:下面的代码部分也要替换为自己自定义的文件夹名称。
在线调试工具:
支付宝开放平台https://open.alipay.com/api/apiDebug?frontProdCode=I1080300001000041313&backProdCode=I1011000100000000004
3:示例代码
此处的代码流程是先执行退款接口,退款失败的话再执行退款查询接口。
fund_change 为Y代表退款成功,但为N时并不代表退款失败。
因为可能存在一种情况是重复退款时,退款接口返回N,那此时我们需要调用一下查询接口,来验证是否真正退款成功,只有查询时返回的refund_status为REFUND_SUCCESS时,才代表退款成功。具体可参考支付宝官方文档说明:
小程序文档 - 支付宝文档中心支付宝文档中心https://opendocs.alipay.com/support/01rawa
//支付宝退款
//$out_trade_no 商户系统内唯一订单号
//$trade_no 支付宝侧订单号
//$money 退款金额(单位:元)
function AlipayRefund($out_trade_no,$trade_no,$money){
$rs=array('code'=>0,'msg'=>'','info'=>[]);
//引入sdk路径时注意路径层级
require_once '/sdk/alipay_refund/aop/AopClient.php';
require_once '/sdk/alipay_refund/aop/AopCertClient.php';
require_once '/sdk/alipay_refund/aop/AopCertification.php';
require_once '/sdk/alipay_refund/aop/AlipayConfig.php';
require_once '/sdk/alipay_refund/aop/request/AlipayTradeRefundRequest.php';
require_once '/sdk/alipay_refund/aop/request/AlipayTradeFastpayRefundQueryRequest.php'; //退款查询
//支付宝应用私钥
$aliapp_refund_privatekey='';
//支付宝公钥
$aliapp_refund_publickey='';
//<-- 应用私钥 -->
$privateKey = $aliapp_refund_privatekey;
//<-- 支付宝公钥 -->
$alipayPublicKey = $aliapp_refund_publickey;
$alipayConfig = new AlipayConfig();
//沙盒环境下的应用网关:https://openapi-sandbox.dl.alipaydev.com/gateway.do
//正式环境下的应用网关:https://openapi.alipay.com/gateway.do
$alipayConfig->setServerUrl("https://openapi.alipay.com/gateway.do");
//<-- 应用AppId -->
$aliapp_appid='';
$alipayConfig->setAppId($aliapp_appid);
$alipayConfig->setPrivateKey($privateKey);
$alipayConfig->setFormat("json");
$alipayConfig->setAlipayPublicKey($alipayPublicKey);
$alipayConfig->setCharset("UTF-8"); //注意此处的编码格式
$alipayConfig->setSignType("RSA2");
$alipayClient = new AopClient($alipayConfig);
//退款
$request = new AlipayTradeRefundRequest();
/* $request->setBizContent("{".
"\"out_trade_no\":\"2_20230816163057378\",".
"\"trade_no\":\"2023081622001472631443028556\",".
"\"refund_amount\":\"0.01\"".
"}");*/
$request->setBizContent("{".
"\"out_trade_no\":\"".$out_trade_no."\",".
"\"trade_no\":\"".$trade_no."\",".
"\"refund_amount\":\"".$money."\"".
"}");
$responseResult = $alipayClient->execute($request);
$responseApiName = str_replace(".","_",$request->getApiMethodName())."_response";
$response = $responseResult->$responseApiName;
file_put_contents('/log/支付宝退款'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'返回信息 :'.json_encode($response)."\r\n",FILE_APPEND);
if(!empty($response->code)&&$response->code==10000){
//var_dump("退款调用成功");
//退款成功
if($response->fund_change=='Y'){
$rs['msg']='退款成功';
return $rs;
}
//退款未成功,需要查询核实
if($response->fund_change=='N'){
//查询
$request = new AlipayTradeFastpayRefundQueryRequest();
/*$request->setBizContent("{".
"\"out_request_no\":\"2_20230816163057378\",".
"\"out_trade_no\":\"2_20230816163057378\",".
"\"trade_no\":\"2023081622001472631443028556\",".
"\"refund_amount\":\"0.01\"".
"}");*/
$request->setBizContent("{".
"\"out_request_no\":\"".$out_trade_no."\",".
"\"out_trade_no\":\"".$out_trade_no."\",".
"\"trade_no\":\"".$trade_no."\",".
"\"refund_amount\":\"".$money."\"".
"}");
$responseResult = $alipayClient->execute($request);
$responseApiName = str_replace(".","_",$request->getApiMethodName())."_response";
$response1 = $responseResult->$responseApiName;
file_put_contents('/log/支付宝退款查询'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'返回信息 :'.json_encode($response1)."\r\n",FILE_APPEND);
if(!empty($response1->code)&&$response1->code==10000){
//var_dump("退款查询调用成功");
if($response1->refund_status=='REFUND_SUCCESS'){
$rs['msg']='退款成功';
return $rs;
}else{
$rs['code']=1002;
$rs['msg']='退款失败,请检查支付宝商户余额或稍后再试';
return $rs;
}
}
else{
file_put_contents('/log/支付宝退款查询'.date('Y-m-d').'.txt',date('y-m-d H:i:s').'返回信息 :订单号==>'.$out_trade_no.";支付宝交易号:==>".$trade_no."退款查询失败"."\r\n",FILE_APPEND);
//var_dump("退款查询调用失败");
$rs['code']=1003;
$rs['msg']='退款查询失败';
return $rs;
}
}
}
else{
//var_dump("退款调用失败");
$rs['code']=1001;
$rs['msg']='退款失败,请检查支付宝商户余额或稍后再试';
return $rs;
}
}
注意:
正式环境下的应用AppId为: