We have a membership that is 2 weeks (14 days) free, then ~$35/month afterwards.
So the ARB subscription is created with a start date 2 weeks into the future.
[refId] => 9419EF760A2922539392 [subscription] => Array ( [name] => Membership with free trial [paymentSchedule] => Array ( [interval] => Array ( [length] => 1 [unit] => months ) [startDate] => 2019-04-05 [totalOccurrences] => 9999 ) [amount] => 35.00 [payment] => Array ( [creditCard] => Array ( [cardNumber] => 4111111111111111 [expirationDate] => 12-2019 [cardCode] => 123 ) ) [order] => Array ( [invoiceNumber] => 9419EF760A2922539392 [description] => Membership with free trial ) [billTo] => Array ( [firstName] => Test [lastName] => Person ) )
When the Webhook is recieved and we poll for the transaction data, the response has NO `subscription` data with it like we would expect.
Here's a sample of the data we're getting about the transaction:
[transaction] => ( [transId] => 61627073813 [submitTimeUTC] => 2019-03-20T10:46:44.95Z [submitTimeLocal] => 2019-03-20T03:46:44.95 [transactionType] => authCaptureTransaction [transactionStatus] => capturedPendingSettlement [responseCode] => 1 [responseReasonCode] => 1 [responseReasonDescription] => Approval [authCode] => 020636 [AVSResponse] => Y [order] => ( [invoiceNumber] => 800774C638E101805611 [description] => Personal [discountAmount] => 0 [taxIsAfterDiscount] => ) [authAmount] => 35 [settleAmount] => 35 [taxExempt] => [payment] => ( [creditCard] => ( [cardNumber] => XXXX1111 [expirationDate] => XXXX [cardType] => Visa ) ) [billTo] => ( [firstName] => Test [lastName] => Person [address] => 123 Fake Street [city] => Some City [state] => TX [zip] => 55555 [country] => US ) [recurringBilling] => [product] => Card Not Present [marketType] => eCommerce ) [messages] => ( [resultCode] => Ok [message] => ( [0] => ( [code] => I00001 [text] => Successful. ) ) )
In some cases `[recurringBilling] =>` will be `[recurringBilling] => 1` and in others its just empty.
But there's no indication of the subscription this transaction was for.
Here's a sample of what we would expect to be getting:
[transaction] => ( [transId] => 40027109996 [submitTimeUTC] => 2019-03-22T09:08:21.73Z [submitTimeLocal] => 2019-03-22T02:08:21.73 [transactionType] => authCaptureTransaction [transactionStatus] => capturedPendingSettlement [responseCode] => 1 [responseReasonCode] => 1 [subscription] => ( [id] => 5707378 [payNum] => 1 ) [responseReasonDescription] => Approval [authCode] => XC8BL5 [AVSResponse] => Y [cardCodeResponse] => P [order] => ( [invoiceNumber] => 9415F30319B437831972 [description] => Membership without free trial [discountAmount] => 0 [taxIsAfterDiscount] => ) [authAmount] => 35 [settleAmount] => 35 [taxExempt] => [payment] => ( [creditCard] => ( [cardNumber] => XXXX1111 [expirationDate] => XXXX [cardType] => Visa ) ) [billTo] => ( [firstName] => Test [lastName] => Person ) [recurringBilling] => [product] => Card Not Present [marketType] => eCommerce ) [messages] => ( [resultCode] => Ok [message] => ( [0] => ( [code] => I00001 [text] => Successful. ) ) )
Which does have some `subscription` data.
Can you please help me figure out why there's no `subscription` data in our transaction poll data?
03-22-2019 02:11 PM - edited 03-22-2019 02:16 PM
03-22-2019 03:26 PM
Hi @cartpauj
You can use the transID you got from the webhook and call the API
in the response if its subscription transaction you will be able to see the below information also .
<subscription>
<id>5486668</id>
<payNum>1</payNum>
</subscription>
Thanks
Anurag
03-22-2019 04:04 PM
We are doing that:
public function get_transaction_details($id) { return $this->send_request('getTransactionDetailsRequest', array('transId' => $id)); }
But for no explainable reason, some of them return no subscription data, most do.
03-25-2019 09:41 AM
Anyone have any ideas?
04-08-2019 11:04 AM
Here's how we're querying the transaction data:
/** * Fetch transaction details from the Auth.net API * @param int Transaction ID * @return object|null JSON decoded transaction object. NULL on API error. */ public function get_transaction_details($id) { return $this->send_request('getTransactionDetailsRequest', array('transId' => $id)); } /** * Send request to the Auth.net api * @param string $type API request type * @param array $args API request arguments * @return object|null JSON decoded transaction object. NULL on API error. */ public function send_request($type, $args = array()) { $post_body = json_encode( array( $type => array( 'merchantAuthentication' => array( 'name' => $this->login_name, 'transactionKey' => $this->transaction_key ), 'transId' => $args['transId'] ) ) ); $api_response_body = wp_remote_retrieve_body(wp_remote_post($this->api_endpoint, array('body' => $post_body, 'headers' => array('content-type' => 'application/json')))); // Authorize.net is sending some garbage at the beginning of the response body that is not valid JSON // Reference: https://community.developer.authorize.net/t5/Integration-and-Testing/JSON-issues/td-p/48851 $api_response_body = preg_replace('/^[^\{]*/', '', $api_response_body); $response_json = json_decode($api_response_body); if($response_json->messages->resultCode === 'Error') { foreach ($response_json->messages->message as $error) { Utils::error_log('Authorize API Error ' . $error->code . '-' . $error->text); } return null; } else { return $response_json; } }
We use the following endpoint also:
https://api.authorize.net/xml/v1/request.api
04-24-2019 11:11 AM
@cartpauj wrote:Here's how we're querying the transaction data:
/** * Fetch transaction details from the Auth.net API * @param int Transaction ID * @return object|null JSON decoded transaction object. NULL on API error. */ public function get_transaction_details($id) { return $this->send_request('getTransactionDetailsRequest', array('transId' => $id)); } /** * Send request to the Auth.net api * @param string $type API request type * @param array $args API request arguments * @return object|null JSON decoded transaction object. NULL on API error. */ public function send_request($type, $args = array()) { $post_body = json_encode( array( $type => array( 'merchantAuthentication' => array( 'name' => $this->login_name, 'transactionKey' => $this->transaction_key ), 'transId' => $args['transId'] ) ) ); $api_response_body = wp_remote_retrieve_body(wp_remote_post($this->api_endpoint, array('body' => $post_body, 'headers' => array('content-type' => 'application/json')))); // Authorize.net is sending some garbage at the beginning of the response body that is not valid JSON // Reference: https://community.developer.authorize.net/t5/Integration-and-Testing/JSON-issues/td-p/48851 $api_response_body = preg_replace('/^[^\{]*/', '', $api_response_body); $response_json = json_decode($api_response_body); if($response_json->messages->resultCode === 'Error') { foreach ($response_json->messages->message as $error) { Utils::error_log('Authorize API Error ' . $error->code . '-' . $error->text); } return null; } else { return $response_json; } }We use the following endpoint also:
https://api.authorize.net/xml/v1/request.api
Nice compilation here! Thnx for sharing.
05-30-2019 03:34 AM