The difference: emoticon = ASCII, predominantly faces, emoji = graphical, predominantly symbols and images of various sorts.
More specifically, emoticons are older, and typically portray a whole face (but nothing else) with few exceptions. There are both Western and Eastern origin emoticons. Western ones typically take the sideways-on colon-eyed form like :), while Eastern ones typically take the right-side-up parentheses-bracketed form like (・_・;). There are also some non-facial emoticons, such as <3 and ☆彡; this also includes things like the tableflip (╯°□°)╯︵ ┻━┻ . In Western usage, formations with noses :-) are markedly of an older generation of users than those without.
Emojis first emerged in 1999, much more recently, in Japan. Rather than being symbol-drawn ASCII images, they are pre-made graphics. Since the late '00s, emojis have been standardized by incorporation into Unicode. Somewhat confusingly, there are emojis of emoticons, such as this:
, though they can also be virtually anything, such as tree, suns, warning signs, &c. Today, emojis are typically downloaded by users through their device manufacturers or third-party programs.
I'm not certain about this, but I
believe that it would be accurate to say that BBCode smilies are emojis, while the ASCII characters they're parsed from are emoticons. So, :) = emoticon,
= emoji. But the tl;dr is that emoticons = ASCII-drawn symbols (mostly faces, sometimes with hands in Eastern ones), emoji = graphically rendered symbols.