♨ 背景
- 這兩天在做 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實現)