android - PayPal MECL交易问题

标签 android paypal paypal-sandbox

我正在尝试设置应用内 paypall MECL 交易。

但它总是无法获取设备 token (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();
    }
}

最佳答案

发现收不到token的问题: 忘记了以下权限:READ_PHONE_STATE

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

关于android - PayPal MECL交易问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8563856/

相关文章:

Paypal 退款 API 操作出现错误 520002

android - 在 Android (API 30) 中以编程方式连接到特定的 wifi 网络

Paypal 成员(member)系统付款日期

javascript - 在 Paypal 中,什么可以保护买家在结账时从他们的账户中扣除正确的金额?

Paypal 不计算折扣代码后的运费(大卡特尔)

Paypal 集成,在 1 笔交易中进行 2 次付款

android - Android GPS 定位的 getAltitude() 是如何工作的

android - 带有软键盘和 "Back"按钮的 EditText

android - 主线程上的 Okhttp 响应回调

PHP:PayPal 与 Credits 的集成