/** * Test: key_is_valid */ function test_key_is_valid() { $object = new WC_Order(); $object->save(); $this->assertFalse($object->key_is_valid('1234')); $object->set_order_key('1234'); $this->assertTrue($object->key_is_valid('1234')); }
/** * Relay response - handles response from NAB Transact CRN * At this stage we've just added a CRN record, and now we must process the payment to this CRN * * @since 1.2.0 */ function relay_response_crn() { global $woocommerce; // Process response $response = new stdClass; foreach ($_GET as $key => $value) { $response->$key = $value; } foreach ($_POST as $key => $value) { $response->$key = $value; } if ( ! empty( $response->order ) ) { $order = new WC_Order( (int) $response->order ); if ((!isset($response->afrescode) || $response->afrescode=='400' || $response->afrescode=='000') && ($response->rescode == '00' || $response->rescode == '08' || $response->rescode == '11')) { // Approved if ($order->key_is_valid( $response->key ) && $order->status != 'completed' && $order->status != 'processing') { // Save CRN to order meta also $this->save_subscription_meta( (int)$response->order , $response->CRN); // Add Order Note $order->add_order_note(__('Credit card details stored.','wc-nab')); if (!function_exists('wcs_get_subscriptions_for_order')) { $amount = WC_Subscriptions_Order::get_total_initial_payment($order); } else { $amount = $order->get_total(); } if (isset($response->is_payment_change) && $response->is_payment_change == '1' && get_post_meta($order->id,'_is_mid_change_method',true)) { $amount = 0; delete_post_meta($order->id,'_is_mid_change_method',true); } if ($amount == 0) { $order->payment_complete(); } else { // Now to process payment, but only if it hasn't already been done // (this url is used by result AND return) if ($order->status != 'completed') { $data = array( 'crn'=>$response->CRN, 'amountcents'=>($amount*100), 'reference'=>substr(urlencode($response->order.'-'.$order->order_key),0,32), 'currency'=>get_woocommerce_currency()); $payment_xml = $this->generatePaymentXMLMessage($data); $payment_result = $this->send($payment_xml,$this->xmlapiurl,true); $result_object = simplexml_load_string($payment_result); if ($result_object->Periodic->PeriodicList->PeriodicItem->responseCode == '00' || $result_object->Periodic->PeriodicList->PeriodicItem->responseCode == '08' || $result_object->Periodic->PeriodicList->PeriodicItem->responseCode == '11') { // Payment success! $order->add_order_note(sprintf(__("NAB Transaction id: %s\r\nNAB Settlement date: %s",'wc-nab'),$result_object->Periodic->PeriodicList->PeriodicItem->txnID,$result_object->Periodic->PeriodicList->PeriodicItem->settlementDate)); $order->payment_complete((string)$result_object->Periodic->PeriodicList->PeriodicItem->txnID); // Remove cart $woocommerce->cart->empty_cart(); } else { if ($order->status != 'completed' && $order->status != 'processing') { $order->update_status( 'failed', sprintf(__("NAB error whilst processing payment via XML API using CRN: code %s - %s.", 'wc-nab'), $result_object->Status->statusCode, $result_object->Status->statusDescription) ); } } } } } else { // payment received but order key didn't match! // Key did not match order id $order->add_order_note( sprintf(__('Payment received, but order ID did not match key: code %s - %s.', 'wc-nab'), $response->response_code, $response->response_reason_text ) ); // Put on hold if pending if ($order->status == 'pending' || $order->status == 'failed') { $order->update_status( 'on-hold' ); } } } else { // Transaction failed if ($order->status != 'completed' && $order->status != 'processing') { $order->update_status( 'failed', sprintf(__("NAB error whilst adding CRN: code %s - %s. PAYMENT NOT PROCESSED!", 'wc-nab'), $response->rescode, $response->restext) ); } } // It's possible we just processed a change of payment method, not a proper order // so we might want to just go back to the My Account page if (isset($_GET['is_payment_change']) && $_GET['is_payment_change'] == '1') { wp_redirect(get_permalink( woocommerce_get_page_id( 'myaccount' ) )); } else { wp_redirect( $this->get_return_url( $order ) ); } exit; } wp_redirect( $this->get_return_url() ); exit; }