You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中通过WebView使用Plaid测试凭证获取交易记录的方法问询

在Android WebView中使用Plaid测试凭证获取交易记录的实现方案

我来帮你梳理在Android WebView中集成Plaid Link并获取交易记录的完整实现,结合你提供的代码,我会补全缺失部分并说明关键要点:

核心实现步骤

  • 配置Plaid Link初始化参数,指定沙箱环境、所需产品(交易+授权)等关键信息
  • 配置WebView的必要设置,确保Plaid Link页面能正常加载和交互
  • 拦截WebView的URL跳转,处理Plaid Link的成功/退出回调,拿到public_token等核心数据
  • 补全缺失的工具方法,完成URI数据解析

完整实现代码

public class PlaidViewActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_plaid_view);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        // 初始化Plaid Link配置参数
        HashMap<String, String> linkInitializeOptions = new HashMap<>();
        linkInitializeOptions.put("key", "56632c5b63db7b7a155000b7c9507649");
        // 修正原代码的错误注释,指定需要的产品:交易+授权
        linkInitializeOptions.put("product", "transactions,auth");
        linkInitializeOptions.put("apiVersion", "v2");
        linkInitializeOptions.put("env", "sandbox"); // 使用沙箱环境做测试
        linkInitializeOptions.put("clientName", "Test App");
        linkInitializeOptions.put("selectAccount", "true");
        linkInitializeOptions.put("webhook", "http://requestb.in");
        linkInitializeOptions.put("baseUrl", "https://cdn.plaid.com/link/v2/stable/link.html");

        // 生成Plaid Link初始化URL
        final Uri linkInitializationUrl = generateLinkInitializationUrl(linkInitializeOptions);

        // 配置WebView设置
        final WebView plaidLinkWebview = findViewById(R.id.webview);
        WebSettings webSettings = plaidLinkWebview.getSettings();
        webSettings.setJavaScriptEnabled(true); // 必须启用JS
        webSettings.setDomStorageEnabled(true); // 启用DOM存储,支持Plaid Link的交互
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        WebView.setWebContentsDebuggingEnabled(true); // 开启调试,方便排查问题

        // 加载Plaid Link页面
        plaidLinkWebview.loadUrl(linkInitializationUrl.toString());

        // 拦截URL跳转,处理Plaid Link的回调
        plaidLinkWebview.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                Uri parsedUri = Uri.parse(url);
                if (parsedUri.getScheme().equals("plaidlink")) {
                    String action = parsedUri.getHost();
                    HashMap<String, String> linkData = parseLinkUriData(parsedUri);

                    if (action.equals("connected")) {
                        // 用户成功完成授权,拿到关键数据
                        Log.d("--->Public token: ", linkData.get("public_token"));
                        Log.d("--->Account ID: ", linkData.get("account_id"));
                        Log.d("--->Account name: ", linkData.get("account_name"));
                        Log.d("--->Institution type: ", linkData.get("institution_type"));
                        Log.d("--->Institution name: ", linkData.get("institution_name"));

                        // 注意:这里拿到的public_token需要传给后端,用来交换access_token
                        // 之后后端用access_token调用Plaid的transactions/get接口获取交易记录
                        // 你可以在这里跳转到其他页面或者发起网络请求传给后端
                    } else if (action.equals("exit")) {
                        // 用户退出了授权流程
                        Log.d("User status in flow: ", linkData.get("status"));
                        Log.d("Link request ID: ", linkData.get("link_request_id"));
                        Log.d("API request ID: ", linkData.get("plaid_api_request_id"));
                    } else {
                        Log.d("Link action detected: ", action);
                    }
                    return true;
                } else if (parsedUri.getScheme().equals("https") || parsedUri.getScheme().equals("http")) {
                    // 打开外部链接(比如忘记密码、账户锁定页面)到系统浏览器
                    view.getContext().startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
                    return true;
                } else {
                    return false;
                }
            }
        });
    }

    // 生成Plaid Link初始化URL
    public Uri generateLinkInitializationUrl(HashMap<String,String>linkOptions) {
        Uri.Builder builder = Uri.parse(linkOptions.get("baseUrl"))
                .buildUpon()
                .appendQueryParameter("isWebview", "true")
                .appendQueryParameter("isMobile", "true");
        for (String key : linkOptions.keySet()) {
            if (!key.equals("baseUrl")) {
                builder.appendQueryParameter(key, linkOptions.get(key));
            }
        }
        return builder.build();
    }

    // 补全缺失的URI数据解析方法
    public HashMap<String,String> parseLinkUriData(Uri linkUri) {
        HashMap<String, String> dataMap = new HashMap<>();
        Set<String> parameterNames = linkUri.getQueryParameterNames();
        for (String paramName : parameterNames) {
            dataMap.put(paramName, linkUri.getQueryParameter(paramName));
        }
        return dataMap;
    }
}

关键注意事项

  1. 测试凭证使用:在沙箱环境下,你可以使用Plaid官方提供的测试机构凭证完成模拟授权:
    • 选择机构Chase,输入用户名user_good,密码pass_good,后续验证步骤随便输即可完成授权
  2. 交易记录获取流程:
    • WebView中拿到的public_token只是临时凭证,必须在后端调用Plaid的item/public_token/exchange接口,将其转换为长期有效的access_token
    • 之后后端使用access_token调用transactions/get接口,就能获取到用户的交易记录(前端不能直接调用这个接口,因为会暴露敏感的API密钥)
  3. 代码修正点:原代码中product参数里的enter code here注释是错误的,已经修正为"transactions,auth",确保Plaid Link加载正确的产品功能

内容的提问来源于stack exchange,提问作者Raj Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:28:34