PHP 支付宝退款操作+注意事项 (2019-06-06)

44 篇文章 10 订阅
13 篇文章 0 订阅

♨ 背景

  • 这两天在做 APP下的支付宝支付功能,涉及到其 退款操作 功能,所以在应用申请的等待时间里就已经做了代码的编写 ,在此记录一下几个注意的事项,希望能帮到各位道友

多少提一下:毕竟我的前提操作是 App支付快速接入,虽然理论上不会影响

  • 开发环境
	> ThinkPHP 框架:	ThinkPHP5.1.2
	> PHP 版本:			php-5.6.32(>= 及以上)
	> 服务器 :			Nginx
	> 线上系统:			CentOS7.1

☄ 代码实现

  1. 首先,自然是顺利把 DEMO & SDK 的源码包整合到自己的框架中,以我的框架为例如下图,同时要注意对使用到的类设置 namespace 空间,以保证顺利访问
  2. 进行核心代码的编写,可对应文档中的请求示例,如下为我自行整理的代码:
    /**
     * 统一收单交易退款接口
     * @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); //这是我自己的封装方法,可忽略...
    }
  1. 根据自己的具体业务进行调用或修改即可,测试可行!!!

☄ 注意事项

  1. 当然是最基本的支付宝应用配置信息,比如 appID、rsaPrivateKey、alipayrsaPublicKey
  2. 尤其注意 请求参数的集合 biz_content 的参数补充,切记最后一个参数后面 不要有 逗号!!!
  • 我就是粗心大意,找了一天查不出原因,一直报错 ( 可算长记性了 ) :

40004: ACQ.INVALID_PARAMETER "参数无效"


3. 对于同一订单的多次退款操作,需要注意添加 out_request_no 参数,不然会提示:

ACQ.REFUND_AMT_NOT_EQUAL_TOTAL “撤销或退款金额与订单金额不一致”

  • 正确配置后,多次退款记录如下:

☞ 附录

    1. 因为觉得退款操作简单,所以先进行整理编辑下;
      对于支付逻辑,等端午节过后再做整理 —— APP(UniAPP) 支付宝支付操作指导 + 遇到的坑(PHP实现)
    1. 建议:进行支付宝退款时,要记录官方服务器反馈的信息,方便后期排查验证
      如下为退款申请,反馈所得的信息如下:
{
	"code": "10000",
	"msg": "Success",
	"buyer_logon_id": "zha***@sina.com",
	"buyer_user_id": "2088702838245430",
	"fund_change": "Y",
	"gmt_refund_pay": "2023-09-08 10:28:02",
	"out_trade_no": "2023090810253542281",
	"refund_detail_item_list": [{
		"amount": "0.01",
		"fund_channel": "PCREDIT"
	}],
	"refund_fee": "0.01",
	"send_back_fee": "0.01",
	"trade_no": "2023090822001445431424023419"
}
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值