0

我在这里有一个棘手的问题。我需要用户向英国的银行(即巴克莱卡)付款。为此,我有一个 https URL,我将参数(例如支付金额、订单参考等)添加到 URL,将这个 http 连接作为 Intent.ActionView 启动,这会将用户重定向到他所在的浏览器可以在银行网页上输入他的信用卡详细信息,并成功向我们的帐户付款。到现在为止还挺好 ?

我使用的代码如下(出于隐私原因,我更改了值)问题是,当用户完成/失败/取消付款时,我需要返回应用程序。支付成功时,Barclaycard 会自动重定向到特定的 URL,如果失败,则会重定向到另一个 URL。有没有办法知道巴克莱卡付款何时成功,以便我以某种方式回到安卓应用程序?

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);
    }
});
4

3 回答 3

2

如果您的用户被重定向到一个新的 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 后,您可以调用 Intent 将您的活动带回前面。 是一个示例应用程序,在这种情况下可能会对您有所帮助。

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

注意:Chrome 和 Android 标准浏览器使用不同的 URL 进行查询。搜索互联网以找到合适的。

希望这会有所帮助....干杯!

于 2013-04-05T16:56:39.107 回答
2

您可以在您的应用程序中放置自己的 Webview,在某处使用一些完成/关闭按钮。然后您可以跟踪在您的 WebView 中打开的所有 url 并相应地执行您的操作..用户将始终留在您的应用程序中..这解决了你的目的..

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

public boolean shouldOverrideUrlLoading (WebView view, String url)

看看这里的WebView 和这里WebViewClient

于 2013-04-05T17:18:30.587 回答
2

你永远不应该在用户设备上做这样的事情。有人可以反编译您的代码并对其进行更改,因此您的应用程序会“认为”他们已付款。

这可能会导致像他们免费使用应用程序这样的小问题,或者像您被迫支付所有款项这样的严重问题。

要么使用服务器端解决方案,要么使用 Google 的应用内购买。

于 2013-04-05T18:30:49.553 回答