0

まず、このクラスを書いてくれてありがとう。アプリケーションの構築がずっと楽になりました。

CIM をセットアップしましたが、ユーザーの追加や支払いの処理などに問題はありません。ただし、項目の追加で行き詰まっています。github の例では、XML リクエスト EX の作成に使用される配列の静的な入力を使用しています。

'lineItems' => array(
    'itemId' => 'ITEM00001',
    'name' => 'name of item sold',
    'description' => 'Description of item sold',
    'quantity' => '1',
    'unitPrice' => '6.95',
    'taxable' => 'true'
 ),
 'lineItems' => array(
     'itemId' => 'ITEM00002',
     'name' => 'other name of item sold',
     'description' => 'Description of other item sold',
     'quantity' => '1',
     'unitPrice' => '1.00',
     'taxable' => 'true'
 ),

これは、手動で作成している場合にうまく機能しますが、ユーザー入力に基づいてこれらの項目を動的に作成しています。残念ながら、キー ('lineItems') が上書きされて 1 つの項目になってしまうため、配列に複数の項目を追加することはできません。

lineItems の配列を作成してから、それをマージしようとしましたが、うまくいきませんでした。うまくいけば、これに対する簡単な修正が欠けているだけです。

4

3 に答える 3

1

ジョンさん、お返事ありがとうございます!繰り返しになりますが、このクラスでの素晴らしい仕事により、私の人生はずっと楽になりました.

簡単にするために私がやったことは次のとおりです。必要に応じてこれについて詳しく説明できると確信していますが、私にとってはこれで完璧に機能しました。配列の同じレベルで複数の項目を渡す代わりに、項目を独自の配列として作成し、その配列を反復処理するように setParamaters() を変更しました。

private function setParameters($xml, $array)
{
    if (is_array($array))
    {
        foreach ($array as $key => $value)
        {
            if (is_array($value))
            {
                if($key == 'lineItems'){
                    foreach($value as $lineitems){
                        $line_item = $xml->addChild('lineItems');
                        foreach($lineitems as $itemkey => $itemvalue) {
                            $line_item->addChild($itemkey, $itemvalue);
                        }
                    }
                }
                else
                {
                    $xml->addChild($key);
                    $this->setParameters($xml->$key, $value);
                }
            }
            else
            {
                $xml->$key = $value;
            }
        }
    }
}

これは私のニーズに完全に適合し、lineItems 配列をネストすることを除いて、フロントエンドで何も変更する必要がないようにしました。したがって、送信する配列は次のようになります。

["lineItems"]=>
  array(2) {
    [0]=>
    array(6) {
      ["itemId"]=>
      string(9) "ITEM00010"
      ["name"]=>
      string(21) "Blah Blah"
      ["description"]=>
      string(21) "Blah Blah Description"
      ["quantity"]=>
      string(1) "1"
      ["unitPrice"]=>
      string(4) "100"
      ["taxable"]=>
      string(5) "false"
    }
    [1]=>
    array(6) {
      ["itemId"]=>
      string(9) "ITEM00011"
      ["name"]=>
      string(25) "Thing Thing"
      ["description"]=>
      string(25) "Thing Thing Description"
      ["quantity"]=>
      string(1) "2"
      ["unitPrice"]=>
      string(3) "50"
      ["taxable"]=>
      string(5) "false"
    }
  }

また、ラインアイテムの配列を構築しようとしている人のために、私はこれを行いました:

foreach ($services as $key => $service){
    $line_items["lineItems"][] = array(
        'itemId'        => 'ITEM000'.$key,
        'name'          => $service->name,
        'description'   => $service->name,
        'quantity'      => $service_count[$key],
        'unitPrice'     => $service->price,
        'taxable'       => 'false'
    );
}

そして、AuthnetXML インスタンスに渡した transaction_array にそれを追加しました。

再度、感謝します!

ジョエル

于 2012-08-18T22:43:10.020 に答える
0

私はそのクラスの作者です。AuthnetXMLクラスには現在、表示された結果をもたらすバグがあります。これを回避するには、コアクラスに変更を加える必要があります。

