expressjs / body-parser

Node.js body parsing middleware
MIT License
5.43k stars 721 forks source link

application/x-www-form-urlencoded not parsed correctly #320

Closed ricxsar closed 6 years ago

ricxsar commented 6 years ago

Hi. I am working on chargify webhooks and the post body is not parsed correctly. The chargify webhooks send a post request with Content-Type: application/x-www-form-urlencoded.

See Chargify Webhooks Reference for more details.

Below is the minimal setup of the expressjs application:

import express from 'express';
import cors from 'cors';
import v1 from './routes/public/v1/index.js';
import logger from 'morgan';
import bodyParser from 'body-parser';

const app = express();

app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors());

app.get('/public', function (req, res) {
  res.send('Hello World!')
})

app.use('/public/v1', v1);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err    = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handler
app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.json({
        name: err.name,
        path: req.path,
        message: err.message,
        stack: err.stack
    });
});

export default app;

See below for the x-www-form-urlencoded string:

id=319951401&event=payment_success&payload[site][id]=55354&payload[site][subdomain]=test30&payload[subscription][activated_at]=2012-09-09%2011%3A38%3A33%20-0400&payload[subscription][balance_in_cents]=9900&payload[subscription][cancel_at_end_of_period]=false&payload[subscription][canceled_at]=&payload[subscription][cancellation_message]=&payload[subscription][coupon_code]=&payload[subscription][created_at]=2012-09-09%2011%3A38%3A32%20-0400&payload[subscription][credit_card][billing_address]=987%20Commerce%20St&payload[subscription][credit_card][billing_address_2]=Suite%20789&payload[subscription][credit_card][billing_city]=Greenberg&payload[subscription][credit_card][billing_country]=US&payload[subscription][credit_card][billing_state]=NC&payload[subscription][credit_card][billing_zip]=67890&payload[subscription][credit_card][card_type]=visa&payload[subscription][credit_card][current_vault]=bogus&payload[subscription][credit_card][customer_id]=0&payload[subscription][credit_card][expiration_month]=4&payload[subscription][credit_card][expiration_year]=2016&payload[subscription][credit_card][first_name]=Jane&payload[subscription][credit_card][id]=0&payload[subscription][credit_card][last_name]=Doe&payload[subscription][credit_card][masked_card_number]=XXXX-XXXX-XXXX-1111&payload[subscription][credit_card][vault_token]=1&payload[subscription][credit_card][customer_vault_token]=&payload[subscription][current_period_ends_at]=2012-10-09%2011%3A49%3A43%20-0400&payload[subscription][current_period_started_at]=2012-09-09%2011%3A49%3A43%20-0400&payload[subscription][customer][address]=123%20Main%20St&payload[subscription][customer][address_2]=Apt%20123&payload[subscription][customer][city]=Pleasantville&payload[subscription][customer][country]=US&payload[subscription][customer][created_at]=2012-09-09%2011%3A38%3A32%20-0400&payload[subscription][customer][email]=john%40example.com&payload[subscription][customer][first_name]=John&payload[subscription][customer][id]=0&payload[subscription][customer][last_name]=Doe&payload[subscription][customer][organization]=Acme%2C%20Inc.&payload[subscription][customer][phone]=555-555-1234&payload[subscription][customer][reference]=johndoe&payload[subscription][customer][state]=NC&payload[subscription][customer][updated_at]=2012-09-09%2011%3A38%3A32%20-0400&payload[subscription][customer][zip]=12345&payload[subscription][delayed_cancel_at]=&payload[subscription][expires_at]=&payload[subscription][id]=0&payload[subscription][next_assessment_at]=2012-10-09%2011%3A49%3A43%20-0400&payload[subscription][previous_state]=active&payload[subscription][payment_type]=credit_card&payload[subscription][product][accounting_code]=pro1234&payload[subscription][product][archived_at]=&payload[subscription][product][created_at]=2012-09-06%2010%3A09%3A35%20-0400&payload[subscription][product][description]=Vel%20soluta%20nihil%20qui%20accusamus%20quidem.&payload[subscription][product][expiration_interval]=&payload[subscription][product][expiration_interval_unit]=never&payload[subscription][product][handle]=handle_6a9273b8a&payload[subscription][product][id]=0&payload[subscription][product][initial_charge_in_cents]=&payload[subscription][product][interval]=1&payload[subscription][product][interval_unit]=month&payload[subscription][product][name]=Pro&payload[subscription][product][price_in_cents]=9900&payload[subscription][product][product_family][accounting_code]=aopf1234&payload[subscription][product][product_family][description]=Lorem%20ipsum%20dolor%20sit%20amet.&payload[subscription][product][product_family][handle]=acme-online&payload[subscription][product][product_family][id]=0&payload[subscription][product][product_family][name]=Acme%20Online&payload[subscription][product][request_credit_card]=true&payload[subscription][product][require_credit_card]=true&payload[subscription][product][return_params]=&payload[subscription][product][return_url]=&payload[subscription][product][trial_interval]=&payload[subscription][product][trial_interval_unit]=month&payload[subscription][product][trial_price_in_cents]=&payload[subscription][product][update_return_url]=&payload[subscription][product][updated_at]=2012-09-09%2011%3A36%3A53%20-0400&payload[subscription][signup_payment_id]=30&payload[subscription][signup_revenue]=99.00&payload[subscription][state]=active&payload[subscription][total_revenue_in_cents]=4200&payload[subscription][trial_ended_at]=&payload[subscription][trial_started_at]=&payload[subscription][updated_at]=2012-09-09%2011%3A49%3A44%20-0400&payload[transaction][amount_in_cents]=9900&payload[transaction][created_at]=2012-09-09%2011%3A38%3A33%20-0400&payload[transaction][ending_balance_in_cents]=0&payload[transaction][gateway_transaction_id]=&payload[transaction][gateway_order_id]=&payload[transaction][gateway_used]=bogus&payload[transaction][id]=0&payload[transaction][kind]=&payload[transaction][memo]=John%20Doe%20-%20Pro%3A%20Signup%20payment&payload[transaction][payment_id]=&payload[transaction][product_id]=0&payload[transaction][subscription_id]=0&payload[transaction][success]=true&payload[transaction][transaction_type]=payment&payload[transaction][type]=Payment&payload[transaction][component_id]=&payload[transaction][tax_id]=&payload[transaction][statement_id]=0&payload[transaction][card_number]=XXXX-XXXX-XXXX-1111&payload[transaction][card_expiration]=04%2F2016&payload[transaction][card_type]=visa&payload[transaction][invoice_id]=

