Проблемы с транзакциями PayPal MECL

Я пытаюсь настроить транзакцию inapp paypall MECL.

Но он продолжает терпеть неудачу в получении токена устройства (canNotFetchDeviceReferenceToken)

А кроме того, когда библиотека инициализируется, я получаю кнопку, но 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 

Кто-нибудь знает, что я делаю неправильно?

Вот некоторые из источников:

  // 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; } } }; 

В 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(); 


 /** * 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(); } } 

Это класс веб-просмотра PayPal:

 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(); } } 


Обнаружил проблему не получения токена: забыли следующее разрешение: READ_PHONE_STATE

Для кнопки я не могу найти проблему, темное решение, которое я использую, просто удалит кнопку и setupButtons () снова ..

Intereting Posts