招行一网通集成

作者: 前行的乌龟 | 来源:发表于2017-02-24 18:25 被阅读206次

    话说这一网通的api和说好的完全不一样啊,封装何在,android 本地适配何在,语言适配还要自己注意,居然默认是适配英文的,我倒~~

    一网通开发文档地址

    ** 核心思路 **
    一网通本质上是招行的一套H5页面,目的是:使用H5兼容所有平台。那么对于开发者来说,就是完全没有封装性啊。

    ** 总体思路 **

    1. 自己写一个activity页面,标题栏自己写,招行的H5里面没有一般页面左上角的返回按钮,然后用webview加载招行的url
    2. 需要自己拦截招行的键盘输入uri,招行的键盘用的是我们集成进来的jar包里的,需要我们的webview拦截指定的uri
    3. 招行支付成功是展示页面,不论支付成功还是支付失败均没有回调,需要我们自己想办法。期中支付成功页有一个返回的按钮,这个按钮的url地址是可以自己配的,我们webview可以拦截这个url

    ** 先来看看招行支付,例子是滴滴的 **

    Snip20170224_4.png Snip20170224_5.png Snip20170224_6.png

    ** 过程 **

    • 首先服务器根据api生成支付数据,使用签名加密,再发送给app
    • app使用webview模拟一个post请求加载支付url
    • 中间过程不用app本地管
    • 我们需要做左上角的返回按钮和物流返回键,还有支付成功页中『返回商家』按钮的监听
    • 使用eventbus传递支结果

    ** 注意点 **

    • 标题栏自己写,返回键自己监听
    Snip20170224_10.png
    • 标题栏一网通的H5页面是没有滴
    • 返回键需要自己监听,物流返回键同样需要监听,监听方式一样。
    • 我这得做法是,不管用户处于支付的那个环节,只要点了左上角返回键,或是物流返回键,就去查询支付结果。我这的服务器写了一个结果,可以查询订单的支付结果。要是服务器不给写,自己也可以去查,一网通提供了这个api
    Snip20170224_11.png Snip20170224_12.png
    • 支付成功监听
      一网通的支付成功会重定向到一个指定的成功页面,当然没有回调,需要我们自己实现
      先来看看图:
    Snip20170224_13.png

    红圈中的按钮就是我们需要监听的,他的监听逻辑是webview监听特定url的重定向,这个url地址是由开发者自己指定的,需要联系招行。

    • 一网通SDK中的键盘,这个键盘是实际上一个activity页面,需要我们在webview的重定向监听中监听指定url,启动这个键盘页面,不过sdk中已经提供了这个方法,光网文档中没有写具体的调用方法,需要查看官方的demo才可以看到

    键盘图片:


    Snip20170224_14.png

    demo的api:

                    CMBKeyboardFunc kbFunc = new CMBKeyboardFunc(YiWangTongPayActivity.this);
                    // 监听一网通键盘url
                    if (!kbFunc.HandleUrlCall(webView, url)) {
                        return false;
                    }
    

    注意一点,键盘中默认的文字是英文的,必须导入中文的values-zh文件才可显示中文


    Snip20170224_15.png

    官方文档有很多说的不是很清晰,尽量看看官方的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);
            }
        }
    
    }
    

    相关文章

      网友评论

        本文标题:招行一网通集成

        本文链接:https://www.haomeiwen.com/subject/mfmwwttx.html