♨ 背景
- 这两天在做 APP下的支付宝支付功能,涉及到其 退款操作 功能,所以在应用申请的等待时间里就已经做了代码的编写 ,在此记录一下几个注意的事项,希望能帮到各位道友
多少提一下:毕竟我的前提操作是 App支付快速接入,虽然理论上不会影响
- 开发环境
> ThinkPHP 框架: ThinkPHP5.1.2
> PHP 版本: php-5.6.32(>= 及以上)
> 服务器 : Nginx
> 线上系统: CentOS7.1
-
支付宝交易退款开发文档:alipay.trade.refund(统一收单交易退款接口)
注意阅读人家官方开头的 应用场景介绍 -
App支付服务端 DEMO & SDK
根据我的语言要求,下载的当然是 PHP版资源 咯
☄ 代码实现
- 首先,自然是顺利把 DEMO & SDK 的源码包整合到自己的框架中,以我的框架为例如下图,同时要注意对使用到的类设置
namespace
空间,以保证顺利访问
- 进行核心代码的编写,可对应文档中的请求示例,如下为我自行整理的代码:
/**
* 统一收单交易退款接口
* @param string $out_trade_no 订单支付时传入的商户订单号
* @param string $refund_fee 需要退款的金额
* @return array
*/
public function payRefundAli($out_trade_no = "", $refund_fee = "0.00")
{
$aop = new AopClient ();
$aop->gatewayUrl = $this->gatewayUrl;
$aop->appId = $this->appID;
$aop->rsaPrivateKey = $this->rsaPrivateKey;
$aop->alipayrsaPublicKey = $this->alipayrsaPublicKey;
$aop->apiVersion = '1.0';
$aop->signType = 'RSA2';
$aop->postCharset = 'utf-8';
$aop->format = 'json';
$request = new AlipayTradeRefundRequest ();
//TODO 方便多次退款的设置
$out_request_no = $out_trade_no.rand(1000,9999);
$request->setBizContent("{" .
//订单支付时传入的商户订单号,不能和 trade_no同时为空。
"\"out_trade_no\":\"$out_trade_no\"," .
//支付宝交易号,和商户订单号不能同时为空
//"\"trade_no\":\"2019060622001445431042039169\"," .
//需要退款的金额,该金额不能大于订单金额,单位为元,支持两位小数 c
"\"refund_amount\":$refund_fee," .
//标识一次退款请求,同一笔交易多次退款需要保证唯一,如需部分退款,则此参数必传
"\"out_request_no\":\"$out_request_no\"" .
" }");
$result = $aop->execute($request);
//var_dump($result);
$responseNode = str_replace(".", "_", $request->getApiMethodName()) . "_response";
$resultCode = $result->$responseNode->code;
if (!empty($resultCode) && $resultCode == 10000) {
$status = 1;
$message = "退款成功";
} else {
$status = 0;
$message = $result->alipay_trade_refund_response->sub_msg;
}
//echo $message;
return showMsg($status,$message); //这是我自己的封装方法,可忽略...
}
- 根据自己的具体业务进行调用或修改即可,测试可行!!!
☄ 注意事项
- 当然是最基本的支付宝应用配置信息,比如
appID、rsaPrivateKey、alipayrsaPublicKey
等 - 尤其注意
请求参数的集合 biz_content
的参数补充,切记最后一个参数后面 不要有 逗号!!!
- 我就是粗心大意,找了一天查不出原因,一直报错 ( 可算长记性了 ) :
40004: ACQ.INVALID_PARAMETER "参数无效"
3. 对于同一订单的多次退款操作,需要注意添加 out_request_no
参数,不然会提示:
ACQ.REFUND_AMT_NOT_EQUAL_TOTAL “撤销或退款金额与订单金额不一致”
- 正确配置后,多次退款记录如下:
☞ 附录
- 因为觉得退款操作简单,所以先进行整理编辑下;
对于支付逻辑,等端午节过后再做整理 —— APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)