IOS苹果内支付iap Java服务端

来源:互联网 发布:php 系统自带空类 编辑:程序博客网 时间:2024/04/29 03:41
import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.URL;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.HttpsURLConnection;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;@Controller@RequestMapping("/pay")public class IAP {// 购买凭证验证地址private static final String certificateUrl = "https://buy.itunes.apple.com/verifyReceipt";// 测试的购买凭证验证地址private static final String certificateUrlTest = "https://sandbox.itunes.apple.com/verifyReceipt";/** * 重写X509TrustManager */private static TrustManager myX509TrustManager = new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}};/** * 接收iOS端发过来的购买凭证 * @param url * @param strings * @return */@ResponseBody@RequestMapping("/iap")private void sendHttpsCoon(long uid, String receipt, boolean chooseEnv){if( 0 == uid || null == receipt){System.out.println("请求参数错误");}else{String url = chooseEnv == true ? certificateUrl : certificateUrlTest;try{// 设置SSLContextSSLContext ssl = SSLContext.getInstance("SSL");ssl.init(null, new TrustManager[] { myX509TrustManager }, null);// 打开连接HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();// 设置套接工厂conn.setSSLSocketFactory(ssl.getSocketFactory());// 加入数据conn.setRequestMethod("POST");conn.setDoOutput(true);conn.setRequestProperty("Content-type", "application/json");conn.setRequestProperty("Proxy-Connection", "Keep-Alive");JSONObject obj = new JSONObject();obj.put("receipt-data", chooseEnv);// 获取输出流BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());buffOutStr.write(obj.toString().getBytes());buffOutStr.flush();buffOutStr.close();// 获取输入流BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line = null;StringBuffer sb = new StringBuffer();while ((line = reader.readLine()) != null){sb.append(line);}String stringadsf = sb.toString();conn.getInputStream().close();System.err.println("苹果返回的验证信息-->  " + stringadsf);JSONObject job = JSONObject.parseObject(stringadsf);// App Store的返回值String money = "";String orderId = "";if(job.getString("status").equals("0"))// 跟苹果验证有返回结果--验证成功{JSONObject code = JSONObject.parseObject(job.getString("receipt"));String creation_date_ms = code.getString("receipt_creation_date_ms"); // receipt创建日期(ms)JSONArray jsonArray = (JSONArray) code.get("in_app");// 订单列表JSONObject targetOrder = null;if(1 == jsonArray.size())//订单列表为一个,直接取出{targetOrder = jsonArray.getJSONObject(0);}else//订单列表为多个,根据支付订单创建时间戳获取本次订单{for (int i = 0; i < jsonArray.size(); i++){JSONObject orderItem = jsonArray.getJSONObject(i);if(orderItem.getString("purchase_date_ms").equals(creation_date_ms)){targetOrder = orderItem;}}}if(null == targetOrder){System.out.println("验证结果中不存在订单信息");}else{String product_id = targetOrder.getString("product_id");money = product_id.substring(4, product_id.length());orderId = uid + "_" + targetOrder.getString("transaction_id");// transaction_id交易号}boolean contains = RedisUtil.getAllkeys().contains(orderId);if((contains && !RedisUtil.getByKey(orderId).equals("3")) || !contains){RedisUtil.setValue(orderId, "2");// 支付成功,未加钻石//读取redis,得到对应充值的钻石数JSONArray json = JSONArray.parseArray(RedisUtil.getByKey("RechargeMeter"));// 首先把字符串转成JSONArray对象int diamond = 0;if(json.size() > 0){for(int i = 0; i < json.size(); i++){JSONObject jsonob = json.getJSONObject(i);// 遍历jsonarray数组,把每一个对象转成json对象if(jsonob.get("money").equals(money)){diamond = Integer.parseInt((String) jsonob.get("diamonds"));}}}System.out.println("add diamond : " + diamond);//操作数据库if (true)//操作成功{System.out.println("增加钻石失败");}else{RedisUtil.setValue(orderId, "3");// 增加钻石成功System.out.println("增加钻石成功");}}}else if(job.getString("status").equals("21007")){System.out.println("21007: 收据信息是测试用(sandbox),但却被发送到产品环境中验证");}}catch (Exception e){e.printStackTrace();}}}}


原创粉丝点击