转自:https://www.jianshu.com/p/976fc6090cfa

官方验证文档地址:Apple Developer Documentation

进行代码前,首先使用postman将收据发送给苹果服务器,熟悉一下返回的数据结构

工具类


import javax.net.ssl.*;
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.util.Locale;/*** 苹果IAP内购验证工具类* Created by wangqichang on 2019/2/26.*/
public class IosVerifyUtil {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";private static final String url_verify = "https://buy.itunes.apple.com/verifyReceipt";/*** 苹果服务器验证** @param receipt*            账单* @url 要验证的地址* @return null 或返回结果 沙盒 https://sandbox.itunes.apple.com/verifyReceipt**/public static String buyAppVerify(String receipt,int type) {//环境判断 线上/开发环境用不同的请求链接String url = "";if(type==0){url = url_sandbox; //沙盒测试}else{url = url_verify; //线上测试}//String url = EnvUtils.isOnline() ?url_verify : url_sandbox;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);BufferedOutputStream hurlBufOus = new BufferedOutputStream(conn.getOutputStream());JSONObject obj = new JSONObject();obj.put("receipt-data", receipt);//自动续费产品加上password// obj.put("password", "**************");hurlBufOus.write(obj.toString().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);}return sb.toString();} catch (Exception ex) {System.out.println("苹果服务器异常");ex.printStackTrace();}return null;}
}

代码JSON包用的hutool的包,需要自行引入或调整代码

