5

私は magento API を使用していますが、注文の作成で少し問題が発生しました。正しく機能するように注文を作成するまで、すべてを行うことができました。私が見ている問題は、メソッドを呼び出して注文を作成すると、常に例外が発生することです。Credit card number mismatch with credit card type.

私はMagento版を実行しています。1.6.2.0

テストしているカードが magento フロントエンド経由で動作することを確認しました。

これに関するヘルプは大歓迎です。

これは私が使用しているテストコードです:

<?php
$proxy = new SoapClient('http://localhost/index.php/api/soap/?wsdl');
$sessionId = $proxy->login('shopapi', 'test123');

// Create a quote, get quote identifier
$shoppingCartId = $proxy->call( $sessionId, 'cart.create');

// Set customer, for example guest
$customerAsGuest = array(
    "firstname" => "testFirstname",
    "lastname" => "testLastName",
    "email" => "test@test.com",
    //"website_id" => "0",
    //"store_id" => "0",
    "mode" => "guest"
);
$resultCustomerSet = $proxy->call($sessionId, 'cart_customer.set', array( $shoppingCartId, $customerAsGuest) );

// Set customer addresses, for example guest's addresses
$arrAddresses = array(
    array(
        "mode" => "shipping",
        "firstname" => "testFirstname",
        "lastname" => "testLastname",
        "company" => "testCompany",
        "street" => "testStreet",
        "city" => "testCity",
        "region" => "CA",
        "postcode" => "90049",
        "country_id" => "US",
        "telephone" => "0123456789",
        "fax" => "0123456789",
        "is_default_shipping" => 0,
        "is_default_billing" => 0
    ),
    array(
        "mode" => "billing",
        "firstname" => "testFirstname",
        "lastname" => "testLastname",
        "company" => "testCompany",
        "street" => "testStreet",
        "city" => "testCity",
        "region" => "CA",
        "postcode" => "90049",
        "country_id" => "US",
        "telephone" => "0123456789",
        "fax" => "0123456789",
        "is_default_shipping" => 0,
        "is_default_billing" => 0
    )
);
$resultCustomerAddresses = $proxy->call($sessionId, "cart_customer.addresses", array($shoppingCartId, $arrAddresses));

// add products into shopping cart
$arrProducts = array(
    array(
        "product_id" => "1",
        "qty" => 1
    )
);
$resultCartProductAdd = $proxy->call($sessionId, "cart_product.add", array($shoppingCartId, $arrProducts));


// get list of products
$shoppingCartProducts = $proxy->call($sessionId, "cart_product.list", array($shoppingCartId));


// set payment method
$paymentMethod = array(
    "method" => "authorizenet",
    "cc_type" => 'MC',
    "cc_number" =>'5555555555554444' ,
    "cc_exp_month" => 9,
    "cc_exp_year" => 2014,
    "cc_cid" => 123     
);
$resultPaymentMethod = $proxy->call($sessionId, "cart_payment.method", array($shoppingCartId, $paymentMethod));


// create order
$resultOrderCreation = $proxy->call($sessionId,"cart.order",array($shoppingCartId));
var_dump($resultOrderCreation);
 ?>
4

5 に答える 5

8

あなたの投稿によると、cart_payment.methodの呼び出しは成功しているので、期待どおり、CC番号はMCカードであることを確認しています。

問題は、PCIの懸念により、MagentoがCC番号をデータベースに保存しないことです(ほとんどの場合)。

したがって、あるリクエストで支払いの詳細とCC番号とCIDを送信し、別のリクエストで注文を作成すると、状態が失われ、CC番号とCIDが空白になります。

注文が作成されると、支払いデータが2回検証されます。その場合、MCタイプの空のCC番号があり、表示される障害が発生します。

残念ながら、cart.orderに支払いデータを回避策として受け入れさせる方法がわかりません。

1回の呼び出しで両方の手順を実行し、問題を解決する可能性が高い新しいメソッドを使用して、チェックアウトAPIを拡張するモジュールを作成できます。

于 2012-05-23T08:34:50.217 に答える
2

私もこの問題に遭遇しました。私の解決策は、複数の API 呼び出しを行わずに、すべての注文作成と送信ロジックを一度に処理するカスタム SOAP エンドポイントを作成することでした。

この方法でも、カード タイプの不一致の例外が発生していました。

トリックは、getPayment->importData メソッドを使用して支払い情報を設定し、合計を収集し、見積もりを保存すると、カード情報を忘れてしまったようです。おそらく(処理するための最良の方法ではありません)PCI-DSS準拠のためです。

それを解決するために、見積もりを保存した後、注文を送信する前に別の getPayment->importData 行を追加しました。

これは、コア ファイルを変更せずに実現されます。

例を参照してください:

