我有一个棘手的问题。我需要用户在英国向银行(即巴克莱卡)付款。为此,我有一个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查询。在网上搜索找到合适的。
希望这有助于....干杯!