alipay.trade.fastpay.refund.query
- 步骤:
- 1. 本接口加密验签方式使用RSA,生成公私钥并上传公钥到支付宝后台
- 2. 对各请求参数进行签名处理,生成URL
- 3.调用此URL,跳转到对应请求页面
- 4.同步回调返回【查询结果】
一.配置公私钥
二.请求参数
参数的形式与格式如下,模仿即可。注意除了$sign,其他参数都是要参与验签的,也就是都要rsa加密(详细见下方demo)
https://openapi.alipay.com/gateway.do?
timestamp=2013-01-01 08:08:08
&method=alipay.trade.fastpay.refund.query
&app_id=1175
&sign_type=RSA
&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE
&version=1.0
&biz_content=
{
"trade_no":"20150320010101001",
"out_trade_no":"2014112611001004680073956707",
"out_request_no":"2014112611001004680073956707"
}
三.回调参数
查询成功后,系统同步会返回如下的结果
成功回调举例:
{
"alipay_trade_fastpay_refund_query_response":{
"code":"10000",
"msg":"Success",
"out_request_no":"20150320010101001",
"out_trade_no":"20150320010101001",
"refund_amount":12.33,
"refund_reason":"用户退款请求",
"total_amount":100.20,
"trade_no":"2014112611001004680073956707"
}
}
<span style="line-height: 33.75px; white-space: pre-wrap;">成功回调举例:</span>{
"alipay_trade_fastpay_refund_query_response":{
"code":"20000",
"msg":"Service Currently Unavailable",
"sub_code":"isp.unknow-error",
"sub_msg":"系统繁忙"
}
}
四.注意问题
1.在RSA签名时,需要私钥和公钥一起参与签名。私钥与公钥都是商户通过OPENSSL来生成得出的。商户把生成出的公钥与支付宝技术人员配置好的支付宝公钥做交换。在签名时,商户要用到的是商户的私钥和支付宝的公钥。
2.本验签方式仅支持RSA加密
五.局部代码
下边代码是来自不同文件所用到的函数代码,完整的流程已经如下,少部分衔接按照逻辑加入自己系统即可
/** 支付宝退款查询
* @param $order_info
*/
private function alipayRefundQuery($order_info,$payment_info){
$api_file = BASE_PATH.DS.'api'.DS.'refund'.DS.'alipay'.DS.'alipay.class.php';
include $api_file;
$payment_config = $payment_info['payment_config'];
$alipay_config = array();
$alipay_config['seller_email'] = $payment_config['alipay_account'];//账户
$alipay_config['partner'] = $payment_config['alipay_partner'];//partner,合作者身份ID
$alipay_config['key'] = $payment_config['alipay_key'];//自己的KEY
$alipaySubmit = new AlipaySubmit($alipay_config);
$parameter['app_id'] = 'your_app_id';<span style="white-space:pre"> </span>//app_id
$parameter['method'] = 'alipay.trade.fastpay.refund.query';//调用的接口
$parameter['charset'] = 'utf-8';<span style="white-space:pre"> </span>//字符集
$parameter['sign_type'] = 'RSA';<span style="white-space:pre"> </span>//加密方式
$parameter['timestamp'] = date('Y-m-d H:i:s');<span style="white-space:pre"> </span>//时间
$parameter['version'] = '1.0';<span style="white-space:pre"> </span>//版本
$arr=array(
'out_trade_no'=>$order_info['trade_no'],
'out_request_no'=>$order_info['trade_no'],
);
$parameter['biz_content'] = json_encode($arr);//除了公共参数的其他参数存储
$pay_url = $alipaySubmit->buildRequestParaToString($parameter);
$re = file_get_contents($pay_url);
$re = json_decode($re)->alipay_trade_fastpay_refund_query_response;
if($re->code == "10000"){
$result['state'] = true;
$result['msg'] = $re->msg;
$result['to_where'] = '';
}else{
$result['state'] = false;
$result['msg'] = $re->msg;
}
return $result;
}
/**
* 生成要请求给支付宝的参数数组
* @param $para_temp 请求前的参数数组
* @return 要请求的参数数组字符串
*/
function buildRequestParaToString($para_temp) {
//待请求参数数组
$para = $this->buildRequestPara($para_temp);
//把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
$request_data = $this->alipay_gateway_new.createLinkstringUrlencode($para);
return $request_data;
}
/**
* 生成要请求给支付宝的参数数组
* @param $para_temp 请求前的参数数组
* @return 要请求的参数数组
*/
function buildRequestPara($para_temp) {
if(!empty($para_temp['sign_type'])) $this->alipay_config['sign_type'] = strtoupper(trim($para_temp['sign_type']));
//除去待签名参数数组中的空值和签名参数
$para_filter = paraFilter($para_temp);
//对待签名参数数组排序
$para_sort = argSort($para_filter);
//生成签名结果
$mysign = $this->buildRequestMysign($para_sort);
//签名结果与签名方式加入请求提交参数组中
$para_sort['sign'] = $mysign;
$para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));
return $para_sort;
}
/**
* 除去数组中的空值和签名参数
* @param $para 签名参数组
* return 去掉空值与签名参数后的新签名参数组
*/
function paraFilter($para) {
$para_filter = array();
while (list ($key, $val) = each ($para)) {
if($key == "sign" || $key == "sign_type" || $val == "")continue;
else $para_filter[$key] = $para[$key];
}
return $para_filter;
}
/**
* 对数组排序
* @param $para 排序前的数组
* return 排序后的数组
*/
function argSort($para) {
ksort($para);
reset($para);
return $para;
}
/**
* 生成签名结果
* @param $para_sort 已排序要签名的数组
* return 签名结果字符串
*/
function buildRequestMysign($para_sort) {
//把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
$prestr = createLinkstring($para_sort);
$mysign = "";
switch (strtoupper(trim($this->alipay_config['sign_type']))) {
case "MD5" :
$mysign = md5Sign($prestr, $this->alipay_config['key']);
break;
case "RSA":
require ('AopClient.php');
$aop = new AopClient();
$mysign = $aop->rsaSign($prestr);
break;
default :
$mysign = "";
}
return $mysign;
}
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码
* @param $para 需要拼接的数组
* return 拼接完成以后的字符串
*/
function createLinkstringUrlencode($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
$arg.=$key."=".urlencode($val)."&";
}
//去掉最后一个&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}
return $arg;
}</span>