In-app Purchases Verification

Source: Internet
Author: User

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

Related Article

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.