Springboot 对接苹果内购代码

苹果内购和微信、支付宝支付流程有所不同,微信和支付宝都是通过各自的统一下单接口,拿到客户端所要的参数,之后返回给客户端,客户端支付完成进行回调并进行业务操作,而苹果内购是客户端直接支付完成之后通过客户端传过来的交易凭证(base64字符串),进行服务端苹果内购校验并进行业务操作。

苹果官方地址 地址

1. 拿到的数据大概是这样的

{"receipt":{"receipt_type":"ProductionSandbox","adam_id":0,"app_item_id":0,"bundle_id":"com.xgdream.app","application_version":"1","download_id":0,"version_external_identifier":0,"receipt_creation_date":"2019-11-10 13:45:48 Etc/GMT","receipt_creation_date_ms":"1573393548000","receipt_creation_date_pst":"2019-11-10 05:45:48 America/Los_Angeles","request_date":"2019-11-10 13:46:00 Etc/GMT","request_date_ms":"1573393560952","request_date_pst":"2019-11-10 05:46:00 America/Los_Angeles","original_purchase_date":"2013-08-01 07:00:00 Etc/GMT","original_purchase_date_ms":"1375340400000","original_purchase_date_pst":"2013-08-01 00:00:00 America/Los_Angeles","original_application_version":"1.0","in_app":[{"quantity":"1","product_id":"**********","transaction_id":"1000000590300432","original_transaction_id":"1000000590300432","purchase_date":"2019-11-10 13:45:48 Etc/GMT","purchase_date_ms":"1573393548000","purchase_date_pst":"2019-11-10 05:45:48 America/Los_Angeles","original_purchase_date":"2019-11-10 13:45:48 Etc/GMT","original_purchase_date_ms":"1573393548000","original_purchase_date_pst":"2019-11-10 05:45:48 America/Los_Angeles","is_trial_period":"false"}]},"status":0,"environment":"Sandbox"
}

2. 苹果内购流程图

3. 以下就是代码了

/*** 苹果内购校验** @param* @param* @param* @return*/@ApiOperation("ios支付成功后验证结果")@PostMapping("/iospay")public synchronized ResponseEntity<JsonResult> iosPay(@RequestBody IPayNotifyVO iPayNotifyVO) {log.info("苹果内购校验开始,交易ID:" + iPayNotifyVO.getTransactionId() + " base64校验体:" + iPayNotifyVO.getPayload());JsonResult r = new JsonResult();if (iPayNotifyVO.getUserId() == null) {r.setStatus("0");r.setMessage("未登录");return ResponseEntity.ok(r);}//线上环境验证   type值  为0的时候是 沙盒环境、1为 线上环境String verifyResult = IosVerifyUtil.buyAppVerify(iPayNotifyVO.getPayload(), 0);if (verifyResult == null) {r.setStatus("0");r.setMessage("苹果验证失败,返回数据为空");return ResponseEntity.ok(r);} else {log.info("线上,苹果平台返回JSON:" + verifyResult);JSONObject appleReturn = JSONObject.parseObject(verifyResult);String states = appleReturn.getString("status");//无数据则沙箱环境验证if ("21007".equals(states)) {verifyResult = IosVerifyUtil.buyAppVerify(iPayNotifyVO.getPayload(), 0);log.info("沙盒环境,苹果平台返回JSON:" + verifyResult);appleReturn = JSONObject.parseObject(verifyResult);states = appleReturn.getString("status");}log.info("苹果平台返回值:appleReturn" + appleReturn);// 前端所提供的收据是有效的    验证成功if (states.equals("0")) {String receipt = appleReturn.getString("receipt");JSONObject returnJson = JSONObject.parseObject(receipt);String inApp = returnJson.getString("in_app");List<HashMap> inApps = JSONObject.parseArray(inApp, HashMap.class);if (!CollectionUtils.isEmpty(inApps)) {ArrayList<String> transactionIds = new ArrayList<String>();for (HashMap app : inApps) {transactionIds.add((String) app.get("transaction_id"));iPayNotifyVO.setTransactionId((String) app.get("transaction_id"));}//交易列表包含当前交易,则 认为交易成功if (transactionIds.contains(iPayNotifyVO.getTransactionId())) {//TODO 处理业务逻辑log.info("交易成功,新增并处理订单:{}");iphonePayService.insert(iPayNotifyVO);r.setStatus("1");r.setMessage("充值成功");return ResponseEntity.ok(r);}r.setStatus("0");r.setMessage("当前交易不在交易列表中");return ResponseEntity.ok(r);}r.setStatus("0");r.setMessage("未能获取获取到交易列表");return ResponseEntity.ok(r);} else {r.setStatus("0");r.setMessage("支付失败");log.info("支付失败,错误码:" + states);return ResponseEntity.ok(r);}}}

4. 工具类

/*** @desc: 苹果IAP内购验证工具类* @author: hwm* @date: 2019/9/3 17:11*/
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 账单* @return null 或返回结果 沙盒 https://sandbox.itunes.apple.com/verifyReceipt* @url 要验证的地址*/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());String str = String.format(Locale.CHINA, "{\"receipt-data\":\"" + receipt + "\"}");//拼成固定的格式传给平台hurlBufOus.write(str.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;}/*** 用BASE64加密** @param str* @return*/public static String getBASE64(String str) {byte[] b = str.getBytes();String s = null;if (b != null) {s = new sun.misc.BASE64Encoder().encode(b);}return s;}
}

