将JSON添加到Parse.Cloud.httpRequest" application / x-www-form-urlencoded"

时间:2016-01-08 16:39:59

标签: javascript json parse-platform stripe-connect

我一直在尝试将Stripe的托管帐户纳入我的云代码功能。 到目前为止,我设法使其工作,但现在我遇到了一个我似乎无法解决的问题。

归结为:     使用'content_type': 'application/x-www-form-urlencoded'如何发送JSON?

由于Stripe需要使用form-urlencoded,因此无法将content_type更改为application/JSON。 我试图将JSON字符串化,但是当我这样做时,Stripe也会抱怨。它期望一个' hash',我认为它是一个JSON。

是否可以对url进行编码,以便我可以在将content_type设置为form-urlencoded的同时发送它?

我的当前代码不起作用,因为Parse说:

  

未捕获错误:无法对对象进行编码

var secret_key = stripeKeys.stripeSecretKey;
var cardTokenId = "tok_...";
var country = "BE";
var currency = "EUR";
var email = "test@test.org";
var firstName = "test";
var lastName = "tester";
var dobDay = 1;
var dobMonth = 1;
var dobYear = 1950;
var addressCity = "City";
var addressCountry = "Country";
var addressLine = "Address line";
var addressZIP = "ZIP";
var addressProvince = "Province";       
var createAccountPromise = function()
{
    var params = 
        {
            url: "https://api.stripe.com/v1/accounts",
            method: "POST",
            headers: 
            {
                "Authorization": "Basic " + new Buffer(secret_key + ":").toString("base64"),
                "content_type": "application/x-www-form-urlencoded"
            },
            body: 
            {   
                "country": country,
                "default_currency": currency,
                "email": email,
                "managed": true,
                "legal_entity":
                    {
                        "first_name": firstName,
                        "last_name": lastName,
                        "type": "individual",
                        "dob":
                            {
                                "day": dobDay,
                                "month": dobMonth,
                                "year": dobYear
                            },
                        "personal_address":
                            {
                                "city": addressCity,
                                "country": addressCountry,
                                "line1": addressLine,
                                "postal_code": addressZIP,
                                "state": addressProvince
                            }
                    },
                "external_account": cardTokenId
            }
        };
    return Parse.Cloud.httpRequest(params);
}
createAccountPromise()
    .then(function(result)
    {
        console.log("SUCCESS: " + result.text);
        response.success("Account Created");
    },
    function(errorReason)
    {
        console.log("ERROR: " + errorReason.text);
        response.error("Account NOT Created because: " + errorReason.text);
    });

2 个答案:

答案 0 :(得分:3)

问题来自于application/x-www-form-urlencoded Content-Type导致属性列表“{1}}”,而您传递的是具有多个级别的分层对象。 JSON知道如何编码这样的对象,key=value没有(有几种不同的方法可以做到这一点,点符号,括号等)。

你应该做的是“压扁”你的JSON对象,使它只有一个级别,并使用“扩展”名称作为键。即而不是包含application/x-www-form-urlencoded的{​​{1}},而是直接设置legal_entity(以匹配Stripe使用的格式)。

所以,你的身体会是:

first_name

当然,如果你有更复杂的对象,可以在代码中“扁平化”而不是手动操作。

此外,您应该使用legal_entity[first_name],而不是body: { "country": country, "default_currency": currency, "email": email, "managed": true, "legal_entity[first_name]": firstName, "legal_entity[last_name]": lastName, "legal_entity[type]": "individual", "legal_entity[dob][day]": dobDay, "legal_entity[dob][month]": dobMonth, "legal_entity[dob][year]": dobYear "legal_entity[personal_address][city]": addressCity, "legal_entity[personal_address][country]": addressCountry, "legal_entity[personal_address][line1]": addressLine, "legal_entity[personal_address][postal_code]": addressZIP, "legal_entity[personal_address][state]": addressProvince "external_account": cardTokenId }

答案 1 :(得分:0)

使用related_sudo=True将json转换为x-www-form-urlencoded。然后发送请求。

encodeURIComponent

或者

return Parse.Cloud.httpRequest(encodeURIComponent(params));