Sage Pay / Opayo 表单集成 - PHP 8.1 - PHP 致命错误:未捕获错误:尝试在 null 上分配属性'start”
P粉872182023
P粉872182023 2023-09-07 22:16:21
0
1
496

我很高兴有类似的问题,但我无法获得任何与我的(继承的)代码一起使用的解决方案,因此将不胜感激您可以提供的任何帮助。

我们通过表单集成使用 Sage Pay / Opayo 支付网关。 完成/失败后,客户将被重定向到我们网站上带有加密 _GET 字符串的 URL。 解密后,调用 getToken 函数 ($values = getToken($Decoded);) 从数组中获取值。

不过,并非所有标记都始终被填充,我怀疑这些空值可能是问题的根源。

该代码在 PHP 7.1 上运行良好,但在 PHP 8.1 上会抛出异常:

[2023 年 5 月 3 日 15:12:15 欧洲/伦敦] PHP 致命错误:未捕获错误:尝试在 /home/sitename/public_html/ch_functions.php:166 中的 null 上分配属性“start” 堆栈跟踪: #0 /home/sitename/public_html/not_completed.php(32): getToken('VendorTxCode=AP...') #1 {主要} 抛出在 /home/sitename/public_html/ch_functions.php 第 166 行

代码是,在$resultArray[$i]->start = $start;上失败的是:

function getToken($thisString) { // List the possible tokens $Tokens = array("Status","StatusDetail","VendorTxCode","VPSTxId","TxAuthNo","Amount","AVSCV2","AddressResult","PostCodeResult","CV2Result","GiftAid","3DSecureStatus","CAVV", "AddressStatus", "PayerStatus", "CardType", "Last4Digits","BankAuthCode","DeclineCode"); // Initialise arrays $output = array(); $resultArray = array(); // Get the next token in the sequence for ($i = count($Tokens)-1; $i >= 0 ; $i--){ // Find the position in the string $start = strpos($thisString, $Tokens[$i]); // If it's present if ($start !== false){ // Record position and token name $resultArray[$i]->start = $start; $resultArray[$i]->token = $Tokens[$i]; } } // Sort in order of position sort($resultArray); // Go through the result array, getting the token values for ($i = 0; $istart + strlen($resultArray[$i]->token) + 1; // Get the length of the value if ($i==(count($resultArray)-1)) { $output[$resultArray[$i]->token] = substr($thisString, $valueStart); } else { $valueLength = $resultArray[$i+1]->start - $resultArray[$i]->start - strlen($resultArray[$i]->token) - 2; $output[$resultArray[$i]->token] = substr($thisString, $valueStart, $valueLength); } } // Return the ouput array return $output; }

P粉872182023
P粉872182023

全部回复 (1)
P粉111927962

您将$resultArray[$i]作为对象引用,但该数组为空,因此没有可供引用的对象。在PHP 7.4 及更早版本中,您可以执行以下操作:

$x = []; $x[0]->foo = 1;

PHP 会在$x[0]处动态创建一个stdClass对象,然后动态创建 foo 属性,但会发出警告:

您当前正在抑制或忽略此警告。在 PHP 8.0 中,这现在会生成致命错误。因此,只需在尝试设置其值之前创建一个空对象即可:

if ($start !== false) { $resultArray[$i] = new stdClass(); $resultArray[$i]->start = $start; $resultArray[$i]->token = $Tokens[$i]; }

或者:

if ($start !== false) { $resultArray[$i] = (object) [ 'start' => $start, 'token' => $Tokens[$i], ]; }
    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!