2016-03-19 2 views
0

В настоящее время выполняется приложение для Android и принято решение интегрировать в него платеж Paypal, так что пользователь перенаправляется на Paypal-платеж внутри приложения.DUPLICATE_REQUEST_ID - Ошибка SDK PayPal

Я нашел Paypal SampleApp для чего я хочу: https://github.com/paypal/PayPal-Android-SDK. Во-первых, я тестировал его, и он работал без ошибок с установкой CONFIG_ENVIRONMENT, установленной в PayPalConfiguration.ENVIRONMENT_NO_NETWORK, и с выборочной пробной песней по умолчанию acc (usr: [email protected], pass: 123123123).

Затем я сделал учетную запись на сайте developer.paypal.com, чтобы внести платеж на мой счет Paypal (с настройкой CONFIG_ENVIRONMENT, установленным в PayPalConfiguration.ENVIRONMENT_PRODUCTION). Я создал приложение и использовал предоставленный идентификатор клиента с портала разработчика в SampleApp. Делая это, платеж не завершен, и выдает ошибку:

request failure with http statusCode:400,exception:Bad Request 
request failed with server response:{"name":"DUPLICATE_REQUEST_ID","debug_id":"9f83f9a8ce3e5","message":"The value of PayPal-Request-Id header has already been used","information_link":"https://developer.paypal.com/webapps/developer/docs/api/","details":[]} 
DUPLICATE_REQUEST_ID 

Примечание: Я только с помощью «КУПИТЬ ВЕЩЬ» вариант в образце приложения; не заинтересованы в других вариантах

код класса, который обрабатывает процесс оплаты:

import com.paypal.android.sdk.payments.PayPalAuthorization; 
import com.paypal.android.sdk.payments.PayPalConfiguration; 
import com.paypal.android.sdk.payments.PayPalFuturePaymentActivity; 
import com.paypal.android.sdk.payments.PayPalItem; 
import com.paypal.android.sdk.payments.PayPalOAuthScopes; 
import com.paypal.android.sdk.payments.PayPalPayment; 
import com.paypal.android.sdk.payments.PayPalPaymentDetails; 
import com.paypal.android.sdk.payments.PayPalProfileSharingActivity; 
import com.paypal.android.sdk.payments.PayPalService; 
import com.paypal.android.sdk.payments.PaymentConfirmation; 
import com.paypal.android.sdk.payments.ShippingAddress; 

import android.app.Activity; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Toast; 

import org.json.JSONException; 

import java.math.BigDecimal; 
import java.util.Arrays; 
import java.util.HashSet; 
import java.util.Set; 

public class PaymentActivity extends Activity{ 
    private static final String TAG = "PAYMENT"; 
    private static final String CONFIG_ENVIRONMENT = PayPalConfiguration.ENVIRONMENT_PRODUCTION; 

    private static final String CONFIG_CLIENT_ID = "i changed this field with my client id"; 

    private static final int REQUEST_CODE_PAYMENT = 1; 
    private static final int REQUEST_CODE_FUTURE_PAYMENT = 2; 
    private static final int REQUEST_CODE_PROFILE_SHARING = 3; 

