auth.netでトランザクションをキャプチャする私の機能は
public function capture(Varien_Object $payment, $amount){
if(!$this->isEnabled()){
return parent::capture($payment, $amount);
}else{
$captureCase = $_POST['invoice']['capture_case'];
if(isset($captureCase) && $captureCase == "online"){
if($capOrderid = $payment->getOrder()->getIncrementId()){
$capOrder = $payment->getOrder();
$capPayment = $payment;
$capAmount = $amount;
$capTransID = $capPayment->getLastTransId();
$ccProfile = $this->getProfileForOrder($capOrderid);
if(isset($ccProfile['used_this_profile']) && $ccProfile['used_this_profile'] == 1){
$pID = $ccProfile['cust_profile_id'];
$ppID = $ccProfile['cust_paymentprofile_id'];
$nick = $ccProfile['nickname'];
$lastOrderId = $capOrder->getIncrementId();
$cvv = $payment->getCcCid();
$directResponseFields = $this->createTransaction($pID,$ppID,$capAmount,$lastOrderId,"profileTransPriorAuthCapture",$cvv,$capTransID);
$responseCode = $directResponseFields[0]; // 1 = Approved 2 = Declined 3 = Error
$responseReasonCode = $directResponseFields[2]; // See http://www.authorize.net/support/AIM_guide.pdf
$responseReasonText = $directResponseFields[3];
$approvalCode = $directResponseFields[4]; // Authorization code
$transId = $directResponseFields[6];
switch ($responseCode) {
case "1":
$capPayment->setStatus(self::STATUS_APPROVED);
$capPayment->setCcTransId($transId);
$capPayment->setLastTransId($transId);
if (!$capPayment->getParentTransactionId() || $transId != $capPayment->getParentTransactionId()) {
$capPayment->setTransactionId($transId);
}
return true;
break;
case "2":
Mage::throwException(__('Payment authorization transaction has been declined.'));
break;
default:
Mage::throwException(__('Payment authorization error.'));
break;
}
}
}
}elseif(!isset($captureCase)){
$oldorderid = Mage::getModel('adminhtml/sales_order_create')->getSession()->getOrder()->getIncrementId();
if(isset($oldorderid) && ($oldorderid != $payment->getOrder()->getIncrementId())){ // if order is created from admin and has an order to refund first.
$oldOrder = Mage::getModel('sales/order')->loadByIncrementId($oldorderid);
$oldPayment = $oldOrder->getPayment();
$oldAmount = $oldPayment->getAmountOrdered();
$transID = $oldPayment->getLastTransId();
$ccProfile = $this->getProfileForOrder($oldorderid);
if(isset($ccProfile['used_this_profile']) && $ccProfile['used_this_profile'] == 1){
$pID = $ccProfile['cust_profile_id'];
$ppID = $ccProfile['cust_paymentprofile_id'];
if($directResponseFields = $this->refundCIM($pID,$ppID,$transID,$oldorderid,$oldAmount)){
$responseCode = $directResponseFields[0]; // 1 = Approved 2 = Declined 3 = Error
$responseReasonCode = $directResponseFields[2]; // See http://www.authorize.net/support/AIM_guide.pdf
$responseReasonText = $directResponseFields[3];
$approvalCode = $directResponseFields[4]; // Authorization code
$transId = $directResponseFields[6];
switch ($responseCode) {
case "1":
//$oldPayment->setStatus(self::STATUS_SUCCESS);
$oldOrder->cancel()->save();
//$oldPayment->setIsTransactionClosed(1);
$oldOrder->setState(Mage_Sales_Model_Order::STATE_CANCELED, true)->save();
//$oldOrder->setState(Mage_Sales_Model_Order::STATE_CLOSED, true)->save();
//Mage::throwException(__("a".$responseCode));
//return $this;
break;
case "4":
Mage::throwException(__('Error Code 4. You cannot refund an unsettled transaction.'));
break;
default:
if(isset($responseReasonText) && !empty($responseReasonText)){
Mage::throwException(__("Code: ".$responseReasonCode." - ".$responseReasonText));
}else{
Mage::throwException(__('Error in refunding the payment. This can happen if the customer has deleted their profile from CIM.'));
}
break;
}
}
}else if(isset($transID) && $oldAmount > 0) {
$oldPayment->setAnetTransType(self::REQUEST_TYPE_CREDIT);
$oldRequest = $this->_buildRequest($oldPayment);
$oldRequest->setXTransId($transID);
$oldPayment->setXAmount($oldAmount,2);
$oldRequest->setXCurrencyCode($oldOrder->getBaseCurrencyCode());
$oldRequest->setXCardNum($oldPayment->getCcLast4());
$oldResult = $this->_postRequest($oldRequest);
if ($oldResult->getResponseCode()==self::RESPONSE_CODE_APPROVED) {
$oldPayment->setStatus(self::STATUS_SUCCESS);
$oldOrder->cancel()->save();
}else{
Mage::throwException($this->_wrapGatewayError($oldResult->getResponseReasonText())); //////////error here/////////
}
}else{
Mage::throwException(Mage::helper('authnet')->__('Error in refunding the payment.'));
}
}
}
$quote = Mage::getSingleton('customer/session');
$nickname = $quote->getAuthorizenetNickname();
$profile = $quote->getProfile();
$postedNickname = $quote->getNickname();
if(!isset($nickname) || $nickname == "" || $nickname == "nnnew"){
if ($amount <= 0) {
Mage::throwException(Mage::helper('authnet')->__('Invalid amount for authorization.'));
}
if ($payment->getCcTransId()) {
$payment->setAnetTransType(self::REQUEST_TYPE_PRIOR_AUTH_CAPTURE);
} else {
$payment->setAnetTransType(self::REQUEST_TYPE_AUTH_CAPTURE);
}
$payment->setAmount($amount);
$request= $this->_buildRequest($payment);
$result = $this->_postRequest($request);
if ($result->getResponseCode() == self::RESPONSE_CODE_APPROVED) {
$payment->setStatus(self::STATUS_APPROVED);
$payment->setCcTransId($result->getTransactionId());
$payment->setLastTransId($result->getTransactionId());
if (!$payment->getParentTransactionId() || $result->getTransactionId() != $payment->getParentTransactionId()) {
$payment->setTransactionId($result->getTransactionId());
}
if(isset($profile) && $profile == "save"){
$order = $payment->getOrder();
$billing = $order->getBillingAddress();
$ccno = $payment->getCcNumber();
$exp = sprintf('%04d-%02d', $payment->getCcExpYear(), $payment->getCcExpMonth());
$cvv = $payment->getCcCid();
$email = $order->getCustomerEmail();
$orderId = $order->getIncrementId();
if($profiles = $this->getCustId($email)){
foreach ($profiles as $_nickname => $cust_profile_id){
if($_nickname == $postedNickname){
Mage::throwException(__('Nickname already in use.'));
}
}
$profileId = $cust_profile_id;
}else{
$profileId = $this->createProfile($payment,true);
}
if($profileId && $profileId != 1){
$ppId = $this->createPaymentProfile($billing,$profileId,$ccno,$exp,$postedNickname,$email,$cvv,true);
$this->assignNicknameToOrder($orderId,$profileId,$ppId,$postedNickname,0);
}
}
return $this;
}
if ($result->getResponseReasonText()) {
Mage::throwException($this->_wrapGatewayError($result->getResponseReasonText()));
}
Mage::throwException(Mage::helper('paygate')->__('Error in capturing the payment.'));
}else if($nickname != "" && $nickname != "nnnew"){
$selectedNickname = $nickname;
$conn_selected = $this->conn();
$results_selected = $conn_selected->query("SELECT * FROM ".$this->getTable()." WHERE cust_paymentprofile_id = '".$selectedNickname."'");
while ($row = $results_selected->fetch() ) {
$pID = $row['cust_profile_id'];
$nick = $row['nickname'];
}
$ppID = $selectedNickname;
$order = $payment->getOrder();
$lastOrderId = $order->getIncrementId();
$cvv = $payment->getCcCid();
$directResponseFields = $this->createTransaction($pID,$ppID,$amount,$lastOrderId,"profileTransAuthCapture",$cvv);
$responseCode = $directResponseFields[0]; // 1 = Approved 2 = Declined 3 = Error
$responseReasonCode = $directResponseFields[2]; // See http://www.authorize.net/support/AIM_guide.pdf
$responseReasonText = $directResponseFields[3];
$approvalCode = $directResponseFields[4]; // Authorization code
$transId = $directResponseFields[6];
switch ($responseCode) {
case "1":
$payment->setStatus(self::STATUS_APPROVED);
//$payment->setCcTransId($result->getTransactionId());
$payment->setLastTransId($transId);
if (!$payment->getParentTransactionId() || $transId != $payment->getParentTransactionId()) {
$payment->setTransactionId($transId);
}
$this->assignNicknameToOrder($lastOrderId,$pID,$ppID,$nick,1);
return true;
break;
case "2":
Mage::throwException(__('Payment authorization transaction has been declined.'));
break;
default:
Mage::throwException(__('Payment authorization error.'));
break;
}
}
Mage::throwException(Mage::helper('paygate')->__('Error in capturing the payment.'));
}
}
この問題は、すでに承認されている金額をキャプチャしようとするとランダムに発生します..私のトランザクションリクエストのダンプは
[request] => Array
(
[x_version] => 3.1
[x_delim_data] => True
[x_relay_response] => False
[x_test_request] => FALSE
[x_login] => ****
[x_tran_key] => ****
[x_type] => PRIOR_AUTH_CAPTURE
[x_method] => CC
[x_invoice_num] => dummy
[x_amount] => 127.48
[x_currency_code] => USD
[x_trans_id] =>
[x_first_name] => dummy
[x_last_name] => dummyl
[x_company] =>
[x_address] => dummy Apt 67
[x_city] => dummy
[x_state] => California
[x_zip] => dummy
[x_country] => US
[x_phone] => dummy
[x_fax] =>
[x_cust_id] =>
[x_customer_ip] => 68.183xxxxx8
[x_customer_tax_id] =>
[x_email] => abc@aol.com
[x_email_customer] => 0
[x_merchant_email] =>
[x_ship_to_first_name] =>dummy
[x_ship_to_last_name] => dummy
[x_ship_to_company] =>
[x_ship_to_address] => dummy Blvd.
[x_ship_to_city] => dummy
[x_ship_to_state] => dummy
[x_ship_to_zip] => dummy
[x_ship_to_country] => US
[x_po_num] =>
[x_tax] => 0.0000
[x_freight] => 0.0000
)
そして応答は
[result] => Array
(
[response_code] => 3
[response_subcode] => 2
[response_reason_code] => 33
[response_reason_text] => A valid referenced transaction ID is required.
[approval_code] =>
[avs_result_code] => P
[transaction_id] => 0
[invoice_number] => 100dddd38
[description] =>
[amount] => 127.48
[method] => CC
[transaction_type] => prior_auth_capture
[customer_id] =>
[md5_hash] => dummy
[card_code_response_code] =>
[c_av_vresponse_code] =>
[split_tender_id] =>
[acc_number] =>
[card_type] =>
[requested_amount] =>
[balance_on_card] =>
)
私Transaction ID
のリクエストでは、Auth.net開発者サイトは同じことを言っています..注文がキャプチャされることもありますが、ほとんどの場合、そうではありません..また、成功したキャプチャと失敗したキャプチャの両方、トランザクションIDが存在することにも注意しましたMagentoで(管理パネルで表示できます。これを参照してください
mag admin を使用して請求書を作成し、トランザクションをキャプチャしようとすると、エラーが発生します
ゲートウェイ エラー: 有効な参照トランザクション ID が必要です。
なぜこのようなことが起こっているのか疑問に思っています..誰か助けてくれませんか? 何か案が?
私のプレート フォームは Magento Enterprisepise (1.12.x) で、機能させようとしている拡張機能は Elayers です (購入したのではなく、誰かのために働いています)。