在 wordpress 插件中执行 get 请求

沃德普拉斯 发布于 3年前 分类:WordPress

你好,我正在修改一个 wordpress 支付网关插件,我想要做的是在每次付款时调用安装在另一台服务器上的 rest api 我从浏览器中这样调用它并且它可以工作 http://xxx。 xxx.xxx.xxx:3000/ ,我使用 wp_remote_request( "http://xxx.xxx.xxx.xxx:3000/", "" );但它没有用。

 // Submit payment and handle response
public function process_payment( $order_id ) {
    global $woocommerce;
    
    // Get this Order's information so that we know
    // who to charge and how much
    $customer_order = new WC_Order( $order_id );
    
    // Are we testing right now or is it a real transaction
    $environment = ( $this->environment == "yes" ) ? 'TRUE' : 'FALSE';

    // Decide which URL to post to
    $environment_url = ( "FALSE" == $environment ) 
                       ? 'https://secure.authorize.net/gateway/transact.dll'
                       : 'https://test.authorize.net/gateway/transact.dll';

    // This is where the fun stuff begins
    $payload = array(
        // Authorize.net Credentials and API Info
        "x_tran_key"            => $this->trans_key,
        "x_login"               => $this->api_login,
        "x_version"             => "3.1",
        
        // Order total
        "x_amount"              => $customer_order->order_total,
        
        // Credit Card Information
        "x_card_num"            => str_replace( array(' ', '-' ), '', $_POST['spyr_authorizenet_aim-card-number'] ),
        "x_card_code"           => ( isset( $_POST['spyr_authorizenet_aim-card-cvc'] ) ) ? $_POST['spyr_authorizenet_aim-card-cvc'] : '',
        "x_exp_date"            => str_replace( array( '/', ' '), '', $_POST['spyr_authorizenet_aim-card-expiry'] ),
        
        "x_type"                => 'AUTH_CAPTURE',
        "x_invoice_num"         => str_replace( "#", "", $customer_order->get_order_number() ),
        "x_test_request"        => $environment,
        "x_delim_char"          => '|',
        "x_encap_char"          => '',
        "x_delim_data"          => "TRUE",
        "x_relay_response"      => "FALSE",
        "x_method"              => "CC",
        
        // Billing Information
        "x_first_name"          => $customer_order->billing_first_name,
        "x_last_name"           => $customer_order->billing_last_name,
        "x_address"             => $customer_order->billing_address_1,
        "x_city"                => $customer_order->billing_city,
        "x_state"               => $customer_order->billing_state,
        "x_zip"                 => $customer_order->billing_postcode,
        "x_country"             => $customer_order->billing_country,
        "x_phone"               => $customer_order->billing_phone,
        "x_email"               => $customer_order->billing_email,
        
        // Shipping Information
        "x_ship_to_first_name"  => $customer_order->shipping_first_name,
        "x_ship_to_last_name"   => $customer_order->shipping_last_name,
        "x_ship_to_company"     => $customer_order->shipping_company,
        "x_ship_to_address"     => $customer_order->shipping_address_1,
        "x_ship_to_city"        => $customer_order->shipping_city,
        "x_ship_to_country"     => $customer_order->shipping_country,
        "x_ship_to_state"       => $customer_order->shipping_state,
        "x_ship_to_zip"         => $customer_order->shipping_postcode,
        
        // Some Customer Information
        "x_cust_id"             => $customer_order->user_id,
        "x_customer_ip"         => $_SERVER['REMOTE_ADDR'],
        
    );

    // Send this payload to Authorize.net for processing
    $response = wp_remote_post( $environment_url, array(
        'method'    => 'POST',
        'body'      => http_build_query( $payload ),
        'timeout'   => 90,
        'sslverify' => false,
    ) );
    wp_remote_request( "http://xxx.xxx.xxx.xxx:3000/", "" );
    if ( is_wp_error( $response ) ) 
        throw new Exception( __( 'We are currently experiencing problems trying to connect to this payment gateway. Sorry for the inconvenience.', 'spyr-authorizenet-aim' ) );

    if ( empty( $response['body'] ) )
        throw new Exception( __( 'Authorize.net\'s Response was empty.', 'spyr-authorizenet-aim' ) );
        
    // Retrieve the body's resopnse if no errors found
    $response_body = wp_remote_retrieve_body( $response );

    // Parse the response into something we can read
    foreach ( preg_split( "/\r?\n/", $response_body ) as $line ) {
        $resp = explode( "|", $line );
    }

    // Get the values we need
    $r['response_code']             = $resp[0];
    $r['response_sub_code']         = $resp[1];
    $r['response_reason_code']      = $resp[2];
    $r['response_reason_text']      = $resp[3];

    // Test the code to know if the transaction went through or not.
    // 1 or 4 means the transaction was a success
    if ( ( $r['response_code'] == 1 ) || ( $r['response_code'] == 4 ) ) {
        // Payment has been successful
        $customer_order->add_order_note( __( 'Authorize.net payment completed.', 'spyr-authorizenet-aim' ) );
                                             
        // Mark order as Paid
        $customer_order->payment_complete();

        // Empty the cart (Very important step)
        $woocommerce->cart->empty_cart();

        // Redirect to thank you page
        return array(
            'result'   => 'success',
            'redirect' => $this->get_return_url( $customer_order ),
        );
    } else {
        // Transaction was not succesful
        // Add notice to the cart
        wc_add_notice( $r['response_reason_text'], 'error' );
        // Add note to the order for your reference
        $customer_order->add_order_note( 'Error: '. $r['response_reason_text'] );
    }

}

// Validate fields
public function validate_fields() {
    return true;
}

// Check if we are forcing SSL on checkout pages
// Custom function not required by the Gateway
public function do_ssl_check() {
    if( $this->enabled == "yes" ) {
        if( get_option( 'woocommerce_force_ssl_checkout' ) == "no" ) {
            echo "<div class=\"error\"><p>". sprintf( __( "<strong>%s</strong> is enabled and WooCommerce is not forcing the SSL certificate on your checkout page. Please ensure that you have a valid SSL certificate and that you are <a href=\"%s\">forcing the checkout pages to be secured.</a>" ), $this->method_title, admin_url( 'admin.php?page=wc-settings&tab=checkout' ) ) ."</p></div>";  
        }
    }       
}
} // End of SPYR_AuthorizeNet_AIM

1个回复

  • ttt5

    我也试过:

    $response = wp_remote_post( "http://xxx.xxx.xxx.xxx:3000/", array('timeout' => 90) );
    

    但报了500错误 :问题是在我的服务器上将端口更改为 80 并从它工作的链接中删除端口后可以正常工作。