Package Com.demo.controller.web.app;import Java.io.bufferedoutputstream;import Java.io.bufferedreader;import Java.io.inputstream;import Java.io.inputstreamreader;import Java.net.url;import Java.security.cert.certificateexception;import Java.security.cert.x509certificate;import Java.text.parseexception;import Java.text.simpledateformat;import Java.util.date;import Java.util.HashMap;import Java.util.list;import Java.util.locale;import Java.util.map;import Javax.net.ssl.hostnameverifier;import Javax.net.ssl.httpsurlconnection;import Javax.net.ssl.sslcontext;import Javax.net.ssl.sslsession;import Javax.net.ssl.trustmanager;import Javax.net.ssl.x509trustmanager;import javax.servlet.http.HttpServletRequest; Import Org.apache.log4j.logger;import Org.springframework.beans.factory.annotation.autowired;import Org.springframework.stereotype.controller;import Org.springframework.web.bind.annotation.requestmapping;import Org.springframework.web.bind.annotation.responsebody;import Sun.misc.BASE64DecoDer;import Com.demo.common.result;import Com.demo.common.util.stringutils;import com.demo.constant.Constant; Import Com.demo.constant.enums;import Com.demo.service.appesporderservice;import Com.demo.service.appespproductservice;import Com.demo.service.appuserinfoservice;import Com.demo.service.appversionservice;import Com.demo.service.userservice;import Com.demo.service.eshop.esporderlogservice;import Com.demo.vo.appesporder;import Com.demo.vo.AppEspProduct;import Com.demo.vo.appuserinfo;import Com.demo.vo.appversion;import Com.demo.vo.esporderlog;import Com.demo.vo.User; Import Net.sf.json.JSONObject; @Controller @requestmapping ("/app/*") public class Astrocalendariosverifycontroller { Private Logger log = Logger.getlogger (Astrocalendariosverifycontroller.class); @Autowiredprivate UserService UserService, @Autowiredprivate appesporderservice appesporderservice; @Autowiredprivate appversionservice Appversionservice; @Autowiredprivate appespproductservice appespproductservice; @Autowiredprivate ApPuserinfoservice appuserinfoservice; @Autowiredprivate esporderlogservice esporderlogservice;private Static class Trustanytrustmanager implements X509trustmanager {public void checkclienttrusted (x509certificate[] chain, String AuthType) throws certificateexception {}public void checkservertrusted (x509certificate[] chain, String authtype) throws certificateexception {}public x509certificate[] getacceptedissuers () {return new x509certificate[] {};}} private static class Trustanyhostnameverifier implements Hostnameverifier {public boolean verify (String hostname, SSLsession session) {return true;}} private static final String url_sandbox = "Https://sandbox.itunes.apple.com/verifyReceipt";p rivate static final string url_verify = "Https://buy.itunes.apple.com/verifyReceipt";/** * * @param receipt Bill * @url address to verify * @return null or return result sandbox Https://sandbox.itunes.apple.com/verifyReceipt * */public string buyappverify (String receipt,string url,map< String, string> map) {try {Sslcontext sc = SSLCOntext.getinstance ("SSL"); Sc.init (null, new trustmanager[] {new Trustanytrustmanager ()},new Java.security.SecureRandom ()); URL console = new URL (URL); Httpsurlconnection conn = (httpsurlconnection) console.openconnection (); Conn.setsslsocketfactory ( Sc.getsocketfactory ()); Conn.sethostnameverifier (new Trustanyhostnameverifier ()); Conn.setrequestmethod ("POST"); Conn.setrequestproperty ("Content-type", "Text/json"), Conn.setrequestproperty ("Proxy-connection", "Keep-Alive"); Conn.setdoinput (True); Conn.setdooutput (true); Conn.setconnecttimeout (30*1000);//Set Connection timeout 30 seconds Bufferedoutputstream hurlbufous = new Bufferedoutputstream (Conn.getoutputstream ()); String str = String.Format (Locale.china, "{\" receipt-data\ ": \" "+ Receipt +" \ "}"); System.out.println ("str:" + str); Hurlbufous.write (Str.getbytes ()); Hurlbufous.flush (); InputStream is = Conn.getinputstream (); BufferedReader reader = new BufferedReader (new InputStreamReader (IS)); String line = null; StringBuffer sb = new StringBuffer (); while (line = Reader.readliNE ()) = null) {sb.append (line);} System.out.println (Sb.tostring ()); return sb.tostring ();} catch (Exception ex) {Log.error ("system Exception" +ex), Map.put ("Orderstatus", "D");//ex.printstacktrace ();} return null;} @RequestMapping ("/app/validateorder" + Constant.json) @ResponseBodypublic map<string, string> validateorder ( HttpServletRequest request) {Long start = System.currenttimemillis (); map<string, string> map = new hashmap<string, string> (); User user = Checkuserlogin (request); Appuserinfo appuser = null;if (user!=null) {appuser = new appuserinfo (); Appuser.setuserid (User.getuserid ()); AppUser = APPUSERINFOSERVICE.FINDBYPK (Appuser);} Determine if this user if (Appuser = = null) {map.put ("LoginStatus", "1") exists in the App user table;} Else{map.put ("LoginStatus", "0"); try {String receipt = Request.getparameter ("receipt"); String ordermonths = Request.getparameter ("ordermonths"); String Versioncode = Request.getparameter ("Versioncode"); String appId = Request.getparameter ("AppId"); String Price = Request.getparameter ("price");Stringutils.isblank (appId) | | Stringutils.isblank (Versioncode)) {map.put ("Orderstatus", "D"); return map;} Integer Vcode = integer.parseint (versioncode), Integer AppID = integer.parseint (AppID); Appesporder Aeo = new Appesporder (); Aeo.setreceipt (receipt); list<appesporder> list = Appesporderservice.freefindall (AEO), if (List.size () ==0) {//Add New Order Appuserinfo AUI Appuserinfo (); Aui.setuserid (User.getuserid ()); AUI = APPUSERINFOSERVICE.FINDBYPK (AUI); SimpleDateFormat OSF = new SimpleDateFormat ("YYMMDDHH"); String orderId = Enums.OrderPrefix.NA + osf.format (new Date ()) + Stringutils.getrandomsixnum (); if (AUI! = null) { AppVersion Version = new appversion (); Version.setversioncode (vcode); int count = Appversionservice.countfreefind ( Version); Appespproduct AEP = new Appespproduct () aep.setappid (AppID); AEP = APPESPPRODUCTSERVICE.FINDBYPK (AEP);//Check AppID, VersionID is valid if (AEP = = NULL | | count<0) {map.put ("Orderstatus", "C"); return map;} Aeo.setappid (Aep.getappid ()); Aeo.setappname (Aep.getappname ()); Aeo.setVersioncode (Vcode); Aeo.setuserid (Aui.getuserid ()); Aeo.setnickname (Aui.getnickname ()); Aeo.setemail (Aui.getEmail ()); Aeo.setorderid (orderId); aeo.setordermonths (ordermonths); Aeo.setsubtotal (new Long); Aeo.setisfree ("N") ; Aeo.setorderstatus ("A");//New Order Aeo.setcreateby ("System"), Aeo.setcreatedt (new Date ()); Aeo.setpaiddate (new Date ()); Appesporderservice.insert (AEO);//order Log Esporderlog log = new Esporderlog () Log.setremark ("Generate New order, paid, waiting for verification ..."); Log.setchangetime (New Date ()), Log.setchangeuser ("system"), Log.setismem ("N"), Log.settype ("A"); Log.setorderid ( ORDERID); Esporderlogservice.addorderlog (log);} Authentication to Apple Server result = Validateappleservler (map, receipt, url_verify, AEO, orderId); if (result.issuccess () ==true) {Validateappleservler (map, receipt, Url_sandbox, AEO, orderId);}} else{//if the receipt already exists, determine the order status of the receipt, and then determine whether the user and month are the same, to prevent misappropriation receiptappesporder order = list.get (0), if ("A". Equals ( Order.getorderstatus ()) | | "D". Equals (Order.getorderstatus ())) {//New Order has been added not yet validated or verified timeout connection error, need to re-request validation result = ValidateappleserVler (Map, Order.getreceipt (), url_verify, Order, Order.getorderid ()), if (result.issuccess () ==true) { Validateappleservler (Map, Order.getreceipt (), Url_sandbox, Order, Order.getorderid ());}} else if ("B". Equals (Order.getorderstatus ())) {if (Receipt.equals (Order.getreceipt ()) &&user.getuserid (). Equals (Order.getuserid ()) &&ordermonths.equals (Order.getordermonths ())) {Map.put ("Orderstatus", "B");} Else{map.put ("Orderstatus", "C");//validation failed}}else{map.put ("Orderstatus", "C");//Validation Failed}}} catch (Exception e) {map.put (" Orderstatus "," D "); Log.error (" System exception "+e); E.printstacktrace ();}} Long end = System.currenttimemillis (); System.out.println ("Verify Receipt Information time:" + (End-start) + "millisecond"); return map;} Send authentication request to Apple server private Result Validateappleservler (map<string, string> Map, string receipt, string URL, Appesporder Aeo, String orderId) {result result = new result (). Setsuccess (false); String Verifyresult = buyappverify (Receipt,url,map), if (verifyresult! = null) {Jsonobject job = Jsonobject.fromobject ( Verifyresult); StRing status = job.getstring ("status"), if ("0". Equals (status)) {//Verify Success Aeo.setorderstatus ("B"); String r_receipt=job.getstring ("receipt"); System.out.println (R_receipt); System.out.println ("-------------------------------"); Jsonobject Returnjson = Jsonobject.fromobject (R_receipt); String product_id = returnjson.getstring ("product_id"); Product ID String quantity = returnjson.getstring ("Quantity"); The number of String TransactionID = returnjson.getstring ("transaction_id");//Trade IDSYSTEM.OUT.PRINTLN ("Product ID:" +produ Ct_id+ "\ T" + "quantity" +quantity+ "\ T" + "Transaction ID" +transactionid) aeo.setproductid (product_id); int total = 0;if (! Stringutils.isblank (quantity)) Total = Integer.parseint (quantity), Aeo.setquantity (total); Aeo.settransactionid ( TransactionID); appesporderservice.update (AEO); Esporderlog log2 = new Esporderlog () Log2.setremark ("Send validation to Apple server ..."); Log2.setchangetime (new Date ()); Log2.setchangeuser ("system"); Log2.setismem ("N"); Log2.settype ("B"); Log2.setordErid (orderId); Esporderlogservice.addorderlog (log2); Map.put ("Orderstatus", "B");} else if ("21007". Equals (status)) {//re-verify, change path to formal environment path Esporderlog log1 = new Esporderlog (); Log1.setremark (" Send a validation failure to the Apple official server, resulting in a status value of 21007. "); Log1.setchangetime (New Date ()), Log1.setchangeuser ("system"), Log1.setismem ("N"), Log1.settype ("A"); Log1.setorderid (orderId); Esporderlogservice.addorderlog (LOG1); result.setsuccess (true);} else{//validation failed Aeo.setorderstatus ("C"); Appesporderservice.update (AEO); Esporderlog log1 = new Esporderlog () Log1.setremark ("Send validation failed to Apple server ..."); Log1.setchangetime (new Date ()); Log1.setchangeuser ("system"); Log1.setismem ("N"); Log1.settype ("A"); Log1.setorderid (orderId); Esporderlogservice.addorderlog (LOG1); Map.put ("Orderstatus", "C");}} return result;} Private User Checkuserlogin (HttpServletRequest request) {String username = request.getparameter ("username"); String Password = request.getparameter ("password"); if (Stringutils.isblank (username) | | Stringutils.isblank (password)) {return null;} User user = new user(); try {user.setemail (username); User.setpassword (password); user = Userservice.userlogin (user);} catch (Exception e) { Log.error ("Login failed, user name or password is wrong!" + e);} return user;}}
In-app Purchases Verification