单击快速结账按钮后调用两次payment()。灯箱继续旋转

时间:2018-01-04 05:44:16

标签: javascript node.js paypal paypal-rest-sdk express-checkout

我正在尝试将express-checkout API与node.jsexpress集成。这是我第一次使用PayPal的API而且我无法让灯箱停止旋转并允许用户批准和授权付款。当用户点击结帐按钮时,payment方法被调用两次(使用2个不同的ID创建2个付款,时间差约为2分钟)并且灯箱弹出但仍保持旋转但不提示用户做任何事情。我很感激任何帮助。

我的客户端代码:

      <div id="paypal-button"></div>

      <script>
        paypal.Button.render({
          env: 'sandbox', // Or 'sandbox',

          commit: true, // Show a 'Pay Now' button

          style: {
            color: 'gold',
            size: 'small'
          },

          payment: function() {
            /* Make a call to the server to set up the payment */
            return paypal.request.post("http://localhost:3000/paypal/create-payment")
                .then(function(res) { 
                    return res.id; 
                })
            },

          onAuthorize: function(data, actions) {
            /* 
             * Execute the payment here 
             */

            return paypal.request.post("http://localhost:3000/paypal/execute-payment",
                {
            paymentID: data.paymentID,
            payerID:   data.payerID
            }).then(function(res) {

            // The payment is complete!
            // You can now show a confirmation message to the customer
            window.alert("PAYMENT COMPLETE!");
            });
          },

          onCancel: function(data, actions) {
            /* 
             * Buyer cancelled the payment 
             */
            console.log("BUYER CANCELLED!");
          },

          onError: function(err) {
            /* 
             * An error occurred during the transaction 
             */
            console.log(err);
          }
        }, '#paypal-button');
      </script>

我的服务器端代码:

// CREATE PAYMENT ROUTE
app.post("/paypal/create-payment", function(req, res){
// CREATE JSON REQUEST 
var create_payment_json = {
    "intent": "sale",
  "redirect_urls":
  {
    "return_url": "https://localhost:3000/success",
    "cancel_url": "https://localhost:3000/cancel"
  },
  "payer":
  {
    "payment_method": "paypal"
  },
  "transactions": [
  {
    "amount":
    {
      "total": "",
      "currency": "USD",
      "details":{
        "subtotal": "",
        "shipping": "0.00",
        "tax": "0.00",
        "shipping_discount": "0.00"
      }
    },
    "item_list":
    {
      "items": []
    },
    "description": "Test shopping cart transaction."
  }]
};

// Change the "total", "subtotal", and "items" array in the json request
create_payment_json["transactions"][0]["amount"]["total"] = cart.totalPrice.toString();
create_payment_json["transactions"][0]["amount"]["details"]["subtotal"] = cart.totalPrice.toString();

// Dummy variable for less typing 
var itemsArray = create_payment_json["transactions"][0]["item_list"]["items"];

// 1) Access each puppy in the cart
// 2) Create an object with the following properties:
//          quantity, name, price, currency, description, and tax
// 3) push that object into itemsArray
 cart["puppies"].forEach(function(puppy){
    var dummy = {
        "quantity" : "1",
        "name" : puppy.name,
        "price" : puppy.price.toString(),
        "currency" : "USD",
        "description" : puppy.description,
        "tax" : "0"
    };
    itemsArray.push(dummy);
 });

// Send a Create Payment request to the Payments API
    paypal.payment.create(create_payment_json, function (error, payment){
        if (error) {
          console.log(error);
        } else {
            console.log(payment);
            console.log("==============");
        }
    });
});

// EXECUTE PAYMENT ROUTE 
app.post("/paypal/execute-payment", function(req, res){
var payerId = { payer_id: req.query.PayerID };
var paymentId = req.query.paymentId;

console.log("Payer ID: " + payerId);
console.log("Paymend ID: " + paymentId);

    paypal.payment.execute(paymentId, payerId, function(error, payment){
        if (error){
            console.log(error);
        } else {
            if(payment.state === "approved"){
                console.log(payment);
                res.send("SUCCESS");
            } else {
                console.log("payment not successful");
            }
        }
    });

});

console.log(payment)方法中的paypal.payment.create运行两次。这就是我知道payment方法被调用两次的方式。我不知道如何解决这个问题。任何帮助或建议表示赞赏!

更新:将return res.paymentId更改为return res.id,但没有运气。

0 个答案:

没有答案