如何使用Paypal Adeptive获得paykey并在结账时成功结账?

时间:2014-03-28 20:10:09

标签: paypal paypal-sandbox paypal-adaptive-payments paypal-subscriptions

我正在使用使用灯箱的paypal自适应并行付款,以便用户无需重定向即可驻留在我自己的网站上。

我只是想要当我点击付款按钮时,我会在表单中获得动态密钥,然后发布表格灯箱打开,我从发件人那里收到付款并将钱分成2个帐户。

paypal business account: 
mohsin@balianti.com that is my site admin account as well. who will receive 10% from total amount.

sanbox account that i created in mohsin@balianti.com sandbox account options: mmskit@outlook.com that will receive 90% of total money.

so mohsin@balianti.com as a site admin and holding business account will receive 10% while other receiver will receive 90%.
means total money will split in both accounts.

希望你能明白我的观点。

问题是:

1- i am not getting paykey from paypal.
2- i am unable to do the transaction in light box.
3- i am unable to slipt the money in 2 receivers and so unable to complete to process.

我的HTML代码:

<html>
<head>
<script src="https://www.paypalobjects.com/js/external/dg.js" type="text/javascript"></script>
</head>

<body>
<!--https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=AP-5S482348KH512131U-->
<form action="https://www.sandbox.paypal.com/webapps/adaptivepayment/flow/pay?expType=light&payKey=NOT KNOW HOW TO GET THIS PAY KEY ON THE BUTTON CLICK" target="PPDGFrame" class="standard">
<label for="buy">Buy Now:</label>
<input type="image" id="submitBtn" value="Pay with PayPal" src="https://www.paypalobjects.com/en_US/i/btn/btn_paynowCC_LG.gif">
</form>

<script type="text/javascript" charset="utf-8">
var embeddedPPFlow = new PAYPAL.apps.DGFlow({trigger: 'submitBtn'});
</script>

</body>

</html>

我的Config.php文件:

<?php
/**
 * Timezone Setting
 * List of Supported Timezones: http://www.php.net/manual/en/timezones.php
 */
date_default_timezone_set('America/Chicago');

/**
  * Enable Sessions
  * Checks to see if a session_id exists.  If not, a new session is started.
  */
if(!session_id()) session_start();

/** 
 * Sandbox Mode - TRUE/FALSE
 * Check the domain of the current page and set $sandbox accordingly.
 * This allows you to automatically use Sandbox or Live credentials throughout 
 * your application based on what server the app is running from.
 * 
 * I like to do this so I don't forget to update Sandbox credentials to Live
 * prior to uploading files to a production server.
 * 
 * In this case, it's checking to see if the current URL is http://sandbox.domain.*
 * If so, $sandbox is true and the PayPal sandbox will be used throughout.  If not, 
 * we'll assume it must be a live transaction and will use live credentials throughout.
 *
 * Following this pattern will allow you to create your own http://sandbox.domain.com test server, 
 * and then any time your code runs from that server, PayPal's sandbox will be used automatically.
 * 
 * If you would rather just set $sandbox to true/false on your own that's fine, 
 * but you have to make sure your live server always uses false and your test server
 * always uses true.  It's easy to forget this and up with real customers processing 
 * payments from your live site on the PayPal sandbox.
 */
$host_split = explode('.',$_SERVER['HTTP_HOST']);
$sandbox = $host_split[0] == 'sandbox' && $host_split[1] == 'domain' ? TRUE : FALSE;
$domain = $sandbox ? 'http://sandbox.domain.com/' : 'http://lahori.org/mydev/themusicnetwork/';

/**
 * Enable error reporting if running in sandbox mode.
 */
if($sandbox)
{
    error_reporting(E_ALL|E_STRICT);
    ini_set('display_errors', '1'); 
}

/* 
 * PayPal API Version
 * ------------------
 * The library is currently using PayPal API version 109.0.  
 * You may adjust this value here and then pass it into the PayPal object when you create it within your scripts to override if necessary.
 */
$api_version = '109.0';

/*
 * PayPal Application ID
 * --------------------------------------
 * The application is only required with Adaptive Payments applications.
 * You obtain your application ID but submitting it for approval within your 
 * developer account at http://developer.paypal.com
 *
 * We're using shorthand if/else statements here to set both Sandbox and Production values.
 * Your sandbox values go on the left and your live values go on the right.
 * The sandbox value included here is a global value provided for developrs to use in the PayPal sandbox.
 */
$application_id = $sandbox ? 'APP-80W284485P519543T' : '';

/*
 * PayPal Developer Account Email Address
 * This is the email address that you use to sign in to http://developer.paypal.com
 */
