支付宝查询退款接口(统一收单交易退款查询)

alipay.trade.fastpay.refund.query

支付宝返回码官方文档:

https://doc.open.alipay.com/doc2/detail.htm?treeId=200&articleId=105351&docType=1#

退款查询API官方文档:

https://doc.open.alipay.com/docs/api.htm?spm=a219a.7386797.0.0.89T9QM&docType=4&apiId=1049

获取公私钥方法:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.ITH10h&treeId=58&articleId=103578&docType=1

  • 步骤:
  • 1. 本接口加密验签方式使用RSA,生成公私钥并上传公钥到支付宝后台
  • 2. 对各请求参数进行签名处理,生成URL
  • 3.调用此URL,跳转到对应请求页面
  • 4.同步回调返回【查询结果】

一.配置公私钥

生成公私钥:点击下载http://download.csdn.net/detail/ty_hf/9626153

配置公私钥流程:

https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.ITH10h&treeId=58&articleId=103578&docType=1

 

二.请求参数

参数的形式与格式如下,模仿即可。注意除了$sign,其他参数都是要参与验签的,也就是都要rsa加密(详细见下方demo)

[php] view plain copy

  1. https://openapi.alipay.com/gateway.do?  
  2. timestamp=2013-01-01 08:08:08  
  3. &method=alipay.trade.fastpay.refund.query  
  4. &app_id=1175  
  5. &sign_type=RSA  
  6. &sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE  
  7. &version=1.0  
  8. &biz_content=  
  9.   {  
  10.     "trade_no":"20150320010101001",  
  11.     "out_trade_no":"2014112611001004680073956707",  
  12.     "out_request_no":"2014112611001004680073956707"  
  13.   }  

 

三.回调参数

查询成功后,系统同步会返回如下的结果

成功回调举例:

[php] view plain copy

  1. {  
  2.     "alipay_trade_fastpay_refund_query_response":{  
  3.         "code":"10000",  
  4.         "msg":"Success",  
  5.         "out_request_no":"20150320010101001",  
  6.         "out_trade_no":"20150320010101001",  
  7.         "refund_amount":12.33,  
  8.         "refund_reason":"用户退款请求",  
  9.         "total_amount":100.20,  
  10.         "trade_no":"2014112611001004680073956707"  
  11.     }  
  12. }  

异常回调举例:

[php] view plain copy

  1. <span style="line-height: 33.75px; white-space: pre-wrap;">成功回调举例:</span>{  
  2.     "alipay_trade_fastpay_refund_query_response":{  
  3.         "code":"20000",  
  4.         "msg":"Service Currently Unavailable",  
  5.         "sub_code":"isp.unknow-error",  
  6.         "sub_msg":"系统繁忙"  
  7.     }  
  8. }  

 

四.注意问题

1.在RSA签名时,需要私钥和公钥一起参与签名。私钥与公钥都是商户通过OPENSSL来生成得出的。商户把生成出的公钥与支付宝技术人员配置好的支付宝公钥做交换。在签名时,商户要用到的是商户的私钥和支付宝的公钥。

2.本验签方式仅支持RSA加密

 

五.局部代码

下边代码是来自不同文件所用到的函数代码,完整的流程已经如下,少部分衔接按照逻辑加入自己系统即可

