如何使用 Elements 将持卡人姓名添加到 Stripe 结账?

Posted

技术标签:

【中文标题】如何使用 Elements 将持卡人姓名添加到 Stripe 结账?【英文标题】:How to add card holder's name to Stripe checkout using Elements? 【发布时间】:2018-04-17 02:56:02 【问题描述】:

我需要在我的自定义表单中添加一个额外的字段,我想添加信用卡的名称。

我尝试了以下方式:

var cardNameElement = elements.create('cardName', 
  style: style
  //, placeholder: 'Custom card number placeholder',
);
cardNameElement.mount('#card-name-element');

<div id="card-name-element" class="field"></div>

但这不起作用,在其documentation 中只允许执行这些程序,仅验证四个元素或数据:cardNumber、cardExpiry、cardCvc、postalCode。

如何添加信用卡名称并使用stripe.js进行验证

我的代码:

var stripe = Stripe('pk_test_6pRNASCoBOKtIshFeQd4XMUh');
var elements = stripe.elements();

var style = 
  base: 
    iconColor: '#666EE8',
    color: '#31325F',
    lineHeight: '40px',
    fontWeight: 300,
    fontFamily: 'Helvetica Neue',
    fontSize: '15px',

    '::placeholder': 
      color: '#CFD7E0',
    ,
  ,
;

var cardNumberElement = elements.create('cardNumber', 
  style: style
  //, placeholder: 'Custom card number placeholder',
);
cardNumberElement.mount('#card-number-element');

var cardExpiryElement = elements.create('cardExpiry', 
  style: style
);
cardExpiryElement.mount('#card-expiry-element');

var cardCvcElement = elements.create('cardCvc', 
  style: style
);
cardCvcElement.mount('#card-cvc-element');

/*var postalCodeElement = elements.create('postalCode', 
  style: style
);
postalCodeElement.mount('#postal-code-element');*/


function setOutcome(result) 
  var successElement = document.querySelector('.success');
  var errorElement = document.querySelector('.error');
  successElement.classList.remove('visible');
  errorElement.classList.remove('visible');

  if (result.token) 
    // In this example, we're simply displaying the token
    successElement.querySelector('.token').textContent = result.token.id;
    successElement.classList.add('visible');

    // In a real integration, you'd submit the form with the token to your backend server
    //var form = document.querySelector('form');
    //form.querySelector('input[name="token"]').setAttribute('value', result.token.id);
    //form.submit();
   else if (result.error) 
    errorElement.textContent = result.error.message;
    errorElement.classList.add('visible');
  

document.querySelector('form').addEventListener('submit', function(e) 
  e.preventDefault();
  stripe.createToken(cardNumberElement).then(setOutcome);
);
<script src="https://code.jquery.com/jquery-2.0.2.min.js"></script>
<script src="https://js.stripe.com/v3/"></script>

		<form action="" method="POST">
			<input type="hidden" name="token" />
			<div class="group">
				<div class="card-container1">
					<label>
						<span class="title-card">Card number</span>
					    <div id="card-number-element" class="field"></div>
					    <span class="brand"><i class="pf pf-credit-card" id="brand-icon"></i></span>
				    </label>
			    </div>
				<div class="card-details">
					<div class="expiration">
						<label>
							<span class="title-card">Expiry date</span>
							<div id="card-expiry-element" class="field"></div>
						</label>
					</div>
					<div class="cvv">
						<label>
							<span class="title-card">CVC</span>
							<div id="card-cvc-element" class="field"></div>
						</label>
					</div>
				</div>
			</div>
			<button type="submit">Pay $25</button>
			<div class="outcome">
				<div class="error"></div>
				<div class="success">Success! Your Stripe token is <span class="token"></span></div>
			</div>
		</form>

我想做的事:

【问题讨论】:

【参考方案1】:

Elements 目前不支持收集持卡人姓名。它侧重于收集:

卡号 有效期 CVC 邮政编码(在某些国家/地区)

如果您想收集持卡人的姓名,您必须为姓名建立自己的字段并在创建令牌期间将其提交给 API:

var card_name = document.getElementById('card_name').value;
stripe.createToken(card, name: card_name).then(setOutcome);

您可以在此处查看 jsfiddle 上的实时示例:https://jsfiddle.net/7w2vnyb5/

【讨论】:

填写除名称外的所有数据时,发送表单时未显示字段名称错误,如何使用条带或 jQuery simple 的 javascript 代码进行验证跨度> @StaOne 只需在您的代码中添加一些逻辑以查看该字段是否为空,并且仅在它不为空时创建一个令牌 如果我早点找到这篇文章,它会节省我数小时浏览糟糕(尽管很广泛)的条带文档的时间。似乎元素缺乏它可以做的事情,并且它们并没有暗示额外的 UI 组件根本不存在的事实。感谢您提供此信息 koopajah。 我还没有在生产中使用它,它可以在测试环境中使用。如果 Stripe 不知道持卡人姓名,是否可以通过扣款? @Adam:是的,持卡人不需要进行交易。【参考方案2】:

当我在这件事上像个白痴一样挣扎了一段时间。截至 2019 年 2 月,您可以添加 tokenData 对象,其中包含有关卡详细信息的信息。例如:

let custData = 
                          name: 'Firstname Lastname',
                          address_line1: '21 Great Street',
                          address_line2: 'Shilloong',
                          address_city: 'Chicago',
                          address_state: 'Illinois',
                          address_zip: '12345',
                          address_country: 'US'
              ;

              stripe.createToken(card, custData).then(function(result) 
                if (result.error) 
                  // Inform the user if there was an error.
                  var errorElement = document.getElementById('card-errors');
                  errorElement.textContent = result.error.message;
                 else 
                  // Send the token to your server.
                  stripeTokenHandler(result.token);
                
              );
            );

【讨论】:

现在我想知道如何发送电子邮件?你可能知道吗?【参考方案3】:

如果您使用的是“PaymentIntents”,如果您是欧盟/SCA 合规者,您可能应该使用它,那么其格式再次略有变化...

stripe.confirmCardPayment(
  'PAYMENT_INTENT_CLIENT_SECRET',
  
    payment_method: 
      card: cardElement,
      billing_details: 
        name: 'Jenny Rosen'
      
    
  
).then(function(result) 
  // Handle result.error or result.paymentIntent
);

stripe.confirmCardPayment 文档:

https://stripe.com/docs/stripe-js/reference#stripe-confirm-card-payment

billing_details 对象文档:

https://stripe.com/docs/api/payment_methods/create#create_payment_method-billing_details

【讨论】:

【参考方案4】:

我将元数据用于自定义字段,例如持卡人姓名:

... create(
              amount: myAmount,
              currency: 'USD,
              description: "Put your full discription here",
              source: tokenid,
              metedata: any: "set of", key: "values", that: "you want", cardholder: "name"
           ,
             idempotency_key "my_idempotency_key"
           )

资源:https://stripe.com/docs/payments/charges-api#storing-information-in-metadata

【讨论】:

以上是关于如何使用 Elements 将持卡人姓名添加到 Stripe 结账?的主要内容,如果未能解决你的问题,请参考以下文章

持卡人姓名拼音自动添加程序的设计

现代信用卡处理系统是不是允许在持卡人姓名中使用变音符号?

Girocard-Maestro 智能卡读卡器问题,读取持卡人姓名和 IBAN

EMV 持卡人姓名与 NFC 扫描信用卡的信用卡名称不同

银行卡号大全和身份证姓名手机号

信用卡验证:卡名可以包含非 ASCII 字符吗?