好在程天河决非徒有虚名,一得知慕容豹投敌就已经开始备战,发现进兵神速的萧骑后临危不乱,当即遣三万骑兵正面迎战,让城内的何晟率两万燕骑从侧翼进攻,自己率三万齐骑掠阵。可惜貌似神武的齐骑已有二十余年未曾大战,战力远不及北燕骑兵,五万联军在两万龙卷风冲击之下,竟然有崩溃之象。程天河当机立断,交待监军太监吴澄领五万步卒入燕京城加强城防,副帅刘锟率剩余十五万人沿城墙结鹿柴、挖壕沟、搭拒马、布弓弩。自己则亲率三万骑兵加入战局,以八万骑对两万骑。
见主帅当先,齐军士气大振,三面受敌的萧挞渐渐不支,不得不边打边退,程天河本不想追击,但姜琮视此战为国战,已下了死令,必得北燕全境,只得冒险进攻。萧挞一退五十余里,死伤惨重,但章法不乱,败退三十里后,赫连大地的后续骑兵陆续赶到,加入战局,齐军顿呈败相。何晟一见不妙,更是马上退出战局,见机再降大周,燕齐联军瞬间就被击溃,数万人马四处逃散,死伤无数。程天河一来想为燕京城防争取时间,二来得此大败亦无颜苟活,率亲兵两千骑死战不退全部战死。北燕境内多为平原,极利马战,赫连一边遣轻骑四处追击,一边集中一万覆甲重骑、五万轻骑直扑燕京城。
其实程天河已有预感,齐军挡不住周骑,唯有清野坚壁、据城死守,待周军粮草不济,自会退军。之所以不是全员进城,是因为燕京城小,如全员进城,为周骑所困,几日功夫就会弹尽粮绝,不战而败。而在城下布防,加上城头的强矢劲弩,周军极难围城。故临走布置实为上策,可惜身为枢密使兼兵部尚书的副帅刘锟自认是皇上心腹,嫉恨本已隐退的程天河官职压过自己一头,不听监军吴澄劝告,执意领五万步卒进军,想在骑兵得胜后抢夺战果,而城外布防亦不果断,阵形松散。待那五万步卒赶出二十余里,得知前方骑兵战败,不是就地布防,而是急急后撤,阵形大乱,后方追至的周骑不废吹灰之力,轻易就将这五万步卒消灭,仅刘锟等十余骑逃回城内。所幸老太监吴澄曾随太祖征战,还算老道,强令城内兵丁壮士上城墙死守,关闭所有城门,并令城外十万守军拼死结阵拒敌。可怜城外尚未完成布防的十万守军在北周铁甲重骑的冲击下,死伤惨重。直到天黑周骑收兵后,吴澄令五万城内守军出城会同城外残兵连夜布防,总算有了喘息之机。
再说这周军经过一天一夜的赶路、拼杀,也已疲惫至极,加上都是骑兵,无法攻城,故当夜就在城外二十里处扎营,此后几天也不急于攻城,一边四处追杀溃军,一边就地征集粮草,想待城内守军断粮后不攻自破。周军有一支追杀逃散齐骑的轻骑,约一万人马,一时追得兴起,在燕京城南百里处与姜琮的御林军不期而遇,自以为齐骑羸弱、不堪一击,率先发起进攻,不想那五万皇家骑兵乃齐国最精锐的军队,加上御驾亲征,士气高昂,人人争先,竟是将不可一世的周骑杀得大败而逃。姜琮知悉前方败绩,又急调国内兵马驰援,一面向燕京城输送兵员粮草,一面在黄河两岸加强布防,但也不敢主动出击。而赫连大地因起兵时未曾想到齐国会用举国之力来战,兵力、粮草准备不足,又恐国内刚刚收复的几大部族联手反叛,时至深秋,也无意再战,故在燕京城下与齐议和。
议和结果是周得北燕幽州以北的云、涿、朔、应、蓟五州,齐得幽、檀等七州,并在幽云两州设榷场互市,北燕亡,自此周齐完全形成对峙之势。这一战,看似齐得了七州土地,但损失约占全国一半的七万骑兵、十五万步卒另有钱粮无数,更惨的是东北方屏障尽失,真正是一场惨败。姜琮将此战失利之责尽数归咎枢密使刘锟,去功名、处凌迟、夷三族,但对国内仍称此战乃是灭燕大捷,封赏三军,死守燕京城外的校尉杨伐,战后两年被擢升至游击将军。周国虽也损失了三万骑,但未伤元气,尽得南下门户,自此占尽先机。此后十余年,大战没有,小战不断,周骑时时深入齐境劫掠,齐军多不敢应战,只能据城自守,边民苦不堪言。