简体   繁体   中英

RESOURCE_NOT_FOUND in Paypal

I have to setup paypal for payment in my ReactJs Project. Inorder to that i create paypal button and Call PayPal to get the transaction details. It seems it works well and i got success message with transaction details also.And the problem arise here is when i try to Validate the transaction details are as expected in my server side ie, nodejs (as mention here: " https://developer.paypal.com/docs/checkout/reference/server-integration/capture-transaction/ ")i got this Error. In my nodjs project i am using " @paypal/checkout-server-sdk ".

My code is:

in ReactJs: PaypalButton.js

import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";

const PaypalButton = props => {
const [sdkReady, setSdkReady] = useState(false);

const addPaypalSdk = () => {
const clientID ="**********CLIENT_ID**************";
const script = document.createElement("script");
script.type = "text/javascript";
script.src = `https://www.paypal.com/sdk/js?client-id=${clientID}`;
script.async = true;
script.onload = () => {
  setSdkReady(true);
};
script.onerror = () => {
  throw new Error("Paypal SDK could not be loaded.");
};

document.body.appendChild(script);
};

useEffect(() => {
if (window !== undefined && window.paypal === undefined) {
  addPaypalSdk();
} else if (
  window !== undefined &&
  window.paypal !== undefined &&
  props.onButtonReady
) {
  props.onButtonReady();
}
}, []);

//amount goes in the value field we will use props of the button for this
const createOrder = (data, actions) => {
console.log("createOrder", data);
return actions.order.create({
  purchase_units: [
    {
      amount: {
        currency_code: "USD",
        value: props.amount
      }
    }
  ]
});
};

const onApprove = (data, actions) => {
return actions.order
  .capture()
  .then(details => {
    if (props.onSuccess) {
      window.alert("Payment Sucessfull...");
      return props.onSuccess(data, details);
    }
  })
  .catch(err => {
    console.log(err);
  });
  };

 const clickPaypal = flag => {
    return props.onClick(flag);
 };

if (!sdkReady && window.paypal === undefined) {
  return <div>Loading...</div>;
}

const Button = window.paypal.Buttons.driver("react", {
React,
ReactDOM
});

return (
  <div style={{ width: 200 }}>
  <Button
    {...props}
    createOrder={
      props.amount && !createOrder
        ? (data, actions) => createOrder(data, actions)
        : (data, actions) => createOrder(data, actions)
    }
    onApprove={
      props.onSuccess
        ? (data, actions) => onApprove(data, actions)
        : (data, actions) => onApprove(data, actions)
    }
    style={{
      layout: "horizontal",
      color: "gold",
      shape: "pill",
      label: "pay",
      size: "responsive",
      tagline: true
    }}
    onClick={props.onClick ? clickPaypal : clickPaypal}
  />
</div>
);
};
export default PaypalButton;

Pay.js

onSuccess = (payment, details) => {
const {
  processInvoicePaypalPayment
} = this.props;

this.paypalSucesssDetails = { ...details };

processInvoicePaypalPayment( .     //call to server
  {
    invoice: invoice.data._id,
    orderId: this.paypalSucesssDetails.id // This order id is from sucess transaction details
  },
  this.paypalCapture
);
};

render=()=>{
   <PaypalButton
    amount={invoiceData.amount}
    onSuccess={this.onSuccess}
    env={"sandbox"}
    onClick={this.clickPaypal}
   />
}

and in my nodejs

 import paypal from "@paypal/checkout-server-sdk";
      const clientId = "CLIENTID";
      const clientSecret = "SECRET";
      const environment = new paypal.core.SandboxEnvironment(clientId, clientSecret);
      const client = new paypal.core.PayPalHttpClient(environment);

      try{
      export const processInvoicePaypalPayment = async (user, data) => {
             const customerId = user.customer,
             { invoice: invoiceId, orderId: orderID } = data;

             let request = new paypal.orders.OrdersGetRequest(orderID);
       const createOrder = async () => {
       const response = await client.execute(request);

       return { ok: true, data: { _id: invoiceId, payment: response.result } };

       };

       const result = await createOrder();

       }
       }catch (err) {
         console.log(err);
       }

And the result is:

  { Error: {"name":"RESOURCE_NOT_FOUND","details": 
  [{"location":"path","issue":"INVALID_RESOURCE_ID","description":"Specified resource ID does not exist. Please check the resource ID and try again."}],"message":"The specified resource does not exist.","debug_id":"c3b5026d6dd74","links":[{"href":"https://developer.paypal.com/docs/api/orders/v2/#error-INVALID_RESOURCE_ID","rel":"information_link","method":"GET"}]}

How can i solve this issue? Any help and Suggestion will be greatly appreciated.

What seems to be happening is that you have a client-side integration for processing the transaction, and then you are attempting to use a server-side API call to check the order status, but that server-side API call is not compatible with the order processing that you used.

You have two options:

  1. Switch to a server-side API call on the payment ID , not the order ID. This is documented here:https://developer.paypal.com/docs/api/payments/v2/#captures_get . A payment ID is more useful than an order ID anyway, since the payment/transaction ID is what is actually persisted for years in www.paypal.com and used for accounting purposes. The order ID is only used during payment approval.

  2. Switch to a server-side integration pattern, like this one: https://developer.paypal.com/demo/checkout/#/pattern/server . Then you will be doing your own API calls to set up and capture the payment, and your existing OrdersGetRequest(..) can work

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM