Stripe 无法在 webview 中进行支付错误

Posted

技术标签:

【中文标题】Stripe 无法在 webview 中进行支付错误【英文标题】:Stripe cannot make make payment error in webview 【发布时间】:2021-01-22 12:50:34 【问题描述】:

我在我的应用程序中使用条带支付网关,当我输入卡详细信息后一切正常,然后在输入 otp 并提交后重定向到 OTP 页面并提交它会引发此错误

此问题仅在实时模式下出现,在测试模式借记卡不会要求 OTP

I/flutter ( 5342): errprint : PlatformException(failed, failed, null, null)

payment-service.dart

import 'dart:convert';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'package:stripe_payment/stripe_payment.dart';

class StripeTransactionResponse 
  String message;
  bool success;
  StripeTransactionResponse(this.message, this.success);


class StripeService 
  static String apiBase = 'https://api.stripe.com/v1';
  static String paymentApiUrl = '$StripeService.apiBase/payment_intents';
  static String secret = 'xxxMy_secretxxx';
  static Map<String, String> headers = 
    'Authorization': 'Bearer $StripeService.secret',
    'Content-Type': 'application/x-www-form-urlencoded'
  ;
  static init() 
    StripePayment.setOptions(StripeOptions(
        publishableKey: "xxxMy_keyxxx",
        androidPayMode: 'production'));
  

  static Future<StripeTransactionResponse> payViaExistingCard(
      String amount, String currency, CreditCard card) async 
    try 
      var paymentMethod = await StripePayment.createPaymentMethod(
          PaymentMethodRequest(card: card));
      var paymentIntent =
          await StripeService.createPaymentIntent(amount, currency);
          print("payment intent $paymentIntent");
      var response = await StripePayment.confirmPaymentIntent(PaymentIntent(
          clientSecret: paymentIntent['client_secret'],
          paymentMethodId: paymentMethod.id));
          print("Payment confirm $response.status");
      if (response.status == 'succeeded') 
        return new StripeTransactionResponse(
            message: 'Transaction successful', success: true);
       else 
        return new StripeTransactionResponse(
            message: 'Transaction failed', success: false);
      
     on PlatformException catch (err) 
      print("errprint : $err");
      return StripeService.getPlatformExceptionErrorResult(err);
     catch (err) 
      print("errprint$err");
      return new StripeTransactionResponse(
          message: 'Transaction failed: $err.toString()', success: false);
    
  

  static Future<Map<String, dynamic>> createPaymentIntent(
      String amount, String currency) async 
    try 
      Map<String, dynamic> body = 
        'amount': amount,
        'currency': currency,
        'payment_method_types[]': 'card',
        'description': 'Software development services',
        'shipping[name]': 'Jenny Rosen',
        'shipping[address][line1]': '510 Townsend St',
        'shipping[address][postal_code]': '98140',
        'shipping[address][city]': 'San Francisco',
        'shipping[address][state]': 'TN',
        'shipping[address][country]': 'IN',
      ;
      var response = await http.post(StripeService.paymentApiUrl,
          body: body, headers: StripeService.headers);
          print("check post res$jsonDecode(response.body)");
      return jsonDecode(response.body);
     catch (err) 
      print('err charging user: $err.toString()');
    
    return null;
  

这是我的 pubspec.yaml

name: message
description: A new Flutter project.

# The following line prevents the package from being accidentally published to
# pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev

# The following defines the version and build number for your application.
# A version number is three numbers separated by dots, like 1.2.43
# followed by an optional build number separated by a +.
# Both the version and the builder number may be overridden in flutter
# build by specifying --build-name and --build-number, respectively.
# In Android, build-name is used as versionName while build-number used as versionCode.
# Read more about Android versioning at https://developer.android.com/studio/publish/versioning
# In ios, build-name is used as CFBundleShortVersionString while build-number used as CFBundleVersion.
# Read more about iOS versioning at
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
version: 1.0.0+1