[php] view plain copy

  1. /**  支付宝退款查询 
  2.      *   @param $order_info 
  3.      */  
  4.     private function alipayRefundQuery($order_info,$payment_info){  
  5.         $api_file = BASE_PATH.DS.'api'.DS.'refund'.DS.'alipay'.DS.'alipay.class.php';  
  6.         include $api_file;  
  7.         $payment_config = $payment_info['payment_config'];  
  8.         $alipay_config = array();  
  9.         $alipay_config['seller_email'] = $payment_config['alipay_account'];//账户  
  10.         $alipay_config['partner'] = $payment_config['alipay_partner'];//partner,合作者身份ID  
  11.         $alipay_config['key'] = $payment_config['alipay_key'];//自己的KEY  
  12.   
  13.         $alipaySubmit = new AlipaySubmit($alipay_config);  
  14.         $parameter['app_id'] = 'your_app_id';<span style="white-space:pre">           </span>//app_id  
  15.         $parameter['method'] = 'alipay.trade.fastpay.refund.query';//调用的接口  
  16.         $parameter['charset'] = 'utf-8';<span style="white-space:pre">            </span>//字符集  
  17.         $parameter['sign_type'] = 'RSA';<span style="white-space:pre">            </span>//加密方式  
  18.         $parameter['timestamp'] = date('Y-m-d H:i:s');<span style="white-space:pre">      </span>//时间  
  19.         $parameter['version'] = '1.0';<span style="white-space:pre">              </span>//版本  
  20.   
  21.         $arr=array(  
  22.             'out_trade_no'=>$order_info['trade_no'],  
  23.             'out_request_no'=>$order_info['trade_no'],  
  24.         );  
  25.           
  26.         $parameter['biz_content'] = json_encode($arr);//除了公共参数的其他参数存储  
  27.   
  28.         $pay_url = $alipaySubmit->buildRequestParaToString($parameter);  
  29.   
  30.         $re = file_get_contents($pay_url);  
  31.   
  32.         $re = json_decode($re)->alipay_trade_fastpay_refund_query_response;  
  33.         if($re->code == "10000"){  
  34.             $result['state'] = true;  
  35.             $result['msg'] = $re->msg;  
  36.             $result['to_where'] = '';  
  37.         }else{  
  38.             $result['state'] = false;  
  39.             $result['msg'] = $re->msg;  
  40.         }  
  41.         return $result;  
  42.     }  
  43.   
  44.   
  45.   
  46.     /** 
  47.      * 生成要请求给支付宝的参数数组 
  48.      * @param $para_temp 请求前的参数数组 
  49.      * @return 要请求的参数数组字符串 
  50.      */  
  51.     function buildRequestParaToString($para_temp) {  
  52.         //待请求参数数组  
  53.         $para = $this->buildRequestPara($para_temp);  
  54.   
  55.         //把参数组中所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码  
  56.         $request_data = $this->alipay_gateway_new.createLinkstringUrlencode($para);  
  57.   
  58.         return $request_data;  
  59.     }  
  60.   
  61.         /** 
  62.      * 生成要请求给支付宝的参数数组 
  63.      * @param $para_temp 请求前的参数数组 
  64.      * @return 要请求的参数数组 
  65.      */  
  66.     function buildRequestPara($para_temp) {  
  67.         if(!empty($para_temp['sign_type'])) $this->alipay_config['sign_type'] = strtoupper(trim($para_temp['sign_type']));  
  68.         //除去待签名参数数组中的空值和签名参数  
  69.         $para_filter = paraFilter($para_temp);  
  70.   
  71.         //对待签名参数数组排序  
  72.         $para_sort = argSort($para_filter);  
  73.   
  74.         //生成签名结果  
  75.         $mysign = $this->buildRequestMysign($para_sort);  
  76.           
  77.         //签名结果与签名方式加入请求提交参数组中  
  78.         $para_sort['sign'] = $mysign;  
  79.         $para_sort['sign_type'] = strtoupper(trim($this->alipay_config['sign_type']));  
  80.   
  81.         return $para_sort;  
  82.     }  
  83.   
  84.     /** 
  85.  * 除去数组中的空值和签名参数 
  86.  * @param $para 签名参数组 
  87.  * return 去掉空值与签名参数后的新签名参数组 
  88.  */  
  89. function paraFilter($para) {  
  90.     $para_filter = array();  
  91.     while (list ($key$val) = each ($para)) {  
  92.         if($key == "sign" || $key == "sign_type" || $val == "")continue;  
  93.         else    $para_filter[$key] = $para[$key];  
  94.     }  
  95.     return $para_filter;  
  96. }  
  97.   
  98. /** 
  99.  * 对数组排序 
  100.  * @param $para 排序前的数组 
  101.  * return 排序后的数组 
  102.  */  
  103. function argSort($para) {  
  104.     ksort($para);  
  105.     reset($para);  
  106.     return $para;  
  107. }  
  108.   
  109.     /** 
  110.      * 生成签名结果 
  111.      * @param $para_sort 已排序要签名的数组 
  112.      * return 签名结果字符串 
  113.      */  
  114.     function buildRequestMysign($para_sort) {  
  115.         //把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串  
  116.         $prestr = createLinkstring($para_sort);  
  117.           
  118.         $mysign = "";  
  119.         switch (strtoupper(trim($this->alipay_config['sign_type']))) {  
  120.             case "MD5" :  
  121.                 $mysign = md5Sign($prestr$this->alipay_config['key']);  
  122.                 break;  
  123.             case "RSA":  
  124.                 require ('AopClient.php');  
  125.                 $aop = new AopClient();  
  126.                 $mysign = $aop->rsaSign($prestr);  
  127.                 break;  
  128.             default :  
  129.                 $mysign = "";  
  130.         }  
  131.         return $mysign;  
  132.     }  
  133.   
  134.   
  135.     /** 
  136.  * 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串,并对字符串做urlencode编码 
  137.  * @param $para 需要拼接的数组 
  138.  * return 拼接完成以后的字符串 
  139.  */  
  140. function createLinkstringUrlencode($para) {  
  141.     $arg  = "";  
  142.     while (list ($key$val) = each ($para)) {  
  143.         $arg.=$key."=".urlencode($val)."&";  
  144.     }  
  145.     //去掉最后一个&字符  
  146.     $arg = substr($arg,0,count($arg)-2);  
  147.       
  148.     //如果存在转义字符,那么去掉转义  
  149.     if(get_magic_quotes_gpc()){$arg = stripslashes($arg);}  
  150.     return $arg;  
  151. }</span>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值