我正在尝试设置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();
}
}
}
答案 0 :(得分:7)
发现无法接收令牌的问题: 忘记了以下权限:READ_PHONE_STATE
按钮我找不到问题, 我使用的临时解决方案只是再次删除按钮和setupButtons()..