environment:
  sdk: ">=2.7.0 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  intro_slider: ^2.3.2

  firebase_auth: ^0.18.0+1
  
  cloud_firestore: ^0.14.0+2

  fluttertoast: ^7.0.2

  image_picker:  ^0.6.0+9

  shared_preferences: ^0.5.3+1

  firebase_storage: ^4.0.0

  #flutter_html: ^1.0.2

  firebase_core: ^0.5.0

  giffy_dialog:

  cached_network_image: ^2.2.0+1

  modal_progress_hud: ^0.1.3

  intl: ^0.16.1

  flutter_clipboard_manager:

  sentry: ^2.2.0
  
  timeago: ^2.0.27

  qr_flutter:

  graphql:

  image_cropper: ^1.0.2

  contacts_service: ^0.4.6

  permission_handler: ^5.0.1+1

  share: ^0.6.1

  fleva_icons: ^1.0.0
 
  google_fonts : ^0.2.0

  flutter_staggered_grid_view: ^0.3.0

  flutter_icons: ^1.0.0+1

  flutter_cache_store:

  web3dart: ^1.2.3

  bitcoins: ^1.0.3

  #bitcoinFlutter
  bitcoin_flutter: ^2.0.1

  carousel_slider: ^1.3.1

  transparent_image: ^1.0.0

  smooth_star_rating: ^1.0.3

  dots_indicator: ^1.1.0

  bip32: ^1.0.5

  bip39: ^1.0.3

  tuple:

  hex: ^0.1.2

  scoped_model: ^1.0.1

  equatable:

  crypto: ^2.1.5

  encrypt: ^4.0.2

  localstorage: 

  path_provider: 
    
  photo_view: ^0.4.0

  mime: ^0.9.6+2

  ntp: ^1.0.3

  decimal:

  virtual_keyboard:

  local_auth:

  url_launcher: ^5.7.2

  launch_review: ^2.0.0

  flutter_secure_storage: ^3.3.4

  giphy_client: ^0.2.0

  flutter_barcode_scanner:

  firebase_messaging: ^5.0.2

  font_awesome_flutter:
  
  #otpinput field
  pin_code_fields: ^5.0.1

  #otpanimation lib
  flare_flutter: ^2.0.6

  flutter_slidable: ^0.5.7

  file_picker: ^2.0.6

  ethereum_address:

  flutter_downloader:
  
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.3

  #upi payment gateway
  upi_india: ^2.1.2

  cool_alert: ^1.0.1

  #webview for paymentgateway
  #webview_flutter: ^1.0.0

  #paypal payment gateway
  http_auth: ^0.3.0

  #Razorpay payment gateway
  #razorpay_flutter: ^1.2.2

  #stripe payment gateway
  stripe_payment: ^1.0.8

  #stripeUI
  flutter_credit_card: ^0.1.3
  progress_dialog: ^1.2.2
  


dev_dependencies:
  flutter_test:
    sdk: flutter

# For information on the generic Dart part of this file, see the
# following page: https://dart.dev/tools/pub/pubspec

# The following section is specific to Flutter.
flutter:

  # The following line ensures that the Material Icons font is
  # included with your application, so that you can use the icons in
  # the material Icons class.
  uses-material-design: true

  # To add assets to your application, add an assets section, like this:
  assets:
     - assets/img_not_available.jpeg
     - assets/flags/
     - assets/emoji/
     - assets/images/
     - assets/bg1.jpg
     - assets/giphy.png
     - assets/anime/otp.flr
     - assets/splash.png
     - assets/splashc.jpg
     - assets/json/FacebookPost.json

  # An image asset can refer to one or more resolution-specific "variants", see
  # https://flutter.dev/assets-and-images/#resolution-aware.

  # For details regarding adding assets from package dependencies, see
  # https://flutter.dev/assets-and-images/#from-packages

  # To add custom fonts to your application, add a fonts section here,
  # in this "flutter" section. Each entry in this list should have a
  # "family" key with the font family name, and a "fonts" key with a
  # list giving the asset and other descriptors for the font. For
  # example:
  # fonts:
  #   - family: Schyler
  #     fonts:
  #       - asset: fonts/Schyler-Regular.ttf
  #       - asset: fonts/Schyler-Italic.ttf
  #         style: italic
  #   - family: Trajan Pro
  #     fonts:
  #       - asset: fonts/TrajanPro.ttf
  #       - asset: fonts/TrajanPro_Bold.ttf
  #         weight: 700
  #
  # For details regarding fonts from package dependencies,
  # see https://flutter.dev/custom-fonts/#from-packages

【问题讨论】:

【参考方案1】:

假设“OTP”是作为 3D 安全流程一部分的“一次性密码”,那么您可以使用 SCA regulatory test cards(例如 3155 或 3184 卡)在测试模式下触发此操作。

目前尚不清楚您的错误来自何处,但如果您可以在测试模式下与重现分享更多细节,那么有人可能会提供更多建议。

【讨论】:

感谢您提出 3D Secure flow 的建议,这对我有很大帮助,问题是我的借记车不接受国际付款

以上是关于Stripe 无法在 webview 中进行支付错误的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Stripe 支付模块在“DOMWindow”上执行“postMessage”

“无法识别的特征:‘支付’。”,来源:https://js.stripe.com/v3/ (1)

“未捕获的类型错误:在 angularJS/NodeJS 中使用条带支付方法 Stripe.charges.create() 时无法读取未定义的属性‘创建’”

解决小程序webview中无法上传图片问题

无法在 iOS 应用中使用 Stripe?

使用 iOS Stripe SDK 进行未来支付