如何安全地将WordPress Gravity Forms中的价格值传递到PHP代码?
安全传递Gravity Forms价格至支付平台的解决方案
我完全懂你的顾虑——直接从前端表单字段取价格确实太容易被篡改了,用户随便用浏览器开发者工具就能改HTML里的字段值,这绝对是个安全漏洞。咱们得换个思路:彻底抛弃前端传递的价格,从Gravity Forms后台计算的可靠数据里取真实金额,这样就能从根源上解决篡改问题。
下面给你两个靠谱的方案,都是基于后端验证的:
方案1:直接用Gravity Forms内置的订单总价
Gravity Forms本身会自动计算订单的最终金额(包含产品价格、优惠券折扣、税费等),这个值会存在提交的$entry对象里,而且是后台生成的,前端用户根本碰不到。你可以直接用这个值:
add_action('gform_after_submission', 'link_to_payment', 10, 2); function link_to_payment($entry, $form) { // 取出后台计算好的订单总金额,这个值绝对安全 $total_price = $entry['payment_amount']; // 先做个基础验证:金额不能为负或者零 if ($total_price <= 0) { wp_die('无效的订单金额,请重新提交'); } // 用WordPress官方的wp_redirect跳转,比原生header更稳妥 $payment_url = add_query_arg('price', $total_price, 'http://www.******.***/test.php'); wp_redirect($payment_url); exit(); }
这里的payment_amount是Gravity Forms的标准字段,只要你的表单里有产品/价格字段,提交后这个值就会自动生成,完全不需要依赖前端提交的任何价格数据。
方案2:手动重新计算价格(双重验证)
如果你的表单有自定义的价格逻辑,或者你想更严谨一点,可以在后端重新计算一遍价格,和Gravity Forms生成的金额做对比,确保没有被篡改:
add_action('gform_after_submission', 'link_to_payment', 10, 2); function link_to_payment($entry, $form) { // 假设你的表单里,6.1是数量字段,单价你可以从设置或产品字段里取 $quantity = rgar($entry, '6.1'); $unit_price = 150; // 比如你的商品单价是150元 // 手动计算总金额 $calculated_total = $quantity * $unit_price; // 和Gravity Forms生成的payment_amount对比,不一致就拦截 if ($calculated_total != $entry['payment_amount']) { wp_die('订单金额验证失败,可能存在篡改行为'); } // 跳转至支付页面 $payment_url = add_query_arg('price', $calculated_total, 'http://www.******.***/test.php'); wp_redirect($payment_url); exit(); }
这个方案相当于做了双重验证,就算有意外情况,也能确保传递的价格是正确的。
额外的安全小贴士
- 尽量不要用URL参数传递价格,最好用POST请求把金额传到支付页面,或者在支付页面通过订单ID从数据库里取真实金额(更安全)
- 别忘了在支付平台的回调接口里再次验证金额!这是最后一道防线,确保用户实际支付的金额和订单金额完全一致
- 用
wp_redirect代替原生的header函数,因为它会处理WordPress的输出缓冲,避免出现“headers already sent”的错误
内容的提问来源于stack exchange,提问作者RTA
相关产品推荐
相关产品推荐

