您的位置:首页 > 移动开发 > Android开发

Xamarin.Forms支付组件PayPal.Forms - 怎样引用原生Android、iOS包

2016-06-10 14:17 344 查看
Xamarin.Forms相关文章

在Android和iOS应用中支付是一个很重要的功能。paypal官方对Android和iOS都有提供SDK。Xamarin.Forms目前市场使用量较小,官方还没有提供支持,好在github上有开源的Xamarin.Forms的SDK可以使用。

Android和iOS发展时间长,已经有很多SDK,现成的库的支持,所以我们还是希望最好能将这些已有的库加入到我们的Xamarin项目中来。Xamarin提供了这样的机制,这里的Paypal.Forms就是用这样的机制调用的官方Android、iOS的SDK来实现的。下面的流程为介绍怎么样将Android,iOS的原生库引入Xamarin项目,Paypal.Forms在NuGet上可以获得。

在NuGet上获得时Xamarin.Forms的portable公用项目不能用NuGet自动加入的话,需要手动将下载好的packages\PayPal.Forms.2.0.4\lib\portable-net45+wp8+win8+MonoAndroid10+MonoTouch10+Xamarin.iOS10+UAP10目录下的dll引入。

使用Bindings Library(Android)可以将Android的jar包包装成C#中的dll以供使用。



添加需要使用的包,配置正确的build action。



在Metadata.xml配置文件中加入命名空间的引用

<metadata>
<attr path="/api/package[@name='com.paypal.android.sdk.payments']" name="managedName">Xamarin.PayPal.Android</attr>
</metadata>

接下来就可以在Xamarin的Android项目中引用这个项目了。

在Android项目中需要加入PayPal.Forms.Android\Resources\values\Strings.xml里面包含命名空间

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="library_name">PayPal.Forms.Android</string>
</resources>

这样才可以正常引用jar包里的类。

引入iOS原生包的步骤基本一致,但是编译的时候要连接装有Xamarin Studio的mac,选择iOS的Bindings Library(iOS),build action选择ObjcBindingNativeLibrary。iOS则是使用ApiDefinition.cs来定义引入的类,该文件的build action为ObjcBindingApiDefinition,以下为一个引入类的方法。

