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; } }
关键注意事项
- 测试凭证使用:在沙箱环境下,你可以使用Plaid官方提供的测试机构凭证完成模拟授权:
- 选择机构
Chase,输入用户名user_good,密码pass_good,后续验证步骤随便输即可完成授权
- 选择机构
- 交易记录获取流程:
- WebView中拿到的
public_token只是临时凭证,必须在后端调用Plaid的item/public_token/exchange接口,将其转换为长期有效的access_token - 之后后端使用
access_token调用transactions/get接口,就能获取到用户的交易记录(前端不能直接调用这个接口,因为会暴露敏感的API密钥)
- WebView中拿到的
- 代码修正点:原代码中
product参数里的enter code here注释是错误的,已经修正为"transactions,auth",确保Plaid Link加载正确的产品功能
内容的提问来源于stack exchange,提问作者Raj Kumar
相关产品推荐
相关产品推荐

