条纹元素:如何在客户端验证卡片元素不是空白?

问题描述

Stripe 建议使用 change 事件对 card 元素进行客户端验证:

cardElement.on('change',function(event) {
  if (event.complete) {
    // enable payment button
  } else if (event.error) {
    // show validation to customer
  }
});

但是,如果用户从不编辑/更改卡片元素,则这种方法无法确定卡片元素是否无效。我总是可以尝试使用 confirmCardPayment 提交付款,但这效率低下 - 这种验证应该可以在客户端进行。

我可以通过将付款表单认为错误状态来解决此问题,然后在用户第一次更改卡时解决(或不解决错误状态。但是,这并不方便,因为它需要我将应用程序代码中的“您的卡号不完整”错误消息国际化,而不是依赖 Stripe。

理想情况下,我可以同步检查卡片元素是否有错误,或者至少同步触发更改事件,但这些似乎都不可能。

解决方法

Stripe.js 根据 Element 的状态将多个类应用于每个 Stripe Element 的容器:

  • StripeElement--focus
  • StripeElement--invalid
  • StripeElement--webkit-autofill
  • StripeElement--empty
  • const cardElementContainer = document.querySelector('#card-element'); let cardElementEmpty = cardElementContainer.classList.contains('StripeElement--empty'); // Do things based on cardElementEmpty being true or false (仅限 Chrome 和 Safari)

您可以在 Stripe's documentation 中阅读有关这些类的更多信息,包括如何自定义它们。

听起来检查 Process: MyAppName [2201] Path: /Applications/MyAppName.app/Contents/MacOS/MyAppName Identifier: es.MyAppName.macos Version: 4.1.0 (45310) App Item ID: 1508553735 App External ID: 840077941 Code Type: ARM-64 (Native) Parent Process: ??? [1] Responsible: MyAppName [2201] User ID: 501 Date/Time: 2021-01-21 17:42:02.638 -0600 OS Version: macOS 11.0.1 (20B29) Report Version: 12 Anonymous UUID: 4FAA8358-ABB0-CC49-10CE-A880D7BC8C04 Sleep/Wake UUID: 0017D1E7-8C98-4D2E-BD79-C5CFC91FE20F Time Awake Since Boot: 21000 seconds Time Since Wake: 710 seconds System Integrity Protection: enabled Crashed Thread: 0 Exception Type: EXC_CRASH (SIGABRT) Exception Codes: 0x0000000000000000,0x0000000000000000 Exception Note: EXC_CORPSE_NOTIFY Thread 0 Crashed: 0 libsystem_kernel.dylib 0x000000019d0efcec __pthread_kill + 8 1 libsystem_pthread.dylib 0x000000019d120c24 pthread_kill + 292 (pthread.c:1388) 2 libsystem_c.dylib 0x000000019d068864 abort + 104 (abort.c:110) 3 es.MyAppName.macos 0x00000001055b3b84 0x104a84000 + 11729796 4 es.MyAppName.macos 0x00000001055b1690 0x104a84000 + 11720336 5 com.apple.CoreFoundation 0x000000019d320654 __handleUncaughtException + 676 (NSException.m:253) 6 libobjc.A.dylib 0x000000019cfca6bc _objc_terminate() + 132 (objc-exception.mm:700) 7 es.MyAppName.macos 0x000000010557d240 0x104a84000 + 11506240 8 libc++abi.dylib 0x000000019d0e00e0 std::__terminate(void (*)()) + 20 (cxa_handlers.cpp:59) 9 libc++abi.dylib 0x000000019d0e006c std::terminate() + 44 (cxa_handlers.cpp:88) 10 libdispatch.dylib 0x000000019cf74434 _dispatch_client_callout + 40 (object.m:562) 11 libdispatch.dylib 0x000000019cf81e1c _dispatch_main_queue_callback_4CF + 836 (inline_internal.h:2548) 12 com.apple.CoreFoundation 0x000000019d25b9dc __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16 (CFRunLoop.c:1790) 13 com.apple.CoreFoundation 0x000000019d21a868 __CFRunLoopRun + 2508 (CFRunLoop.c:3118) 14 com.apple.CoreFoundation 0x000000019d219730 CFRunLoopRunSpecific + 600 (CFRunLoop.c:3242) 15 com.apple.HIToolbox 0x00000001a4d22f0c RunCurrentEventLoopInMode + 292 (EventLoop.c:455) 16 com.apple.HIToolbox 0x00000001a4d22d3c ReceiveNextEventCommon + 688 (EventBlocking.c:326) 17 com.apple.HIToolbox 0x00000001a4d22a6c _BlockUntilNextEventMatchingListInModeWithFilter + 76 (EventBlocking.c:170) 18 com.apple.AppKit 0x000000019f9eedb0 _DPSNextEvent + 868 (CGDPSReplacement.m:584) 19 com.apple.AppKit 0x000000019f9ed730 -[NSApplication(NSEvent) _nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 1312 (appEventRouting.m:1377) 20 com.apple.AppKit 0x000000019f9df58c -[NSApplication run] + 600 (NSApplication.m:3278) 21 com.apple.AppKit 0x000000019f9b0d74 NSApplicationMain + 1064 (NSApplication.m:8773) 22 es.MyAppName.macos 0x0000000104f254f8 0x104a84000 + 4855032 23 es.MyAppName.macos 0x0000000104f254bc 0x104a84000 + 4854972 24 es.MyAppName.macos 0x0000000104a93548 0x104a84000 + 62792 25 libdyld.dylib 0x000000019d13cf54 start + 4 Thread 1: 0 libsystem_kernel.dylib 0x000000019d0e7ce8 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x000000019d0e8098 mach_msg + 76 (mach_msg.c:103) 2 es.MyAppName.macos 0x00000001055aabe0 0x104a84000 + 11693024 3 libsystem_pthread.dylib 0x000000019d12106c _pthread_start + 320 (pthread.c:881) 4 libsystem_pthread.dylib 0x000000019d11bda0 thread_start + 8 Thread 2: 0 libsystem_kernel.dylib 0x000000019d0e7ce8 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x000000019d0e8098 mach_msg + 76 (mach_msg.c:103) 2 com.apple.CoreFoundation 0x000000019d21be88 __CFRunLoopServiceMachPort + 380 (CFRunLoop.c:2641) 3 com.apple.CoreFoundation 0x000000019d21a35c __CFRunLoopRun + 1216 (CFRunLoop.c:2974) 4 com.apple.CoreFoundation 0x000000019d219730 CFRunLoopRunSpecific + 600 (CFRunLoop.c:3242) 5 com.apple.AppKit 0x000000019fb6f240 _NSEventThread + 216 (NSEvent.m:5211) 6 libsystem_pthread.dylib 0x000000019d12106c _pthread_start + 320 (pthread.c:881) 7 libsystem_pthread.dylib 0x000000019d11bda0 thread_start + 8 Thread 3: 0 libsystem_kernel.dylib 0x000000019d0e7ce8 mach_msg_trap + 8 1 libsystem_kernel.dylib 0x000000019d0e8098 mach_msg + 76 (mach_msg.c:103) 2 com.apple.CoreFoundation 0x000000019d21be88 __CFRunLoopServiceMachPort + 380 (CFRunLoop.c:2641) 3 com.apple.CoreFoundation 0x000000019d21a35c __CFRunLoopRun + 1216 (CFRunLoop.c:2974) 4 com.apple.CoreFoundation 0x000000019d219730 CFRunLoopRunSpecific + 600 (CFRunLoop.c:3242) 5 com.apple.CFNetwork 0x00000001a16c5930 +[__CFN_CoreSchedulingSetRunnable _run:] + 572 (CoreSchedulingSet.mm:1374) 6 com.apple.Foundation 0x000000019df990f4 __NSThread__start__ + 864 (NSThread.m:724) 7 libsystem_pthread.dylib 0x000000019d12106c _pthread_start + 320 (pthread.c:881) 8 libsystem_pthread.dylib 0x000000019d11bda0 thread_start + 8 Thread 4: 0 libsystem_pthread.dylib 0x000000019d11bd8c start_wqthread + 0 Thread 5: 0 libsystem_pthread.dylib 0x000000019d11bd8c start_wqthread + 0 Thread 6: 0 libsystem_pthread.dylib 0x000000019d11bd8c start_wqthread + 0 Thread 7: 0 libsystem_pthread.dylib 0x000000019d11bd8c start_wqthread + 0 Thread 8: 0 libsystem_pthread.dylib 0x000000019d11bd8c start_wqthread + 0 Thread 9: 0 libsystem_pthread.dylib 0x000000019d11bd8c start_wqthread + 0 Thread 0 crashed with ARM Thread State (64-bit): x0: 0x0000000000000000 x1: 0x0000000000000000 x2: 0x0000000000000000 x3: 0x0000000000000000 x4: 0x0000000000000010 x5: 0x000000013eb1a200 x6: 0x0000000000000000 x7: 0x0000000000000000 x8: 0x00000000000005b9 x9: 0x94cf92498d1f6560 x10: 0x0000000000003ffe x11: 0x000000020863d50a x12: 0x000000020863d50a x13: 0x000000000000001e x14: 0x0000000000000881 x15: 0x000000008000001f x16: 0x0000000000000148 x17: 0x0000000200736eb0 x18: 0x0000000130093940 x19: 0x0000000000000006 x20: 0x0000000105bd3d40 x21: 0x0000000000000303 x22: 0x0000000105bd3e20 x23: 0x000000013eb35800 x24: 0x0000600001d74240 x25: 0x0000600001d74120 x26: 0x00000001f1065285 x27: 0x00000001f1066aeb x28: 0x000000019d61f90c fp: 0x000000016b379cc0 lr: 0x000000019d120c24 sp: 0x000000016b379ca0 pc: 0x000000019d0efcec cpsr: 0x40000000 far: 0x0000600002564000 esr: 0x56000080 类可能足以满足您的用例。你可以这样做:

while (true)
{
    Console.Write("My Command : ");
    string input = Console.ReadLine();
    if (input.ToUpper() == @"SET /P")
        Console.WriteLine("command correct : " + input);
    else
        Console.WriteLine("command wrong : " + input);
}