    private static PayPalConfiguration config = new PayPalConfiguration() 
      .environment(CONFIG_ENVIRONMENT) 
      .clientId(CONFIG_CLIENT_ID) 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_payment); 

     Intent intent = new Intent(this, PayPalService.class); 
     intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config); 
     startService(intent); 
    } 

    public void onBuyPressed(View pressed) { 
     PayPalPayment thingToBuy = getThingToBuy(PayPalPayment.PAYMENT_INTENT_SALE); 

     Intent intent = new Intent(PaymentActivity.this, com.paypal.android.sdk.payments.PaymentActivity.class); 

     // send the same configuration for restart resiliency 
     intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config); 

    intent.putExtra(com.paypal.android.sdk.payments.PaymentActivity.EXTRA_PAYMENT, thingToBuy); 

     startActivityForResult(intent, REQUEST_CODE_PAYMENT); 
    } 

    private PayPalPayment getThingToBuy(String paymentIntent) { 
     return new PayPalPayment(new BigDecimal("1.0"), "USD", "DRINK", 
       paymentIntent); 
    } 

    /* 
    * This method shows use of optional payment details and item list. 
    */ 

    public void onFuturePaymentPressed(View pressed) { 
     Intent intent = new Intent(PaymentActivity.this, PayPalFuturePaymentActivity.class); 

     // send the same configuration for restart resiliency 
     intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config); 

     startActivityForResult(intent, REQUEST_CODE_FUTURE_PAYMENT); 
    } 

    public void onProfileSharingPressed(View pressed) { 
     Intent intent = new Intent(PaymentActivity.this, PayPalProfileSharingActivity.class); 

     // send the same configuration for restart resiliency 
     intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config); 

     intent.putExtra(PayPalProfileSharingActivity.EXTRA_REQUESTED_SCOPES, getOauthScopes()); 

     startActivityForResult(intent, REQUEST_CODE_PROFILE_SHARING); 
    } 

    private PayPalOAuthScopes getOauthScopes() { 
     Set<String> scopes = new HashSet<String>(
       Arrays.asList(PayPalOAuthScopes.PAYPAL_SCOPE_EMAIL, PayPalOAuthScopes.PAYPAL_SCOPE_ADDRESS)); 
     return new PayPalOAuthScopes(scopes); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == REQUEST_CODE_PAYMENT) { 
      if (resultCode == Activity.RESULT_OK) { 
       PaymentConfirmation confirm = 
         data.getParcelableExtra(com.paypal.android.sdk.payments.PaymentActivity.EXTRA_RESULT_CONFIRMATION); 
       if (confirm != null) { 
        try { 
         Log.i(TAG, confirm.toJSONObject().toString(4)); 
         Log.i(TAG, confirm.getPayment().toJSONObject().toString(4)); 
         /** 
         * TODO: send 'confirm' (and possibly confirm.getPayment() to your server for verification 
         * or consent completion. 
         * See https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/ 
         * for more details. 
         * 
         * For sample mobile backend interactions, see 
         * https://github.com/paypal/rest-api-sdk-python/tree/master/samples/mobile_backend 
         */ 
         Toast.makeText(
           getApplicationContext(), 
           "PaymentConfirmation info received from PayPal", Toast.LENGTH_LONG) 
           .show(); 

        } catch (JSONException e) { 
         Log.e(TAG, "an extremely unlikely failure occurred: ", e); 
        } 
       } 
      } else if (resultCode == Activity.RESULT_CANCELED) { 
       Log.i(TAG, "The user canceled."); 
      } else if (resultCode == com.paypal.android.sdk.payments.PaymentActivity.RESULT_EXTRAS_INVALID) { 
       Log.i(
         TAG, 
         "An invalid Payment or PayPalConfiguration was submitted. Please see the docs."); 
      } 
     } else if (requestCode == REQUEST_CODE_FUTURE_PAYMENT) { 
      if (resultCode == Activity.RESULT_OK) { 
       PayPalAuthorization auth = 
         data.getParcelableExtra(PayPalFuturePaymentActivity.EXTRA_RESULT_AUTHORIZATION); 
       if (auth != null) { 
        try { 
         Log.i("FuturePaymentExample", auth.toJSONObject().toString(4)); 

         String authorization_code = auth.getAuthorizationCode(); 
         Log.i("FuturePaymentExample", authorization_code); 

         sendAuthorizationToServer(auth); 
         Toast.makeText(
           getApplicationContext(), 
           "Future Payment code received from PayPal", Toast.LENGTH_LONG) 
           .show(); 

        } catch (JSONException e) { 
         Log.e("FuturePaymentExample", "an extremely unlikely failure occurred: ", e); 
        } 
       } 
      } else if (resultCode == Activity.RESULT_CANCELED) { 
       Log.i("FuturePaymentExample", "The user canceled."); 
      } else if (resultCode == PayPalFuturePaymentActivity.RESULT_EXTRAS_INVALID) { 
       Log.i(
         "FuturePaymentExample", 
         "Probably the attempt to previously start the PayPalService had an invalid PayPalConfiguration. Please see the docs."); 
      } 
     } else if (requestCode == REQUEST_CODE_PROFILE_SHARING) { 
      if (resultCode == Activity.RESULT_OK) { 
       PayPalAuthorization auth = 
         data.getParcelableExtra(PayPalProfileSharingActivity.EXTRA_RESULT_AUTHORIZATION); 
       if (auth != null) { 
        try { 
         Log.i("ProfileSharingExample", auth.toJSONObject().toString(4)); 

         String authorization_code = auth.getAuthorizationCode(); 
         Log.i("ProfileSharingExample", authorization_code); 

         sendAuthorizationToServer(auth); 
         Toast.makeText(
           getApplicationContext(), 
           "Profile Sharing code received from PayPal", Toast.LENGTH_LONG) 
           .show(); 

        } catch (JSONException e) { 
         Log.e("ProfileSharingExample", "an extremely unlikely failure occurred: ", e); 
        } 
       } 
      } else if (resultCode == Activity.RESULT_CANCELED) { 
       Log.i("ProfileSharingExample", "The user canceled."); 
      } else if (resultCode == PayPalFuturePaymentActivity.RESULT_EXTRAS_INVALID) { 
       Log.i(
         "ProfileSharingExample", 
         "Probably the attempt to previously start the PayPalService had an invalid PayPalConfiguration. Please see the docs."); 
      } 
     } 
    } 

    private void sendAuthorizationToServer(PayPalAuthorization authorization) { 

     /** 
     * TODO: Send the authorization response to your server, where it can 
     * exchange the authorization code for OAuth access and refresh tokens. 
     * 
     * Your server must then store these tokens, so that your server code 
     * can execute payments for this user in the future. 
     * 
     * A more complete example that includes the required app-server to 
     * PayPal-server integration is available from 
     * https://github.com/paypal/rest-api-sdk-python/tree/master/samples/mobile_backend 
     */ 

    } 

    @Override 
    public void onDestroy() { 
     // Stop service when done 
     stopService(new Intent(this, PayPalService.class)); 
     super.onDestroy(); 
    } 
} 

Спасибо!

ответ

0

Оказывается, ошибка возникает из-за того, что приложение PayPal также установлено на моем телефоне. Если я удалю его, платеж будет успешно выполнен в среде ПРОИЗВОДСТВО.

PayPal скоро выпустит версию своего приложения, которое исправляет эту ошибку: https://github.com/paypal/PayPal-Android-SDK/issues/272.

Смежные вопросы