简体   繁体   中英

Subscription failed using Stripe API in Google Apps Script

I'm trying to make an add-on using Google Apps Script & Stripe where user can subscribe for an item as an yearly subscription. Every time I purchase the subscription from Stripe checkout, I get error like this,

{
  "error": {
   "code": "parameter_unknown",
   "doc_url": "https://stripe.com/docs/error-codes/parameter-unknown",
   "message": "Received unknown parameter: @45b5a607",
   "param": "@45b5a607",
   "type": "invalid_request_error"
  }
}

When I check the log in Stripe Dashboard I get the POST body like this,

{
  "items": "[Ljava.lang.Object",
  "@45b5a607": null,
  "customer": "cus_Dix0eSYM5qP0kx"
}

This is my code in Google Apps Script,

var headers = {
    "Authorization" : "Basic " + Utilities.base64Encode(USERNAME + ':' + PASSWORD)
};

var customer = {
  'email': customerEmail,
  'source': token
};

var optCreate = {
  'method' : 'post',
  "headers" : headers,
  'contentType': 'application/x-www-form-urlencoded',
  'payload' : customer,
  'muteHttpExceptions' : true
};

var createCustomer = UrlFetchApp.fetch(urlCreate, optCreate);
var respCreate = JSON.parse(createCustomer.getContentText());
var customerId = respCreate.id;
if (customerId == null) { return "Error"; }

var data = {
  "customer" : customerId,
  "items" : [
    {
      "plan" : "plan_Diuw7CdAGcSrhm"
    }
  ]
};

var options = {
  'method' : 'post',
  "headers" : headers,
  'contentType': 'application/x-www-form-urlencoded',
  'payload' : data,
  'muteHttpExceptions' : true
};

var response = UrlFetchApp.fetch(url, options);
var resp = JSON.parse(response.getContentText());
Logger.log(resp);

I think I must be doing something wrong in my data JSON object. The items field is not working correctly that's why POST body is weird. What is the correct way here?

You need to stringify the payload.

var options = {
  'method' : 'post',
  "headers" : headers,
  'contentType': 'application/x-www-form-urlencoded',
  'payload' : JSON.stringify(data),
  'muteHttpExceptions' : true
};

It looks like you're POSTing JSON data, but Stripe's API does not accept JSON — you need to use form encoding. ie your code needs to set data to be in this format:

items[0][plan]=plan_CvVNfwZ4pYubYg&customer=cus_Diygqj4wAq6L9T

You can refer to cURL examples in Stripe's API docs for this. Generally you should use an official library to simplify making API requests, but that may not be possible with Apps Script.

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