Вам нужно изменить
data: { data }
до
data: data
в вашем коде AJAX.
То, что делает ваша версия, это оборачивает данные внутри дополнительного объекта. Это приводит к тому, что отдельная переменная с именем «data» отправляется на сервер в теле запроса, например:
data=username%3Duser123%26password%3Dabcdef
Когда то, что вы действительно хотите, это:
username=user123&password=abcdef
Следовательно, PHP не распознает значения, которые вы отправляете. Он может видеть только одну переменную с именем «data», которая, насколько это касается, содержит случайную строку. Он должен иметь возможность видеть переменные «username» и «password» отдельно.
Если вы посмотрите на этот JSFiddle http://jsfiddle.net/jcx2Ly5e/3/ с открытыми сетевыми инструментами - отправьте форму и просмотрите два запроса в "test.php". Первое неверно, а второе - правильно. Загляните внутрь тела каждого запроса, чтобы увидеть разницу.
P.S. Как вы заметите, все это не имеет ничего общего с JSON. Ваш PHP возвращает JSON, но данные формы отправляются в стандартном формате, закодированном по URL-адресу формы. JSON не является частью проблемы, поэтому я отредактировал ваш вопрос, чтобы удалить это.