目录:前言
android 建行龙支付教程2:传递支付url给建行,获取支付数据并处理
通过
获取到支付url后,需要把这一串url传递给建行,传递方法很简单,用webView打开url就行:
String url = new CcbPayUtils().pay(价格,订单号,说明);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(url);
打开建行app:
把url传递给建行后,建行会传回一个h5的支付网页和一个带mbspay协议和支付信息的url,通过 webView.setWebViewClient()获取到回传的url再进行处理
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//获取建行返回的支付信息,mbspay开头则跳转到建行app
//判断用户有没有安装建行app,有的话跳转到建行app,没有的话不做任何处理就是h5支付
if(url.startsWith("mbspay:")) {
PackageManager pm = getPackageManager();
Intent checkIntent = pm.getLaunchIntentForPackage("com.chinamworld.main");
if (checkIntent != null) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
}
return true;
}else
{
return false;
}
}
});
当用户使用h5支付时,可以直接获取到支付回调码(通知串),也就是支付结果:
h5支付返回的回调码格式为:手机银行网页反馈地址+通知串,
手机银行网页反馈地址在设置实时反馈地址时一起设置的,参考填写反馈地址
通知串格式为:
POSID=000000000&BRANCHID=110000000&ORDERID=19991101234&PAYMENT=500.00&CURCODE=01&REMARK1=&REMARK2=&ACC_TYPE=12&SUCCESS=Y&TYPE=1&REFERER=http://www.ccb.com/index.jsp&CLIENTIP=172.0.0.1&ACCDATE=20100907&USRMSG=T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&INSTALLNUM=3&ERRMSG=&USRINFO= T4NJx%2FVgocRsLyQnrMZLyuQQkFzMAxQjdqyzf6pM%2Fcg%3D&DISCOUNT=1.00&SIGN=317b7dd349c1fbcabc26a20ba117a778da5a685c588be5e7378682651062a25b0885e36ee237c19a143f7271c9529a0e9bf198c8735709dc74233d96e1a276cec9d4835422bee597100b0a47d11b44dbba74bdf9cbde0587f138141ce79a3536733d5f6b53ed119c13708dca52ee8d3fcf7e67dcdb20053889adff1989a8c859
其中SUCCESS为支付结果标志,SUCCESS = Y说明支付成功,获取通知串的方法可以参考:
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//判断开头是否为手机银行网页反馈地址
if (url.startsWith("设置反馈地址时的手机银行网页反馈地址")) {
//提取回调信息关传递
String CCBPARAM = "";
String[] split = url.split("?");
if (split.length == 2)
CCBPARAM = split[1];
//CCBPARAM即为通知串,判断其中是否有"SUCCESS=Y",有的话即为支付成功
return true;
}
}
});
完成的调用支付可以参考:
public class CCBPayActivity extends AppCompatActivity {
private WebView webView;
private ProgressBar progressBar;
private ProgressDialog dialog;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ccb_pay);
webView = findViewById(R.id.webview);
progressBar = findViewById(R.id.ProgressBar);
dialog = new ProgressDialog(this);
dialog.setMessage("支付数据加载中");
String url = new CcbPayUtils().pay(0.01, "123456789", "");
WebSettings settings = webView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setAllowFileAccess(false);
settings.setSupportZoom(true);
settings.setCacheMode(WebSettings.LOAD_NO_CACHE);
// settings.setUserAgentString("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.134 Safari/537.36");
//自适应屏幕
settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
settings.setUseWideViewPort(true);
settings.setLoadWithOverviewMode(true);
settings.setBuiltInZoomControls(true);
settings.setDisplayZoomControls(false);
webView.requestFocusFromTouch();
webView.loadUrl(url);
dialog.show();
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
// 重写此方法表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边
if (url.startsWith("mbspay:")) {
PackageManager pm = getPackageManager();
Intent checkIntent = pm.getLaunchIntentForPackage("com.chinamworld.main");
//判断是否有安装建行app
if (checkIntent != null) {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
startActivity(intent);
// webView.loadUrl("");
} else {
showToast("未安装建行app");
}
return true;
} else if (url.startsWith("设置反馈地址时的手机银行网页反馈地址")) {
//提取回调信息关传递
String CCBPARAM = url.replace("手机银行网页反馈地址", "");
//CCBPARAM即为通知串,判断其中是否有"SUCCESS=Y",有的话即为支付成功
if(!TextUtils.isEmpty(CCBPARAM)&&CCBPARAM.contains("UCCESS=Y")){
//支付成功
}else {
//支付失败
}
return true;
} else {
return false;
}
}
});
webView.setInitialScale(100);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
progressBar.setProgress(newProgress);
if (newProgress < 100) {
if (progressBar.getVisibility() != View.VISIBLE) {
progressBar.setVisibility(View.VISIBLE);
if (!dialog.isShowing())
dialog.show();
}
} else {
dialog.dismiss();
if (progressBar.getVisibility() != View.GONE) {
progressBar.setVisibility(View.GONE);
}
}
}
});
}
private void showToast(String text) {
Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
}
}