问题描述
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);
}