Android PayPal 支付集成

PayPal本身自己有移动端的SDK,但是已经不推荐使用了,我也自己集成了一下,还有一些问题存在,在这里就不做介绍了,官方推荐使用BraintreeSDK来集成,Braintree支持很多种支付方式,也有很多调用方式,我也尝试了很多,为了大家少走弯路,直接看这篇文档就可以了:

首先介绍一下,Braintree是需要申请资质的,但是似乎不是那么好申请,因为我们公司最后就没有申请下来,他SDK里面好多支付方式,都是需要在申请通过了之后才可以使用.

没有Braintree账号,也没有关系,使用依据上面的文档,我们使用PayPal还是可以的。

1. 添加依赖

dependencies {
    ……
    implementation 'com.braintreepayments.api:braintree:3.0.0'
}

2. 配置清单文件

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

3. 获取支付token

通过后台接口下单,获取支付token

4. 初始化

try {
    mBraintreeFragment = BraintreeFragment.newInstance(activity, clientToken)
	 // 支付完成监听
    mBraintreeFragment?.addListener(mPaymentMethodNonceCreatedListener)
    // 取消监听
    mBraintreeFragment?.addListener(mBraintreeCancelListener)
    // 错误监听
    mBraintreeFragment?.addListener(mBraintreeErrorListener)
} catch (e: InvalidArgumentException) {
    e.printStackTrace()
}

5. 调起支付

val request = PayPalRequest("订单金额")
        .currencyCode("货币类型")
        .intent(PayPalRequest.INTENT_SALE)
PayPal.requestOneTimePayment(mBraintreeFragment, request)

这里有一个设置intent,有三个可选项:PayPalRequest.INTENT_AUTHORIZEPayPalRequest.INTENT_SALEPayPalRequest.INTENT_ORDER。默认是PayPalRequest.INTENT_AUTHORIZE,表示预授权,并不是立即到账。如果想要支付立即到账,需要设置为PayPalRequest.INTENT_SALE

支付成功后,可以在mPaymentMethodNonceCreatedListener接口中取得nonce订单号等信息,验证支付结果。

5.1 关于调起PayPal支付还是Web支付

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)

5.2 解决方案

方案一(推荐)

在调用支付之前先配置:

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")