公元757年九月丁丑日,蔡希德率领轻骑兵到上党城下挑战。程千里率领一百名骑兵打开城门,突然杀出,想要活捉蔡希德;恰逢叛军的救兵赶到,程千里只得收拢骑兵退回城中。这时城门的桥梁损坏,程千里失足掉进壕沟里,反而被蔡希德擒获。他抬头对身边的骑兵说:“我不幸落到这个地步,是天意啊!回去告诉各位将领,好好坚守城池,宁可失去主帅,也不能丢掉城池。”蔡希德继续攻城,最终还是没能攻克,便把程千里押送到洛阳。安庆绪任命程千里为特进,把他囚禁在客省之中。
郭子仪认为回纥的骑兵精锐善战,劝说肃宗多征召回纥兵力来攻打叛军。怀仁可汗派遣他的儿子叶护以及将军帝德等人,率领四千多名精锐骑兵赶到凤翔。肃宗亲自接见叶护,设宴犒劳,赏赐财物,满足他的一切要求。丁亥日,元帅广平王李俶率领朔方等镇的军队,以及回纥、西域的援军,共计十五万人,号称二十万大军,从凤翔出兵东征。李俶见到叶护后,与他结拜为兄弟,叶护十分高兴,称呼李俶为兄长。回纥军队抵达扶风时,郭子仪留他们宴饮了三天。叶护说:“国家正有危难,我们远道而来援助,哪里还顾得上吃喝!”宴会结束后,回纥军队立即启程。朝廷每天供给回纥军二百只羊、二十头牛、四十斛米。
庚子日,各路大军一同出发;壬寅日,抵达长安城西面,在香积寺北面、沣水东岸列阵。李嗣业担任前军主将,郭子仪担任中军主将,王思礼担任后军主将。叛军十万大军在官军北面列阵,李归仁出阵挑战,官军追击他,一直逼近叛军的阵地。叛军全军齐出,官军向后退却,叛军趁机猛攻,军中陷入慌乱,叛军争相奔袭官军的辎重。李嗣业说:“今天如果不豁出性命抵挡叛军,官军就会全军覆没了!”于是他袒露上身,手持长刀,站在阵前,大声呼喊着奋力冲杀。凡是被他的长刀砍中的叛军,人马都被劈成碎块。他一连斩杀了几十名叛军,官军的阵势才逐渐稳定下来。随后李嗣业率领前军将士,各持长刀,排成墙一般的队列向前推进,他身先士卒,所到之处,叛军纷纷溃败。都知兵马使王难得为了援救自己的副将,被叛军的箭射中眉心,皮肤下垂遮住了眼睛。王难得自己拔出箭,扯掉下垂的皮肤,鲜血流满了脸庞,依旧向前奋战不止。叛军在阵地东侧埋伏了精锐骑兵,想要偷袭官军的后方,官军的侦察兵发现了这个情况,朔方左厢兵马使仆固怀恩率领回纥骑兵前去攻打伏兵,几乎将叛军的伏兵全部歼灭,叛军的士气因此大落。李嗣业又与回纥军队绕道来到叛军阵地的后方,与官军主力前后夹击叛军。从午时一直打到酉时,官军斩杀叛军首级六万颗,叛军士兵填沟坠堑而死的不计其数,叛军于是大败溃逃。残余的叛军逃回长安城中,到了夜里,城中依旧喧嚣不止。
仆固怀恩对广平王李俶说:“叛军已经弃城逃走了,请允许我率领二百名骑兵追击,一定能活捉安守忠、李归仁等人。”李俶说:“将军作战已经很疲惫了,暂且休息一晚,等到明天再做打算。”仆固怀恩说:“安守忠、李归仁是叛军的猛将,他们刚刚打了胜仗却突然溃败,这是上天赐予我们的良机,怎能放过他们!如果让他们重新收拢部众,再来作乱,到时我们后悔都来不及了!打仗讲究速战速决,为什么要等到明天早上呢!”李俶坚决阻止他,让他返回营中休息。仆固怀恩坚持请求追击,他出去又回来,一夜之间往返了四五次。天快亮的时候,侦察兵回来报告,安守忠、李归仁已经和张通儒、田乾真等人逃走了。癸卯日,官军主力进入西京长安。
当初,肃宗想要尽快收复京师,与回纥约定说:“攻克长安的那天,土地和百姓都归唐朝所有,金银布帛和女子都归回纥所有。”到了官军收复长安的时候,叶护打算按约定行事。广平王李俶连忙跪在叶护的马前说:“如今我们刚刚收复西京,如果马上就对城中进行掳掠,那么东京洛阳的百姓就会为叛军拼死坚守,我们就再也无法收复东京了。希望能等到攻克东京之后,再履行约定。”叶护又惊又喜,连忙跳下马回拜,双手捧着李俶的脚说:“我愿意为殿下立刻进军东京。”随即与仆固怀恩率领回纥、西域的军队从长安城南绕行,在浐水东岸扎营。长安的百姓、官军士兵以及胡人,看到李俶下跪的场景,都流着泪说:“广平王真是汉族和异族共同的君主啊!”肃宗听说这件事后,高兴地说:“我比不上广平王啊!”李俶整顿军队进入长安城中,城中的百姓扶老携幼,夹道欢呼,有人喜极而泣。李俶留在长安,安抚百姓三天后,率领大军向东进发。肃宗任命太子少傅虢王李巨为西京留守。
甲辰日,捷报传到凤翔,文武百官入朝庆贺。肃宗泪流满面,当天就派遣宦官啖庭瑶前往蜀地,向太上皇奏报收复长安的喜讯,又命左仆射裴冕前往长安,祭告天地宗庙,并且安抚城中的百姓。
肃宗派驿马从长安召回李泌。李泌抵达凤翔后,肃宗说:“我已经上表请求太上皇返回长安,我打算回到东宫,重新尽到人子的本分。”李泌说:“那份奏表还能追回来吗?”肃宗说:“已经送出去很远了。”李泌说:“这样的话,太上皇不会回来了。”肃宗大惊,询问其中的缘故。李泌说:“这