ppgjx 发表于 2022-4-5 19:54

java验证苹果内购思路请教

本帖最后由 ppgjx 于 2022-4-5 19:55 编辑

苹果和微信支付宝不同 苹果的支付是在本地的 没有支付回调 所以苹果的支付一般是这样的

支付之前客户端向自家服务器申请创建一个订单 -- 用户支付完成客户端会有一个苹果官方支付回调的回执加密串和苹果的交易订单号 把这个加密串和苹果订单号发给自家服务器 -- 自家服务器可以根据这个加密串去请求苹果服务器查询订单 判断服务器返回的订单和前端传入的订单是否一样 如果一样就说明支付成功

这种方式有个漏洞 因为请求苹果服务器查询订单信息是查不到支付金额的 我就这样做
我第一步创建一个88块钱的订单 我不付款 在创建一个1块钱的订单 我把1块钱的订单支付成功的加密串和苹果订单号用88块钱的订单号去请求自家服务器 这样就出问题了 1块钱可以买到88块钱的货 这个问题有什么办法解决吗?

Goldrepo 发表于 2022-4-5 22:16

1块钱的订单支付成功的加密串在自家服务器解密出来的信息应该是跟88块钱订单号的支付成功后加密串解密出来的数据不一致的,可以在自家服务器那边对支付成功后的加密串进行解密,然后判断订单号是否一致,不一致就不通过

ppgjx 发表于 2022-4-5 22:22

Goldrepo 发表于 2022-4-5 22:16
1块钱的订单支付成功的加密串在自家服务器解密出来的信息应该是跟88块钱订单号的支付成功后加密串解密出来 ...

现在问题是 ios订单号和加密串肯定是一样的 你没理解我的意思

文西思密达 发表于 2022-4-5 23:32

那就不设置1块的产品就好啦   只有一个88的产品可以下单

currentNB 发表于 2022-4-5 23:46

这就涉及到非对称加密了吧。

无缺i 发表于 2022-4-6 09:21

ppgjx 发表于 2022-4-5 22:22
现在问题是 ios订单号和加密串肯定是一样的 你没理解我的意思

1元的订单和88元的订单,加密的字符串肯定是不一样的,就算两个都是一元的订单,也不会是一样的

ppgjx 发表于 2022-4-6 09:31

无缺i 发表于 2022-4-6 09:21
1元的订单和88元的订单,加密的字符串肯定是不一样的,就算两个都是一元的订单,也不会是一样的

这不是不一样的问题, 加密串和苹果订单号都是前端发送的过来的,后端只能验证这个加密串里面的苹果订单号和前端发过来的是不是一样的,没办法判断金额,

Goldrepo 发表于 2022-4-6 19:12

本帖最后由 Goldrepo 于 2022-4-6 19:25 编辑

ppgjx 发表于 2022-4-5 22:22
现在问题是 ios订单号和加密串肯定是一样的 你没理解我的意思
虽然我没实际接入过app支付,但弄过其他的支付,所有的支付流程思路都差不多的,服务端那边肯定要验证支付结果跟当前订单号是否一致的,这是我在网上查找的apple支付后,自家服务器验证订单号跟支付结果的流程:
1、首先拿到客户端的支付receiptData和transaction信息
2、服务端通过receiptData通过向苹果服务器post数据发起校验
3、服务端端对苹果服务器响应数据做处理和校验订单的合法性。
4、如果订单合法则对订单做出相应处理(购买道具、开通会员……等等)

无缺i 发表于 2022-4-6 20:27

ppgjx 发表于 2022-4-6 09:31
这不是不一样的问题, 加密串和苹果订单号都是前端发送的过来的,后端只能验证这个加密串里面的苹果订单号 ...

问题是你无法伪造出来可被服务端识别且认可的加密串
页: [1]
查看完整版本: java验证苹果内购思路请教