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

alipay.trade.fastpay.refund.query
  • 步骤:
  • 1. 本接口加密验签方式使用RSA,生成公私钥并上传公钥到支付宝后台
  • 2. 对各请求参数进行签名处理,生成URL
  • 3.调用此URL,跳转到对应请求页面
  • 4.同步回调返回【查询结果】
一.配置公私钥
生成公私钥:点击下载http://download.csdn.net/detail/ty_hf/9626153
配置公私钥流程:


二.请求参数
参数的形式与格式如下,模仿即可。注意除了$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>




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值