Hey @jerrycin , I wrote a ColdFusion CFC for PayPal's REST API as a result of this recent NVP issue too. I plan on sharing it via on Twitter/X & my blog after I've performed some more tests on production websites. https://x.com/gamesover https://dev.to/gamesover I've added caching to the token generation so that it's automatically fetched & refreshed as needed without ever having to explicitly check. (I've added a method to call it if needed for testing/refresh purposes.) When generating transactionID, an integer may be fine, but could be duplicated randomly and should always be unique... consider using createUUID() instead. I noticed that your example CFML code passes "type" &"brand" in the createOrder payment_source object. I don't see these keys listed in the official documentation. It's interesting that their API ignored the invalid keys rather than throwing an error. The integration for the library I'm working on looks like this: playPalClient = [
"name": "MyClient"
,"clientid": "3d56cbf6-02e2-4125-9d91-33465e04a56f-fake"
,"secret": "9763ea1b-3baa-4439-9e1d-df91aa19b936-fake"
,"descriptor": "ADDED-TO-CC-STATEMENT"
,"developmentMode": true
];
payPalApi = new PaypalRestAPI(
clientId = playPalClient.clientId
,clientSecret = playPalClient.secret
,descriptor = playPalClient.descriptor
,developmentMode = playPalClient.developmentMode
);
requestId = createuuid();
orderData = [
"requestId": requestId
,"amount": 15
,"name": "Joe CardUser"
,"cardnumber": "4556747948786484" // PayPal test
,"expdate": dateadd("m", 2, now()) // "yyyy-mm" or pass a date
,"cvv2": "789"
,"address": "123 ABC Street"
,"city": "Anytown"
,"state": "CA"
,"zip": "90210"
,"country": "US"
];
order = payPalApi.createOrder(argumentcollection=orderData);
if (order.responseCode neq "0000"){
writeoutput("CreateOrder Error: #order.errorMessage#");
//writedump(var=order, label="order");
exit;
}
orderDataToCapture = [
"requestId": requestId
,"id": order.id
];
capturedOrder = payPalApi.capture(argumentcollection=orderDataToCapture);
if (capturedOrder.responseCode neq "0000"){
writeoutput("Capture Error: #order.errorMessage#");
// writedump(var=order, label="order");
exit;
}
writeoutput("Success: Transaction ID #capturedOrder.id#");
writedump(var=capturedOrder, label="capturedOrder");
... View more