如何为Contact Form 7设置Stripe动态注册金额?
实现Contact Form 7参会人数动态计算注册费用的方法
要实现根据参会人数自动计算Stripe付款金额,需要分前端实时计算和后端验证防篡改两步操作:
一、修改表单结构并添加前端计算逻辑
- 调整原表单代码,新增隐藏字段存储计算后的金额,同时更新Stripe短代码的
amount参数指向该字段:
<label> Name [text* your-name autocomplete:name] </label> <label> Email [email* your-email autocomplete:email] </label> <label> Company name [text* your-company autocomplete:text] </label> <label> Number of people [number* number-602 min:1 "1"] </label> <!-- 新增隐藏字段存储计算后的总金额 --> [hidden dynamic_amount] <!-- Stripe短代码使用隐藏字段的值作为付款金额 --> [stripe currency:usd amount:[dynamic_amount] "Proceed to checkout" "Pay"]
- 添加JavaScript监听人数输入框的变化,实时计算并更新金额:
将以下代码添加到主题的functions.php文件中,用于注册并加载自定义脚本:
add_action( 'wp_enqueue_scripts', 'cf7_dynamic_amount_script' ); function cf7_dynamic_amount_script() { wp_enqueue_script( 'cf7-dynamic-amount', get_stylesheet_directory_uri() . '/js/cf7-dynamic-amount.js', array('jquery'), '1.0', true ); }
随后在主题目录下创建js/cf7-dynamic-amount.js文件,写入核心计算逻辑:
jQuery(document).ready(function($) { // 监听人数输入框的输入/变化事件 $('#wpcf7-number-602').on('input change', function() { const numberOfPeople = parseInt($(this).val()) || 1; const feePerPerson = 60; // 每人60美元 const totalAmount = numberOfPeople * feePerPerson; // 更新隐藏字段的金额值 $('input[name="dynamic_amount"]').val(totalAmount); }); // 页面加载时初始化金额(适配默认值1) $('#wpcf7-number-602').trigger('change'); });
二、后端验证防止金额篡改
前端计算逻辑可被恶意修改,因此必须在后端校验提交的金额是否与参会人数匹配:
将以下代码添加到主题的functions.php文件中:
add_action( 'wpcf7_before_send_mail', 'cf7_validate_dynamic_amount' ); function cf7_validate_dynamic_amount( $contact_form ) { $submission = WPCF7_Submission::get_instance(); if ( ! $submission ) return; $posted_data = $submission->get_posted_data(); $numberOfPeople = isset($posted_data['number-602']) ? intval($posted_data['number-602']) : 1; $submittedAmount = isset($posted_data['dynamic_amount']) ? intval($posted_data['dynamic_amount']) : 0; $correctAmount = $numberOfPeople * 60; // 校验金额是否匹配,不匹配则阻止提交并提示错误 if ( $submittedAmount !== $correctAmount ) { $contact_form->add_error( '金额验证失败,请重新提交表单' ); $submission->set_status( 'validation_failed' ); } }
完成以上设置后,用户输入参会人数时,前端会自动计算总费用并同步到Stripe付款按钮;同时后端会校验提交的金额是否与人数对应,彻底避免恶意篡改的风险。
内容的提问来源于stack exchange,提问作者Szymon Mudrak
相关产品推荐
相关产品推荐

