我正在尝试设置inapp paypall MECL交易.
但它一直无法获取设备令牌(couldNotFetchDeviceReferenceToken)
当初始化库时,我得到了按钮,但是当我在按钮上多次单击时,onClickListeneren只获得第一次点击(而在onClick中没有做任何事情).
12-19 16:59:41.731: ERROR/Error(4745): Authentication Failed,button not enabled. 12-19 16:59:41.739: ERROR/paypal(4745): FAIL receiving Token 12-19 17:00:06.544: ERROR/PP Init(4745): INITIALIZE_FAILURE@H_301_9@有谁知道我做错了什么?
这里有一些来源:
// The PayPal server to be used - can also be ENV_NONE and ENV_LIVE private static final int server = PayPal.ENV_SANDBox; // The ID of your application that you received from PayPal private static final String appID = "APP-.....xxxxxxx"; Handler hRefresh = new Handler(){ @Override public void handleMessage(Message msg) { switch(msg.what){ case INITIALIZE_SUCCESS: //We have initialized the application,close the dialog and launch the WebView setupButtons(); break; case INITIALIZE_FAILURE: setupButtons(); //Initialization failure,close the dialog,update the page and show a toast //mProgDialog.cancel(); //currentPage.update(); break; } } };@H_301_9@在onCreate中:
// Initialize the library. We'll do it in a separate thread because it requires communication with the server // which may take some time depending on the connection strength/speed. Thread libraryInitializationThread = new Thread() { public void run() { initLibrary(); // The library is initialized so let's launch it by notifying our handler if (PayPal.getInstance().isLibraryInitialized()) { Log.e("PP Init","INITIALIZE_SUCCESS"); hRefresh.sendEmptyMessage(INITIALIZE_SUCCESS); } else { Log.e("PP Init","INITIALIZE_FAILURE"); hRefresh.sendEmptyMessage(INITIALIZE_FAILURE); } } }; libraryInitializationThread.start();@H_301_9@.
/** * Create our CheckoutButton and update the UI. */ public void setupButtons() { PayPal pp = PayPal.getInstance(); // Get the CheckoutButton. There are five different sizes. The text on the button can either be of type TEXT_PAY or TEXT_DONATE. launchSimplePayment = pp.getCheckoutButton(DailyOfferOrderActivity.this,PayPal.BUTTON_194x37,CheckoutButton.TEXT_PAY); // You'll need to have an OnClickListener for the CheckoutButton. For this application,MPL_Example implements OnClickListener and we // have the onClick() method below. launchSimplePayment.setOnClickListener(DailyOfferOrderActivity.this); // The CheckoutButton is an android LinearLayout so we can add it to our display like any other View. layoutSimplePayment.addView(launchSimplePayment); info.setText(""); info.setVisibility(View.GONE); } public void onClick(View v) { /** * For each call to checkout() and preapprove(),we pass in a ResultDelegate. If you want your application * to be notified as soon as a payment is completed,then you need to create a delegate for your application. * The delegate will need to implement PayPalResultDelegate and Serializable. See our ResultDelegate for * more details. */ if(v == launchSimplePayment) { if(checkParameters()){ new startPPTask().execute(); } layoutSimplePayment.removeAllViews(); setupButtons(); } }@H_301_9@这是paypal webview类:
public class PayPalWebViewActivity extends Activity { private WebView mWebView; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.paypalwebview); Intent intent = getIntent(); String token = intent.getStringExtra("token"); String deviceToken = intent.getStringExtra("devicetoken"); //String url = "https://www.sandBox.paypal.com/cgi-bin/webscr?"; String url = "https://www.paypal.com/cgi-bin/webscr?"; mWebView = (WebView) findViewById(R.id.webview); mWebView.getSettings().setJavaScriptEnabled(true); mWebView.setWebViewClient(new HelloWebViewClient()); String temp = url + "cmd=_express-checkout-mobile&useraction=commit&token=" + token + "&drt=" + deviceToken; //Log.e("test",temp); mWebView.loadUrl(temp); //+ "&drt=NULL" } @Override public boolean onKeyDown(int keyCode,KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack()) { mWebView.goBack(); return true; } return super.onKeyDown(keyCode,event); } private class HelloWebViewClient extends WebViewClient { @Override public void onPageStarted(WebView view,String url,Bitmap favicon) { //Log.e("done","start: " + url); } // intercept page finished event @Override public void onPageFinished(WebView view,String url) { //Log.e("done","done: " + url); view.loadUrl("javascript:javascript:(function() { " + "window.navigator.standalone=1;" + "})()"); } @Override public boolean shouldOverrideUrlLoading(WebView view,String url) { HttpClient httpclient = new DefaultHttpClient(); // Prepare a request object HttpGet httpget = new HttpGet(url); // Execute the request HttpResponse response; try { response = httpclient.execute(httpget); // Examine the response status //Log.e("Get Request",response.toString()); // Get hold of the response entity HttpEntity entity = response.getEntity(); // If the response does not enclose an entity,there is no need // to worry about connection release if (entity != null) { // A Simple JSON Response Read InputStream instream = entity.getContent(); String result= convertStreamToString(instream); //Log.e("test",result); instream.close(); } } catch (IOException e) { e.printStackTrace(); } view.loadUrl(url); return true; } private String convertStreamToString(InputStream is) { /* * To convert the InputStream to String we use the BufferedReader.readLine() * method. We iterate until the BufferedReader return null which means * there's no more data to read. Each line will appended to a StringBuilder * and returned as String. */ BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); } }@H_301_9@}