First of all: YOU CAN’T.
Now for real, there’s a workaround, just buid your vCard text to be rendered as QR Code by removing the spaces between the first name words, and the last name words (surname that you may like).
N:Johns Phillips;John Philip;;; (Last Name;First Name;;;)
and then, in the address book editing form that appears in Android you just tap in the middle of the joined words and press space.
It will be MUCH faster than moving around in the fields the misplaced name components.
There is NO WAY to actually have a vcard data correctly formatted to be correctly rendered by a QR Code scanner and correctly passed to the address book.
If you used a correctly formatted vCard file to directly import it in Android address book, it will work (for example, first export a vCard file for a contact, and then reverse engineer it… but to actually copy the VCF to the phone for each contact and manually importing it would be time consuming and bothersome); but if you use a generated QR code from the vCard code, each and every QR scanner out there will pass the full name data to the address book as a single unformatted string, IGNORING the name components of the N field, leaving the address book parser to decypher which is which.
So, depending on how you go about hacking your way into the vCard format, you might get
John (first name) Philip Johns (middle name) Phillips (last name)
or any other weird combination, BUT the one you were looking for.
Believe me, I tried, and chances are, if you ended up here, you did, too.
In my case I spend on it much more time than I care to admit. More than I needed to actually code from scratch the PHP to generate the relevant QR code into my management software.
So just embrace this workaround, but if you find a solution, please Please PLEASE share in the comments.