$developer_account_email = 'mohsin@balianti.com';

/*
 * PayPal Gateway API Credentials
 * ------------------------------
 * These are your PayPal API credentials for working with the PayPal gateway directly.
 * These are used any time you're using the parent PayPal class within the library.
 * 
 * We're using shorthand if/else statements here to set both Sandbox and Production values.
 * Your sandbox values go on the left and your live values go on the right.
 * 
 * You may obtain these credentials by logging into the following with your PayPal account: https://www.paypal.com/us/cgi-bin/webscr?cmd=_login-api-run
 */
$api_username = $sandbox ? 'mohsin_api1.balianti.com' : 'LIVE_API_USERNAME';
$api_password = $sandbox ? 'DAQQ3QK5LTHHWGYV' : 'LIVE_API_PASSWORD';
$api_signature = $sandbox ? 'Ad9JZLf8.13dlHmFgFft2NVbaPK4AvTXPIYEMvf.CyBXiGxnrmbQG4l2' : 'LIVE_API_SIGNATURE';

/*
 * Payflow Gateway API Credentials
 * ------------------------------
 * These are the credentials you use for your PayPal Manager:  http://manager.paypal.com
 * These are used when you're working with the PayFlow child class.
 * 
 * We're using shorthand if/else statements here to set both Sandbox and Production values.
 * Your sandbox values go on the left and your live values go on the right.
 * 
 * You may use the same credentials you use to login to your PayPal Manager, 
 * or you may create API specific credentials from within your PayPal Manager account.
 */
$payflow_username = $sandbox ? 'SANDBOX_PAYFLOW_USERNAME' : 'LIVE_PAYFLOW_USERNAME';
$payflow_password = $sandbox ? 'SANDBOX_PAYFLOW_PASSWORD' : 'LIVE_PAYFLOW_PASSWORD';
$payflow_vendor = $sandbox ? 'SANDBOX_PAYFLOW_VENDOR' : 'LIVE_PAYFLOW_VENDOR';
$payflow_partner = $sandbox ? 'SANDBOX_PAYFLOW_PARTNER' : 'LIVE_PAYFLOW_PARTNER';

/* 
 * PayPal REST API Credentials
 * ---------------------------
 * These are the API credentials used for the PayPal REST API.
 * These are used any time you're working with the REST API child class.
 * 
 * You may obtain these credentials from within your account at http://developer.paypal.com
 */
$rest_client_id = $sandbox ? 'AUjqAhB6ZWMudj58C_NAC0kA58EmNCl2LPFlmaX76t1e0kVu-GwALjzVTBwR' : 'LIVE_CLIENT_ID';
$rest_client_secret = $sandbox ? 'EPXlgBAIfaptG15JI7OxxZK1GNxgfAqQg5uhmllzdF1FIE5hjEhsIBbrwfbV' : 'LIVE_SECRET_ID';

/* 
 * PayPal Finance Portal API
 * -------------------------
 * These are credentials used for obtaining a PublisherID used in Bill Me Later Banner code.
 * As of now, these are specialized API's and you must obtain credentials directly from a PayPal rep.
 */
$finance_access_key = $sandbox ? 'SANDBOX_ACCESS_KEY' : 'LIVE_ACCESS_KEY';
$finance_client_secret = $sandbox ? 'SANDBOX_CLIENT_SECRET' : 'LIVE_CLIENT_SECRET';

/**
 * Third Party User Values
 * These can be setup here or within each caller directly when setting up the PayPal object.
 */
$api_subject = '';  // If making calls on behalf a third party, their PayPal email address or account ID goes here.
$device_id = '';
$device_ip_address = $_SERVER['REMOTE_ADDR'];
?>

我的PHP代码我来自天使之眼贝宝类:

<?php
// Include required library files.
require_once('config.php');
require_once('paypal.class.php');
require_once('paypal.adaptive.class.php');

// Create PayPal object.
$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);

