在Android中以编程方式监控web浏览器



我有一个棘手的问题。我需要用户在英国向银行(即巴克莱卡)付款。为此,我有一个https URL,我将参数(如支付金额,订单引用等)添加到URL,将此http连接作为Intent启动。ActionView,它会将用户重定向到浏览器,在那里他可以在银行网页上输入他的信用卡详细信息,并成功地向我们的账户付款。到目前为止一切顺利吗?

我使用的代码如下(出于隐私原因我更改了值)问题是,当用户完成/失败/取消支付时,我需要回到应用程序。当支付成功时,barclaycard自动重定向到一个特定的URL,如果失败则重定向到另一个URL。有没有办法知道什么时候巴克莱卡支付成功了,然后我就会回到android应用程序?

Button cardbutton = (Button) findViewById(R.id.card_button);
cardbutton.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View arg0)
    {
        String preHashString = new String();
        String proHashString = new String();
        String SHAPassPhrase = new String();
        SHAPassPhrase = "GSvTh£h70ZkHdAq9b"; // FOR TEST ENVIRONMENT
        preHashString = preHashString + "AMOUNT=" + String.valueOf((int) (order.getPaymentAmount() * 100.00)) + SHAPassPhrase;
        preHashString = preHashString + "BGCOLOR=cccccc" + SHAPassPhrase;
        preHashString = preHashString + "CN=" + user.getString("name") + SHAPassPhrase;
        preHashString = preHashString + "CURRENCY=GBP" + SHAPassPhrase;
        preHashString = preHashString + "LANGUAGE=en_US" + SHAPassPhrase;
        preHashString = preHashString + "ORDERID=" + order.getOrderId() + SHAPassPhrase;
        try
        {
            proHashString = SHA1(preHashString);
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }
        String redirecturl = "https://mdepayments.epdq.co.uk/ncol/test/orderstandard.asp";
        redirecturl += "?AMOUNT=" + String.valueOf((int) (order.getPaymentAmount() * 100));
        redirecturl += "&CN=" + user.getString("name");
        redirecturl += "&CURRENCY=GBP";
        redirecturl += "&LANGUAGE=en_US";
        redirecturl += "&ORDERID=" + order.getOrderId();
        redirecturl += "&SHASIGN=" + proHashString;
        Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse(redirecturl));
        startActivity(i);
    }
});

你可以在你的应用程序中有你自己的Webview,在某个地方有一些完成/关闭按钮。这样你就可以跟踪所有在你的WebView中打开的url,并相应地做你的事情,用户将永远留在你的应用程序中,这解决了你的目的。

要跟踪WebView中的所有url,您需要注册一个WebViewClient并覆盖下面的函数

public boolean shouldOverrideUrlLoading (WebView view, String url)

看看这里的WebView和这里的WebViewClient

永远不要在用户设备上做这样的事情。有人可以反编译你的代码并修改它,所以你的应用程序会"认为"他们支付了。

这可能会导致小问题,比如他们免费使用应用程序,严重的问题,比如你被迫支付所有的费用。

使用服务器端解决方案或从Google购买应用程序。

如果你的用户被重定向到一个新的URL,你可以使用ContentObserver来观察书签历史记录的任何变化:

public class UrlObserver extends ContentObserver {
    @Override
    public void onChange(boolean selfChange) {
       super.onChange(selfChange);
       // check last URL in history
    }
}

读取历史记录可以通过以下方式完成:

private static final Uri CONTENT_URI = Browser.BOOKMARKS_URI;
Cursor cursor = context.getContentResolver().query(
                    CONTENT_URI, Browser.HISTORY_PROJECTION, null, null, null); 

内容观察器的注册:

UrlObserver observer = new UrlObserver();
context.getContentResolver().registerContentObserver(CONTENT_URI, true, observer);          

一旦一个特定的URL被检测到,你可以调用一个意图把你的活动带回到前面。这是一个示例应用程序,它可能会帮助你在这种情况下。

我不能100%确定如果相同的站点用于表单传输会发生什么。可能是内容观察者不会触发。在这种情况下,您可能会发现一些有用的日志条目。

注意:Chrome和Android标准浏览器使用不同的url查询。在网上搜索找到合适的。

希望这有助于....干杯!

最新更新