まだレビューする機会がないソリューションを提供したユーザーからメールを受け取りました。彼らが私に与えたのと同じ情報をあなたに与えるでしょう、そしてうまくいけばそれはあなたを助けるでしょう:

The problem is that you can't have duplicate keys at the same level in an array. If you do the last one entered wins and the rest are overwritten.

So you need a way to represent repeating items from XML in and array. I decide to use the JSON methods to keep it simple. A quick wat to convert Simple XML to and array is to pass it through JSON.

$array = json_decode( json_encode( $simpleXML), true);

That will convert XML like this:

<transactionSettings>
  <setting>
    <settingName>allowPartialAuth</settingName>
    <settingValue>false</settingValue>
  </setting>
  <setting>
    <settingName>duplicateWindow</settingName>
    <settingValue>0</settingValue>
  </setting>
  <setting>
    <settingName>emailCustomer</settingName>
    <settingValue>false</settingValue>
  </setting>
  <setting>
    <settingName>recurringBilling</settingName>
    <settingValue>false</settingValue>
  </setting>
  <setting>
    <settingName>testRequest</settingName>
    <settingValue>false</settingValue>
  </setting>
</transactionSettings>


To an array like this:


array(
'transactionSettings' => array(  
  'setting' => array(
    0 => array('settingName' =>'allowPartialAuth' ,  'settingValue' => 'false',),
    1 => array('settingName' => 'duplicateWindow', 'settingValue' => '0', ),
    2 => array('settingName' => 'emailCustomer', 'settingValue' => 'false', ),
    3 => array('settingName' => 'recurringBilling', 'settingValue' => 'false',),
    4 => array( 'settingName' => 'testRequest', false, ),
  )
);


So you need to modify AuthNetXML.class to recognize this format. Just replace your setParameters() method with:


  private function setParameters($xml, $array)
  {
    if (is_array($array))
    {
      $first = true;

      foreach ($array as $key => $value)
      {
        if (is_array($value)) {

          if( is_numeric($key) )  {
            if($first){
              $xmlx = $xml;
              $first = false;
            } else {
              $parent = $xml->xpath('parent::*');
              $xmlx = $parent[0]->addChild($xml->getName());
            }

          } else {

            $xmlx = $xml->addChild($key);

          }

          $this->setParameters($xmlx, $value);
        }
        else
        {
          $xml->$key = $value;
        }
      }
    }
  }

更新2012-08-21

このバグは修正されました。サンプルコードが更新されました。

于 2012-08-18T16:28:08.890 に答える
0

編集:私はこの問題を解決しました。キーは次のlineItemsように渡す必要があります。

'lineItems' => array(
    'itemId'      => '13',
    'name'        => 'hello',
    'description' => 'hello description',
    'quantity'    => '1',
    'unitPrice'   => '55.00'
),

これは、 Authorize.net-XMLリポジトリで提供されているサンプルとは異なることに注意してください。私は今そこに向かい、修正を提出します。

元の質問: Authorize.net-XML クラスに関する同様の問題が発生しています。メソッドを実行するcreateCustomerProfileTransactionRequest()と、次のエラーが表示されます。

The element 'lineItems' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd' has 
invalid child element 'lineItem' in namespace 
'AnetApi/xml/v1/schema/AnetApiSchema.xsd'. 
List of possible elements expected: 'itemId' in namespace 
'AnetApi/xml/v1/schema/AnetApiSchema.xsd'.' (length=272)

ここで提供されているサンプル入力を貼り付けることさえしましたが、同じエラーが表示されますか? それ以外の場合、クラスは正常に機能しています。createTransactionRequest()およびメソッドを使用して、 createCustomerProfileRequest()AIM トランザクションを処理し、問題なく CIM プロファイルを作成します。

繰り返しますが、 GitHubにあるものと同じサンプル入力を使用しようとさえしています。

何か案は?

本当にありがとう!ジェイソン

于 2012-10-01T17:58:02.090 に答える