Paypal支付(二)Express Checkout EC WebView快捷支付
阿新 • • 發佈:2019-01-31
一、實現的功能
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
2.重點:.WebView屬性設定和WebSetting屬性設定/***** 將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(); } }
/*** 初始化佈局 ***/
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>