一、实现的功能
1.android端使用的自己设计的购物车;m站点使用的也是自己设计的购物车。
2.购物车界面有cheekout按钮,相当于Checkout with paypal,即快捷支付按钮。如果想要使用Paypal提供的快捷支付按钮,可以在paypal开发网站下载,链接如下:
https://developer.paypal.com/
3.点击Chekcout按钮,进入Paypal登录界面
4.点击Log In,进入账单信息确认页面
5.点击继续,跳转到自己的m站点,进行账单信息确认;当然也可以自定义页面,但是需要m站点将客户信息、邮寄信息等信息返回,在进行解析展示。
6.点击PlACE ORDER,提交订单到Paypal,由Paypal对订单进行处理,处理的结果展示暂时汗没做,暂略。
二、重点、难点
1.难点:点击Checkout按钮,后续的页面是以WebView进行加载的,如果直接加载,跳转的页面是未登录状态。所以需要将Http请求的Cookie信息,同步到WebView。
1)取得Cookie
if (response.getStatusLine().getStatusCode() == 200) { String jsonString = EntityUtils.toString(response.getEntity(), "utf-8"); Log.e(TAG, "json: " + jsonString); JSONObject object = new JSONObject(jsonString); if ("true".equals(object.getString("result"))) { List<Cookie> cookies = httpClient.getCookieStore().getCookies(); return cookies; } }
2)同步Cookie
/***** 将http请求的cookie同步到WebView ****/ private void aSyncCookies(List<Cookie> cookies, String url) { CookieSyncManager.createInstance(CheckoutActivity.this); CookieManager cookieManager = CookieManager.getInstance(); for (Cookie cookie : cookies) { String cookieString = cookie.getName() + "=" + cookie.getValue() + "; domain=" + cookie.getDomain(); Log.e(TAG, "HttpCookie---:" + cookieString); cookieManager.setCookie(url2, cookieString); CookieSyncManager.getInstance().sync(); } }2.重点:.WebView属性设置和WebSetting属性设置
/*** 初始化布局 ***/ private void initView() { webView = (WebView) this.findViewById(R.id.webView); pb = (ProgressBar) this.findViewById(R.id.progress_webView); initWebSeting(webView); } /*** 设置WebView和WebSetting的属性 ****/ private void initWebSeting(WebView webView) { webView.setWebViewClient(mWebViewClient); webView.setWebChromeClient(mWebChromeClient); webView.addJavascriptInterface(new DemoJavaScriptInterface(), "demo"); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setJavaScriptCanOpenWindowsAutomatically(true); webSettings.setSavePassword(true); webSettings.setSaveFormData(false); webSettings.setSupportZoom(false); }3.难点:页面拦截处理,之前一直在点击“继续”按钮之后就出现问题,跳转回去的页面是未登录状态,但是经过排查,发现也不是cookie的问题。
/****** WebViewClient *****/ private WebViewClient mWebViewClient = new WebViewClient() { String CookieStr; String newUrl; boolean flag = false; @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); Log.e(TAG, "start"); } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { /*** 对于拦截的url也需要进行cookies设置 ****/ // synCookies(CheckoutActivity.this, url, CookieStr); Log.e(TAG, "URL:" + url); Log.e(TAG, "load"); if(url.contains("http://192.168.1.199:3001/m")){ view.loadUrl(url3); return true; } view.loadUrl(url); return true; } @Override public void onPageFinished(WebView view, String url) { /*****获得WebView的cookies的方法,默认WebView是自动存取cookies的,通过Session保存回话。*****/ CookieManager cookieManager = CookieManager.getInstance(); CookieStr = cookieManager.getCookie(url); Log.e("PageFinished", "Cookies = " + CookieStr); super.onPageFinished(view, url); } };刚开始以为从WebView重新跳转到m站点,需要取出WebView的cookies,然后进行同步,但是还是没有效果,打印了一下WebView的cookie信息如下:
乱七八糟的,不管了,换个思维。
不做任何同步cookie的处理,个人理了一下思维:Http加载M站点,获得Cookie-->WebView加载M站点,同步Cookie-->WebView加载Paypal页面-->WebView加载站点,
第一次同步了cookie,在同步的时候也没有调用cookieManager.removeSessionCookie()方法,WebView会自动存取Cookie信息,用于接下来的请求。
通过观察Log日志,查看究竟是什么原因,打印的日志信息如下:
Log日志 1)--->登录界面 09-13 03:06:36.451: E/CheckoutActivity(3246): json: {"result":"true","cookie":[],"desc":"","url":"http:\/\/192.168.1.199:3001\/m\/checkout\/cart\/"} 09-13 03:06:36.615: E/CheckoutActivity(3246): HttpCookie---:ZDEDebuggerPresent=php; domain=192.168.1.199 09-13 03:06:36.695: E/CheckoutActivity(3246): HttpCookie---:phtml=null; domain=192.168.1.199 09-13 03:06:36.695: E/CheckoutActivity(3246): HttpCookie---:php3=null; domain=192.168.1.199 09-13 03:06:36.695: E/CheckoutActivity(3246): HttpCookie---:frontend=snt7364en440tmts2sojveo877; domain=192.168.1.199 09-13 03:06:36.991: E/CheckoutActivity(3246): start 09-13 03:06:39.391: E/CheckoutActivity(3246): URL:https://www.paypal.com/au/cgi-bin/webscr?cmd=_express-checkout&useraction=&token=EC-7H604118EM819322K 09-13 03:06:39.391: E/CheckoutActivity(3246): load 09-13 03:06:39.407: E/CheckoutActivity(3246): finish 09-13 03:06:39.407: E/CheckoutActivity(3246): start 09-13 03:06:45.203: E/CheckoutActivity(3246): finish 09-13 03:06:45.207: E/CheckoutActivity(3246): finish 2)点击确认,进入确认界面 09-13 03:06:58.331: E/CheckoutActivity(3246): finish 3)点击继续 09-13 03:07:01.451: E/CheckoutActivity(3246): URL:http://192.168.1.199:3001/paypal/express/return/?token=EC-7H604118EM819322K&PayerID=NYS6A7K94G2YN 09-13 03:07:01.451: E/CheckoutActivity(3246): load 09-13 03:07:01.455: E/CheckoutActivity(3246): start 09-13 03:07:02.871: E/CheckoutActivity(3246): URL:http://192.168.1.199:3001/paypal/express/review/ 09-13 03:07:02.871: E/CheckoutActivity(3246): load 09-13 03:07:02.875: E/CheckoutActivity(3246): finish 09-13 03:07:02.879: E/CheckoutActivity(3246): start 09-13 03:07:02.947: E/CheckoutActivity(3246): URL:http://192.168.1.199:3001/checkout/cart/ 09-13 03:07:02.947: E/CheckoutActivity(3246): load 09-13 03:07:02.947: E/CheckoutActivity(3246): finish 09-13 03:07:02.947: E/CheckoutActivity(3246): start 09-13 03:07:03.179: E/CheckoutActivity(3246): finish 09-13 03:07:03.179: E/CheckoutActivity(3246): URL:http://192.168.1.199:3001/m/checkout/cart/ 09-13 03:07:03.179: E/CheckoutActivity(3246): load 09-13 03:07:03.207: E/CheckoutActivity(3246): start 09-13 03:07:04.015: E/CheckoutActivity(3246): finish 如果正常按照这个流程进行访问:最后加载的页面是:http://192.168.1.199:3001/m/checkout/cart/ 但是正确的最后访问页面是:http://192.168.1.199:3001/m/paypal/express/review/ 所以,需要对加载的链接进行过滤,添加过滤规则,过滤条件见前面。<span style="white-space:pre"> </span>