// Prepare request arrays
$PayRequestFields = array(
                        'ActionType' => 'PAY',                              // Required.  Whether the request pays the receiver or whether the request is set up to create a payment request, but not fulfill the payment until the ExecutePayment is called.  Values are:  PAY, CREATE, PAY_PRIMARY
                        'CancelURL' => $domain.'cancel.php',                                    // Required.  The URL to which the sender's browser is redirected if the sender cancels the approval for the payment after logging in to paypal.com.  1024 char max.
                        'CurrencyCode' => 'USD',                                // Required.  3 character currency code.
                        'FeesPayer' => 'EACHRECEIVER',                                  // The payer of the fees.  Values are:  SENDER, PRIMARYRECEIVER, EACHRECEIVER, SECONDARYONLY
                        'IPNNotificationURL' => '',                         // The URL to which you want all IPN messages for this payment to be sent.  1024 char max.
                        'Memo' => '',                                       // A note associated with the payment (text, not HTML).  1000 char max
                        'Pin' => '',                                        // The sener's personal id number, which was specified when the sender signed up for the preapproval
                        'PreapprovalKey' => '',                             // The key associated with a preapproval for this payment.  The preapproval is required if this is a preapproved payment.  
                        'ReturnURL' => $domain.'return.php',                                    // Required.  The URL to which the sener's browser is redirected after approvaing a payment on paypal.com.  1024 char max.
                        'ReverseAllParallelPaymentsOnError' => '',          // Whether to reverse paralel payments if an error occurs with a payment.  Values are:  TRUE, FALSE
                        'SenderEmail' => '',                                // Sender's email address.  127 char max.
                        'TrackingID' => ''                                  // Unique ID that you specify to track the payment.  127 char max.
                        );

$ClientDetailsFields = array(
                        'CustomerID' => '',                                 // Your ID for the sender  127 char max.
                        'CustomerType' => '',                               // Your ID of the type of customer.  127 char max.
                        'GeoLocation' => '',                                // Sender's geographic location
                        'Model' => '',                                      // A sub-identification of the application.  127 char max.
                        'PartnerName' => 'Always Give Back'                                 // Your organization's name or ID
                        );

$FundingTypes = array('ECHECK', 'BALANCE', 'CREDITCARD');

$Receivers = array();
$Receiver = array(
                'Amount' => '10.00',                                            // Required.  Amount to be paid to the receiver.
                'Email' => 'mohsin@balianti.com',                                               // Receiver's email address. 127 char max.
                'InvoiceID' => '',                                          // The invoice number for the payment.  127 char max.
                'PaymentType' => 'GOODS',                                       // Transaction type.  Values are:  GOODS, SERVICE, PERSONAL, CASHADVANCE, DIGITALGOODS
                'PaymentSubType' => '',                                     // The transaction subtype for the payment.
                'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''), // Receiver's phone number.   Numbers only.
                'Primary' => 'TRUE'                                             // Whether this receiver is the primary receiver.  Values are boolean:  TRUE, FALSE
                );
array_push($Receivers,$Receiver);

$Receiver = array(
                'Amount' => '5.00',                                             // Required.  Amount to be paid to the receiver.
                'Email' => 'mmskit@outlook.com',                                                // Receiver's email address. 127 char max.
                'InvoiceID' => '',                                          // The invoice number for the payment.  127 char max.
                'PaymentType' => 'GOODS',                                       // Transaction type.  Values are:  GOODS, SERVICE, PERSONAL, CASHADVANCE, DIGITALGOODS
                'PaymentSubType' => '',                                     // The transaction subtype for the payment.
                'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => ''), // Receiver's phone number.   Numbers only.
                'Primary' => 'false'                                                // Whether this receiver is the primary receiver.  Values are boolean:  TRUE, FALSE
                );
array_push($Receivers,$Receiver);

$SenderIdentifierFields = array(
                                'UseCredentials' => ''                      // If TRUE, use credentials to identify the sender.  Default is false.
                                );

$AccountIdentifierFields = array(
                                'Email' => '',                              // Sender's email address.  127 char max.
                                'Phone' => array('CountryCode' => '', 'PhoneNumber' => '', 'Extension' => '')                               // Sender's phone number.  Numbers only.
                                );

$PayPalRequestData = array(
                    'PayRequestFields' => $PayRequestFields, 
                    'ClientDetailsFields' => $ClientDetailsFields, 
                    'FundingTypes' => $FundingTypes, 
                    'Receivers' => $Receivers, 
                    'SenderIdentifierFields' => $SenderIdentifierFields, 
                    'AccountIdentifierFields' => $AccountIdentifierFields
                    ); 

// Pass data into class for processing with PayPal and load the response array into $PayPalResult
$PayPalResult = $PayPal->Pay($PayPalRequestData);



if(!$this->paypal_adaptive->APICallSuccessful($PayPalResult['Ack']))
    {
        $errors = array('Errors'=>$PayPalResult['Errors']);

        // Write the contents of the response array to the screen for demo purposes.
        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);
    }   
 }

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

我从paypal收到的登录信息和完整的详细信息。

REST API CREDENTIALS

测试凭据

您的应用中的所有功能都启用了测试凭据。