public R applePayOrderNotifyCallBack(String transactionId, String payload) {//1.先线上测试    发送平台验证String verifyResult = IosVerifyUtil.buyAppVerify(payload, 1);//苹果服务器没有返回验证结果if (verifyResult == null) {logger.info("无订单信息!");R.fail("无订单信息");}// 苹果验证有返回结果logger.info("线上,苹果平台返回JSON:" + verifyResult);JSON job = JSONUtil.parse(verifyResult);String states = job.getByPath("status").toString();//0 正常//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环境的验证服务if ("21007".equals(states)) { //是沙盒环境,应沙盒测试,否则执行下面//2.再沙盒测试  发送平台验证verifyResult = IosVerifyUtil.buyAppVerify(payload, 0);logger.info("沙盒环境,苹果平台返回JSON:" + verifyResult);job = JSONUtil.parse(verifyResult);states = job.getByPath("status").toString();}logger.info("苹果平台返回值:job" + job);if (states.equals("0")) { // 前端所提供的收据是有效的    验证成功JSON inAppJson = JSONUtil.parse(JSONUtil.getByPath(job, "receipt.in_app"));List<JSON> jsons = JSONUtil.toList(inAppJson.toString(), JSON.class);//所有支付成功的订单号List<String> transaction_id =jsons.stream().map(t -> t.getByPath("transaction_id").toString()).distinct().collect(Collectors.toList());if(transaction_id.contains(transactionId)){return R.ok();}return R.fail();} else {return R.fail("receipt数据有问题");}}

java对接苹果支付相关推荐

  1. JAVA对接支付宝支付(超详细,一看就懂)

    Java对接支付宝支付 更多内容 冷文博客: 传送门 引入 为什么要发这篇帖子呢?原因很简单,就是因为在一个稍稍正规一点的应用上都会有支付这个环节,我们日常的在线支付如今包括支付宝,微信钱包,QQ钱包 ...

  2. java对接微信支付收不到支付通知问题(亲身实践)

    问题描述: 用java对接微信支付时,统一下单接口正常.但是用户扫码付款成功后,设置用于回调的notify_url对应的接口并没有收到请求(这个url测试过,是正常的且外网能访问的). 由于官方文档没 ...

  3. java对接支付宝支付

    java对接支付宝支付演示 现在有不少的项目都需要对接支付,这里主要是进行讲解对接支付宝H5支付 废话不多说 上代码 引入支付宝官方的sdk <!-- https://mvnrepository ...

  4. Android java对接建行支付SDK

    Android java 对接建行支付 准备工作 创建常量类 编写支付工具类 遇到的坑 用到的工具类 准备工作 在对接建行支付之前,需要准备好这几个东西:商户代码.商户柜台代码.分行代码.公钥 创建常 ...

  5. java对接PayPal支付-自动续费功能

    一. java对接PayPal支付(v2). 讲了PayPal v2:checkout-sdk 的对接过程 二. java对接PayPal支付 (添加物流跟踪信息). 讲了PayPal添加物流信息 的 ...

  6. Java对接第三方支付渠道之支付宝支付

    提示:支付宝相对于微信支付更人性化,且细节做得更好. Java对接第三方支付渠道之支付宝支付 一.前期准备工作 二.导入依赖 三.书写配置类 四.书写配置文件 五.调用相关支付接口 1.流程图 2.创 ...

  7. Java对接微信支付(完整全流程)

    Java对接微信支付及支付回调通知的全流程 一.所用框架.对接微信支付我们技术组用的是payment框架,因为该框架已整合springboot因此很方便快捷 <dependency>< ...

  8. java对接PayPal支付(v2)

    java对接PayPal支付 我们公司最近开通了网上支付功能,国内选择对接支付宝和微信,国外选择对接paypal, 今天我先将paypal对接方式记录下来,后面会记录微信和支付宝(本人比较懒,微信和支 ...

  9. Java对接第三方支付渠道之微信支付APIV3版本

    提示:微信支付APIV3版本对接流程梳理,目前微信支付提供APIV3和APIV2两个版本,简而言之,V3版本的安全性比V2更高. Java对接第三方支付渠道之微信支付APIV3版本 一.接入指引 1. ...

  10. java 对接支付宝支付

    2019独角兽企业重金招聘Python工程师标准>>> 对接支付宝支付的前提: 1,商户开通支付能力 登录蚂蚁金服 开放平台:https://open.alipay.com/plat ...

最新文章

  1. 3W 字的 Spring Boot 超详细总结
  2. FPGA中IBERT 核的应用(二)
  3. java常见业务对象_Java各种对象(PO,BO,VO,DTO,POJO,DAO,Entity,JavaBean,JavaBeans)的区分...
  4. Java中头指针和头结点_. 2 . 【严题集 2.1① 描述以下三个概念的区别:头指针、头结点、首元结点(第一个元素结点)。...
  5. linux的系统移植——【PC-开发板】的环境搭建
  6. Github上都没有的“网约车”项目,终于有人给写出来了!
  7. 在沈阳存款多少可以不用工作?
  8. python-学生管理系统--7-显示功能模块
  9. MVC模式在Java web 应用程序的实现
  10. 10W+字C语言从入门到精通保姆级教程(2021版下)
  11. java实现同步的5种方式
  12. 强强协同,共拓发展!英特尔与太一物联举办 AI 计算盒聚合服务研讨会
  13. 上海公积金网上提取_为什么提取上海公积金租房这么简单?
  14. Java教程:Java分割字符串(spilt())
  15. Axon框架使用指南(二):入门
  16. 小程序修改swiper的小圆圈
  17. SUSE12 LVM- Logical Volume Manager(逻辑卷管理)实例
  18. 湖大重现L.Cracked Pipes
  19. 神兵利器推荐——你一定不能错过的chrome插件
  20. 关于测试环境部署的那些事儿

热门文章

  1. LoadRunner报错vuser_init.c(18): Error: nca_connect_server: cannot communicate
  2. 清华大学计算机科学学院刘钊,姚 骏-清华大学生命学院
  3. Android显示——一帧的渲染过程(VSYNC)
  4. vue 截取video第一帧作为封面
  5. python金融编程入门_python金融实务从入门到精通完整版
  6. 作业 5:词频统计——增强功能
  7. 可实时配置的错误系统 errcode-errmsg
  8. Python学习-if语句
  9. centos6.5 MailScanner+ Spamassassin垃圾邮件过滤器+clamav 杀毒软件
  10. 什么时候跳槽,为什么离职,你想好了么?