android – PayPal MECL交易问题

前端之家收集整理的这篇文章主要介绍了android – PayPal MECL交易问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试设置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

有谁知道我做错了什么?

这里有一些来源:

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

}

解决方法

发现没有收到令牌的问题:
忘记了以下权限:READ_PHONE_STATE

对于按钮我找不到问题,我使用的临时解决方案只是删除按钮和setupButtons()再次..

猜你在找的Android相关文章