首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >PayPal智能按钮INVALID_RESOURCE_ID

PayPal智能按钮INVALID_RESOURCE_ID
EN

Stack Overflow用户
提问于 2020-06-29 16:03:24
回答 1查看 684关注 0票数 0

我试图通过使用SmartButtonsserver side中创建订单来集成我的网站上的PayPal支付。

在遵循文档中的步骤之后,比如初始化按钮,然后通过设置服务器端代码来创建orderID,当我尝试付款时,我在客户端得到以下错误:

代码语言:javascript
代码运行次数:0
运行
复制
Error: INVALID_RESOURCE_ID↵    at https://www.sandbox.paypal.com/smart/buttons?style.label=paypal&style.layout=horizontal&style.color=gold&style.shape=rect&style.tagline=false&style.height=52&components.0=buttons&locale.country...

在客户端收到的orderID是正确的,因为它与在paypal仪表板上创建的相同。在阅读了其他一些类似的问题后,有人说要捕获支付onApprove,但即使在设置了捕获支付的接口之后,请求也没有进入到捕获支付的API中。

我的按钮代码如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
var PAYPAL_SCRIPT = 'https://www.paypal.com/sdk/js?client-id=XXXXXX&currency=EUR';
var script = document.createElement('script');
script.setAttribute('src', PAYPAL_SCRIPT);
script.onload = function(){
    paypal.Buttons({
        style: {
            shape: 'rect',
            color: 'gold',
            layout: 'horizontal',
            label: 'paypal',
            tagline: false,
            height: 52
        },
        createOrder: function() {
            return fetch('https://localhost:44350/payment/paypal/order/create/', {
              method: 'post',
              headers: {
                'content-type': 'application/json'
              }
            }).then(function(res) {
              return res.json();
            }).then(function(data) {
              return data.headers[2].Value[0]; // Use the same key name for order ID on the client and server
            });
        },
        onApprove: function(data, actions) {
          return fetch('https://localhost:44350/payment/paypal/' + data.headers[2].Value[0] + '/capture/', {
            method: 'post'
        }).then(function(res) {
            return res.json();
        }).then(function(details) {
            // Show a success message to the buyer
            alert('Transaction completed by ' + details.payer.name.given_name + '!');
        });
        }
    }).render('#paypal-button-container');
}
document.head.appendChild(script);

然后我的api控制器如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
    [HttpPost("paypal/order/create/")]
    public Task<HttpResponse> PayPal()
    {
        
        return PaypalHelper.CreateOrder("XXXXX", "XXXXXX", true);
    }

    [HttpPost("paypal/{orderID}/capture/")]
    public Task<HttpResponse> PayPal(string orderID)
    {

        return PaypalHelper.CaptureOrder(orderID, "XXXXX", "XXXXX", true);
    }

其中创建订单的方法如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
 public async static Task<HttpResponse> CreateOrder(string publickey, string privatekey, bool debug = false)
        {
            var request = new OrdersCreateRequest();
            request.Prefer("return=representation");
            request.RequestBody(BuildRequestBody());
            //3. Call PayPal to set up a transaction
            var response = await PayPalClient.client(publickey, privatekey).Execute(request);

            if (debug)
            {
                var result = response.Result<Order>();
                Console.WriteLine("Status: {0}", result.Status);
                Console.WriteLine("Order Id: {0}", result.Id);
                Console.WriteLine("Intent: {0}", result.CheckoutPaymentIntent);
                Console.WriteLine("Links:");
                foreach (LinkDescription link in result.Links)
                {
                    Console.WriteLine("\t{0}: {1}\tCall Type: {2}", link.Rel, link.Href, link.Method);
                }
                AmountWithBreakdown amount = result.PurchaseUnits[0].AmountWithBreakdown;
                Console.WriteLine("Total Amount: {0} {1}", amount.CurrencyCode, amount.Value);
            }

            return response;
        }

        private static OrderRequest BuildRequestBody()
        {
            var order = new OrderRequest()
            {
                CheckoutPaymentIntent = "CAPTURE",
                PurchaseUnits = new List<PurchaseUnitRequest>()
                {
                    new PurchaseUnitRequest()
                    {
                        AmountWithBreakdown = new AmountWithBreakdown()
                        {
                            CurrencyCode = "EUR",
                            Value = "100.00"
                        }
                    }
                },
                ApplicationContext = new ApplicationContext()
                {
                    ReturnUrl = "https://www.example.it/vmenu?paypal=success",
                    CancelUrl = "https://www.example.com?paypal=error"
                }
            };

            return order;
        }

createOrder fetch中的数据如下:

代码语言:javascript
代码运行次数:0
运行
复制
{headers: Array(3), statusCode: 201}headers: Array(3)0: {Key: "Cache-Control", Value: Array(1)}1: {Key: "Date", Value: Array(1)}2: Key: "Paypal-Debug-Id"Value: ["97fcfafaae8ef"]__proto__: Objectlength: 3__proto__: Array(0)statusCode: 201__proto__: Object
menu_test.js:33

而通过获取data.headers[2].Value[0],结果是97fcfafaae8ef

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-06-29 19:06:25

您传递的ID错误。贝宝调试Id不是orderID。

同样,orderID不会在头中返回,它们在主体中返回,作为'id‘。

您可以在此处查看示例响应:https://developer.paypal.com/docs/api/orders/v2/#orders_create

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62633683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档