Stripe.js / stripe.php - 所有卡错误都有效(失效,cvc,错误#),但被拒绝的卡除外(Stripe.js / stripe.php - All card errors work (expiry, cvc, incorrect #) except for declined card)
我正在测试一个简单的结账表格,使用条纹付款。 我遵循了教程示例( https://stripe.com/docs/tutorials/forms ),除了拒绝卡错误外,一切正常。 根据api,使用4000000000000002来模拟被拒绝的卡。 它只是崩溃了我的charge.php文件。 这是来自html表单和charge.php文件的代码。
现场版: http : //www.getwebshark.com/trial/step3
form.html -
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta name="generator" content= "HTML Tidy for Linux/x86 (vers 11 February 2007), see www.w3.org" /> <meta http-equiv="Content-type" content="text/html; charset=us-ascii" /> <title>Stripe Getting Started Form</title> <script type="text/javascript" src="https://js.stripe.com/v1/"> </script><!-- jQuery is used only for this example; it isn't required to use Stripe --> <script type="text/javascript" src= "https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> </script> <script type="text/javascript"> //<![CDATA[ // this identifies your website in the createToken call below Stripe.setPublishableKey('ihidthis'); function stripeResponseHandler(status, response) { if (response.error) { // re-enable the submit button $('.submit-button').removeAttr("disabled"); // show the errors on the form $(".payment-errors").html(response.error.message); } else { var form$ = $("#payment-form"); // token contains id, last4, and card type var token = response['id']; // insert the token into the form so it gets submitted to the server form$.append("<input type='hidden' name='stripeToken' value='" + token + "' />"); // and submit form$.get(0).submit(); } } $(document).ready(function() { $("#payment-form").submit(function(event) { // disable the submit button to prevent repeated clicks $('.submit-button').attr("disabled", "disabled"); // createToken returns immediately - the supplied callback submits the form if there are no errors Stripe.createToken({ name: $('.card-name').val(), number: $('.card-number').val(), cvc: $('.card-cvc').val(), exp_month: $('.card-expiry-month').val(), exp_year: $('.card-expiry-year').val() }, stripeResponseHandler); return false; // submit from callback }); }); if (window.location.protocol === 'file:') { alert("stripe.js does not work when included in pages served over file:// URLs. Try serving this page over a webserver. Contact support@stripe.com if you need assistance."); } //]]> </script> </head> <body> <h1>Trial $4.99 with recurring $74.98 after 18 days</h1> <!-- to display errors returned by createToken --> <form action="charge.php" method="post" id="payment-form" name="payment-form"> <div class="form-row"> <label>Name on Card</label> <input type="text" size="20" autocomplete="off" class= "card-name" /> </div> <div class="form-row"> <label>Email</label> <input type="text" size="20" autocomplete="off" name= "email" /> </div> <div class="form-row"> <label>Card Number</label> <input type="text" size="20" autocomplete="off" class= "card-number" /> </div> <div class="form-row"> <label>CVC</label> <input type="text" size="4" autocomplete="off" class= "card-cvc" /> </div> <div class="form-row"> <label>Expiration (MM/YYYY)</label> <input type="text" size="2" class= "card-expiry-month" /> <span>/</span> <input type="text" size="4" class= "card-expiry-year" /> </div> <div class="form-row"> <label>Shipping address</label> <input type="text" size="20" autocomplete="off" name="address" /> </div> <div class="form-row"> <label>City</label> <input type="text" size="20" autocomplete="off" name="city" /> </div> <div class="form-row"> <label>State</label> <input type="text" size="20" autocomplete="off" name= "state" /> </div> <div class="form-row"> <label>Zip Code</label> <input type="text" size="20" autocomplete="off" name= "zip" /> </div><button type="submit" class="submit-button">Submit Payment</button> </form> </body> </html>
charge.php -
<?php require_once('stripe-php/lib/Stripe.php'); Stripe::setApiKey("ihidthis"); // get the single use token from the form submitted by stripeResponseHandler // set your secret key: remember to change this to your live secret key in production // see your keys here https://manage.stripe.com/account // get the credit card details submitted by the form $token = $_POST['stripeToken']; $email = $_POST['email']; //combine these variables and post them all to stripe's customer description $address = $_POST['address']; $city = $_POST['city']; $state = $_POST['state']; $zip = $_POST['zip']; $description = $address . " " . $city . " " . $state . " " . $zip; $customer = Stripe_Customer::create(array( "card" => $token, "plan" => "001", "description" => $description, "email" => $email )); Stripe_Charge::create(array( "amount" => 499, # amount in cents, again "currency" => "usd", "customer" => $customer->id )); echo '<h1>Thank you for your business!</h1>'; ?>
I'm testing a simple checkout form using stripe for payments. I followed tutorial examples ( https://stripe.com/docs/tutorials/forms ) and everything works except the declined card error. As per the api, use 4000000000000002 to simulate a declined card. It just crashes my charge.php file. Here is the code from the html form and charge.php file.
live version here: http://www.getwebshark.com/trial/step3
form.html -
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta name="generator" content= "HTML Tidy for Linux/x86 (vers 11 February 2007), see www.w3.org" /> <meta http-equiv="Content-type" content="text/html; charset=us-ascii" /> <title>Stripe Getting Started Form</title> <script type="text/javascript" src="https://js.stripe.com/v1/"> </script><!-- jQuery is used only for this example; it isn't required to use Stripe --> <script type="text/javascript" src= "https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"> </script> <script type="text/javascript"> //<![CDATA[ // this identifies your website in the createToken call below Stripe.setPublishableKey('ihidthis'); function stripeResponseHandler(status, response) { if (response.error) { // re-enable the submit button $('.submit-button').removeAttr("disabled"); // show the errors on the form $(".payment-errors").html(response.error.message); } else { var form$ = $("#payment-form"); // token contains id, last4, and card type var token = response['id']; // insert the token into the form so it gets submitted to the server form$.append("<input type='hidden' name='stripeToken' value='" + token + "' />"); // and submit form$.get(0).submit(); } } $(document).ready(function() { $("#payment-form").submit(function(event) { // disable the submit button to prevent repeated clicks $('.submit-button').attr("disabled", "disabled"); // createToken returns immediately - the supplied callback submits the form if there are no errors Stripe.createToken({ name: $('.card-name').val(), number: $('.card-number').val(), cvc: $('.card-cvc').val(), exp_month: $('.card-expiry-month').val(), exp_year: $('.card-expiry-year').val() }, stripeResponseHandler); return false; // submit from callback }); }); if (window.location.protocol === 'file:') { alert("stripe.js does not work when included in pages served over file:// URLs. Try serving this page over a webserver. Contact support@stripe.com if you need assistance."); } //]]> </script> </head> <body> <h1>Trial $4.99 with recurring $74.98 after 18 days</h1> <!-- to display errors returned by createToken --> <form action="charge.php" method="post" id="payment-form" name="payment-form"> <div class="form-row"> <label>Name on Card</label> <input type="text" size="20" autocomplete="off" class= "card-name" /> </div> <div class="form-row"> <label>Email</label> <input type="text" size="20" autocomplete="off" name= "email" /> </div> <div class="form-row"> <label>Card Number</label> <input type="text" size="20" autocomplete="off" class= "card-number" /> </div> <div class="form-row"> <label>CVC</label> <input type="text" size="4" autocomplete="off" class= "card-cvc" /> </div> <div class="form-row"> <label>Expiration (MM/YYYY)</label> <input type="text" size="2" class= "card-expiry-month" /> <span>/</span> <input type="text" size="4" class= "card-expiry-year" /> </div> <div class="form-row"> <label>Shipping address</label> <input type="text" size="20" autocomplete="off" name="address" /> </div> <div class="form-row"> <label>City</label> <input type="text" size="20" autocomplete="off" name="city" /> </div> <div class="form-row"> <label>State</label> <input type="text" size="20" autocomplete="off" name= "state" /> </div> <div class="form-row"> <label>Zip Code</label> <input type="text" size="20" autocomplete="off" name= "zip" /> </div><button type="submit" class="submit-button">Submit Payment</button> </form> </body> </html>
charge.php -
<?php require_once('stripe-php/lib/Stripe.php'); Stripe::setApiKey("ihidthis"); // get the single use token from the form submitted by stripeResponseHandler // set your secret key: remember to change this to your live secret key in production // see your keys here https://manage.stripe.com/account // get the credit card details submitted by the form $token = $_POST['stripeToken']; $email = $_POST['email']; //combine these variables and post them all to stripe's customer description $address = $_POST['address']; $city = $_POST['city']; $state = $_POST['state']; $zip = $_POST['zip']; $description = $address . " " . $city . " " . $state . " " . $zip; $customer = Stripe_Customer::create(array( "card" => $token, "plan" => "001", "description" => $description, "email" => $email )); Stripe_Charge::create(array( "amount" => 499, # amount in cents, again "currency" => "usd", "customer" => $customer->id )); echo '<h1>Thank you for your business!</h1>'; ?>
原文:https://stackoverflow.com/questions/9706128
最满意答案
因为你正在使用table-cell,所以应用
border-spacing: 10px;
或border-spacing: 10px 0;
应该为你工作.nav-justified { border-spacing: 10px 0; border-collapse: separate; }
看到你更新的小提琴
since you are using table-cell so applying
border-spacing: 10px;
orborder-spacing: 10px 0;
should work for you.nav-justified { border-spacing: 10px 0; border-collapse: separate; }
see your updated fiddle
相关问答
更多-
为什么不把屏幕分成两列,即.col-md-4和col-md-8,并将框1,框2和框3的内容放到左栏中? 其中一个屏幕小于md这会使.container的框为100%, .container升序排列。 .box { border: 1px solid #c66; background-color: #f99; margin-bottom: 15px; height: 100px; line-height: 100px; color: #fff; font-family ...
-
你可以简单地使用String(selectmedic).replace(/,/g, ', '); 在每次昏迷后增加一个空间。 /,/g只是一个正则表达式来代替所有的出现。 You could simply use String(selectmedic).replace(/,/g, ', '); to add a space after every coma. The /,/g is simply a regex to replace all occurences.
-
您必须减少每个项目的顶部和底部填充。 试试下面的CSS .navbar-default .dropdown-menu>li>a { padding: 0 20px; } /*For responsive*/ @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu>li>a { padding: 0 20px; } } .navbar-default .dropdown-menu>li ...
-
尝试使用此方法: public void updateBottomBar() { BottomNavigationMenuView menuView = (BottomNavigationMenuView) bottomNavigationView.getChildAt(0); if (menuView != null) { for (int i = 0; i < menuView.getChildCount(); i++) { BottomNavig ...
-
表格使用的空间(Space used by tables)[2024-01-30]
您的代码提供了所使用空间的逐表视图。 您也可以在没有params的情况下运行sp_spaceused来概述整个数据库的大小。 是什么原因让你怀疑结果? Your code gives a table-by-table view of space used. You can also just run sp_spaceused without params to get an overview of the size of the whole database. What causes you to doub ... -
使用:first-child伪选择器: span:first-child { margin: 0; } :first-child在我们的例子中,第:first-child选择(在这种情况下)第一个 ,它是父母的第一个孩子 ( ),并且仅将样式应用于该元素。 同样适用于:last-child ,将造型应用于其父母的最后一个孩子 。 另外,使用:last-child选择器应该平分所有东西,请记住是对称的,你也可以为元素应用margin-left和right,一个小例子: sp ...
-
所以我把你提供的代码放到JSFiddle中 。 只有Bootstrap CSS,两个glypicons就在彼此旁边。 你可以提供更多的html和CSS,因为其他东西导致你不想要的样式。 https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css
清单项之间的引导空间(Bootstrap Space between Listing Item)[2023-05-29]
因为你正在使用table-cell,所以应用border-spacing: 10px; 或border-spacing: 10px 0; 应该为你工作 .nav-justified { border-spacing: 10px 0; border-collapse: separate; } 看到你更新的小提琴 since you are using table-cell so applying border-spacing: 10px; or border-spacing: 10p ...在Qt中,对于上下文菜单项,如何隐藏图标的空间(In Qt, for a context menu item, how to hide the space of the icon)[2021-10-23]
我不知道是否有特定于动作或菜单的方法,但您可以使用样式删除它。 I don't know if there is a way specific to the action or the menu, but you could probably remove it using a style.给li一个固定的padding-left , position: relative并使图标position: absolute; 在左边应该解决你的问题。 li { padding-left: 40px; position: relative; } li i { left: 0; position: absolute; top: 0; } 此外,您可以为图标设置宽度或最大宽度: li i { left: 0; position: absolute; top: 0; m ...相关文章
更多- Create a Bootable MicroSD Card
- PHP和javascript,谁更容易调试??
- my php & mysql FAQ
- php面试题一
- PHP基础教程一:基本语法
- RabbitMQ Work模式消息队列
- 强力推荐几款JS插件,
- PHP简介
- Don’t work. Be hated. Love someone.
- 微信会员注册开发【带源码】:网页授权,得到code后在当前页面获取openid,js+php实现跨域请求
最新问答
更多- 您如何使用git diff文件,并将其应用于同一存储库的副本的本地分支?(How do you take a git diff file, and apply it to a local branch that is a copy of the same repository?)
- 将长浮点值剪切为2个小数点并复制到字符数组(Cut Long Float Value to 2 decimal points and copy to Character Array)
- OctoberCMS侧边栏不呈现(OctoberCMS Sidebar not rendering)
- 页面加载后对象是否有资格进行垃圾回收?(Are objects eligible for garbage collection after the page loads?)
- codeigniter中的语言不能按预期工作(language in codeigniter doesn' t work as expected)
- 在计算机拍照在哪里进入
- 使用cin.get()从c ++中的输入流中丢弃不需要的字符(Using cin.get() to discard unwanted characters from the input stream in c++)
- No for循环将在for循环中运行。(No for loop will run inside for loop. Testing for primes)
- 单页应用程序:页面重新加载(Single Page Application: page reload)
- 在循环中选择具有相似模式的列名称(Selecting Column Name With Similar Pattern in a Loop)
- System.StackOverflow错误(System.StackOverflow error)
- KnockoutJS未在嵌套模板上应用beforeRemove和afterAdd(KnockoutJS not applying beforeRemove and afterAdd on nested templates)
- 散列包括方法和/或嵌套属性(Hash include methods and/or nested attributes)
- android - 如何避免使用Samsung RFS文件系统延迟/冻结?(android - how to avoid lag/freezes with Samsung RFS filesystem?)
- TensorFlow:基于索引列表创建新张量(TensorFlow: Create a new tensor based on list of indices)
- 企业安全培训的各项内容
- 错误:RPC失败;(error: RPC failed; curl transfer closed with outstanding read data remaining)
- C#类名中允许哪些字符?(What characters are allowed in C# class name?)
- NumPy:将int64值存储在np.array中并使用dtype float64并将其转换回整数是否安全?(NumPy: Is it safe to store an int64 value in an np.array with dtype float64 and later convert it back to integer?)
- 注销后如何隐藏导航portlet?(How to hide navigation portlet after logout?)
- 将多个行和可变行移动到列(moving multiple and variable rows to columns)
- 提交表单时忽略基础href,而不使用Javascript(ignore base href when submitting form, without using Javascript)
- 对setOnInfoWindowClickListener的意图(Intent on setOnInfoWindowClickListener)
- Angular $资源不会改变方法(Angular $resource doesn't change method)
- 在Angular 5中不是一个函数(is not a function in Angular 5)
- 如何配置Composite C1以将.m和桌面作为同一站点提供服务(How to configure Composite C1 to serve .m and desktop as the same site)
- 不适用:悬停在悬停时:在元素之前[复制](Don't apply :hover when hovering on :before element [duplicate])
- 常见的python rpc和cli接口(Common python rpc and cli interface)
- Mysql DB单个字段匹配多个其他字段(Mysql DB single field matching to multiple other fields)
- 产品页面上的Magento Up出售对齐问题(Magento Up sell alignment issue on the products page)