以上就是苹果内购的完整的代码了,可以直接拿到项目中使用,希望可以帮助到大家。

Springboot 对接苹果内购代码相关推荐

  1. Cocos 2d-X Lua 游戏添加苹果内购(二) OC和Lua交互代码详解

    这是第二篇 Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程 这是前面的第一篇,详细的说明了怎样添加内购项目以及填写银行信息提交以及沙盒测试员的添加使用以及需要我们注意的东西,结 ...

  2. postman关闭ssl验证_【第5期】springboot:苹果内购服务端验证

    ​苹果内购: 只要你在苹果系统购买APP中虚拟物品(虚拟货币,VIP充值等),必须通过内购方式进行支付,苹果和商家进行三七开 验证模式有两种: Validating Receipts With the ...

  3. iOS内购代码(苹果支付ApplePay)

    转载注明出处:https://www.jianshu.com/p/8c958e75f98f 刚刚做了内购, 记录一下 这里直接上代码, 至于写代码之前的一些设置工作参考以下文章: http://www ...

  4. PHP后端处理苹果内购对接

    苹果内购流程: iOS App上次苹果商店审核对于虚拟金币类必须要用苹果支付,不能使用第三方支付,苹果支付还要3/7分成,呵呵... 1.前六步有IOS端处理,最终获取购买凭证 2.POST请求,发送 ...

  5. Cocos 2d-X Lua 游戏添加苹果内购(一) 图文详解准备流程

    事前准备 最近给游戏添加了苹果的内购,这一块的东西也是刚刚做完,总结一下,其实这里不管是游戏还是我们普通的App添加内购这一块的东西都是差不多的,多出来的部分就是我们Lua和OC的交互的部分,以前刚开 ...

  6. iOS开发 IAP苹果内购

    为什么80%的码农都做不了架构师?>>>    1.概念介绍 <1>苹果内购: App内购买是指在苹果的 App Store 中购买应用程序的方式. 在玩一些游戏类应用软 ...

  7. java(jfinal) 接入ios苹果内购(连续包月订阅),服务端将二次验证。

    大致流程: 1.ios端进行支付,然后收到苹果的一串数据(也叫收据),然后ios端将其转码为BASE64编码的字符串. 2.ios端请求服务端接口,将数据传给服务端,服务端拿到数据后,通过一系列处理后 ...

  8. iOS 苹果内购 In-App Purchase 踩过的坑

    项目里面要接苹果支付,结果我研究了一个小时的apple pay,结果经理说是苹果内购,当时就感觉被耍了!好了,那就说说In-App Purchase这个吧,前面所有的准备工作经理做完了,我只是码代码, ...

  9. Java支付--苹果内购

    一.苹果支付 ①逻辑流程图 二.苹果支付流程介绍 ①用户购买产品下发支付请求到app端; ②app端收到请求后调用苹果服务进行支付扣款; ③苹果服务扣款成功后返回receipt_data加密数据和支付 ...

最新文章

  1. Linux命令Find实例
  2. java怎么获取ajax_Java学习路线
  3. CF 1638 E. Colorful Operations set 区间平推
  4. draw graph
  5. 基于java SSM校园兼职平台系统设计和实现
  6. linux下mknod命令介绍
  7. C# 匿名方法及Lambda表达式
  8. Counter 用法 from collections import Counter
  9. Direct2D教程(十二)图层
  10. 干什么事都要先定位,再聚焦
  11. git init github
  12. junit测试mysql_使用Junit单元测试及操作MySQL数据库时出现错误及解决方法
  13. 水仙花数c语言程序vb,VB编程:求水仙花数
  14. svn汉化插件安装步骤
  15. android的吸顶效果,吸顶效果解决方案
  16. QNX Hypervisor —— 设备
  17. bind dlz mysql rpm_智能DNS --BIND DLZ+MYSQL
  18. 无线网可拼服务器吗6,当WiFi 6遇到了WiFi 6+,我们的网速真的变快了吗?
  19. 计算机只存在于计算机硬盘上,计算机病毒只存在于计算机硬盘上。()
  20. 凸规划问题与二阶锥规划

热门文章

  1. 排序算法 | 快排、冒泡、堆排、归并、基数、递归、希尔、计数
  2. 脑机接口基础学习19---救救我吧,Evoked数据可视化
  3. 软件设计师备考笔记(一)软考概述
  4. 几种常见的RC滤波器-RC低通滤波器
  5. 获取Google Play Store中的apk文件
  6. MySQL复习笔记【上】
  7. java生成XML格式文件,导入MS Project生成甘特图
  8. 计算机音乐毕业论文范文,音乐型毕业论文范文
  9. Linux入职基础-4.1_简介微型计算机的组成结构
  10. 编程语言的被淘汰:选错语言毁终身