php - Paypal 自适应支付(链式)- 链式支付中不允许单边接收方

标签 php api paypal paypal-adaptive-payments chained-payments

我一直在尝试使用 Paypal Adaptive Payments API 实现拆分付款。我有一个简单的并行付款可以工作,但是这显示了向买方的两次付款。

基本上我是在卖成员(member)资格。我们本地的协会应该获得75%的资金,25%转交给管理机构。成员(member)应该只能看到 2015 年成员(member)的总金额,因此我开始研究链式支付。从表面上看,这看起来像是一个非常简单的代码更改,但给我带来了与单方面支付相关的问题。

我正在 php 中实现这个。

这里是paypal发送方法

function PaypalSend($payment_details, $api_function){

    // initial endpoint that starts the transaction
    $paypalInitialEndpoint = 'https://svcs.sandbox.paypal.com/AdaptivePayments/';

    // set http headers
    $headers = array(
        'Connection: Close',
        'X-PAYPAL-SECURITY-USERID: testseller_api1.nipf.com',
        'X-PAYPAL-SECURITY-PASSWORD: 1381912839',
        'X-PAYPAL-SECURITY-SIGNATURE: AzykGe5AzfK.mJFMRzBwIcTap-LcAsmsP4AhYzk1Y-07mh-xPLc-goK3',
        'X-PAYPAL-APPLICATION-ID: APP-80W284485P519543T',
        'X-PAYPAL-REQUEST-DATA-FORMAT: JSON',
        'X-PAYPAL-RESPONSE-DATA-FORMAT: JSON'
    );

    // setup curl request and http headers
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $paypalInitialEndpoint . $api_function);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payment_details));
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    if(!($res = curl_exec($ch)) ) 
    {   
        error_log(curl_error($ch));    
        curl_close($ch);    
        exit;
    }

    curl_close($ch);

    return json_decode($res, TRUE);     
}

这是我的链式付款方式。该代码需要大量重构,但只需对当前代码进行少量更改即可完全支持并行支付。

function sendChainedPayment(){

    $purchase_details_array = array(
        "actionType" => "PAY",
        "currencyCode" => "GBP",
        "feesPayer" => "PRIMARYRECEIVER",
        "memo" => "blah blah blah",
        "receiverList" => array(
            "receiver" => array(
                array(
                    "amount" => "30.00", 
                    "email" => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c5b1a0b6b1b6a0a9a9a0b785abacb5a3eba6aaa8" rel="noreferrer noopener nofollow">[email protected]</a>",
                    "primary" => "true"
                ),
                array(
                    "amount" => "10.00", 
                    "email" => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="5a2e3f292e293f36363f281a3d382a3c74393537" rel="noreferrer noopener nofollow">[email protected]</a>",
                    "primary" => "false"
                )           
            )
        ),
        "returnUrl" => "http://localhost/membershipSuccess.php",
        "cancelUrl" => "http://localhost/membershipCancel.php",
        "requestEnvelope" => array(
            "errorLanguage" => "en_UK",
            "detailLevel" => "ReturnAll"
        )
    );

    $response = PaypalSend($purchase_details_array, "Pay");

    //echo json_encode($response) . "<br /><br />";

    $payKey = $response['payKey'];

    $payment_details = array(
        "requestEnvelope" => array(
            "errorLanguage" => "en_UK",
            "detailLevel" => "ReturnAll"
        ),
        "payKey" => $payKey,
        "receiverOptions" => array(
            array(
                "receiver" => array("email" => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="f98d9c8a8d8a9c95959c8bb99790899fd79a9694" rel="noreferrer noopener nofollow">[email protected]</a>"),
                "invoiceData" => array(
                    "item" => array(
                        array(
                            "name" => "Membership 2015",
                            "price" => "30.00",
                            "identifier" => "Membership 2015: joe bloggs"
                        )
                    )                                               
                )
            ),
            array(
                "receiver" => array("email" => "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="691d0c1a1d1a0c05050c1b290e0b190f470a0604" rel="noreferrer noopener nofollow">[email protected]</a>"),
                "invoiceData" => array(
                    "item" => array(
                        array(
                            "name" => "Membership 2015 (Fee)",
                            "price" => "10.00",
                            "identifier" => "Membership 2015 (Fee): joe bloggs"
                        )
                    )                                               
                )
            )
        )
    );

    $response = PaypalSend($payment_details, "SetPaymentOptions");

    //echo json_encode($response) . "<br /><br />";

    $paypalCustomerUrl = 'https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_ap-payment&paykey=' . $payKey;

    echo $paypalCustomerUrl;

    //header('Location: ' . $paypalCustomerUrl);        
}

我通过第一个标注得到以下响应 JSON。我认为这与帐户只是沙箱帐户而不是真实帐户有关,但是如果帐户都必须是真实帐户,我该如何在沙箱中测试它呢?在这种情况下,用作 API 帐户的帐户是主要接收者。

{"responseEnvelope":{"timestamp":"2015-02-04T14:37:26.598-08:00","ack":"Failure","correlationId":"749bd1d709e76","build":"15089777"},"error":[{"errorId":"520009","domain":"PLATFORM","subdomain":"Application","severity":"Error","category":"Application","message":"Account Account not found. Unilateral receiver not allowed in chained payment is restricted","parameter":["Account not found. Unilateral receiver not allowed in chained payment"]}]}

最佳答案

我收到了相同的错误消息,并通过确保我在 API 调用中发送付款的 2 个电子邮件地址都是沙盒帐户来修复该问题。它们并不作为真实的电子邮件地址存在,但它们确实需要作为 Paypal 帐户存在。 (之前我将它们发送到沙箱中不存在的 2 个实际的 PayPal 帐户)。

从错误消息“找不到帐户。链式支付中不允许单边接收者”来看,它只是找不到您的帐户,可能是因为它们不是沙盒帐户。

关于php - Paypal 自适应支付(链式)- 链式支付中不允许单边接收方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28333435/

相关文章:

php - 用PHP将表单数据传递到MySQL数据库

PHP 允许使用旧的 session ID 而不更改它们,这使得 session 很容易被劫持。怎么修?

php - 如何检查所有行是否具有相同的列值?

javascript - Addmefast.com 检查在新窗口中单击的“赞”按钮?如何

api - Youtube api 上传视频不起作用 "Error : NoLinkedYouTubeAccount "

php - 数组的第一个元素 $$foo

api - Django allauth 使用谷歌账户登录

Express 上的 Paypal 自定义金额类型

php - laravel 中用于支付网关的 csrf 异常

php - Paypal IPN - 它是如何运作的?