【问题标题】:sending multiple products to paypal using symfony使用 symfony 向贝宝发送多个产品
【发布时间】:2015-04-05 10:16:27
【问题描述】:

我正在使用 Symfony Payum 捆绑包将订单发送到 PayPal,到目前为止,它在单个产品上运行良好

假设我的单个产品数组看起来像这样

$orderDetails = array(
        'productID' => '10',
        'fname' => 'First Name',
        'lname' => 'Last Name',
        'phone' => '111',
        'clientemail' => 'xyz@abc.com',
        'name' => 'Product Name',
        'description' => 'The Product description.',
        'price' => 8.64,
        'currency_symbol' => '$',
        'currency' => 'USD',
        'clientId' => '222',
        'payment_option' => $paymentName


);

那么下面的代码就可以正常工作了

$storage = $this->get('payum')->getStorage('ClickTeck\featuresBundle\Entity\Orders');
/** @var $paymentDetails Orders */
$paymentDetails = $storage->create();


$paymentDetails->setClientFname($orderDetails['fname']);
$paymentDetails->setClientLname($orderDetails['lname']);
$paymentDetails->setClientPhone($orderDetails['phone']);
$paymentDetails->setClientEmail($orderDetails['clientemail']);
$paymentDetails->setNumber($orderDetails['productID']);
$paymentDetails->setDescription($orderDetails['description']);
$paymentDetails->setCurrencyCode($orderDetails['currency']);
$paymentDetails->setTotalAmount($orderDetails['price']);
$paymentDetails->setClientId($orderDetails['clientId']);
$paymentDetails->setPaymentOption($orderDetails['payment_option']);



$paymentDetails['PAYMENTREQUEST_0_CURRENCYCODE'] = $orderDetails['currency'];
$paymentDetails['PAYMENTREQUEST_0_AMT'] = $orderDetails['price'];
$paymentDetails['NOSHIPPING'] = Api::NOSHIPPING_NOT_DISPLAY_ADDRESS;
$paymentDetails['REQCONFIRMSHIPPING'] = Api::REQCONFIRMSHIPPING_NOT_REQUIRED;
$paymentDetails['L_PAYMENTREQUEST_0_ITEMCATEGORY0'] = Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL;
$paymentDetails['L_PAYMENTREQUEST_0_AMT0'] = $orderDetails['price'];
$paymentDetails['L_PAYMENTREQUEST_0_NAME0'] = $orderDetails['name'];
$paymentDetails['L_PAYMENTREQUEST_0_DESC0'] = $orderDetails['description'];
$storage->update($paymentDetails);
$captureToken = $this->getTokenFactory()->createCaptureToken(
    $paymentName,
    $paymentDetails,
    'payment_done'
);
$paymentDetails['INVNUM'] = $paymentDetails->getId();
$storage->update($paymentDetails);
return $this->redirect($captureToken->getTargetUrl());

但是,如果我有多个类似下面数组的产品,那么如何处理呢?

$paymentName = 'paypal';

$orderDetails = array(
    array(
        'productID' => '10',
        'fname' => 'First Name',
        'lname' => 'Last Name',
        'phone' => '111',
        'clientemail' => 'xyz@abc.com',
        'name' => 'Product Name',
        'description' => 'The Product description.',
        'price' => 8.64,
        'currency_symbol' => '$',
        'currency' => 'USD',
        'clientId' => '222',
        'payment_option' => $paymentName
    ),
    array(
        'productID' => '10',
        'fname' => 'First Name',
        'lname' => 'Last Name',
        'phone' => '111',
        'clientemail' => 'xyz@abc.com',
        'name' => 'Product Name',
        'description' => 'The Product description.',
        'price' => 8.64,
        'currency_symbol' => '$',
        'currency' => 'USD',
        'clientId' => '222',
        'payment_option' => $paymentName
    ),
);

【问题讨论】:

    标签: php symfony loops paypal payum


    【解决方案1】:

    您只需要遍历这些项目以动态生成 API 请求的那部分。所以它会是这样的。

    $i = 0;
    foreach($orderDetails as $orderItem)
    {
        $paymentDetails['L_PAYMENTREQUEST_0_ITEMCATEGORY' . $i] = Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL;
        $paymentDetails['L_PAYMENTREQUEST_0_AMT' . $i] = $orderItem['price'];
        $paymentDetails['L_PAYMENTREQUEST_0_NAME' . $i] = $orderItem['name'];
        $paymentDetails['L_PAYMENTREQUEST_0_DESC' . $i] = $orderItem['description'];
        $i++;
    }
    

    【讨论】:

    • 谢谢。循环通过它确实有意义。你用过 payum 做 symfony 框架吗
    • 不,我实际上有自己的PHP class library for PayPal,我已经维护了多年。我在图书馆内为您处理订购物品之类的事情。它几乎有 PayPal 提供的所有 API 可供使用,并且每个 API 都有一个功能示例和空模板。您所要做的就是用您自己的数据填写参数。我建议看看。我想你会喜欢的。
    • 这似乎只发送一个项目到贝宝,数组的底部
    • 感谢安德鲁的帮助。
    【解决方案2】:

    就这样:

    for ($i = 0; $i < count($orderDetails); $i++) {
      $paymentDetails->setClientEmail($orderDetails[$i]['clientemail']);
      $paymentDetails->setDescription($orderDetails[$i]['description']);
      $paymentDetails->setCurrencyCode($orderDetails[$i]['currency']);
      $paymentDetails->setTotalAmount($orderDetails[$i]['price']);
      $paymentDetails[$payment.$i.'_CURRENCYCODE'] = $orderDetails[$i]['currency'];
      $paymentDetails[$payment.$i.'_AMT'] = $orderDetails[$i]['price'];
      $paymentDetails['NOSHIPPING'] = Api::NOSHIPPING_NOT_DISPLAY_ADDRESS;
      $paymentDetails['REQCONFIRMSHIPPING'] = Api::REQCONFIRMSHIPPING_NOT_REQUIRED;
      $paymentDetails[$lpayment.$i.'_ITEMCATEGORY0'] = Api::PAYMENTREQUEST_ITERMCATEGORY_DIGITAL;
      $paymentDetails[$payment . $i . '_PAYMENTREQUESTID'] = "CART26488-PAYMENT".$i;
      $paymentDetails[$payment . $i . '_SELLERPAYPALACCOUNTID'] = "etochavez-facilitator@gmail.com";
      $paymentDetails[$lpayment.$i.'_AMT0'] = $orderDetails[$i]['price'];
      $paymentDetails[$lpayment.$i.'_NAME0'] = $orderDetails[$i]['name'];
      $paymentDetails[$lpayment.$i.'_DESC0'] = $orderDetails[$i]['description'];
    }
    

    【讨论】:

    • 忘记放最上面:$payment = "PAYMENTREQUEST_"; $lpayment = "L_PAYMENTREQUEST_";
    • 这不准确,因为我现在正在查看它。您需要记住这里有两件事:您可以进行多次付款,这就是 PAYMENTREQUEST_0_AMT 等参数中 0 的来源。然后,每笔付款可能有多个项目,这就是您有 L_PAYMENTREQUEST_0_AMT0 之类的参数的原因。您需要将 $i 与 $n 分开跟踪,并将一个用于付款,一个用于物品。
    猜你喜欢
    • 2017-12-21
    • 2015-11-04
    • 1970-01-01
    • 2013-05-09
    • 2019-03-31
    • 2010-12-17
    • 2013-09-11
    • 2016-09-08
    • 1970-01-01
    相关资源
    最近更新 更多