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配置文件中加入命名空间的引用
接下来就可以在Xamarin的Android项目中引用这个项目了。
在Android项目中需要加入PayPal.Forms.Android\Resources\values\Strings.xml里面包含命名空间
这样才可以正常引用jar包里的类。
引入iOS原生包的步骤基本一致,但是编译的时候要连接装有Xamarin Studio的mac,选择iOS的Bindings Library(iOS),build action选择ObjcBindingNativeLibrary。iOS则是使用ApiDefinition.cs来定义引入的类,该文件的build action为ObjcBindingApiDefinition,以下为一个引入类的方法。
AcceptCreditCards 是否接收信用卡
MerchantName 商户名字
MerchantPrivacyPolicyUri 商户隐私声明
MerchantUserAgreementUri 用户协议
MerchantPrivacyPolicyUri ,MerchantUserAgreementUri 是用在Futurepayment中的,普通的及时支付不会看到这个。
支付方法
至此支付流程完成。
PayPal SDK的支付过程是按照payment信息直接去支付,不是先生成支付订单,再对支付订单支付,这样会造成一个问题,如果用户支付成功但是在向我们自己的服务端传送支付完成的信息时出现异常,会导致用户白白支付了钱,但是我们的服务端不知道的情况。这也是我们使用这个SDK时要注意的问题。
在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时要注意的问题。
相关文章推荐
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- Ruby on Rails在Ping ++ 平台实现支付
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法
- C#中Equality和Identity浅析