苹果内购后台(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
    评论
作为AI语言模型,我无法提供完整的代码实现,但是我可以提供一些基本的思路和建议。 对接苹果内购退款通知和退款确认,需要使用苹果的服务器端验证和通知机制,具体步骤如下: 1. 在应用程序中,发起退款请求,将退款申请发送到苹果服务器。 2. 苹果服务器会对退款请求进行验证,检查是否符合退款条件,包括订单号、购买日期、退款金额等。 3. 如果符合退款条件,则苹果服务器会向应用程序发送退款通知,包括订单号、退款日期、退款金额等信息。 4. 应用程序收到退款通知后,需要更新本地的订单状态,以反映退款结果。 5. 如果应用程序需要确认退款结果,可以向苹果服务器发送退款确认请求,以确认退款已成功完成。 在Java中实现上述功能,需要使用苹果提供的Java开发工具包(Java SDK),以及苹果的API和文档。具体步骤如下: 1. 安装苹果Java SDK,包括Java库和开发工具包。 2. 在应用程序中,编写退款请求的代码,使用苹果提供的API和文档,向苹果服务器发送退款请求,包括订单号、购买日期、退款金额等。 3. 在应用程序中,编写退款通知的代码,使用苹果提供的API和文档,处理从苹果服务器收到的退款通知,包括订单号、退款日期、退款金额等信息。 4. 在应用程序中,编写退款确认的代码,使用苹果提供的API和文档,向苹果服务器发送退款确认请求,以确认退款已成功完成。 需要注意的是,苹果内购退款涉及到用户的财务信息和隐私,需要保证数据传输和存储的安全性和可靠性。应用程序需要严格遵守苹果的相关规定和要求,确保用户的利益不受损害。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值