PayPal希望传递订单ID。

8

我已经将Paypal智能按钮集成到我的页面中,并且它可以正常工作。3天前,直接传递Pay-xxx出现错误,并告诉我要发送一个令牌。这一次,当我引用它时,它返回了一个错误:需要传递订单ID。我应该怎么办?

以下代码会出现错误:需要传递订单ID

var CREATE_PAYMENT_URL = '/api/create-payment';
var checkBox = document.getElementById("ship_to_different");
var note = $("#ordernote").val();
if (checkBox.checked == true) {
  var body = $("#checkoutt, #data").serializeArray();
} else {
  $('input[name=note]').val(note);
  var body = $("#data").serializeArray();

}
$("#wait").show();
return fetch(CREATE_PAYMENT_URL, {
  method: 'post',
  headers: {
    'content-type': 'application/json'
  },
  body: JSON.stringify({
    body: body
  })

}).then(function (res) {
  return res.json();
}).then(function (data) {
  console.log(data);
  let token;

  for (let link of data.links) {
    if (link.rel === 'approval_url') {
      token = link.href.match(/EC-\w+/)[0];
    }
  }

  return data.token;
});

以下代码会引发错误: 不要直接将PAY-XXX或PAYID-XXX传递给createOrder。请传递EC-XXX令牌。
var CREATE_PAYMENT_URL = '/api/create-payment';
var checkBox = document.getElementById("ship_to_different");
var note = $("#ordernote").val();
if (checkBox.checked == true) {
  var body = $("#checkoutt, #data").serializeArray();
} else {
  $('input[name=note]').val(note);
  var body = $("#data").serializeArray();

}
$("#wait").show();
return fetch(CREATE_PAYMENT_URL, {
  method: 'post',
  headers: {
    'content-type': 'application/json'
  },
  body: JSON.stringify({
    body: body
  })

}).then(function (res) {
  return res.json();
}).then(function (data) {
  console.log(data);
  let token;

  for (let link of data.links) {
    if (link.rel === 'approval_url') {
      token = link.href.match(/EC-\w+/)[0];
    }
  }

  return data.id;
});

我无法理解正在发生的事情。

8个回答

3

我也遇到了这个问题,但我很容易地解决了它。

paypal.Buttons({
    createOrder: function () {
        return fetch('/api/create_payment/', {
                method: "POST",
                headers: {
                    'content-type': 'application/json',
                    'X-CSRFToken': $('[name=csrfmiddlewaretoken]').val()
                }
            }
        )
        .then(function(res) {
            return res.json();
        }).then(function(res) {
            return res['orderId'];
        });
    },
    onApprove: function (data, actions) {
        // Do something after approved...
    }
}).render('#paypal-container');

重要的是,在后端,我使用Paypal V2 API端点创建了订单 - https://developer.paypal.com/docs/api/orders/v2/#orders_create


2

如果您正在使用.NET,那么在创建付款 API 调用时,请返回一个包含订单 ID 的对象,而不是返回 BraintreeHttp.HttpResponse。

 [HttpPost]
    public async Task<Order> Post()
    {
        try
        {
            var request = new OrdersCreateRequest();
            request.Prefer("return=representation");
            request.RequestBody(BuildRequestBody());
            //3. Call PayPal to set up a transaction
            var response = await PayPalClient.client().Execute(request);
            Order order = new Order();
            var result = response.Result<Order>();


            if (result?.Status?.Trim()?.ToLower() == "created")
            {
                order.OrderId = result.Id;
            }

            return order;
        }
        catch (Exception ex)
        {
            string m = ex.Message;
            throw;
        }
    }

