苹果内购后台(java)验证订单

苹果内购:前端购买 -> 下单支付 -> 拿到苹果服务器返回的receipt-data,再把receipt-data传递给自己的服务器进行验证操作,自己的服务器拿到receipt-data后,请求苹果服务器进行验证,然后处理本地业务逻辑,并返回支付状态给客户端

 

前端拿到的参数格式:{"receipt-data" : "MIIVDAYJKoZIhvcNAQcCoIIU/T..."}

直接POST请求苹果服务器进行验证(http post需要自己写)

@RequestMapping(value = "/apple/verify", method = RequestMethod.POST)
public BaseResponse<Object> appleVerify(String data) {
	//data = {"receipt-data" : "MIIVDAYJKoZIhvcNAQcCoIIU/T..."}
	// 苹果支付沙箱验证地址
	String url = "https://sandbox.itunes.apple.com/verifyReceipt";
	// 苹果支付正式验证地址
	// String url = "https://buy.itunes.apple.com/verifyReceipt";
	JSONObject param = JSON.parseObject(data);
	JSONObject result = this.sendPost(url, param);
	log.info("order apple notify result: {}", result);
	Integer status = result.getInteger("status");//0 成功的
	//处理自己的订单业务逻辑
	//...
	//返回
	return new BaseResponse<Object>(status == 0 ? "SUCCESS" : "FAIL");
}
	/**
	 * 发送POST请求
	 * @param url 		
	 * @param param 	
	 * @return
	 */
	private JSONObject sendPost(String url, JSONObject param) {
		StringBuilder sb = new StringBuilder();
		PrintWriter out = null;
		BufferedReader in = null;
		try {
			URL realUrl = new URL(url);
			// 打开和URL之间的连接
			URLConnection conn = realUrl.openConnection();
			// 设置通用的请求属性
			conn.setRequestProperty("accept", "*/*");
			conn.setRequestProperty("connection", "Keep-Alive");
			conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
			// 发送POST请求必须设置如下两行
			conn.setDoOutput(true);
			conn.setDoInput(true);
			// 获取URLConnection对象对应的输出流
			out = new PrintWriter(conn.getOutputStream());
			// 发送请求参数
			out.print(param);
			// flush输出流的缓冲
			out.flush();
			// 定义BufferedReader输入流来读取URL的响应
			in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line;
			sb = new StringBuilder();

			while ((line = in.readLine()) != null) {
				sb.append(line);
			}
		} catch (Exception e) {
			// System.out.println("发送 POST 请求出现异常!"+e);
			e.printStackTrace();
		}
		// 使用finally块来关闭输出流、输入流
		finally {
			try {
				if (out != null) {
					out.close();
				}
				if (in != null) {
					in.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
		return JSON.parseObject((String) sb.toString());
	}

返回代码

status
* 0 SUCCESS
* 21000 App Store不能读取你提供的JSON对象
* 21002 receipt-data域的数据有问题
* 21003 receipt无法通过验证
* 21004 提供的shared secret不匹配你账号中的shared secret
* 21005 receipt服务器当前不可用
* 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
* 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
* 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务

返回详情

{
    "environment": "Sandbox",
    "receipt": {
        "in_app": [
            {
                "transaction_id": "1000000514154331",
                "original_purchase_date": "2019-03-28 06:40:18 Etc/GMT",
                "quantity": "1",
                "original_transaction_id": "1000000514154331",
                "purchase_date_pst": "2019-03-27 23:40:18 America/Los_Angeles",
                "original_purchase_date_ms": "1553755218000",
                "purchase_date_ms": "1553755218000",
                "product_id": "ERSHUAI18",//18是钱,具体格式和前端约定。服务端把约定字符串(ERSHUAI)去掉,剩下的数字(18)就是业务逻辑需要的金额
                "original_purchase_date_pst": "2019-03-27 23:40:18 America/Los_Angeles",
                "is_trial_period": "false",
                "purchase_date": "2019-03-28 06:40:18 Etc/GMT"
            }
        ],
        "adam_id": 0,
        "receipt_creation_date": "2019-03-28 08:21:40 Etc/GMT",
        "original_application_version": "1.0",
        "app_item_id": 0,
        "original_purchase_date_ms": "1375340400000",
        "request_date_ms": "1553761302654",
        "original_purchase_date_pst": "2013-08-01 00:00:00 America/Los_Angeles",
        "original_purchase_date": "2013-08-01 07:00:00 Etc/GMT",
        "receipt_creation_date_pst": "2019-03-28 01:21:40 America/Los_Angeles",
        "receipt_type": "ProductionSandbox",
        "bundle_id": "com.ershuai.blog",
        "receipt_creation_date_ms": "1553761300000",
        "request_date": "2019-03-28 08:21:42 Etc/GMT",
        "version_external_identifier": 0,
        "request_date_pst": "2019-03-28 01:21:42 America/Los_Angeles",
        "download_id": 0,
        "application_version": "1.0.1"
    },
    "status": 0
}

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值