Reply
Highlighted
Contributor
Posts: 19
Registered: ‎07-11-2013
Accepted Solution

The element 'subscription' has invalid child element 'customer'

Error E00003 The element 'subscription' in namespace 'AnetApi/sml/v1/schema/AnetApiSchema.xsd' has invalid child element 'cusotmer' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'. List of possible elements expected: 'shipTo', profile' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'.

 

Getting this error when trying to add an ARB subscription. We're not using profiles, but according to the API docs, "customer" should be a valid sub element of "subscription".

 

https://developer.authorize.net/api/reference/#recurring-billing-create-a-subscription

 

Full code:

<?php
  ...
  public function create_subscription($transaction) {
    global $custom_options;

    if(isset($transaction) and $transaction instanceof Transaction) {
      $usr = $transaction->user();
      $prd = $transaction->product();
      $sub = $transaction->subscription();
    }
    else {
      throw new CustomGatewayException( 'Payment was unsuccessful, please check your payment details and try again.' );
    }

    $invoice = $this->create_new_order_invoice($sub);

    // Default to 9999 for infinite occurrences
    $total_occurrences = $sub->limit_cycles ? $sub->limit_cycles_num : 9999;

    $args = array( "refId" => $invoice,
                   "subscription" => array(
                     "name" => $prd->post_title,
                     "paymentSchedule" => array(
                       "interval" => $this->arb_subscription_interval($sub),
                       "startDate" => Utils::get_date_from_ts((time() + (($sub->trial)?Utils::days($sub->trial_days):0)), 'Y-m-d'),
                       "totalOccurrences" => $total_occurrences,
                     ),
                     "amount" => Utils::format_float($sub->total),
                     "payment" => array(
                       "creditCard" => array(
                         "cardNumber" => sanitize_text_field($_POST['custom_cc_num']),
                         "expirationDate" => sanitize_text_field($_POST['custom_cc_exp_month']) . '-' . sanitize_text_field($_POST['custom_cc_exp_year']),
                         "cardCode" => sanitize_text_field($_POST['custom_cvv_code'])
                       )
                     ),
                     "order" => array(
                       "invoiceNumber" => $invoice,
                       "description" => $prd->post_title
                     ),
                     "billTo" => array(
                       "firstName" => $usr->first_name,
                       "lastName" => $usr->last_name
                     ),
                     "customer" => array(
                       "email" => $usr->user_email
                     )
                   )
                 );

    if($custom_options->show_address_fields && $custom_options->require_address_fields) {
      $args['subscription']['billTo'] =
        array_merge($args['subscription']['billTo'],
                    array("address" => str_replace('&', '&amp;', get_user_meta($usr->ID, 'custom-address-one', true)),
                          "city"    => get_user_meta($usr->ID, 'custom-address-city', true),
                          "state"   => get_user_meta($usr->ID, 'custom-address-state', true),
                          "zip"     => get_user_meta($usr->ID, 'custom-address-zip', true),
                          "country" => get_user_meta($usr->ID, 'custom-address-country', true)));
    }

    $res = $this->send_arb_request('ARBCreateSubscriptionRequest', $args);
    ...
  
  protected function send_arb_request($method, $args, $http_method = 'post') {
    $args = array_merge(
      array(
        "merchantAuthentication" => array(
          "name" => $this->settings->login_name,
          "transactionKey" => $this->settings->transaction_key
        )
      ),
      $args
    );

    $content = $this->arb_array_to_xml($method, $args);

    $remote_array = array('method' => strtoupper($http_method),
                          'timeout' => 30,
                          'redirection' => 5,
                          'httpversion' => '1.0',
                          'blocking' => true,
                          'headers' => array('content-type' => 'application/xml'),
                          'body' => $content,
                          'cookies' => array());

    $response = wp_remote_post('https://api2.authorize.net/xml/v1/request.api', $remote_array);
    ...

Is the (https://api2.authorize.net/xml/v1/request.api) endpoint the problem?

 

Thanks for any help!


Accepted Solutions
Solution
Accepted by topic author cartpauj
‎09-03-2019 04:31 PM
All Star
Posts: 685
Registered: ‎11-05-2018

Re: The element 'subscription' has invalid child element 'customer'

@cartpauj 

 

So you are creating XML with that. In your code below, I think it is the customer and billTo properties being out of order.  

 

 

 $args = array( "refId" => $invoice,
                   "subscription" => array(
                     "name" => $prd->post_title,
                     "paymentSchedule" => array(
                       "interval" => $this->arb_subscription_interval($sub),
                       "startDate" => Utils::get_date_from_ts((time() + (($sub->trial)?Utils::days($sub->trial_days):0)), 'Y-m-d'),
                       "totalOccurrences" => $total_occurrences,
                     ),
                     "amount" => Utils::format_float($sub->total),
                     "payment" => array(
                       "creditCard" => array(
                         "cardNumber" => sanitize_text_field($_POST['custom_cc_num']),
                         "expirationDate" => sanitize_text_field($_POST['custom_cc_exp_month']) . '-' . sanitize_text_field($_POST['custom_cc_exp_year']),
                         "cardCode" => sanitize_text_field($_POST['custom_cvv_code'])
                       )
                     ),
                     "order" => array(
                       "invoiceNumber" => $invoice,
                       "description" => $prd->post_title
                     ),
                     "billTo" => array(
                       "firstName" => $usr->first_name,
                       "lastName" => $usr->last_name
                     ),
                     "customer" => array(
                       "email" => $usr->user_email
                     )
                   )
                 );

 

 you are getting this error:

 

 error E00003 The element 'subscription' in namespace 'AnetApi/sml/v1/schema/AnetApiSchema.xsd' has invalid child element 'customer' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'. List of possible elements expected: 'shipTo', profile' in namespace 'AnetApi/xml/v1/schema/AnetApiSchema.xsd'.

 

Because the next child element following billTo is shipTo, but your request gives customer. Put customer after order and billTo after customer and it should work. 

View solution in original post


All Replies
Contributor
Posts: 19
Registered: ‎07-11-2013

Re: The element 'subscription' has invalid child element 'customer'

@Renaissance any ideas? I've tried different endpoints, but I can't seem to get around the Email required error. I disabled email as required in the Form Fields, but the processor must be requiring the email. So we have to provide the email.

All Star
Posts: 685
Registered: ‎11-05-2018

Re: The element 'subscription' has invalid child element 'customer'

@cartpauj 

 

The customer object is a direct property of the TransactionRequestType.  Try that and it should work. 

Contributor
Posts: 19
Registered: ‎07-11-2013

Re: The element 'subscription' has invalid child element 'customer'

@Renaissance 

 

We're trying to create a subscription with ARB when we get the error.

All Star
Posts: 685
Registered: ‎11-05-2018

Re: The element 'subscription' has invalid child element 'customer'

@cartpauj

I do not use ARB and was thinking that subscription was under a transaction request. I am not sure about your endpoint. I would have to look it up. I would say if you’re getting a response you are fine. I’m leaving breakfast now and will be busy all day, but I’ll look at your code again tomorrow morning or maybe later tonight. You should be able to pass the customer.
Regular Contributor
Posts: 60
Registered: ‎05-29-2015

Re: The element 'subscription' has invalid child element 'customer'

[ Edited ]

The error message has "cusotmer" where your code says "customer"?

 

customer is a child of subscription.

All Star
Posts: 685
Registered: ‎11-05-2018

Re: The element 'subscription' has invalid child element 'customer'

@kabutotx

Good catch.
Member
Posts: 2
Registered: ‎09-01-2019

Re: The element 'subscription' has invalid child element 'customer'

Sometimes simple spelling mistakes can generate this kind of errors. Recently this literally happened with me and It took more than 2 hours to solve that problem.

Contributor
Posts: 19
Registered: ‎07-11-2013

Re: The element 'subscription' has invalid child element 'customer'

I had to type the error manually as it was given to me in a screenshot. I made a typo there. The code is correctly using "customer" and the error message is correctly reflecting "customer" as well. Just a typo in the OP is all. Screenshot: http://cspf.co/fb4c81da8add

 

All Star
Posts: 685
Registered: ‎11-05-2018

Re: The element 'subscription' has invalid child element 'customer'

@cartpauj 

 

Where are you creating the customer object in this request?