Paypal 贝宝自适应支付
我想向两个接收者付款,即买方以100美元购买货物,接收者1得到90美元,接收者2得到10美元。我使用的是链式付款方式。我在接收人1的账户中获得100,这是可以的,但我无法获得接收人2的付款。已设置接收方的帐户id,但此处未给出。我做错了什么?谢谢Paypal 贝宝自适应支付,paypal,paypal-adaptive-payments,Paypal,Paypal Adaptive Payments,我想向两个接收者付款,即买方以100美元购买货物,接收者1得到90美元,接收者2得到10美元。我使用的是链式付款方式。我在接收人1的账户中获得100,这是可以的,但我无法获得接收人2的付款。已设置接收方的帐户id,但此处未给出。我做错了什么?谢谢 <?php require_once('../includes/config.php'); require_once('../includes/paypal.class.php'); $PayPalConfig = array(
<?php
require_once('../includes/config.php');
require_once('../includes/paypal.class.php');
$PayPalConfig = array(
'Sandbox' => $sandbox,
'DeveloperAccountEmail' => $developer_account_email,
'ApplicationID' => $application_id,
'DeviceID' => $device_id,
'IPAddress' => $_SERVER['REMOTE_ADDR'],
'APIUsername' => $api_username,
'APIPassword' => $api_password,
'APISignature' => $api_signature,
'APISubject' => $api_subject
);
$PayPal = new PayPal_Adaptive($PayPalConfig);
$PayRequestFields = array(
'ActionType' => 'PAY_PRIMARY',
'CancelURL' => $domain.'cancel.php',
'CurrencyCode' => 'USD',
'FeesPayer' => 'EACHRECEIVER',
'IPNNotificationURL' => '',
'Memo' => '',
'Pin' => '',
'PreapprovalKey' => '',
'ReturnURL' => $domain.'return.php',
'ReverseAllParallelPaymentsOnError' => '',
'SenderEmail' => '',
'TrackingID' => ''
);
$ClientDetailsFields = array(
'CustomerID' => '',
'CustomerType' => '',
'GeoLocation' => '',
'Model' => '',
'PartnerName' => ''
);
$FundingTypes = array('ECHECK', 'BALANCE', 'CREDITCARD');
$Receivers = array();
$Receiver = array(
'Amount' => '100.00',
'Email' => 'receiver1accountid',
'InvoiceID' => '',
'PaymentType' => 'GOODS',
'PaymentSubType' => '',
'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''),
'Primary' => 'true'
);
array_push($Receivers,$Receiver);
$Receiver = array(
'Amount' => '10.00',
'Email' => 'receiver2accountid',
'InvoiceID' => '',
'PaymentType' => 'GOODS',
'PaymentSubType' => '',
'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''),
'Primary' => 'false'
);
array_push($Receivers,$Receiver);
$SenderIdentifierFields = array(
'UseCredentials' => ''
);
$AccountIdentifierFields = array(
'Email' => '',
'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => '')
);
$PayPalRequestData = array(
'PayRequestFields' => $PayRequestFields,
'ClientDetailsFields' => $ClientDetailsFields,
'FundingTypes' => $FundingTypes,
'Receivers' => $Receivers,
'SenderIdentifierFields' => $SenderIdentifierFields,
'AccountIdentifierFields' => $AccountIdentifierFields
);
$PayPalResult = $PayPal->Pay($PayPalRequestData);
if(!$PayPalResult)
{
$errors = array('Errors'=>$PayPalResult['Errors']);
echo '<pre />';
print_r($errors);
exit();
}
else
{
header('Location: '.$PayPalResult['RedirectURL']);
$ExecutePaymentFields = array(
'PayKey' => $PayPalResult['PayKey'],
'FundingPlanID' => ''
);
$PayPalRequestData = array('ExecutePaymentFields' => $ExecutePaymentFields);
$PayPalResult = $PayPal->ExecutePayment($PayPalRequestData);
if(!$PayPalResult)
{
$errors = array('Errors'=>$PayPalResult['Errors']);
echo '<pre />';
print_r($errors);
exit();
}
else
{
echo '<pre />';
print_r($PayPalResult);
}
}
?>
你的问题是使用PAY_PRIMARY而不是PAY。根据贝宝的文件 仅对于链接付款,请指定此值以延迟向 次级接收器;只有支付给主接收方的款项才是有效的 已处理 你真的需要推迟吗,还是说你只是在分手之后?看起来你试图同时触发它们,所以没有必要延迟 在您的情况下,您可以简单地设置主接收器和辅助接收器,然后使用ActionType Pay而不是Pay_primary调用Pay。这仍然会将其拆分为链式付款,其中买家在结账时只会看到主收款人,但次收款人会像您预期的那样在同一时间收到付款 根据我的理解,我已经调整了你的代码以满足你的需要
<?php
require_once('../includes/config.php');
require_once('../includes/paypal.class.php');
$PayPalConfig = array(
'Sandbox' => $sandbox,
'DeveloperAccountEmail' => $developer_account_email,
'ApplicationID' => $application_id,
'DeviceID' => $device_id,
'IPAddress' => $_SERVER['REMOTE_ADDR'],
'APIUsername' => $api_username,
'APIPassword' => $api_password,
'APISignature' => $api_signature,
'APISubject' => $api_subject
);
$PayPal = new PayPal_Adaptive($PayPalConfig);
$PayRequestFields = array(
'ActionType' => 'PAY',
'CancelURL' => $domain.'cancel.php',
'CurrencyCode' => 'USD',
'FeesPayer' => 'EACHRECEIVER',
'IPNNotificationURL' => '',
'Memo' => '',
'Pin' => '',
'PreapprovalKey' => '',
'ReturnURL' => $domain.'return.php',
'ReverseAllParallelPaymentsOnError' => '',
'SenderEmail' => '',
'TrackingID' => ''
);
$ClientDetailsFields = array(
'CustomerID' => '',
'CustomerType' => '',
'GeoLocation' => '',
'Model' => '',
'PartnerName' => ''
);
$FundingTypes = array('ECHECK', 'BALANCE', 'CREDITCARD');
$Receivers = array();
$Receiver = array(
'Amount' => '100.00',
'Email' => 'receiver1accountid',
'InvoiceID' => '',
'PaymentType' => 'GOODS',
'PaymentSubType' => '',
'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''),
'Primary' => 'true'
);
array_push($Receivers,$Receiver);
$Receiver = array(
'Amount' => '10.00',
'Email' => 'receiver2accountid',
'InvoiceID' => '',
'PaymentType' => 'GOODS',
'PaymentSubType' => '',
'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''),
'Primary' => 'false'
);
array_push($Receivers,$Receiver);
$SenderIdentifierFields = array(
'UseCredentials' => ''
);
$AccountIdentifierFields = array(
'Email' => '',
'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => '')
);
$PayPalRequestData = array(
'PayRequestFields' => $PayRequestFields,
'ClientDetailsFields' => $ClientDetailsFields,
'FundingTypes' => $FundingTypes,
'Receivers' => $Receivers,
'SenderIdentifierFields' => $SenderIdentifierFields,
'AccountIdentifierFields' => $AccountIdentifierFields
);
$PayPalResult = $PayPal->Pay($PayPalRequestData);
if($PayPal->APICallSuccessful($PayPalResult['Ack']))
{
// Redirect to PayPal so user can complete payment.
header('Location: '.$PayPalResult['RedirectURL']);
}
else
{
// Error
echo '<pre />';
print_r($PayPalResult['Errors']);
exit();
}
?>
同样,在这种情况下,您不必担心使用ExecutePayment。它会简单地将用户重定向到PayPal,在那里他们完成付款,这样做后,他们会像现在一样返回到您的重定向URL,但二次付款将同时触发
如果你真的想因为某种原因推迟二次付款,大多数人在触发二次付款前都会等待一天/一周/等,那么请告诉我,我可以帮你
另一个提示:如果您使用的是,其中包含了一个新功能PayWithOptions,这将允许您在组合中包含SetPaymentOptions,这样您就可以提供有关付款的更多详细信息,而无需自行设置其他呼叫。我建议你用这个。所有设置都是一样的,但是它附带了一些额外的参数,您可以设置这些参数,这些参数对不同的项目很有用。谢谢Andrew!我刚做完。但是,我只想同时支付两笔款项。感谢您的宝贵意见,当然也感谢您构建的库。它真的很震撼。再次感谢……。@Andrew Angell嗨,我想推迟二次付款,因为二次收款人只有在完成任务后才会被记入贷方。那么,你能告诉我你的想法吗?建议一些链接…您将使用此线程涵盖的相同类型的示例,除非您将操作设置为PAY_PRIMARY而不是PAY。