然后在我的js文件中。
 paypal.Buttons({
        createOrder: function () {


          return fetch('/api/paypal', {
            method: 'post',
            headers: {
              'content-type': 'application/json'
              }
          }).then(function(res) {
            return res.json();
          }).then(function (data) {
            return data.orderId; // the data is the order object returned from the api call, its not the BrainTree.Response object
          });
        }

对于代码质量不佳,很抱歉,我还在试图找出问题的过程中。希望你能掌握解决方案的要点。


1
我目前正在处理同样的事情。PayPal的示例C#服务器端代码(Checkout-NET-SDK)返回HttpResponse。为什么不直接返回订单并在客户端使用其ID呢?我想知道他们为什么这样做。当接收到HttpResponse时,他们的示例客户端代码无法成功从返回的HttpResponse中检索id。哪种服务器端语言会以这种方式工作呢? - Jay
我猜设计师可能有一些原因,但是当大公司没有按预期标准的方式完成事情时,这让人感到沮丧,因为他们有充足的资源,这会让你不得不自己去解决或者阅读更多的内容。如果我使用了 HttpClient,我也会期望有一个 HttpResponse,并且按顺序执行。 - kudzanayi

0
我之所以出现这种情况,是因为在createorder函数中有一个return false。购物车价值输入框不在那里,漏传了一个文件。这可能会有所帮助 :)
createOrder: function (data, actions) {
    var cartVal = $("body").find("#cartVal").val();
    if (typeof cartVal === 'undefined')
        return false;
});

0
如果您正在使用 PayPal SDK,请确保返回订单。
   createOrder={(data, actions) => {
          return this.createOrder(cartState, actions)
        }}

0
在您的第一个JS代码示例中,请尝试返回token变量而不是data.token。在该示例中,data.token只会返回一个对象(当我运行您的代码时,它返回了整个付款对象)。如果您仅返回token变量,它将返回所需的orderID值(EC-XXXXX)。我已经调整了您的代码示例如下。
 var CREATE_PAYMENT_URL = '/api/create-payment';
        var checkBox = document.getElementById("ship_to_different");
        var note = $("#ordernote").val();
        if (checkBox.checked == true){
            var body = $("#checkoutt, #data").serializeArray();
        }else{
            $('input[name=note]').val(note);
            var body = $("#data").serializeArray();

        }
        $("#wait").show();
        return fetch(CREATE_PAYMENT_URL, {
            method: 'post',
            headers: {
                'content-type': 'application/json'
            },
            body: JSON.stringify({
                body:body
            })

        }).then(function (res) {
            return res.json();
        }).then(function (data) {
          console.log(data);
            let token;

            for (let link of data.links) {
                if (link.rel === 'approval_url') {
                    token = link.href.match(/EC-\w+/)[0];
                }
            }

            return token;
        });

    },

0
只是以防万一,我并不回答这个问题,但可能会有用。我正在使用这个包,但是与一个Node服务器一起使用,并且我向服务器发送了一个非常长的数字,比如$25,000,然后我收到了错误信息“期望一个订单ID”。
而$25.00是可以正常工作的。

0

你的第一段代码应该可以工作。我的建议是检查你的浏览器控制台是否有任何错误。

Ref: https://developer.paypal.com/docs/checkout/reference/upgrade-integration/?mark=Ec%20token#4-set-up-the-transaction

代码:

createOrder: function(data, actions) {
    return fetch('{{ route('create-payment') }}', {
        headers: {
            'Content-Type': 'application/json',
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        },
        method: 'post',
        body: JSON.stringify({
            body:body
        })
    }).then(function(res) {
        return res.json();
    }).then(function(orderData) {
        console.log(orderData);
        // If you don't use ES2015 or higher replace 'let' with 'var'
        var token;
        for (link of orderData.links) {
            if (link.rel === 'approval_url') {
                token = link.href.match(/EC-\w+/)[0];
            }
        }
        return token;
    });
},

谢谢您的帮助,但请添加一些解释并说明您在链接中所指的内容。 - MJK
你使用过 PHP API v1 吗?PayPal-PHP-SDK - Salinda Lakmal
不需要使用REST API SDK for PHP V2提取令牌。您可以直接使用JavaScript代码作为示例。 - Salinda Lakmal
文档:https://developer.paypal.com/docs/checkout/reference/server-integration/setup-sdk/#http-request-headers - Salinda Lakmal

0
你需要发送付款的令牌而不是付款的ID。 如果你使用php,请使用以下代码:

// Instance of your ApiPayment
$payment = new ApiPayment();
$payment->getToken();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接