我正在使用Authorize.net的客户信息管理器API(CIM)。我的测试用例以用户在结账时给出错误的地址为中心。
每次用户提交表单时,我的应用程序都会尝试创建客户个人资料:
$txrq = new AuthorizeNetCIM;
$txrsp = $txrq->createCustomerProfileTransaction("AuthCapture", $transaction, 'x_duplicate_window=0');
我已尝试将上面提到的x_duplicate_window
设置为“额外选项”,在SDK中,它是请求的以下部分:
<extraOptions><![CDATA[' . $this->_extraOptions . ']]></extraOptions>
无论我为x_duplicate_window使用什么值,authorize.net都会一直返回错误,直到默认时间过去为止。
AuthorizeNet Error: Response Code: 3 Response Subcode: 1 Response Reason Code: 11 Response Reason Text: A duplicate transaction has been submitted.
我担心,如果我们(潜在的)用户之一尝试提交错误的地址,意识到他或她的错误,那么在事务超时发生时会再遇到3分钟的错误。
答案 0 :(得分:9)
Authorize.net SDK代码中存在错误:
〜CIM.php's method _setPostString()
if ($this->_extraOptions) {
$this->_xml->addChild("extraOptions");
$this->_post_string = str_replace("<extraOptions></extraOptions>",'<extraOptions><![CDATA[' . $this->_extraOptions . ']]></extraOptions>', $this->_xml->asXML());
$this->_extraOptions = false;
}
$this->_xml->addChild("extraOptions");
会导致节点与str_replace调用不匹配:<extraOptions/>
修改str_replace将解决这个问题,这将很好地传递 x_duplicate_window 参数:
if ($this->_extraOptions) {
$this->_xml->addChild("extraOptions");
$this->_post_string = str_replace("<extraOptions/>",'<extraOptions><![CDATA[' . $this->_extraOptions . ']]></extraOptions>', $this->_xml->asXML());
$this->_extraOptions = false;
}