Android PayPal未来支付活动授权无效

Android PayPal未来支付活动授权无效,android,paypal,paypal-sandbox,Android,Paypal,Paypal Sandbox,我使用的是PayPal移动SDK(Android),因为我需要访问RESTAPI,我使用的是沙箱。即时付款很好,但我无法获得未来付款的授权码。我已经检查了开发者门户,并且启用了未来的付款,尽管我认为这是沙箱的默认设置。我正在使用Xamarin android(c#): 舱单: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/and

我使用的是PayPal移动SDK(Android),因为我需要访问RESTAPI,我使用的是沙箱。即时付款很好,但我无法获得未来付款的授权码。我已经检查了开发者门户,并且启用了未来的付款,尽管我认为这是沙箱的默认设置。我正在使用Xamarin android(c#):

舱单:

<?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>

代码:

公共类PayPalDroid:IPayPalService
{
私有PayPalConfiguration配置=新PayPalConfiguration()
.Environment(PayPalConfiguration.EnvironmentSandbox)
.ClientId(“AEX06W97L702SEFGK5ZB4TC4VEYO4OOZOP9DGKIHCDVGD4O0MGEZONL1T-sFWAmRXyzyx87Y1mupJ1W”)
.MerchantName(“示例商户”)
.MerchantPrivacyPolicyUri(Android.Net.Uri.Parse(“https://www.example.com/privacy"))
.MerchantUserAgreementUri(Android.Net.Uri.Parse(“https://www.example.com/legal"));
//仅使用依赖项注入调用默认构造函数,因此这是必需的
公共PayPalDroid(){}
私人int请求\代码\付款=1;
私人int请求\代码\未来\付款=2;
私有int请求\代码\配置文件\共享=3;
公共任务请求PayPal()
{
Context=MainActivity.Instance;
MainActivity=(MainActivity)上下文;
//创建侦听器
var listener=新活动ResultListener(活动);
//启动贝宝服务-每次都必须这样做
var intent=新意图(上下文、类型(PayPalService));
intent.PutExtra(PayPalService.ExtraPaypalConfiguration,config);
context.StartActivity(Intent.CreateChooser(Intent,“请求贝宝交易”);
var payment=新的PayPayment(新Java.Math.BigDecimal(“2.45”),“USD”,“项目”,
paymappayment.PaymentIntentSale);
意向=新意向(上下文、类型(PaymentActivity));
intent.PutExtra(PayPalService.ExtraPaypalConfiguration,config);
意向。额外支付(PaymentActivity.ExtraPayment,payment);
activity.StartActivityForResult(Intent.CreateChooser(Intent,“贝宝交易完成”),请求\代码\未来\付款;
返回listener.Task;
}
私有类ActivityResultListener
{
私有TaskCompletionSource Complete=新TaskCompletionSource();
公共任务任务{get{返回this.Complete.Task;}
主要活动;
公共活动ResultListener(主活动)
{
活动=活动;
//订阅活动结果
activity.ActivityResult+=OnActivityResult;
}
ActivityResult上的私有void(int请求代码、结果代码、意图数据)
{
//取消订阅活动结果
Activity.ActivityResult-=OnActivityResult;
//过程结果
if(resultCode==Result.Ok)
{
Object auth=data.GetParcelableExtra(PayPalFuturePaymentActivity.ExtraResultAuthorization);
如果(auth!=null)/**则始终为null**//
{
尝试
{
//字符串授权\ U代码=auth.AuthorizationCode;
//sendAuthorizationToServer(身份验证);
}
捕获(例外e)
{
//Log.e(“FuturePaymentExample”,“发生极不可能的故障:”,e);
}
}
}
Complete.TrySetResult(resultCode.ToString());
Context=MainActivity.Instance;
var intent=新意图(上下文、类型(PayPalService));
上下文。停止服务(意图);
}
}
}
如果没有授权码,我无法进一步(即服务器端编码)。问题是“auth”对象总是空的,我看不出代码有什么问题,因为它基本上是示例代码。我错过了什么?或者这只在现场环境中起作用?
谢谢。

犯了一个简单错误,该活动需要是PayPalFuturePaymentActivity,而不是PaymentActivity。PaymentConfirmation对象可用于PaymentActivity,而不是PayPalAuthorization对象

我在这里找到了一些非常好的PayPal集成示例代码,这可能对其他人有所帮助:

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