话说这一网通的api和说好的完全不一样啊,封装何在,android 本地适配何在,语言适配还要自己注意,居然默认是适配英文的,我倒~~
** 核心思路 **
一网通本质上是招行的一套H5页面,目的是:使用H5兼容所有平台。那么对于开发者来说,就是完全没有封装性啊。
** 总体思路 **
- 自己写一个activity页面,标题栏自己写,招行的H5里面没有一般页面左上角的返回按钮,然后用webview加载招行的url
- 需要自己拦截招行的键盘输入uri,招行的键盘用的是我们集成进来的jar包里的,需要我们的webview拦截指定的uri
- 招行支付成功是展示页面,不论支付成功还是支付失败均没有回调,需要我们自己想办法。期中支付成功页有一个返回的按钮,这个按钮的url地址是可以自己配的,我们webview可以拦截这个url
** 先来看看招行支付,例子是滴滴的 **
** 过程 **
- 首先服务器根据api生成支付数据,使用签名加密,再发送给app
- app使用webview模拟一个post请求加载支付url
- 中间过程不用app本地管
- 我们需要做左上角的返回按钮和物流返回键,还有支付成功页中『返回商家』按钮的监听
- 使用eventbus传递支结果
** 注意点 **
- 标题栏自己写,返回键自己监听
- 标题栏一网通的H5页面是没有滴
- 返回键需要自己监听,物流返回键同样需要监听,监听方式一样。
- 我这得做法是,不管用户处于支付的那个环节,只要点了左上角返回键,或是物流返回键,就去查询支付结果。我这的服务器写了一个结果,可以查询订单的支付结果。要是服务器不给写,自己也可以去查,一网通提供了这个api
- 支付成功监听
一网通的支付成功会重定向到一个指定的成功页面,当然没有回调,需要我们自己实现
先来看看图:
红圈中的按钮就是我们需要监听的,他的监听逻辑是webview监听特定url的重定向,这个url地址是由开发者自己指定的,需要联系招行。
- 一网通SDK中的键盘,这个键盘是实际上一个activity页面,需要我们在webview的重定向监听中监听指定url,启动这个键盘页面,不过sdk中已经提供了这个方法,光网文档中没有写具体的调用方法,需要查看官方的demo才可以看到
键盘图片:
demo的api:
CMBKeyboardFunc kbFunc = new CMBKeyboardFunc(YiWangTongPayActivity.this);
// 监听一网通键盘url
if (!kbFunc.HandleUrlCall(webView, url)) {
return false;
}
注意一点,键盘中默认的文字是英文的,必须导入中文的values-zh文件才可显示中文
官方文档有很多说的不是很清晰,尽量看看官方的demo,起码没什么问题
- 最后送上代码
public class YiWangTongPayActivity extends AppCompatActivity {
private static final String TAG = "ehome" + YiWangTongPayActivity.class.getName();
private static final String KEY_ATTACH = "key_attach";
private static final String KEY_ORDER_ID = "key_order_id";
private static final String KEY_ORDER_TYPE = "key_order_type";
// 支付成功页面中的按钮的url
private static final String URL_BACK = "http://cmbc/success";
private WebView webView;
private View view_goBack;
private View view_loading;
private String orderId;
private String orderType;
// 记录是否正在查询支付结果
private boolean isQueryPayResult = false;
public static Intent getIntent(Activity activity, String orderId, String orderType, String attack) {
if (BaseUtils.isEmpty(attack)) {
return null;
}
Intent intent = new Intent(activity, YiWangTongPayActivity.class);
intent.putExtra(KEY_ATTACH, attack);
intent.putExtra(KEY_ORDER_ID, orderId);
intent.putExtra(KEY_ORDER_TYPE, orderType);
return intent;
}
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_yiwangtongpay);
initView();
initClick();
initWebView();
// 获取数据
Intent intent = getIntent();
if (intent == null) {
EventBus.getDefault().post(new YWTPayRayResult(YWTPayRayResult.ERROR, "支付失败"));
YiWangTongPayActivity.this.finish();
return;
}
String attach = intent.getStringExtra(KEY_ATTACH);
orderId = intent.getStringExtra(KEY_ORDER_ID);
orderType = intent.getStringExtra(KEY_ORDER_TYPE);
String url = ConfigFactory.newInstance().getYiWangTongPayUrl();
String parame = "jsonRequestData=" + attach;
webView.postUrl(url, parame.getBytes());
}
private void initView() {
webView = (WebView) findViewById(R.id.view_webview);
view_goBack = findViewById(R.id.pay_back);
view_loading = findViewById(R.id.announcement_list_loading);
}
private void initClick() {
view_goBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 查询支付是否成功
if (!isQueryPayResult) {
queryPayResult(orderId, orderType);
}
}
});
}
private void initWebView() {
// 对WebView进行设置
webView.getSettings().setUserAgentString(Environment.getInstance().getWebUserAgentEx(webView.getSettings().getUserAgentString()));
webView.getSettings().setDefaultTextEncodingName("utf-8");
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setSupportZoom(false);
webView.getSettings().setSavePassword(false);
webView.getSettings().setSaveFormData(false);
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
webView.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
DebugLog.d(TAG, "监听到重定向url:" + url);
// 使用当前的WebView加载页面
CMBKeyboardFunc kbFunc = new CMBKeyboardFunc(YiWangTongPayActivity.this);
// 监听支付成功按钮的特定url
if (url.equals(URL_BACK)) {
isQueryPayResult = false;
EventBus.getDefault().post(new YWTPayRayResult(YWTPayRayResult.SUCCESS, "支付成功"));
YiWangTongPayActivity.this.finish();
return false;
}
// 监听一网通键盘url
if (!kbFunc.HandleUrlCall(webView, url)) {
return false;
}
return true;
}
});
}
private void queryPayResult(String orderId, String orderType) {
isQueryPayResult = true;
view_loading.setVisibility(View.VISIBLE);
YiWangTongPayHelper.getPayInfo(new YiWangTongPayRequest(orderType, orderId), new YiWangTongPayHelper.IYiWangTongPayCallBack() {
@Override
public void success() {
view_loading.setVisibility(View.GONE);
isQueryPayResult = false;
EventBus.getDefault().post(new YWTPayRayResult(YWTPayRayResult.SUCCESS, "支付成功"));
YiWangTongPayActivity.this.finish();
}
@Override
public void error(String message) {
view_loading.setVisibility(View.GONE);
isQueryPayResult = false;
EventBus.getDefault().post(new YWTPayRayResult(YWTPayRayResult.ERROR, message));
YiWangTongPayActivity.this.finish();
}
});
}
/**
* 强制处理返回键,检测支付结果
*/
@Override
public void onBackPressed() {
if (!isQueryPayResult) {
queryPayResult(orderId, orderType);
}
}
}