namespace Xamarin.PayPal.iOS
{
// @interface PayPalConfiguration : NSObject <NSCopying>
[BaseType(typeof (NSObject))]
interface PayPalConfiguration : INSCopying
{
// @property (readwrite, copy, nonatomic) NSString * _Nullable defaultUserEmail;
[NullAllowed, Export("defaultUserEmail")]
string DefaultUserEmail { get; set; }

// @property (readwrite, copy, nonatomic) NSString * _Nullable defaultUserPhoneCountryCode;
[NullAllowed, Export("defaultUserPhoneCountryCode")]
string DefaultUserPhoneCountryCode { get; set; }

// @property (readwrite, copy, nonatomic) NSString * _Nullable defaultUserPhoneNumber;
[NullAllowed, Export("defaultUserPhoneNumber")]
string DefaultUserPhoneNumber { get; set; }

// @property (readwrite, copy, nonatomic) NSString * _Nullable merchantName;
[NullAllowed, Export("merchantName")]
string MerchantName { get; set; }

// @property (readwrite, copy, nonatomic) NSURL * _Nullable merchantPrivacyPolicyURL;
[NullAllowed, Export("merchantPrivacyPolicyURL", ArgumentSemantic.Copy)]
NSUrl MerchantPrivacyPolicyURL { get; set; }

// @property (readwrite, copy, nonatomic) NSURL * _Nullable merchantUserAgreementURL;
[NullAllowed, Export("merchantUserAgreementURL", ArgumentSemantic.Copy)]
NSUrl MerchantUserAgreementURL { get; set; }

// @property (assign, readwrite, nonatomic) BOOL acceptCreditCards;
[Export("acceptCreditCards")]
bool AcceptCreditCards { get; set; }

// @property (assign, readwrite, nonatomic) PayPalShippingAddressOption payPalShippingAddressOption;
[Export("payPalShippingAddressOption", ArgumentSemantic.Assign)]
PayPalShippingAddressOption PayPalShippingAddressOption { get; set; }

// @property (assign, readwrite, nonatomic) BOOL rememberUser;
[Export("rememberUser")]
bool RememberUser { get; set; }

// @property (readwrite, copy, nonatomic) NSString * _Nullable languageOrLocale;
[NullAllowed, Export("languageOrLocale")]
string LanguageOrLocale { get; set; }

// @property (assign, readwrite, nonatomic) BOOL alwaysDisplayCurrencyCodes;
[Export("alwaysDisplayCurrencyCodes")]
bool AlwaysDisplayCurrencyCodes { get; set; }

// @property (assign, readwrite, nonatomic) BOOL disableBlurWhenBackgrounding;
[Export("disableBlurWhenBackgrounding")]
bool DisableBlurWhenBackgrounding { get; set; }

// @property (assign, readwrite, nonatomic) BOOL presentingInPopover;
[Export("presentingInPopover")]
bool PresentingInPopover { get; set; }

// @property (assign, readwrite, nonatomic) BOOL forceDefaultsInSandbox;
[Export("forceDefaultsInSandbox")]
bool ForceDefaultsInSandbox { get; set; }

// @property (readwrite, copy, nonatomic) NSString * _Nullable sandboxUserPassword;
[NullAllowed, Export("sandboxUserPassword")]
string SandboxUserPassword { get; set; }

// @property (readwrite, copy, nonatomic) NSString * _Nullable sandboxUserPin;
[NullAllowed, Export("sandboxUserPin")]
string SandboxUserPin { get; set; }
}
}
Paypal.Forms初始化
namespace PayPal.Forms.Test.PCL.Droid
{
    [Activity (Label = "PayPal.Forms.Test.PCL.Droid", Icon = "@drawable/icon", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation)]
    public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
    {
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            global::Xamarin.Forms.Forms.Init (this, bundle);

            PayPal.Forms.CrossPayPalManager.Init (
                new PayPalConfiguration (PayPalEnvironment.Sandbox,"ClientID")
                {
                    AcceptCreditCards = true,
                    MerchantName = "Test Store",
                    MerchantPrivacyPolicyUri = "https://www.example.com/privacy",
                    MerchantUserAgreementUri = "https://www.example.com/legal"
                }
            );

            LoadApplication (new App ());
        }

        protected override void OnActivityResult (int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult (requestCode, resultCode, data);
            PayPalManagerImplementation.Manager.OnActivityResult (requestCode, resultCode, data);
        }

        protected override void OnDestroy ()
        {
            base.OnDestroy ();
            PayPalManagerImplementation.Manager.Destroy ();
        }
    }
}
PayPalEnvironment.Sandbox沙箱测试环境,ClientID是在Paypal的sandbox环境中注册的商户id

AcceptCreditCards 是否接收信用卡

MerchantName 商户名字

MerchantPrivacyPolicyUri 商户隐私声明

MerchantUserAgreementUri 用户协议
MerchantPrivacyPolicyUri ,MerchantUserAgreementUri 是用在Futurepayment中的,普通的及时支付不会看到这个。

支付方法

var result = await PayPal.Forms.CrossPayPalManager.Current.Buy(
new PayPalItem("Test Product", new Decimal(12.50), "USD"),
new Decimal(25),
new ShippingAddress("test buyer", "NO 1 Nan Jin Road", "", "Shanghai", "Shanghai", "200000", "CN")
);
if (result.Status == PayPalStatus.Successful)
{
    Debug.WriteLine(result.ServerResponse.Response.Id);
}
在使用这个方法时,我们的应用程序会启动PayPal SDK,这个SDK会启动一个PayPal的页面来引导完成支付流程。函数OnActivityResult里的代码保证支付完成之后把结果返回给我们的应用程序。

至此支付流程完成。

PayPal SDK的支付过程是按照payment信息直接去支付,不是先生成支付订单,再对支付订单支付,这样会造成一个问题,如果用户支付成功但是在向我们自己的服务端传送支付完成的信息时出现异常,会导致用户白白支付了钱,但是我们的服务端不知道的情况。这也是我们使用这个SDK时要注意的问题。

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息