Test account:
mohsin-facilitator@balianti.com
Endpoint:  api.sandbox.paypal.com 
Client ID: AUjqAhB6ZWMudj58C_NAC0kA58EmNCl2LPFlmaX76t1e0kVu-GwALjzVTBwR 
Secret:    EPXlgBAIfaptG15JI7OxxZK1GNxgfAqQg5uhmllzdF1FIE5hjEhsIBbrwfbV 

以下是您的API签名:

API Username: mohsin_api1.balianti.com
API Password: DAQQ3QK5LTHHWGYV
Signature: Ad9JZLf8.13dlHmFgFft2NVbaPK4AvTXPIYEMvf.CyBXiGxnrmbQG4l2

将上面的PayPal设置复制并粘贴到Magento配置页面的API / Integration部分。

您已成功保存首选项。在您的网站上设置付款数据传输时,请使用以下身份令牌。 A9XxF-vXyH3-kPYVX0dDDcojmBxvMidXnmn846gxQD0ehzXM4Xjva0VL6RW

http://developer.paypal.com
mohsin@balianti.com
m@h$!nBali
请帮助我解决整个问题。我正在等待认真的答复。

谢谢大家。

2 个答案:

答案 0 :(得分:0)

我拿了你的代码并在我的服务器上运行它。

我注意到的第一件事是你已经在$ PayPalResult下面注释了所有内容,因此你没有真正发生任何结果。没有输出到屏幕或返回到请求客户端。

当我使用我的凭据运行它并查看实际结果时,这就是我所得到的。

[Errors] => Array
    (
        [0] => Array
            (
                [Receiver] => 
                [Category] => Application
                [Domain] => PLATFORM
                [ErrorID] => 520009
                [ExceptionID] => 
                [Message] => Account mohsin@balianti.com is restricted
                [Parameter] => mohsin@balianti.com
                [Severity] => Error
                [Subdomain] => Application
            )

    )

[Ack] => Failure
[Build] => 10273932
[CorrelationID] => 471e9fbfa0053
[Timestamp] => 2014-03-29T09:45:56.631-07:00

因此,您在此处使用的接收方帐户似乎存在问题。当我进一步研究时,我发现您在同一笔付款中获得的接收器设置与主接收器和辅助接收器相同。

一旦我用自己的沙盒帐户中的2封单独的电子邮件替换了您的收件人电子邮件地址,我就得到了成功的回复。

[Ack] => Success
[Build] => 10273932
[CorrelationID] => 9afd1342ebf17
[Timestamp] => 2014-03-29T09:50:00.472-07:00
[PayKey] => AP-8FY50816521434738
[PaymentExecStatus] => CREATED

然后我回去尝试将您的帐户作为收件人以及我的一个帐户,但我最后收到了有关该帐户受限制的相同错误。

所以,我不确定为什么会限制该帐户,特别是在沙箱上。但它看起来不像沙盒电子邮件帐户。是一个吗?您需要确保在沙箱上进行测试时使用沙盒帐户。

如果您实际上正在点击实时服务器并收到相同的错误,那么您需要contact PayPal获取有关该帐户错误的帮助。

如果您正在直播,可能会遇到不同的错误。要检查您是否需要查看返回$ PayPalResult的实际结果。同样,您已经在代码中注释了所有内容,因此它甚至不会将结果返回给您的客户请求。

答案 1 :(得分:0)

请看。:

Array
(
    [Errors] => Array
        (
            [0] => Array
                (
                    [Receiver] => 
                    [Category] => Application
                    [Domain] => PLATFORM
                    [ErrorID] => 580022
                    [ExceptionID] => 
                    [Message] => Invalid request parameter: payKey cannot be null
                    [Parameter] => payKey
                    [Severity] => Error
                    [Subdomain] => Application
                )

        )

    [Ack] => Failure
    [Build] => 10273932
    [CorrelationID] => 2d63bc22401c7
    [Timestamp] => 2014-04-15T02:27:08.040-07:00
    [PaymentExecStatus] => 
    [XMLRequest] => ReturnAllen_US
    [XMLResponse] => 2014-04-15T02:27:08.040-07:00Failure2d63bc22401c710273932580022PLATFORMApplicationErrorApplicationInvalid request parameter: payKey cannot be nullpayKeynull
)
odftetretArray
(
    [0] => Array
        (
            [Receiver] => 
            [Category] => Application
            [Domain] => PLATFORM
            [ErrorID] => 580022
            [ExceptionID] => 
            [Message] => Invalid request parameter: payKey cannot be null
            [Parameter] => payKey
            [Severity] => Error
            [Subdomain] => Application
        )

)
相关问题