woocommerce共享单个ipn到多个子域。

时间:2017-06-15 05:46:34

标签: php wordpress paypal woocommerce

我的网站在子域中安装了多个独立的wp。它不是多站点安装。每个wp安装都有自己的woocommerce商店启用。

例如:

example.com // main site
first.example.com // subdomain 
2nd.example.com //subdomain

问题是,如何为所有网站使用单个paypal ipn网址?

3 个答案:

答案 0 :(得分:0)

但是,IPN URL是特定于站点的,因此您不能对多个域使用相同的URL。这会产生一个严重的问题,导致

  • 会员专业版未被PayPal通知交易状态
  • PayPal方可能导致暂停PayPal帐户的错误。

但您仍然可以通过IP过滤请求使用paypal IPN,请在此处查看脚本:http://codeseekah.com/2012/02/11/how-to-setup-multiple-ipn-receivers-in-paypal/

答案 1 :(得分:0)

您只能将PayPal帐户配置为将IPN发送到单个网址,但是,如果您愿意,可以将该数据转发到其他网址。

由于您使用WordPress,完成此操作的最佳方法是安装PayPal IPN for WordPress,这是免费的,然后购买IPN Forwarder extension。您要做的是将PayPal配置为将IPN发送到免费插件提供的URL,然后Forwarder将为您提供所需数量的其他URL,以便将IPN数据转发到所有其他URL以便它们全部运行。

当然,如果您不想使用这些插件,您可以简单地构建自己的IPN脚本来转发数据。

答案 2 :(得分:0)

这是我提出的解决方案。

感谢@ahmed-ginani指出了脚本。还有其他工作需要做,因为您无法直接应用脚本。

基本上这就是我所做的,定义一个自定义的Paypal ipn端点。该端点将正确地重定向到子域woocommerce ipn端点。

这是脚本:

在您启用了woocommerce paypal网关的每个子域中。

//first addding the woocommerce paypal ipn in the checkout field, this will be used when paypal sending back to the custom ipn endpoint. 

add_filter('woocommerce_paypal_args', 'add_web_paypal_url');
function add_web_paypal_url($args){

    $url = site_url();
    $ipn = add_query_arg( 'wc-api', 'WC_Gateway_Paypal', $url);
    /*we need to merge it into custom field*/
    $oldcustom = json_decode($args['custom'], true);
    $newcustom = array_merge($oldcustom , array('ipnurl' => $ipn) );
    $args['custom'] = json_encode($newcustom);  

    return $args;
} 

然后在主域网站(或您想要定义自定义ipn端点的网站)中,我们将paypal返回数据转发到正确的ipn端点。

因此,假设自定义ipn端点为https://www.example.com?action=ipn_forwarder

add_action( 'init', 'paypal_ipn_fowarder' );
function paypal_ipn_fowarder(){
    if (isset($_GET['action']) && $_GET['action']=='ipn_forwarder'&& isset($_POST['custom']) ) {
        if ( ( $custom = json_decode( $_POST['custom'] ) ) && is_object( $custom ) ) {

            $ipnurl  = $custom->ipnurl;
            if(isset($ipnurl)){
                $data = array();
                foreach ($_POST as $key => $value) $data []= urlencode($key).'='.urlencode($value);
                $data = implode('&', $data);

                $ch = curl_init(); /* Initialize */

                curl_setopt($ch, CURLOPT_URL, $ipnurl);
                curl_setopt($ch, CURLOPT_POST, count($data));
                curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

                curl_exec($ch); /* Execute HTTP request */

                curl_close($ch); /* Close */

                header( 'HTTP/1.1 200 OK', true, 200 );
                exit();
            }else{
                    return;
            }

        }
    }
}

就是这样。