PayPal本身自己有移动端的SDK,但是已经不推荐使用了,我也自己集成了一下,还有一些问题存在,在这里就不做介绍了,官方推荐使用Braintree
SDK来集成,Braintree
支持很多种支付方式,也有很多调用方式,我也尝试了很多,为了大家少走弯路,直接看这篇文档就可以了:
首先介绍一下,Braintree
是需要申请资质的,但是似乎不是那么好申请,因为我们公司最后就没有申请下来,他SDK里面好多支付方式,都是需要在申请通过了之后才可以使用.
没有Braintree
账号,也没有关系,使用依据上面的文档,我们使用PayPal还是可以的。
dependencies {
……
implementation 'com.braintreepayments.api:braintree:3.0.0'
}
<activity android:name="com.braintreepayments.api.BraintreeBrowserSwitchActivity"
android:launchMode="singleTask">
<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="${applicationId}.braintree" />
</intent-filter>
</activity>
通过后台接口下单,获取支付token
try {
mBraintreeFragment = BraintreeFragment.newInstance(activity, clientToken)
// 支付完成监听
mBraintreeFragment?.addListener(mPaymentMethodNonceCreatedListener)
// 取消监听
mBraintreeFragment?.addListener(mBraintreeCancelListener)
// 错误监听
mBraintreeFragment?.addListener(mBraintreeErrorListener)
} catch (e: InvalidArgumentException) {
e.printStackTrace()
}
val request = PayPalRequest("订单金额")
.currencyCode("货币类型")
.intent(PayPalRequest.INTENT_SALE)
PayPal.requestOneTimePayment(mBraintreeFragment, request)
这里有一个设置intent,有三个可选项:PayPalRequest.INTENT_AUTHORIZE
、PayPalRequest.INTENT_SALE
、PayPalRequest.INTENT_ORDER
。默认是PayPalRequest.INTENT_AUTHORIZE
,表示预授权,并不是立即到账。如果想要支付立即到账,需要设置为PayPalRequest.INTENT_SALE
。
支付成功后,可以在mPaymentMethodNonceCreatedListener
接口中取得nonce
、订单号
等信息,验证支付结果。
SDK会调起PayPal支付还是Web支付,在默认配置下,每次请求支付,SDK会请求当前平台的对应配置来判断是调用PayPal App支付,还是通过浏览器Web支付。也就是说,支付方式是由PayPal来控制的。
配置信息在 ConfigManager.java
中的 CONFIGURATION_URL
常量。
这里安卓的配置当前时间点的配置(2019-12-06 15:06:55),是通过浏览器开支付的,即不管本地有没有安装PayPal,SDK都会通过调起浏览器来支付。(IOS的配置是通过App来实现支付的。PS:如果已经安装PayPal App)
在调用支付之前先配置:
PayPalOneTouchCore.useHardcodedConfig(applicationContext, true)
作用是禁止每次支付请求最新配置,而是使用本地默认的配置,默认配置是通过App来支付的。PS:已安装PayPal。
默认配置在:com.paypal.android.sdk.onetouch.core.BuildConfig.CONFIGURATION
通过反射修改ConfigManager.java
中的 CONFIGURATION_URL
常量,可以改成去读取IOS的配置,或者改成自己服务器上的配置。
val declaredField = ConfigManager::class.java.getDeclaredField("CONFIGURATION_URL")
declaredField.isAccessible = true
declaredField.set(null ,"https://www.paypalobjects.com/webstatic/otc/otc-config.ios.json")