Alipay, China's leading third-party online payment solutionAlipay, China's leading third-party online payment solution

App支付链接唤起方案

当终端类型为App时,支付 接口的返回中,支付宝会返回至多三种类型的链接:

链接名

schemeUrl

applinkUrl

normalUrl

描述

原生类型的 deep link。

UL/AL 类型的 deep link,在WebView 中也可以充当 H5 链接进行加载。

H5 类型的链接。该链接会屏蔽 AL/UL 属性,使得一定能进到一个 H5 页面。

样例

alipays://platformapi/startApp?appId=10000007&actionTy...

https://payments.gcash.com/gcash-ac-cashier-intermedi...

https://m.dana.id/m/ac/init?ACCodeValue=https%3A%2F...

补充信息

image

您可以根据应用的架构或兼容性需求采取对应的方案进行对接。

安卓篇

添加 AndroidManifest.xml 配置

出于安卓的隐私和安全政策,请在 AndroidManifest.xml 中添加 <queries> 标签,以确保支付链接能打开对应的钱包 App。

参考:https://developer.android.com/guide/topics/manifest/queries-element

<queries> 标签中需要配置钱包 App 的包名(package name),对应的值可以从支付宝的 支付 接口返回中获取到,或者联系支付宝技术支持。

copy
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          package="com.llw.scandemo">
  
  ...
  <queries>
    <package android:name="th.co.truemoney.wallet" />
    <package android:name="com.eg.android.AlipayGphone" />
    <package android:name="my.com.tngdigital.ewallet" />
  </queries>
  ...
  
</manifest>

判断钱包 App 是否安装并分别处理

建议使用支付宝返回的 applinkUrl 拉起支付。您可以先判断买家是否安装钱包 App,若已安装,则通过该链接唤起钱包 App 进行支付。若未安装,可以在 WebView 容器中加载该链接,页面将引导买家进行 H5 支付或者跳转至应用市场的钱包下载页。

若需要兼容低版本安卓,在尝试拉起支付时,可以使用 schemeUrl 以提高拉起成功率。若您希望直接拉起 H5 支付,可以使用 WebView 容器加载 normalUrl 或 applinkUrl。

判断是否安装以及拉起支付的代码请参考以下示例,WebView 容器的配置请参考下一节的内容。

image

copy
String link = "https://m.tngdigital.com.my/s/ac...";
try {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.setPackage("my.com.tngdigital.ewallet");
    
    // 通过以下两行代码判断是否安装钱包APP
    PackageManager packageManager = MainActivity.this.getPackageManager();
    List<ResolveInfo> activities = packageManager.queryIntentActivities(intent, 0);
    
    if (activities.size() <= 0) {
        // 钱包未安装。建议在WEBVIEW中打开H5链接

        intent = new Intent(MainActivity.this, WebviewActivity.class);
        intent.setData(Uri.parse(link));
        startActivity(intent);
    } else {
        
        // 钱包已安装。通过原生方式唤起交易。
        startActivity(intent);
    }
} catch (Exception e) {
    // 处理报错
    e.printStackTrace();
}

通过 WebView 打开付款链接

若您希望支付在 H5 页面处理,可以使用 WebView 容器加载 normalUrl 或 applinkUrl。

但请注意,部分支付方式不支持 H5 支付,即使是在 WebView 中加载,页面依然会尝试发起一次 deep link 跳转,唤起钱包进行支付,您需要重写 WebView 容器的 shouldOverrideUrlLoading 方法,拦截该次 deep link 跳转并以原生的方式加载,以完成支付过程。

用户体验及 WebView 的配置代码请参考以下示例:

image

copy
WebView webview = findViewById(R.id.webviewBox);

// 重写shouldOverrideUrlLoading方法,检测到deeplink时允许外跳。
webview.setWebViewClient(new WebViewClient() {
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
        if (url.startsWith("http")) {
            view.loadUrl(url);
        } else {
            try {
                Intent intent = new Intent(Intent.ACTION_VIEW, request.getUrl());
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                startActivity(intent);
            } catch (Exception e) {
                e.printStackTrace();
            }
            view.stopLoading();
        }
        return super.shouldOverrideUrlLoading(view, request);
    }
});

WebSettings webSettings = webview.getSettings();
webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);

webSettings.setUseWideViewPort(true);
webSettings.setLoadWithOverviewMode(true);

在系统默认浏览器中打开付款链接

在以下情况下,系统会打开系统默认浏览器并加载该支付链接。

  • 用户未安装钱包 App,但使用原生方式打开 applinkUrl 时。
  • 使用原生方式打开 normalUrl 时。

用户体验与示例代码如下:

image

copy
String link = "https://m.tngdigital.com.my/s/ac...";
try {
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(link));
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
} catch (Exception e) {
    // 处理报错
    e.printStackTrace();
}

IOS 篇

原生方式打开付款链接

建议使用支付宝返回的 applinkUrl 拉起支付。在 IOS 系统下,若买家已安装钱包 App,则该链接会唤起钱包 App 进行支付。若未安装,系统则会拉起 Safari 浏览器并以 H5 的形式加载 applinkUrl。

用户体验与示例代码如下:

image

image

copy
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:redirectUrl] options:@{} completionHandler:nil];

通过 WebView 打开付款链接

若您希望支付在 H5 页面处理,可以使用 WebView 容器加载 normalUrl 或 applinkUrl。

但请注意,部分支付方式不支持 H5 支付,即使是在 WebView 中加载,页面依然会尝试发起一次 deep link 跳转,唤起钱包进行支付。

用户体验与 WebView 的配置代码请参考以下示例:

image

copy
SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:redirectUrl entersReaderIfAvailable:NO];
safariVC.delegate = self;
[self.navigationController presentViewController:safariVC animated:YES completion:nil];

判断钱包 App 是否安装并分别处理

若希望对买家是否安装钱包 App 的情况分别处理,则在拉起支付前需要判断用户是否安装钱包 App。

在 IOS 系统下,需要先在 info.plist 配置中添加配置 LSApplicationQueriesSchemes 配置,之后在代码中通过 canOpenURL 方法判断是否安全钱包 App。

配置示例、代码请参考以下示例:

image

copy
NSString *walletSchemeUrl = @"gcash://";

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:walletSchemeUrl]]){
    // 钱包应用已安装,建议通过原生方式打开
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:redirectUrl] options:@{} completionHandler:nil];
    
    return YES;
} else {
    // 钱包应用未安装,建议通过WEBVIEW加载H5页面
    SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:redirectUrl entersReaderIfAvailable:NO];
    safariVC.delegate = self;
    [self.navigationController presentViewController:safariVC animated:YES completion:nil];
    
    return NO;
}