支付宝退款全解析
2016-07-11 本文已影响3960人
Tsy远
简单介绍了支付宝退款的请求处理和一些注意事项
0 系列文章
系列一 微信App支付全解析
系列二 支付宝App支付全解析
系列三 微信公众号支付全解析
系列四 微信扫码支付全解析
系列五 支付宝即时到账支付全解析
系列六 微信退款全解析
系列七 支付宝退款全解析
系列八 支付宝开放平台支付更新升级全解析
支付宝退款主要3个步骤:
- 生成退款链接
- 打开退款链接,跳转支付宝收银台,输入密码确认退款
- 异步接收退款结果通知
注:这个退款适用于即时到账、手机网站、移动支付这三个支付渠道的退款
1 生成退款链接
该接口支持批量退款,一笔交易可以多次退款,退款次数最多不能超过99次,需要遵守多次退款的总金额不超过该笔交易付款金额的原则。
$partner = ""; //你的pid
$seller_id = ""; //seller_id
$rsa_path = ""; //rsa私钥路径
$notify_url = ""; //接收退款结果通知url
$batch_no = ""; //注意要遵循接口batchno格式
$batch_detail = ""; //批量拼接字符串,详细格式见文档
$MAPI_GATEWAY = "https://mapi.alipay.com/gateway.do"; //mapi 入口 路由
$data = array();
$data['service'] = "refund_fastpay_by_platform_pwd";
$data['partner'] =$partner;
$data['_input_charset'] = "utf-8";
$data['notify_url'] = $notify_url;
$data['seller_email'] = $seller_id;
$data['refund_date'] = date('Y-m-d H:i:s');
$data['batch_no'] = $batch_no;
$data['batch_detail'] = batch_detail;
//签名
$unsign_str =createLinkString(argSort($data));
$sign =rsaSign($unsign_str, $rsa_path);
$params = createLinkstringUrlencode($data);
$url = $MAPI_GATEWAY . '?' . $params;
一些函数:
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串
* @param $para mixed 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
public static function createLinkString($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
if($val == "") {
continue;
}
$arg.=$key."=".$val."&";
}
//去掉最后一个&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){
$arg = stripslashes($arg);
}
return $arg;
}
/**
* 把数组所有元素,按照“参数=参数值”的模式用“&”字符拼接成字符串 并对字符串做urlencode编码
* @param $para mixed 需要拼接的数组
* @return string 拼接完成以后的字符串
*/
public static function createLinkstringUrlencode($para) {
$arg = "";
while (list ($key, $val) = each ($para)) {
if($val == "") {
continue;
}
$arg.=$key."=".urlencode($val)."&";
}
//去掉最后一个&字符
$arg = substr($arg,0,count($arg)-2);
//如果存在转义字符,那么去掉转义
if(get_magic_quotes_gpc()){
$arg = stripslashes($arg);
}
return $arg;
}
/**
* 数组排序 按照ASCII字典升序
* @param $para mixed 排序前数组
* @return mixed 排序后数组
*/
public static function argSort($para) {
ksort($para);
reset($para);
return $para;
}
/**
* RSA签名
* @param $data string 待签名数据
* @param $private_rsa_path string 用户私钥地址
* @return mixed
* 失败:false
* 成功:签名结果
*/
public static function rsaSign($data, $private_rsa_path) {
$private_rsa = file_get_contents($private_rsa_path);
$res = openssl_get_privatekey($private_rsa);
if(!$res) {
return false;
}
openssl_sign($data, $sign, $res);
openssl_free_key($res);
//base64编码
$sign = base64_encode($sign);
return $sign;
}
2 退款结果通知
验证签名可以直接下载支付宝sdk例子,进行直接调用。
下载地址:https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
打开其中服务端Demo将里面验证通知部分取出来使用。
$$alipay_partnerid = ""; //你的pid
$$alipay_public_key_path = ""; //支付宝公钥路径
$alipayNotify = new AlipayNotify($alipay_partnerid, $alipay_public_key_path);
$verify_result = $alipayNotify->verifyNotify();
if(!$verify_result) {
//签名验证失败 todo
die("fail");
}
//成功接收并验证了通知
echo("success");
//解析result_details里面每笔退款的状态,然后更新退款状态
//todo
}
//支付成功处理 发货
//todo
结尾
更多文章关注我的公众号
我的公众号