2012-11-26 165 views
0

我想付款给两个接收者,即买家购买100件商品,接收者1得到90,接收者2得到10。我正在使用链接付款方式。我在收款人1的账户中收到了100美元,但是我无法收到收款人2的付款。收件人的帐户ID已设置,但未在此处给出。我做错了什么?谢谢Paypal自适应付款

<?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); 
} 
} 

?> 

回答

8

你的问题是使用PAY_PRIMARY而不是只是付费。每个PayPal的文档...

仅限于链接付款,请指定此值以延迟付款给 辅助接收方;仅向主要接收方付款 已处理。

你是否真的需要延迟它,或者你是否仅仅在分裂之后?看起来你试图同时触发它们,所以真的不需要延迟。

在您的情况下,您可以像设置主要和次要接收器一样简单地设置,然后使用PAY的ActionType而不是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,在那里他们完成付款,这样他们会像现在一样返回到您的RedirectURL,但二次付款将同时触发。

如果您真的想延迟二次付款出于某种原因(大多数人最终等待一天/周/等触发二次付款之前),请让我知道,我可以帮助你。

另一个提示:如果您使用的是most recent version of my library,则会有一个新功能,包括PayWithOptions,它允许您在组合中包含SetPaymentOptions(),以便您可以提供有关付款的更多详细信息,而无需设置其他呼叫你自己。我建议使用这个。一切都会设置相同,但是它会附带一些可以设置的附加参数,这些参数可以用于不同的项目。

+1

谢谢安德鲁!我只是完成了它。不过,我只想让这两笔款项同时完成。感谢您宝贵的意见,以及您建立的图书馆。它真的很有趣。再次感谢........ –

+0

抱歉不能投票,因为我的repu不允许截至目前....... :-) –

+0

@Andrew Angell您好,我想延迟二次付款,因为二级接收器只有在完成任务后才会被记入。所以,你能告诉我你的想法如何解决这个问题吗?建议一些链接... – SDK

相关问题