Flutter智能签名插件flutter_intelligence_sign3的使用

Flutter智能签名插件flutter_intelligence_sign3的使用

Sign3 SDK集成指南

Sign3 SDK 是一个欺诈预防工具包,旨在评估设备安全性,检测潜在风险如越狱设备、VPN连接或远程访问等。通过提供有关设备安全性的见解,它增强了对欺诈活动的安全措施,并确保了强大的保护系统。

在项目中添加Sign3 SDK

添加最新版本到pubspec.yaml文件

  1. 我们不断改进我们的欺诈库,增加新功能、修复错误并进行安全更新。为了应对不断发展的欺诈风险,我们建议更新到最新的SDK版本。
    dependencies:
      flutter_intelligence_sign3: ^x.x.x (请参阅最新版本)
    

创建.env文件

  1. 在您的Flutter项目的根目录下创建一个.env文件。
    SIGN3_USERNAME=在凭证文档中提供
    SIGN3_PASSWORD=在凭证文档中提供
    SIGN3_REPO_URL=https://sign3.jfrog.io/artifactory/intelligence-generic-local/
    

使用项目级Gradle依赖

  1. 将Sign3 SDK添加到依赖块
    def envProperties = new Properties()
    def envFile = rootProject.file("../.env")
    if (envFile.exists()) {
        envFile.withInputStream { stream ->
            envProperties.load(stream)
        }
        println ".env file loaded successfully."
    } else {
        println "Error: .env file not found."
    }
          
    allprojects {
       repositories {
           def sign3RepoUrl = envProperties['SIGN3_REPO_URL'] ?: ""
           def sign3Username = envProperties['SIGN3_USERNAME'] ?: ""
           def sign3Password = envProperties['SIGN3_PASSWORD'] ?: ""
           if (!sign3RepoUrl.isEmpty() && sign3RepoUrl.startsWith("https://") && !sign3Username.isEmpty() && !sign3Password.isEmpty()) {
               maven {
                   url sign3RepoUrl
                   credentials {
                       username = sign3Username
                       password = sign3Password
                   }
               }
           } else {
               println "Error: Invalid repository URL or missing credentials in .env file."
           }
       }
    }
    

初始化SDK

  1. 在您的Flutter项目的Android文件夹中创建一个Application类,在该类的onCreate()方法中初始化Sign3 SDK,并将其添加到AndroidManifest.xml文件中。
  2. 该SDK需要以下两个Android权限以实现更高的准确性:
    • ACCESS_FINE_LOCATION
    • READ_PHONE_STATE
  3. 使用凭证文档中共享的ClientID和Client Secret。

对于Java

public class MyApplication extends FlutterApplication {
    @Override
    public void onCreate() {
        super.onCreate();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            Sign3IntelligencePlugin sign3IntelligencePlugin = new Sign3IntelligencePlugin();
            if (sign3IntelligencePlugin.stop()) return;
            OptionsBuilder.INSTANCE.build(
                    "<SIGN3_CLIENT_ID>",
                    "<SIGN3_CLIENT_SECRET>",
                    OptionsBuilder.ENV_DEV); // For Prod: Options.ENV_PROD, For Dev: Options.ENV_DEV
            sign3IntelligencePlugin.initAsync(this);
        }
    }
}

对于Kotlin

class MyApplication : FlutterApplication() {
    override fun onCreate() {
        super.onCreate()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val sign3IntelligencePlugin = Sign3IntelligencePlugin()
            if (sign3IntelligencePlugin.stop()) return
            OptionsBuilder.build(
                clientId = "<SIGN3_CLIENT_ID>",
                secret = "<SIGN3_CLIENT_SECRET>",
                env = OptionsBuilder.ENV_DEV  // For Prod: Options.ENV_PROD, For Dev: Options.ENV_DEV
            )
            sign3IntelligencePlugin.initAsync(this)
        }
    }
}

对于AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

<!-- 如果minSdk低于23,请取消注释以下行 -->
<!-- <uses-sdk tools:overrideLibrary="com.sign3.intelligence.flutter_intelligence_sign3"/> -->

    <application
        android:name=".MyApplication">
        <!-- 在此处添加其他组件如activity等 -->
    </application>

</manifest>

获取会话ID

  1. 会话ID是用户应用程序会话的唯一标识符,当检索该会话的设备结果时用作参考点。
  2. 会话ID遵循OS生命周期管理,符合行业最佳实践。这意味着只要设备保持活动状态,用户的会话就会保持活跃,除非用户终止应用或设备内存不足需要杀死应用。
Future<void> getSessionID() async {
 var sessionId = await Sign3Intelligence.getSessionId();
}

获取设备智能结果

  1. 要获取设备智能数据,请参考以下代码片段。
  2. 智能响应和智能错误模型由SDK公开。
Future<void> getIntelligence() async {
  try {
    var sign3IntelligenceResponse = await Sign3Intelligence.getIntelligence();
    // 处理响应
  } catch (e) {
    // 处理错误消息 
  }
}

可选参数

  1. 您可以随时添加可选参数,如UserId、电话号码等,并更新Sign3Intelligence实例。
  2. 一旦选项被更新,它们会被重置。客户端需要显式更新选项才能摄入它们,否则将发送默认值OTHERS到后端。
  3. 每次更新选项时,都需要调用getIntelligence()函数。
  4. 要使用以下示例更新Sign3Intelligence实例及其可选参数:
