I found the answer after visiting official Oracle forum. this line is determine the length of my body. When I send an english character it's accurate but some arabic letters is more than one byte.
the solution is to replace this line in my code:
UTL_HTTP.SET_HEADER(l_http_req, 'Content-Length', DBMS_LOB.GETLENGTH(l_payload));
with this line:
utl_http.set_header( l_http_req, 'Content-Length', utl_raw.length( utl_i18n.string_to_raw( l_payload, 'AL32UTF8' ) ) );
Thank you @Keon Lostrie for your help.