java 接入apple pay_支付的那些套路(apple pay篇)
ios支付比普通的支付要麻烦许多,因为要走内购,而且像支付宝,微信那种还可以给回调,Apple PAY根被不会回调啊,所以要么找第三方的支付平台,要么自行接入,本篇是直接接入的,applepay的支付手续费是总金额的30%,所以业务逻辑要自行改变。
流程是这样的:
1,IOS传过来的参数经过非空校验及验证码重复校验后先要判断验证码的重复,验证码是手机端向apple请求后,apple返回的data经过MD5加密存库,留个备份,每次验证的时候判断一下重复。
2.向apple请求,参数是地址,IOS的data,订单ID,换取status,bid,productId,订单ID
public static Map verifyReceipt(String reqUrl, String receiptDataJson, String appTransactionId) throws Exception{
reqUrl=https://buy.itunes.apple.com/verifyReceipt
int status = -1;
String bid = "";
String productId = "";
String transactionId = "";
//This is the URL of the REST webservice in iTunes App Store
URL url = new URL(reqUrl);
//make connection, use post mode
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.setAllowUserInteraction(false);
//Write the JSON query object to the connection output stream
PrintStream ps = new PrintStream(connection.getOutputStream());
ps.print(receiptDataJson);
ps.close();
//Call the service
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
//Extract response
String str;
StringBuffer sb = new StringBuffer();
while ((str = br.readLine()) != null) {
sb.append(str);
}
br.close();
String response = sb.toString();
//System.out.println("AppleAppStoreVerifyRequest----response:"+response);
JSONObject resutl = JSON.parseObject(response);
status = resutl.containsKey("status") ? resutl.getInteger("status") : status;
JSONObject receipt = resutl.containsKey("receipt") ? resutl.getJSONObject("receipt") : null;
if(receipt != null && !StringUtils.isBlank(receipt.toString())){
bid = receipt.containsKey("bundle_id") ? receipt.getString("bundle_id") : bid;
JSONArray inApp = receipt.getJSONArray("in_app");
if(inApp != null && !StringUtils.isBlank(inApp.toString())) {
if(StringUtils.isBlank(appTransactionId)) { //如果未给订单号,则默认获取第一个
JSONObject inAppJSONObjectTemp = inApp.getJSONObject(0);
if (inAppJSONObjectTemp != null && !inAppJSONObjectTemp.isEmpty()) {
productId = inAppJSONObjectTemp.containsKey("product_id") ? inAppJSONObjectTemp.getString("product_id") : productId;
transactionId = inAppJSONObjectTemp.containsKey("transaction_id") ? inAppJSONObjectTemp.getString("transaction_id") : transactionId;
}
} else { //如果APP已给定订单号时用订单号进行查找
for(int i=0; i
JSONObject inAppJSONObjectTemp = inApp.getJSONObject(i);
if (inAppJSONObjectTemp != null && !inAppJSONObjectTemp.isEmpty()) {
String transactionIdTemp = inAppJSONObjectTemp.containsKey("transaction_id") ? inAppJSONObjectTemp.getString("transaction_id") : transactionId;
if(appTransactionId.equals(transactionIdTemp)) {
productId = inAppJSONObjectTemp.containsKey("product_id") ? inAppJSONObjectTemp.getString("product_id") : productId;
transactionId = transactionIdTemp;
}
}
}
}
}
}
Map resMap = new HashMap();
resMap.put("status",status);
resMap.put("bid",bid);
resMap.put("productId",productId);
resMap.put("transactionId",transactionId);
resMap.put("resutl",resutl == null ?"":resutl.toJSONString());
return resMap;
}
3.然后去验证返回的status是否合法:
int resultStauts = Integer.valueOf(String.valueOf(verifyMap.get("status")));
if (resultStauts == 21007) { //本次支付为沙盒支付
if (!"165".equals(thridPartyNotifyVo.getUserId())) { //非苹果审批账号 沙盒进行充值不进行饭票增加
return false;
}
}
判断bid,productId是否合法,这一步一定要验,要不会出现替换充值的bug:
String bid = String.valueOf(verifyMap.get("bid"));
String productId = String.valueOf(verifyMap.get("productId"));
transactionId = String.valueOf(verifyMap.get("transactionId"));
if(!"申请的bid".equals(bid)) {//苹果内购支付使用的iPhone程序的bundle标识是否合法
return false
}
if(StringUtils.isBlank(productId) || StringUtils.isBlank(transactionId)) { //是否返回商品信息
return false
}
4.最后进行下面的业务逻辑,更余额,把加密好的data存库留底,改状态。
注意:productID一定要给IOS,而且不能对错,6元的商品对应com.starunion.xxxxxx_Purchase_6Yuan.
去IOS请求后的bid,一定要验。因为不是IOS给的回调验证一定要小心谨慎,
java 接入apple pay_支付的那些套路(apple pay篇)相关推荐
- Java接入支付宝支付(alipay)
最近公司有一个需求是接入第三方支付(微信&支付宝),我接到了支付宝支付,所以本博客主要就简述我如何面像文档编程的经过,和中间遇到的小坑小洼,只要一步一步来操作,轻松接入alipay 微信支付的 ...
- Java接入微信支付超级详细教程——从入门到精通
源码下载 源码获取邮箱:xiaoshu1024@qq.com 本文介绍了"二维码付款"的代码.其他微信支付方式的代码都在源码中. 一.准备开发所需的账号以及配置信息 解释:想要接入 ...
- uni-app 接入银联H5支付(Java)思路代码
uni-app 接入银联H5支付(Java)思路代码 uni-app-web-view Java(后台部分代码)可以参考官方的Demo取代码 银联文档地址: H5支付. 第一次接触银联支付的话建议 跑 ...
- Java接入微信native、jsapi支付
Java接入微信native.jsapi支付 一.说明 本文示例使用的微信支付版本为V2版本,是旧版本,旧版本与新版本的接口不一,并不通用. 微信官方接口文档地址:https://pay.weixin ...
- Java接入支付宝支付测试买iPhone13 pro max
Java接入支付宝支付 一.介绍 二.沙箱 三.支付流程 四.准备支付宝 五.代码 1.前端代码 2.后端代码 六.测试 一.介绍 支付宝官方网站 支付宝(中国)网络技术有限公司是国内的第三方支付平台 ...
- Java接入微信支付APIV3(Native)
Native支付是指商户系统按微信支付协议生成支付二维码,用户再用微信"扫一扫"完成支付的模式. 一.准备工作 微信商户平台 微信支付 - 中国领先的第三方支付平台 | 微信支付提 ...
- Java接入支付宝支付超级详细教程——从入门到精通
Java接入支付宝支付教程 源码下载 源码获取:点击获取源码 本文介绍了"二维码付款"的代码.其他支付方式的代码都在源码中. 一.创建应用 1.登录支付宝开放平台 支付宝开放平 ...
- Java接入支付宝支付教程
Java接入支付宝支付教程 一.创建应用 1.登录支付宝开放平台 支付宝开放平台网址:https://open.alipay.com/platform/developerIndex.htm 2.创建一 ...
- 后端---最全最简单细致的Java接入微信支付接口(Native接入)
首先,我简单总结一下这几天搞微信支付和支付宝支付接口的体会,通过这几天的动手实操,加强了自己对SSM框架的认识,以及对业务逻辑的思路,明白了许多以前不懂的许多空白. 做支付宝接口的接入完全可以按照支付 ...
- 商家 APP 如何接入新版支付宝支付,老版本商家如何升级
代码地址如下: http://www.demodashi.com/demo/14006.html ##前言 支付宝移动支付2.0版本对比1.0版本做了较大更新,新申请的商家都需要采用最新2.0版本 S ...
最新文章
- MATLAB【十四】————遍历三层文件夹操作
- configure: error: mcrypt.h not found. Please reins
- 固定在计算机主机箱体上,联结计算机各种部件,起桥梁作用的是,2014年12月计算机应用基础模拟试题...
- Spring AOP编程-aspectJ注解开发(@Pointcut声明切点)
- JQuery判断数组中是否包含某个元素$.inArray(js, arr);
- Java并发编程—为什么 wait() 方法需要写在 while 里,而不是 if?
- 五、Kafka 用户日志上报实时统计之应用概述
- python 线程池_老程序员的经验分享:Python 从业十年是种什么体验?
- php 逻辑与运算符使用说明
- On the other hand, regarding Linux Mint’s
- 使用Android OpenGL ES 2.0绘图之三:绘制形状
- TankGame1.0
- atiny_log | LiteOS 物联网操作系统中的日志打印组件使用分享
- 清除手机图案解锁(执行adb命令工具类)
- NOI / 1.3编程基础之算术表达式与顺序执行——12:计算球的体积
- android中接口的作用是什么意思,Type-C接口有什么好处?和安卓micro USB接口有什么区别...
- 基二FFT时间抽取和频域抽取算法
- java 数据库密码加密解密方法
- python实战| 爬取虎牙高质量小姐姐私房照!
- [Python从零到壹] 四.网络爬虫之入门基础及正则表达式抓取博客案例