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

2024-06-07 17:18

本文主要是介绍PHP 支付宝退款操作+注意事项 (2019-06-06),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

♨ 背景

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

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

  • 开发环境
	> ThinkPHP 框架:	ThinkPHP5.1.2> PHP 版本:			php-5.6.32(>= 及以上)> 服务器 :			Nginx> 线上系统:			CentOS7.1
  • 支付宝交易退款开发文档:alipay.trade.refund(统一收单交易退款接口)
    注意阅读人家官方开头的 应用场景介绍

  • App支付服务端 DEMO & SDK
    根据我的语言要求,下载的当然是 PHP版资源

☄ 代码实现

  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"
}

这篇关于PHP 支付宝退款操作+注意事项 (2019-06-06)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1039797

相关文章

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

bytes.split的用法和注意事项

当然,我很乐意详细介绍 bytes.Split 的用法和注意事项。这个函数是 Go 标准库中 bytes 包的一个重要组成部分,用于分割字节切片。 基本用法 bytes.Split 的函数签名如下: func Split(s, sep []byte) [][]byte s 是要分割的字节切片sep 是用作分隔符的字节切片返回值是一个二维字节切片,包含分割后的结果 基本使用示例: pa

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create

PHP原理之内存管理中难懂的几个点

PHP的内存管理, 分为俩大部分, 第一部分是PHP自身的内存管理, 这部分主要的内容就是引用计数, 写时复制, 等等面向应用的层面的管理. 而第二部分就是今天我要介绍的, zend_alloc中描写的关于PHP自身的内存管理, 包括它是如何管理可用内存, 如何分配内存等. 另外, 为什么要写这个呢, 因为之前并没有任何资料来介绍PHP内存管理中使用的策略, 数据结构, 或者算法. 而在我们

php中json_decode()和json_encode()

1.json_decode() json_decode (PHP 5 >= 5.2.0, PECL json >= 1.2.0) json_decode — 对 JSON 格式的字符串进行编码 说明 mixed json_decode ( string $json [, bool $assoc ] ) 接受一个 JSON 格式的字符串并且把它转换为 PHP 变量 参数 json

如何将文件夹里的PHP代码放到一个文件里

find ./dir -name "*.php" -exec 'cat' {} \; > dir.out