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
获取公私钥方法:
- 步骤:
- 1. 本接口加密验签方式使用RSA,生成公私钥并上传公钥到支付宝后台
- 2. 对各请求参数进行签名处理,生成URL
- 3.调用此URL,跳转到对应请求页面
- 4.同步回调返回【查询结果】
一.配置公私钥
生成公私钥:点击下载http://download.csdn.net/detail/ty_hf/9626153
配置公私钥流程:
二.请求参数
参数的形式与格式如下,模仿即可。注意除了$sign,其他参数都是要参与验签的,也就是都要rsa加密(详细见下方demo)
[php] view plain copy
- 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"
- }
三.回调参数
查询成功后,系统同步会返回如下的结果
成功回调举例:
[php] view plain copy
- {
- "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"
- }
- }
异常回调举例:
[php] view plain copy
- <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加密
五.局部代码
下边代码是来自不同文件所用到的函数代码,完整的流程已经如下,少部分衔接按照逻辑加入自己系统即可
[php] view plain copy
- /** 支付宝退款查询
- * @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>