1. 程式人生 > >Paypal支付(二)Express Checkout EC WebView快捷支付

Paypal支付(二)Express Checkout EC WebView快捷支付

一、實現的功能

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>