0

0

苹果支付PHP金额怎么校验_苹果支付金额PHP校验方法【教程】

雪夜

雪夜

发布时间:2025-12-26 21:49:02

|

507人浏览过

|

来源于php中文网

原创

苹果支付金额校验需严格比对in_app中price与本地订单金额、绑定product_id价格表、检查price_change_tag、验证bundle_id一致性、确保transaction_id与order_id原子绑定。

苹果支付php金额怎么校验_苹果支付金额php校验方法【教程】

如果您在服务端接收到苹果支付返回的收据凭证后,发现订单金额与预期不符,可能是由于客户端未正确传递商品ID、服务端未比对苹果返回的product_id与价格映射、或未校验in_app数组中对应交易的实际金额字段。以下是多种校验苹果支付金额的PHP实现方法:

一、校验收据解析后的in_app数组内actual_amount字段

苹果验证接口返回的JSON响应中,in_app数组每个元素包含交易明细,其中original_transaction_idproduct_idtransaction_amount(部分版本为price或需从currency+price组合推导)是关键字段。必须提取该笔交易对应的实际支付金额,并与本地订单金额比对。

1、使用json_decode解析苹果返回的验证响应,确保获取到in_app数组。

2、遍历in_app数组,查找与当前订单所用product_id完全匹配的条目。

立即学习PHP免费学习笔记(深入)”;

3、读取该条目中的price字段(单位为最小货单位,如USD为美分),并结合currency字段确认币种

4、将本地订单金额按相同币种与最小单位换算后,与price值进行严格相等比较(非浮点数比较,应转为整型)。

二、绑定product_id与预设价格表进行双向校验

服务端必须维护一份与App Store Connect中配置完全一致的商品ID与价格映射表(含币种)。该表不可由前端传入,须硬编码或从可信配置中心加载,防止被篡改。校验时需同时验证product_id存在性及对应价格一致性。

1、定义本地价格映射数组,例如:$priceMap = ['com.app.coins100' => ['amount' => 99, 'currency' => 'USD']]

2、从苹果收据解析结果中提取product_idcurrency字段。

3、检查$product_id是否存在于$priceMap中,且$priceMap[$product_id]['currency']与收据中currency完全一致。

4、将$priceMap[$product_id]['amount']与收据中对应交易的price字段作整型全等判断

三、校验original_purchase_date_ms与price_change_tag防重复/篡改

针对订阅类商品,苹果可能在价格变更后允许用户保留旧价格。此时收据中会包含price_change_tag字段,且original_purchase_date_ms可用于识别首次购买时间。若业务要求强制使用最新定价,则需拒绝含price_change_tag且price不等于当前配置价格的交易。

海螺AI
海螺AI

MiniMax平台的AI对话问答工具,你的AI伙伴

下载

1、检查收据in_app条目中是否存在price_change_tag字段(非空字符串)。

2、若存在,读取original_purchase_date_ms并转换为日期,判断是否早于当前价格生效时间。

3、若早于且本地价格已更新,则拒绝该交易金额,视为无效定价,不执行发货逻辑。

四、比对receipt.bundle_id与应用标识一致性

bundle_id是苹果分配给应用的唯一标识,若收据中bundle_id与当前服务所归属的应用不一致,说明该收据可能来自其他应用或伪造,其内部金额字段不可信,必须拦截。

1、从苹果验证响应的根级receipt对象中提取bundle_id字段。

2、与服务端预设常量IOS_BUNDLE_ID(如'com.example.app')进行字符串全等比较

3、若不一致,立即终止后续金额校验流程,返回错误码21003或自定义非法应用标识错误。

五、校验transaction_id与本地订单号的原子绑定关系

苹果返回的transaction_id是全局唯一交易标识,必须与服务端生成的order_id在数据库层面建立强关联。金额校验前,需确认该transaction_id尚未被其他订单使用,且对应order_id的状态为“待支付”,防止金额被重复提交或错配。

1、根据请求中携带的transaction_id查询数据库中是否存在已处理记录。

2、若存在且status非“已取消”,则拒绝本次请求,防止金额覆盖或双花

3、若不存在,再执行订单号(order_id)查库,确认其status为“待支付”且product_id与收据中一致。

4、仅当上述两项均通过,才进入金额数值比对环节。

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

1715

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1144

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1047

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1396

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1228

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1439

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

虚拟号码教程汇总
虚拟号码教程汇总

本专题整合了虚拟号码接收验证码相关教程,阅读下面的文章了解更多详细操作。

25

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 7.9万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 6.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号