PHP 誤讀支付寶介面可能引發的烏龍

2021-09-07 01:38:00 字數 2152 閱讀 6914

之所以發現這個坑,源起專案中的支付寶頁面跳轉同步通知頁return_url中的$verify_result始終返回false。

$alipaynotify = new alipaynotify($alipay_config); //

支付寶通知處理類

$verify_result = $alipaynotify->verifyreturn();

verifyreturn函式用於針對return_url驗證訊息是否是支付寶發出的合法訊息

其中生成簽名結果一項,$issign = $this->getsignveryfy($_get, $_get['sign']);返回true或false

getsignveryfy是獲取返回時的簽名驗證結果,該函式做以下三件事(呼叫的均為支付寶公用函式):

1. 除去待簽名引數陣列中的空值和簽名引數,parafilter

2. 對簽名引數陣列排序,argsort

3. 把陣列所有元素,按照『引數=引數值』的模式用「&」字元拼接成字串,createlinkstring

4. 如果是md5加密,使用md5verify驗證簽名,返回true或false

第1,2兩步都沒有問題,到第3步時,我們所期待的結果是這樣子的:

而列印後返回的結果是這樣的:

顯然,這裡轉換出了問題,下面來看一下createlinkstring函式的具體實現

/*

* * 把陣列所有元素,按照"引數=引數值"的模式用「&」字元拼接成字串

* @param $para 需要拼接的陣列

* return 拼接完成以後的字串 */

function createlinkstring($para

)

//去掉最後乙個&字元

$arg = substr($arg, 0, count($arg)-2);

//如果存在轉義字元,那麼去掉釋義

if(get_magic_quotes_gpc

())

return

$arg

;}

上面連線字串部分使用foreach實現都不影響$arg, substr使用rtrim實現也不影響$arg, get_agic_quotes_gpc在5.4以上才廢棄,但是裡面不存在轉義字元;再看上面列印的結果,很有可能是 「&」 符號出了問題,程式部分將 「&」 符改為 「&」 後終於得到了期望的結果。

$arg .= $key ."=".$val ."&";

$arg .= $key .'='.$val .'&';
非同步通知url和同步通知url中都不能有自定義引數,由於提交支付寶時的引數加密與跳轉商家頁面的驗證加密機制是一致的,所以一旦url中含有自定義引數,導致提交前與提交後不相等,$verify_result將返回false,即無法通過驗證;不通過這一步驗證,商戶的資料操作始終無法進行,如果就此忽略$verify_result必然存在安全問題。

對於mvc形式的動態url,需要去除提交時不需要的引數,保證乾淨,如:

unset($_get['controller']);

unset($_get['method']);

$alipaynotify = new alipaynotify($alipay_config);

$verify_result = $alipaynotify->verifyreturn();

if($verify_result) else {

//驗證失敗(除錯請看alipaynotify.php頁面的verifyreturn函式)

同步url的引數保證了乾淨,同樣別忘了提交時不要帶有,如:

unset($_get['controller']);

unset($_get['method']);

$this->load->library('alipaysubmit');

$alipay_config = $this->alipay_config;

$alipaysubmit = new alipaysubmit($alipay_config);

為什麼非同步notify_url會失效?

如果非同步notify_url位址是mvc形式,因為你的控制器和方法已經被支付寶過濾掉,那麼支付寶將找不到頁面,所以無法通知到這個指定的位址。

link:

@黑眼詩人 

支付寶介面

支付寶的介面呼叫很不方便,剛做好乙個封裝,實現了虛擬交易和實物交易。解決方案中有三個專案以及ndoc生成的文件,簡單的序列圖 commonalipay,封裝的支付寶介面。testali,asp.net的測試專案 testcommonalipay,nunit的測試專案。呼叫方法 1 引入commona...

支付寶介面

解決方案中有三個專案以及ndoc生成的文件,簡單的序列圖 commonalipay,封裝的支付寶介面。testali,asp.net的測試專案 testcommonalipay,nunit的測試專案。呼叫方法 1 引入commonalipay.dll 2 實現支付寶服務介面的方法呼叫方式 alipa...

支付寶介面

解決方案中有三個專案以及ndoc生成的文件,簡單的序列圖 commonalipay,封裝的支付寶介面。testali,asp.net的測試專案 testcommonalipay,nunit的測試專案。呼叫方法 1 引入commonalipay.dll 2 實現支付寶服務介面的方法呼叫方式 alipa...