我的网站在子域中安装了多个独立的wp。它不是多站点安装。每个wp安装都有自己的woocommerce商店启用。
例如:
example.com // main site
first.example.com // subdomain
2nd.example.com //subdomain
问题是,如何为所有网站使用单个paypal ipn网址?
答案 0 :(得分:0)
但是,IPN URL是特定于站点的,因此您不能对多个域使用相同的URL。这会产生一个严重的问题,导致
但您仍然可以通过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;
}
}
}
}
就是这样。