2017-12-23 17 views
0

私はREST APIにアクセスする必要があるため、PayPalモバイルSDK(Android)を使用しています。サンドボックスを使用しています。即時支払いは正常に機能しますが、将来の支払いのための認証コードを取得することはできません。とにかくサンドボックスのデフォルトだとは思いますが、開発者のポータルを確認して、将来の支払いを有効にしています。私はXamarinのアンドロイド(C#)を使用しています:PayPal今後のお支払いアクティビティ承認null null

マニフェスト:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:installLocation="auto" package="ShoezApp.Android"> 
    <!--This will default to ShoezApp.ShoezApp if no second part is specified--> 
    <uses-sdk android:minSdkVersion="19" /> 
    <uses-permission android:name="android.permission.CAMERA" /> 
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> 

    <!-- admob permissions--> 
    <uses-permission android:name="android.permission.INTERNET"/> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 


    <application android:label="ShoezApp" android:icon="@drawable/icon"> 
    <activity android:name="com.microsoft.windowsazure.mobileservices.authentication.RedirectUrlActivity" android:launchMode="singleTop" android:noHistory="true"> 
     <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <category android:name="android.intent.category.BROWSABLE" /> 
     <data android:scheme="shoezapp" android:host="easyauth.callback" /> 
     </intent-filter> 
    </activity> 

    <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version"/> 
    <activity android:name="com.google.android.gms.ads.AdActivity" android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" android:theme="@android:style/Theme.Translucent" /> 
    </application> 
</manifest> 

コード:

public class PayPalDroid : IPayPalService 
    { 
     private PayPalConfiguration config = new PayPalConfiguration() 
      .Environment(PayPalConfiguration.EnvironmentSandbox) 
      .ClientId("AeX06w97L702sEFGK5ZB4Tc4Veyo4oOzopS9DgKiHCDVgD4O0mGeZoNl1t-sFWAmRXyzyx87Y1mupJ1W") 
      .MerchantName("Example Merchant") 
      .MerchantPrivacyPolicyUri(Android.Net.Uri.Parse("https://www.example.com/privacy")) 
      .MerchantUserAgreementUri(Android.Net.Uri.Parse("https://www.example.com/legal")); 

     //only calls default constructor with dependency injection, so this is necessary 
     public PayPalDroid() {} 

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

     public Task<string> RequestPayPal() 
     { 
      Context context = MainActivity.Instance; 
      MainActivity activity = (MainActivity)context; 
      //create the listener 
      var listener = new ActivityResultListener(activity); 

      // start paypal service - this must be done each time 
      var intent = new Intent(context, typeof(PayPalService)); 
      intent.PutExtra(PayPalService.ExtraPaypalConfiguration, config); 
      context.StartActivity(Intent.CreateChooser(intent, "Request PayPal transaction")); 

      var payment = new PayPalPayment(new Java.Math.BigDecimal("2.45"), "USD", "the item", 
       PayPalPayment.PaymentIntentSale); 

      intent = new Intent(context, typeof(PaymentActivity)); 
      intent.PutExtra(PayPalService.ExtraPaypalConfiguration, config); 
      intent.PutExtra(PaymentActivity.ExtraPayment, payment); 

      activity.StartActivityForResult(Intent.CreateChooser(intent, "PayPal transaction complete"), REQUEST_CODE_FUTURE_PAYMENT); 

      return listener.Task; 
     } 


     private class ActivityResultListener 
     { 
      private TaskCompletionSource<string> Complete = new TaskCompletionSource<string>(); 
      public Task<string> Task { get { return this.Complete.Task; } } 

      MainActivity Activity; 

      public ActivityResultListener(MainActivity activity) 
      { 
       Activity = activity; 
       // subscribe to activity results 
       activity.ActivityResult += OnActivityResult; 
      } 

      private void OnActivityResult(int requestCode, Result resultCode, Intent data) 
      { 
       // unsubscribe from activity results 
       Activity.ActivityResult -= OnActivityResult; 

       // process result 
       if (resultCode == Result.Ok) 
       { 
        Object auth = data.GetParcelableExtra(PayPalFuturePaymentActivity.ExtraResultAuthorization); 
        if (auth != null) //**THIS IS ALWAYS NULL**// 
        { 

         try 
         { 
          //string authorization_code = auth.AuthorizationCode; 

          //sendAuthorizationToServer(auth); 

         } 
         catch (Exception e) 
         { 
          //Log.e("FuturePaymentExample", "an extremely unlikely failure occurred: ", e); 
         } 
        } 
       } 

       Complete.TrySetResult(resultCode.ToString()); 

       Context context = MainActivity.Instance; 
       var intent = new Intent(context, typeof(PayPalService)); 
       context.StopService(intent); 
      } 
     } 
    } 

私は認可コードなし、さらに(コーディングすなわち、サーバ側に)行くことはできません。問題は、 'auth'オブジェクトが常にnullであることと、基本的にサンプルコードと同じように、コードに何か間違ったものは見えないということです。私は何が欠けていますか?またはこれはライブ環境でのみ機能しますか?おかげさまで

答えて

1

単純なエラーが発生したため、アクティビティはPaymentActivityではなくPayPalFuturePaymentActivityである必要があります。 PayPalAuthorizationオブジェクトではなく、PaymentActivityに対してPaymentConfirmationオブジェクトを使用できます。

私はここにPayPalの統合のためのいくつかの本当に良いサンプルコードを見つけました。誰かに役立つ可能性があります:https://www.csharpcodi.com/vs2/?source=176/PayPal.Forms/MobileApps/PayPal.Forms/PayPalAndroidTest/PayPalManager.cs

関連する問題