跳到主要内容

参考代码 - APP拉起支付宝

示例代码:

package com.alipay.sdk.pay.demo;

import com.alipay.sdk.app.PayTask;
import com.alipay.sdk.util.H5PayResultModel;
import com.alipay.sdk.app.H5PayCallback;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.res.Configuration;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.webkit.CookieManager;
import android.webkit.WebResourceRequest;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;


public class H5PayDemoActivity extends Activity {

private WebView mWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle extras = null;
try {
extras = getIntent().getExtras();
} catch (Exception e) {
finish();
return;
}
if (extras == null) {
finish();
return;
}
// 获取传入的付费界面URL
String url = null;
try {
url = extras.getString("url");
} catch (Exception e) {
finish();
return;
}
if (TextUtils.isEmpty(url)) {
// 测试H5支付,必须设置要打开的url网站
new AlertDialog.Builder(H5PayDemoActivity.this).setTitle(R.string.error)
.setMessage(R.string.error_missing_h5_pay_url)
.setPositiveButton(R.string.confirm, new OnClickListener() {

@Override
public void onClick(DialogInterface arg0, int arg1) {
finish();
}
}).show();

}
super.requestWindowFeature(Window.FEATURE_NO_TITLE);
LinearLayout layout = new LinearLayout(getApplicationContext());
LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
layout.setOrientation(LinearLayout.VERTICAL);
setContentView(layout, params);

// 此处使用 this 才能正常展示 webview 内的下拉选择元素
mWebView = new WebView(this);
params.weight = 1;
mWebView.setVisibility(View.VISIBLE);
layout.addView(mWebView, params);

WebSettings settings = mWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);

// 启用二方/三方 Cookie 存储和 DOM Storage
// 注意:若要在实际 App 中使用,请先了解相关设置项细节。
CookieManager.getInstance().setAcceptCookie(true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
CookieManager.getInstance().setAcceptThirdPartyCookies(mWebView, true);
}
settings.setDomStorageEnabled(true);

mWebView.setVerticalScrollbarOverlay(true);
mWebView.setWebViewClient(new MyWebViewClient());
mWebView.loadUrl(url);

// 启用 WebView 调试模式。
// 注意:请勿在实际 App 中打开!
WebView.setWebContentsDebuggingEnabled(true);
}

@Override
public void onBackPressed() {
if (mWebView.canGoBack()) {
mWebView.goBack();
} else {
finish();
}
}

@Override
public void finish() {
super.finish();
}

@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
}

private class MyWebViewClient extends WebViewClient {

@Override
public boolean shouldOverrideUrlLoading(final WebView view, WebResourceRequest request) {
String url = request.getUrl().toString();
Log.i("UrlLoading", url);
if (!(url.startsWith("http") || url.startsWith("https"))) {
return true;
}

/**
* 推荐采用的新的二合一接口(payInterceptorWithUrl),只需调用一次
*/
final PayTask task = new PayTask(H5PayDemoActivity.this);
boolean isIntercepted = task.payInterceptorWithUrl(url, true, new H5PayCallback() {
@Override
public void onPayResult(final H5PayResultModel result) {
final String url = result.getReturnUrl();
if (!TextUtils.isEmpty(url)) {
H5PayDemoActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.loadUrl(url);
}
});
}
}
});

/**
* 判断是否成功拦截
* 若成功拦截,则无需继续加载该URL;否则继续加载
*/
if (isIntercepted) {
return true;
}

// 支付宝H5转App处理之后,处理艺爪付费的App支付请求
String EZREVENUE_BRIDGE_ALIPAY = "1002";
String EZREVENUE_URL1 = "https://revenue.ezboti.com";
String EZREVENUE_URL2 = "https://revenue.ezfuns.com"; //备用域名
if (url.startsWith(EZREVENUE_URL1 + "/paywall/bridge/") || url.startsWith(EZREVENUE_URL2 + "/paywall/bridge/")) {
Log.i("PaywallBridge", url);
Uri urlObj = request.getUrl();
// 检查是否是拉起支付宝,以后也可以根据bridgeType判断拉起微信等
String bridgeType = urlObj.getQueryParameter("type");
if (EZREVENUE_BRIDGE_ALIPAY.equals((bridgeType))) {
final String orderString = urlObj.getQueryParameter("order_string");
final String callbackUrl = urlObj.getQueryParameter("callback_url");
Log.i("PaywallBridge", "Alipay orderString=" + orderString + " callbackUrl=" + callbackUrl);
// 拉起支付宝APP
final PayTask appPayTask = new PayTask(H5PayDemoActivity.this);
Runnable payRunnable = new Runnable() {
@Override
public void run() {
try {
String result = appPayTask.pay(orderString, true);
Log.i("PaywallBridge", "Alipay result: " + result);
} catch (Exception ex) {
Log.e("PaywallBridge Error", ex.toString());
}
H5PayDemoActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
view.loadUrl(callbackUrl);
}
});
}
};
// 必须异步调用
Thread payThread = new Thread(payRunnable);
payThread.start();
return true;
}
}
return false;
}
}

@Override
protected void onDestroy() {
super.onDestroy();
if (mWebView != null) {
mWebView.removeAllViews();
try {
mWebView.destroy();
} catch (Throwable t) {
}
mWebView = null;
}
}
}

源码参考 支付宝官方 - App支付客户端DEMO,可 联系我 获取完整 Android 示例项目代码。