IOS苹果内支付iap Java服务端

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
			{
				// 设置SSLContext
				SSLContext 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();
			}
		}
	}
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值