UpdateOptions getUpdatedOptions() {
  Map<String, String> additionalAttributes = {
    "TRANSACTION_ID": "<TRANSACTION_ID>",
    "DEPOSIT": "<AMOUNT>",
    "WITHDRAWAL": "<AMOUNT>",
    "METHOD": "UPI/CARD/NET_BANKING/WALLET",
    "STATUS": "SUCCESS/FAILURE",
    "CURRENCY": "USD/INR/GBP/etc.",
    "TIMESTAMP": DateTime.now().millisecondsSinceEpoch.toString(),
  };

  UpdateOptions updateOptions = UpdateOptionsBuilder()
      .setPhoneNumber("<phone_number>")
      .setUserId("<user_id>")
      .setPhoneInputType(PhoneInputType.GOOGLE_HINT)
      .setOtpInputType(OtpInputType.AUTO_FILLED)
      .setUserEventType(UserEventType.TRANSACTION)
      .setMerchantId("<merchant_id>")
      .setAdditionalAttributes(additionalAttributes)
      .build();
  return updateOptions;
}

Future<void> updateOptions() async {
  await Sign3Intelligence.updateOptions(getUpdatedOptions());
}

Future<void> getIntelligence() async {
  try {
    var sign3IntelligenceResponse = await Sign3Intelligence.getIntelligence();
    // 处理响应
  } catch (e) {
    // 处理错误消息 
  }
}

示例设备结果响应

成功的智能响应

{
    "requestId": "403ad427-5018-47b9-b6e8-790e17a78201",
    "newDevice": false,
    "deviceId": "43fccb70-d64a-4c32-a251-f07c082d7034",
    "vpn": false,
    "proxy": false,
    "emulator": true,
    "cloned": false,
    "geoSpoofed": false,
    "rooted": false,
    "ip": "106.219.161.71",
    "remoteAppProviders": false,
    "remoteAppProvidersCount": 3,
    "mirroredScreen": false,
    "hooking": true,
    "factoryReset": true,
    "appTampering": true,
    "sessionRiskScore": 99.50516,
    "deviceRiskScore": 99.50516,
    "clientUserIds": [
        "difansd23r32",
        "2390ksdfaksd"
    ],
    "sign3UserIds": [
        "13asefnn324"
    ],
    "gpsLocation": {
        "address": "F2620, Block F, Sushant Lok III, Sector 57, Gurugram, Haryana 122011, India",
        "adminArea": "Haryana",
        "countryCode": "IN",
        "countryName": "India",
        "featureName": "F2620",
        "latitude": "28.420385999999997",
        "locality": "Gurugram",
        "longitude": "77.088926",
        "postalCode": "122011",
        "subAdminArea": "Gurgaon Division",
        "subLocality": "Sector 57"
    },
    "ipDetails": {
        "country": "IN",
        "fraudScore": 27.0,
        "city": "New Delhi",
        "isp": null,
        "latitude": 28.60000038,
        "region": "National Capital Territory of Delhi",
        "asn": "",
        "longitude": 77.19999695
    },
    "simInfo": {
        "simIds": [
            {
                "simSlotIndex": 0,
                "carrierName": "Android",
                "id": 1
            }
        ],
        "totalSimUsed": 10
    },
    "additionalData": {}
}

错误响应

{
  "requestId": "7e12d131-2d90-4529-a5c7-35f457d86ae6",
  "errorMessage": "Sign3 Server Error"
}

更多关于Flutter智能签名插件flutter_intelligence_sign3的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter智能签名插件flutter_intelligence_sign3的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成和使用flutter_intelligence_sign3插件的一个基本示例。这个示例将展示如何初始化插件并捕获用户的签名。

首先,确保你已经在pubspec.yaml文件中添加了flutter_intelligence_sign3依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_intelligence_sign3: ^最新版本号  # 请替换为实际最新版本号

然后,运行flutter pub get来安装依赖。

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_intelligence_sign3插件:

  1. 导入插件

在你的Dart文件中导入插件:

import 'package:flutter_intelligence_sign3/flutter_intelligence_sign3.dart';
  1. 初始化签名面板

在你的UI中,你可以使用IntelligenceSign小部件来显示签名面板。以下是一个简单的示例:

import 'package:flutter/material.dart';
import 'package:flutter_intelligence_sign3/flutter_intelligence_sign3.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Intelligent Signature Example'),
        ),
        body: SignaturePage(),
      ),
    );
  }
}

class SignaturePage extends StatefulWidget {
  @override
  _SignaturePageState createState() => _SignaturePageState();
}

class _SignaturePageState extends State<SignaturePage> {
  final IntelligenceSignController _controller = IntelligenceSignController();

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: <Widget>[
          Expanded(
            child: IntelligenceSign(
              controller: _controller,
              backgroundColor: Colors.white,
              penColor: Colors.black,
              strokeWidth: 5.0,
              clearButton: IntelligenceSignClearButton(
                color: Colors.red,
              ),
            ),
          ),
          SizedBox(height: 20),
          ElevatedButton(
            onPressed: () async {
              // 获取签名图片
              Uint8List imageBytes = await _controller.getImage();
              // 这里你可以将imageBytes保存到服务器或本地文件
              print('Signature image bytes: $imageBytes');
            },
            child: Text('Get Signature'),
          ),
        ],
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个签名面板和一个按钮。用户可以在签名面板上绘制签名,然后点击按钮获取签名的图像数据。

  • IntelligenceSign小部件用于显示签名面板。
  • IntelligenceSignController用于控制签名面板,如获取签名图像。
  • clearButton属性用于自定义清除按钮的样式。

当用户点击“Get Signature”按钮时,将调用_controller.getImage()方法来获取签名的图像数据,并将其打印到控制台。你可以根据需要处理这些图像数据,例如将其保存到服务器或本地文件。

请确保在实际应用中处理错误和异常,并根据需要自定义UI和交互。

回到顶部