Below is the parsed data:


event: 'payment_success',
'payload[site][id]': '55354',
'payload[site][subdomain]': 'test30',
'payload[subscription][activated_at]': '2012-09-09 11:38:33 -0400',
'payload[subscription][balance_in_cents]': '9900',
'payload[subscription][cancel_at_end_of_period]': 'false',
'payload[subscription][canceled_at]': '',
'payload[subscription][cancellation_message]': '',
'payload[subscription][coupon_code]': '',
'payload[subscription][created_at]': '2012-09-09 11:38:32 -0400',
'payload[subscription][credit_card][billing_address]': '987 Commerce St',
'payload[subscription][credit_card][billing_address_2]': 'Suite 789',
'payload[subscription][credit_card][billing_city]': 'Greenberg',
'payload[subscription][credit_card][billing_country]': 'US',
'payload[subscription][credit_card][billing_state]': 'NC',
'payload[subscription][credit_card][billing_zip]': '67890',
'payload[subscription][credit_card][card_type]': 'visa',
'payload[subscription][credit_card][current_vault]': 'bogus',
'payload[subscription][credit_card][customer_id]': '0',
'payload[subscription][credit_card][expiration_month]': '4',
'payload[subscription][credit_card][expiration_year]': '2016',
'payload[subscription][credit_card][first_name]': 'Jane',
'payload[subscription][credit_card][id]': '0',
'payload[subscription][credit_card][last_name]': 'Doe',
'payload[subscription][credit_card][masked_card_number]': 'XXXX-XXXX-XXXX-1111',
'payload[subscription][credit_card][vault_token]': '1',
'payload[subscription][credit_card][customer_vault_token]': '',
'payload[subscription][current_period_ends_at]': '2012-10-09 11:49:43 -0400',
'payload[subscription][current_period_started_at]': '2012-09-09 11:49:43 -0400',
'payload[subscription][customer][address]': '123 Main St',
'payload[subscription][customer][address_2]': 'Apt 123',
'payload[subscription][customer][city]': 'Pleasantville',
'payload[subscription][customer][country]': 'US',
'payload[subscription][customer][created_at]': '2012-09-09 11:38:32 -0400',
'payload[subscription][customer][email]': 'john@example.com',
'payload[subscription][customer][first_name]': 'John',
'payload[subscription][customer][id]': '0',
'payload[subscription][customer][last_name]': 'Doe',
'payload[subscription][customer][organization]': 'Acme, Inc.',
'payload[subscription][customer][phone]': '555-555-1234',
'payload[subscription][customer][reference]': 'johndoe',
'payload[subscription][customer][state]': 'NC',
'payload[subscription][customer][updated_at]': '2012-09-09 11:38:32 -0400',
'payload[subscription][customer][zip]': '12345',
'payload[subscription][delayed_cancel_at]': '',
'payload[subscription][expires_at]': '',
'payload[subscription][id]': '0',
'payload[subscription][next_assessment_at]': '2012-10-09 11:49:43 -0400',
'payload[subscription][previous_state]': 'active',
'payload[subscription][payment_type]': 'credit_card',
'payload[subscription][product][accounting_code]': 'pro1234',
'payload[subscription][product][archived_at]': '',
'payload[subscription][product][created_at]': '2012-09-06 10:09:35 -0400',
'payload[subscription][product][description]': 'Vel soluta nihil qui accusamus quidem.',
'payload[subscription][product][expiration_interval]': '',
'payload[subscription][product][expiration_interval_unit]': 'never',
'payload[subscription][product][handle]': 'handle_6a9273b8a',
'payload[subscription][product][id]': '0',
'payload[subscription][product][initial_charge_in_cents]': '',
'payload[subscription][product][interval]': '1',
'payload[subscription][product][interval_unit]': 'month',
'payload[subscription][product][name]': 'Pro',
'payload[subscription][product][price_in_cents]': '9900',
'payload[subscription][product][product_family][accounting_code]': 'aopf1234',
'payload[subscription][product][product_family][description]': 'Lorem ipsum dolor sit amet.',
'payload[subscription][product][product_family][handle]': 'acme-online',
'payload[subscription][product][product_family][id]': '0',
'payload[subscription][product][product_family][name]': 'Acme Online',
'payload[subscription][product][request_credit_card]': 'true',
'payload[subscription][product][require_credit_card]': 'true',
'payload[subscription][product][return_params]': '',
'payload[subscription][product][return_url]': '',
'payload[subscription][product][trial_interval]': '',
'payload[subscription][product][trial_interval_unit]': 'month',
'payload[subscription][product][trial_price_in_cents]': '',
'payload[subscription][product][update_return_url]': '',
'payload[subscription][product][updated_at]': '2012-09-09 11:36:53 -0400',
'payload[subscription][signup_payment_id]': '30',
'payload[subscription][signup_revenue]': '99.00',
'payload[subscription][state]': 'active',
'payload[subscription][total_revenue_in_cents]': '4200',
'payload[subscription][trial_ended_at]': '',
'payload[subscription][trial_started_at]': '',
'payload[subscription][updated_at]': '2012-09-09 11:49:44 -0400',
'payload[transaction][amount_in_cents]': '9900',
'payload[transaction][created_at]': '2012-09-09 11:38:33 -0400',
'payload[transaction][ending_balance_in_cents]': '0',
'payload[transaction][gateway_transaction_id]': '',
'payload[transaction][gateway_order_id]': '',
'payload[transaction][gateway_used]': 'bogus',
'payload[transaction][id]': '0',
'payload[transaction][kind]': '',
'payload[transaction][memo]': 'John Doe - Pro: Signup payment',
'payload[transaction][payment_id]': '',
'payload[transaction][product_id]': '0',
'payload[transaction][subscription_id]': '0',
'payload[transaction][success]': 'true',
'payload[transaction][transaction_type]': 'payment',
'payload[transaction][type]': 'Payment',
'payload[transaction][component_id]': '',
'payload[transaction][tax_id]': '',
'payload[transaction][statement_id]': '0',
'payload[transaction][card_number]': 'XXXX-XXXX-XXXX-1111',
'payload[transaction][card_expiration]': '04/2016',
'payload[transaction][card_type]': 'visa',
'payload[transaction][invoice_id]': '' }```
ricxsar commented 6 years ago

I'm using the latest version of body-parser: 1.18.3

dougwilson commented 6 years ago

You have in your code extended: false but the data looks like the extended version. Are you sure you don't want it to be extended: true? If not, I'm not clear on what exactly the issue is, as that looks like a correct parse when you have extended set to false to me.

ricxsar commented 6 years ago

I will try to set it to true.

ricxsar commented 6 years ago

It is correctly parsed now. Sorry for the inconvenience. I will now close the issue. Thank you for helping me out. I am still novice. Suggestion: maybe you can add some small examples to help beginners like me.