public function customCheckout($checkoutData=false)
  {
    if(!$checkoutData){
      Mage::throwException("No checkout data received.");
    }
    if(!json_decode($checkoutData)){
      Mage::throwException("Bad checkout data received.");
    }

    $data = json_decode($checkoutData);

    $email = 'email@email.cc';

    // get the basic store info to associate with order
    $websiteId  = Mage::app()->getWebsite()->getId();
    $store      = Mage::app()->getStore();

    // begin checkout with a quote
    $quote    = Mage::getModel('sales/quote')->setStoreId($store->getId());

    // set customer by email
    $customer = Mage::getModel('customer/customer')
                  ->setWebsiteId($websiteId)
                  ->loadByEmail($email);

    // handle customer not exists by creating a new customer
    if($customer->getId() == ''){
      $customer = Mage::getModel('customer/customer');
      $customer->setWebsiteId($websiteId)
               ->setStore($store)
               ->setFirstName("Bob")
               ->setLastName("Loblaw")
               ->setEmail($email)
               ->setPassword('password');
      $customer->save();
    }

    // assign customer to SO quote
    $quote->assignCustomer($customer);

    // do we want to send a confirmation email to the customer?
    // my guess is we would handle that in a separate service.
    $quote->setSendConfirmation(0);

    // add products to quote
    foreach($data->products as $item){
      $product = Mage::getModel('catalog/product')->load($item->id);
      $quote->addProduct($product,new Varien_Object(array('qty'=>$item->qty)));
    }

    // set SO billing address
    $billingAddress = $quote->getBillingAddress()->addData(array(
      'customer_address_id' => '',
      'prefix' => '',
      'firstname' => $data->customer->firstName,
      'middlename' => '',
      'lastname' => $data->customer->lastName,
      'suffix' => '',
      'company' => '',
      'street' => array(
        '0' => 'street1',
        '1' => 'street2'
      ),
      'city'=>'city',
      'country_id'=>'US',
      'region'=>'WA',
      'postcode'=>'98101',
      'telephone' => '425-425-4254',
      'fax' => '789-789-7897',
      'vat_id' => '',
      'save_in_address_book' => 0
    ));

    // set SO shipping address, this will probably be the location of sale, on-site
    $shippingAddress = $quote->getShippingAddress()->addData(array(
      'customer_address_id' => '',
      'prefix' => '',
      'firstname' => $data->customer->firstName,
      'middlename' => 'middle',
      'lastname' => $data->customer->lastName,
      'suffix' => '',
      'company' => '',
      'street' => array(
        '0' => 'street1',
        '1' => 'street2'
      ),
      'city'=>'city',
      'country_id'=>'US',
      'region'=>'WA',
      'postcode'=>'98201',
      'telephone' => '425-425-4254',
      'fax' => '789-789-7897',
      'vat_id' => '',
      'save_in_address_book' => 0
    ));

    // set shipping method, if it's sold on site we aren't charging for delivery
    $shipMethod='freeshipping_freeshipping';

    $shippingAddress->setCollectShippingRates(true)
                    ->collectShippingRates()
                    ->setShippingMethod($shipMethod)
                    ->setPaymentMethod($data->payment->method);

    // set payment method
    $quote->getPayment()->importData(array(
      'method'      =>$data->payment->method,
      'cc_type'     =>$data->payment->type,
      'cc_number'   =>$data->payment->number,
      'cc_exp_year' =>$data->payment->expYear,
      'cc_exp_month'=>$data->payment->expMonth,
    ));

    // collect totals, save quote
    $quote->collectTotals()->save();

    // turn the quote into an order
    $service = Mage::getModel('sales/service_quote',$quote);

    // set payment method A SECOND TIME!!!!!!!!!!!!!
    $quote->getPayment()->importData(array(
      'method'      =>$data->payment->method,
      'cc_type'     =>$data->payment->type,
      'cc_number'   =>$data->payment->number,
      'cc_exp_year' =>$data->payment->expYear,
      'cc_exp_month'=>$data->payment->expMonth,
    ));

    $service->submitAll();
    $increment_id = $service->getOrder()->getRealOrderId();

    $quote = $customer = $service = null;

    $retval = new stdClass;
    $retval->orderId = $increment_id;

    return json_encode($retval);
  }
于 2017-01-31T01:19:12.003 に答える
1

実際、API を介して authorize.net の支払いを受ける方法を発見しました。

最初に /app/code/core/Mage/Payment/Model/Method/Cc.php で、cid の保存に関する行のコメントを外します。関数は 65 行目で次のようになります。

public function prepareSave()
{
    $info = $this->getInfoInstance();
    if ($this->_canSaveCc) {
        $info->setCcNumberEnc($info->encrypt($info->getCcNumber()));
    }
    $info->setCcCidEnc($info->encrypt($info->getCcCid()));
    $info->setCcNumber(null)
        ->setCcCid(null);
    return $this;
}

次に、支払い方法のメイン モデル ファイルで、変数が次のように設定されていることを確認します。

    protected $_canSaveCc = true;

これを使用して 2 つの支払い方法をテストしましたが、どちらも API 経由で正常に動作します。

于 2013-03-26T03:35:32.040 に答える
1

支払い方法コードに対して API トランザクションを成功させたことは一度もありませんauthorizenet。これは常にフロントエンド経由でのみ成功しますが、理由はわかりません..また、理由を調査する時間もありませんでした. 代わりに私が常に行ってきたことは、代わりにauthorizenet_direct投稿を使用することですが。これの背後にある私の推論/私がこれに出くわした方法は、同じことがPaypalの支払い方法にも当てはまるということです. API はpaypal_directまたはでのみ動作するようpaypaluk_directです。それを試してみてください!それはうまくいくはずです。少なくとも、これは私にとってはうまくいきます。

$paymentMethod = array(
    "method" => "authorizenet_directpost",
    "cc_type" => 'MC',
    "cc_number" =>'5555555555554444' ,
    "cc_exp_month" => 9,
    "cc_exp_year" => 2014,
    "cc_cid" => 123     
);
于 2012-05-19T14:19:36.767 に答える