package Ġcom . run yu . http Ċ Ċ import Ġcom . run yu . com . run yu . worker . Worker Master Ċ import Ġcom . run yu . std . Const Ċ import Ġcom . run yu . std . Const . Prompt . USER _ FOUND Ċ import Ġcom . run yu . std . Const . Prompt . USER _ NOT _ LOGIN Ċ import Ġcom . run yu . std . ID Gen Ċ import Ġcom . run yu . std . Log Ċ import Ġcom . run yu . std . Msg Ċ import Ġcom . run yu . user . C us User Ċ import Ġcom . run yu . user . User Ċ import Ġcom . run yu . wechat . PKCS 7 Encoder . decode Ċ import Ġcom . run yu . wechat . Wx Service Ċ import Ġcom . run yu . worker . Work Http Agent Ċ import Ġio . vertx . core . json . JsonObject Ċ import Ġio . vertx . reactivex . ext . web . Router Ċ import Ġio . vertx . reactivex . ext . web . Routing Context Ċ import Ġsun . misc . BASE 6 4 Decoder Ċ import Ġjava . nio . charset . Charset Ċ import Ġjava . time . LocalDateTime Ċ import Ġjavax . crypto . Cipher Ċ import Ġjavax . crypto . spec . Iv Parameter Spec Ċ import Ġjavax . crypto . spec . SecretKey Spec ĊĊ Ċ class ĠW x Handler ( var Ġapp Key : String , Ġsecret : String , var Ġpath : String , Ġvar Ġrouter : ĠRouter , Ġvar Ġagent : ĠWork Http Agent , Ġvar Ġdb Work Id : String ) Ġ{ ĊĠĠ Ġ// Ġprivate Ġval Ġm Wx Service = ĠW x Service (" w xa 0 7 1 1 5 7 0 1 8 8 d 8 1 fe ", Ġ" 9 4 e 1 2 8 e 8 9 af 9 8 c 1 bdd 8 f 5 5 9 8 dd 1 4 c 1 8 2 ") ĊĠĠ Ġ// Ġprivate Ġval Ġm Wx Service = ĠW x Service (" wx 2 de 3 1 6 d 9 5 0 a 4 9 f 4 2 "," c 6 7 8 3 fc 4 4 8 9 3 6 f 9 7 b 2 c 1 a 9 9 bbb 4 1 b 8 8 4 ") // å±± éĿĴ èĬ± ç ĩ ĥ ĊĠĠ Ġ// Ġprivate Ġval Ġm Wx Service = ĠW x Service (" w xe bef 4 e 0 6 df 5 8 4 7 6 a ", Ġ" 2 3 8 3 cac 8 8 c 6 c 9 8 e 7 4 5 6 6 ca 9 1 0 d 4 5 5 1 7 8 ") // ask q å°ı ç¨ĭåºı ĊĠĠĠ Ġprivate Ġval Ġm Wx Service = ĠW x Service ( app Key , secret )// å±± éĿĴ èĬ± ç ĩ ĥ ĊĠĠĠ Ġprivate Ġvar Ġm Han l der : (( user : User , userInfo : JsonObject )-> Unit )? = null ĊĠĠĠ Ġinit { ĊĠĠĠĠĠĠĠ Ġrouter . POST ("$ path / wx Login ", this :: handle Wx Login ) ĊĠĠĠĠĠĠĠ Ġrouter . POST ("$ path / wx GetUser ", this :: handle Wx GetUser ) ĊĠĠĠĠĠĠĠ Ġrouter . POST ("$ path / wx UserInfo ", this :: handle Wx Info User ) ĊĊĊĠĠĠĠĠĠĠ Ġrouter . post () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġwx Service (): Wx Service { ĊĠĠĠĠĠĠĠ Ġreturn Ġm Wx Service ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġset Handler ( block :( user : ĠUser , ĠuserInfo : JsonObject )-> Unit ): Wx Handler { ĊĠĠĠĠĠĠĠ Ġm Han l der = block ĊĠĠĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Wx Login ( rc : ĠRouting Context ): Unit { ĊĠĠĠĠĠĠĠ Ġval Ġcode Ġ= Ġrc . request (). getParam (" code ") ĊĠĠĠĠĠĠĠ Ġm Wx Service . wx Login ( code ) Ġ{ Ġuser -> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif ( null != user ){ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// æŃ¤ æĹ¶ åĬłåħ¥ çļĦ åħ¶å®ŀ åıªæľī å¦Ĥä¸ĭ ä¿¡æģ¯ ï¼ļ userId ï¼Į user _ token , openid , wx Token ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// åħĪ cache åĪ° Redis ï¼Į çŃī åĪ° è§£ åĩº çĶ¨æĪ· ä¿¡æģ¯ åĲİ æīį ä¸Ģèµ· åĬłåħ¥ æķ°æį®åºĵ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . token = ID Gen . str Id () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġuser . expired Time Ġ= ĠC us User . format ( LocalDateTime . now (). plus Seconds ( Worker Master . getUser Token Timeout ()). toString ()) // èĩªåĭķ å»¶ éķ· æĻĤéĸĵ 2 åĢĭ å°ı æĻĤ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ä»¥ çĶ¨æĪ· èĩªå®ļä¹ī æµģç¨ĭ ä¼ł åĽŀ çļĦ userId ä½ľä¸º key ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC us User . add User ( user ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). good ( user . toJson ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} else ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). error ( Const . Err User NotFound ())) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġprivate Ġfun Ġhandle Wx Info User ( rc : ĠRouting Context ): Unit { ĊĠĠĠĠĠĠĠ Ġvar Ġtoken : String ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġvar Ġencrypted Data Ġ: String ? ="" ĊĠĠĠĠĠĠĠ Ġvar Ġiv : String ? Ġ= Ġ"" ĊĊĠĠĠĠĠĠĠ Ġrc . body As Json ?. let { ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtoken = it . getString (" token ", null ) Ġ// è¿Ļä¸ª token æĺ¯ ä¸ĢèĪ¬ çļĦ token ï¼Į ä¸įæĺ¯ wx çļĦ token ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencrypted Data = it . getString (" encrypted Data ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġiv = it . getString (" iv ") ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" body ", rc . body As Json ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// æµĭè¯ķ åĲİ éľĢè¦ģ åħ³ æİī ä¸ĭéĿ¢ è¿Ļ è¡Į ĊĠĠĠĠĠĠ Ġ// Ġvar Ġresult : ĠString ? Ġ= Ġdecrypt ( encrypted Data , Ġtoken , Ġiv ) ĊĊĠĠĠĠĠĠĠ Ġval Ġuser = C us User . getUser ( token ) ĊĠĠĠĠĠĠĠ Ġif ( null == user ){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). error ( 1 0 5 , ĠUSER _ NOT _ LOGIN )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// //////// ////// Ġ 2 ãĢģ å¯¹ encrypted Data åĬłå¯Ĩ æķ°æį® è¿Ľè¡Į AES è§£ å¯Ĩ Ġ// //////// ////// ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult : ĠString ? Ġ= Ġdecrypt ( encrypted Data , Ġuser . wx Token , Ġiv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( null Ġ!= Ġresult Ġ&& Ġresult . length Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġm Han l der ?. invoke ( user , Msg ( result )) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). bad (" çĶ¨æĪ· ä¿¡æģ¯ èİ·åıĸ å¤±è´¥ ")) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġ// è¿ĶåĽŀ çĶ¨æĪ· æķ°æį® ĊĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). good (" çĶ¨æĪ· ä¿¡æģ¯ å·² èİ·å¾Ĺ ")) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġhandle Wx GetUser ( rc : ĠRouting Context ): Unit { ĊĠĠĠĠĠĠĠ Ġval Ġtoken Ġ= Ġrc . request (). getParam (" token ") ĊĠĠĠĠĠĠĠ Ġif ( null == C us User . getUser ( token )){ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). error ( 0 , USER _ FOUND )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// è¿ĶåĽŀ çĶ¨æĪ· æķ°æį® ĊĠĠĠĠĠĠĠ Ġrc . response (). reply Json ( Msg (). good ( C us User . getUser ( token ) !!. toJson ())) ĊĠĠĠ Ġ} ĊĊĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ å¯¹äºİ å®ĺæĸ¹ åĬłå¯Ĩ æķ°æį® ï¼Ī encrypt Data ï¼ī è§£ å¯Ĩ è¯´æĺİ å¦Ĥä¸ĭ ï¼ļ Ġ åĬłå¯Ĩ æķ°æį® è§£ å¯Ĩ ç®Ĺæ³ķ Ġ æİ¥åı£ å¦Ĥæŀľ æ¶ ī åıĬ æķ ı æĦŁ æķ°æį® ï¼Ī å¦Ĥ wx . getUser Info å½ĵ ä¸ŃçļĦ ĊĠĠĠĠ Ġ* Ġopen Id ĠåĴĮ union Id Ġ ï¼īï¼Į æİ¥åı£ çļĦ æĺİ æĸĩ åĨħå®¹ å°Ĩ ä¸į åĮħåĲ« è¿ĻäºĽ æķ ı æĦŁ æķ°æį® ãĢĤ å¼Ģåıĳ èĢħ å¦Ĥ éľĢè¦ģ èİ·åıĸ æķ ı æĦŁ æķ°æį® ï¼Į éľĢè¦ģ å¯¹ æİ¥åı£ è¿ĶåĽŀ çļĦ åĬłå¯Ĩ æķ°æį® ( ĊĠĠĠĠ Ġ* Ġencrypted Data Ġ) è¿Ľè¡Į å¯¹ ç§° è§£ å¯Ĩ ãĢĤ Ġ è§£ å¯Ĩ ç®Ĺæ³ķ å¦Ĥä¸ĭ ï¼ļ Ġå¯¹ ç§° è§£ å¯Ĩ ä½¿çĶ¨çļĦ ç®Ĺæ³ķ ä¸º ĠAES - 1 2 8 - CBC ï¼Į æķ°æį® éĩĩçĶ¨ PKCS # 7 å¡« åħħ ãĢĤ ĊĠĠĠĠ Ġ* Ġå¯¹ ç§° è§£ å¯Ĩ çļĦ çĽ®æłĩ å¯Ĩ æĸĩ ä¸º ĠBase 6 4 _ Decode ( encrypted Data ), Ġå¯¹ ç§° è§£ å¯Ĩ ç§ ĺ éĴ¥ Ġaes key Ġ= ĊĠĠĠĠ Ġ* ĠBase 6 4 _ Decode ( session _ key ), Ġaes key Ġæĺ¯ 1 6 åŃĹèĬĤ Ġå¯¹ ç§° è§£ å¯Ĩ ç®Ĺæ³ķ åĪĿå§ĭ åĲĳ éĩı Ġiv Ġä¼ļ åľ¨ æķ°æį® æİ¥åı£ ä¸Ń è¿ĶåĽŀ ãĢĤ ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ Description Ġ( TODO è¿ĻéĩĮ çĶ¨ ä¸Ģ åı¥ è¯Ŀ æııè¿° è¿Ļä¸ª æĸ¹æ³ķ çļĦ ä½ľçĶ¨ ) ĊĠĠĠĠ Ġ* Ġ@ param Ġencrypted Data ĊĠĠĠĠ Ġ* Ġ åĬłå¯Ĩ åĨħå®¹ ĊĠĠĠĠ Ġ* Ġ@ param Ġsession Key ĊĠĠĠĠ Ġ* Ġå°ı ç¨ĭåºı çĻ»å½ķ session Key ĊĠĠĠĠ Ġ* Ġ@ param Ġiv ĊĠĠĠĠ Ġ* Ġ è§£ å¯Ĩ ç®Ĺæ³ķ åĪĿå§ĭ åĲĳ éĩı Ġiv Ġä¼ļ åľ¨ æķ°æį® æİ¥åı£ ä¸Ń è¿ĶåĽŀ ãĢĤ ĊĠĠĠĠ Ġ* Ġ@ param Ġencoding Format ĊĠĠĠĠ Ġ* Ġ ç¼ĸçłģ æł¼å¼ı é»ĺè®¤ UTF - 8 ĊĠĠĠĠ Ġ* Ġ@ return Ġè¿ĶåĽŀ è§£ å¯Ĩ åĲİçļĦ åŃĹç¬¦ä¸² ĊĠĠĠĠ Ġ* Ġ@ throws ĠException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( Exception :: class ) ĊĠĠĠ Ġfun Ġdecrypt ( encrypted Data : ĠString ?, Ġsession Key : ĠString ?, Ġiv : ĠString ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcipher Ġ= ĠCipher . getInstance (" AES / CBC / No Padding ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbase 6 4 Decoder Ġ= ĠBASE 6 4 Decoder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ encrypted Data Ġ= Ġbase 6 4 Decoder . decode Buffer ( encrypted Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ session Key Ġ= Ġbase 6 4 Decoder . decode Buffer ( session Key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ_ iv Ġ= Ġbase 6 4 Decoder . decode Buffer ( iv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecret KeySpec Ġ= ĠSecret KeySpec (_ session Key , Ġ" AES ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġiv Parameter Spec Ġ= ĠI v Parameter Spec (_ iv ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher . init ( Cipher . DE CRYPT _ MODE , Ġsecret KeySpec , Ġiv Parameter Spec ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal Ġ= Ġcipher . do Final (_ encrypted Data ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġdecode ( original ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠString ( bytes , ĠCharset . forName (" UTF - 8 ")) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ Ċ }