记Paypal支付小坑

因为业务需求,需要接入Paypal,总体来说也是比较简单的,但是陌生的东西总是免不了要躺坑的,这里做一下记录。
首先是一波官方的资料:
Paypal Android sdk github地址
Paypal 开发者首页

在开始之前你需要一个Paypal的账号。

接入的大致步骤如下:
(1)新建测试账号,分别是PERSONAL、BUSINESS身份
记Paypal支付小坑_第1张图片
(2)以刚才新建的BUSINESS账号为商家账号,创建一个app(随便填就好,主要要用自己新建的测试商家账号。自己弄得时候一开始是用的官方给的,死活连不上
记Paypal支付小坑_第2张图片
(3)添加gradle依赖

 compile('com.paypal.sdk:paypal-android-sdk:2.16.0') {
        //标识去掉信用卡相关的
        exclude group: 'io.card'
    }

好像是已经不支持信用卡了,所以我就把它给去掉了。其实这个组件也已经被弃用了,官方给出的一种新的方案是通过braintree SDK来访问,可以去尝试一下。
(4)开始撸代码,还是比较简单的。先是初始化服务:

//初始化,启动sdk中封装的服务
Intent intent = new Intent(mActivity, PayPalService.class);
intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
mActivity.startService(intent);

我们关注一下Intent对象中添加的config对象:

/**
 * 设置为沙盒环境,上线需切换为正式环境ENVIRONMENT_PRODUCTION
 */
 private static final String CONFIG_ENVIRONMENT = PayPalConfiguration.ENVIRONMENT_SANDBOX;

 /**
  *  证书
  *  当前为sanbox环境,上架前切换为正式环境,并测试
  */
 private static final String CONFIG_CLIENT_ID = "xxx";

 private static PayPalConfiguration config = new PayPalConfiguration()
            .environment(CONFIG_ENVIRONMENT)
            .clientId(CONFIG_CLIENT_ID);

关于ClientId我们可以在Paypal控制台找到,具体在:
记Paypal支付小坑_第3张图片
(5)调起支付

//调起支付的函数
public void paypalForTools() {
        //获取支付的封装对象
        PayPalPayment payment = getThingToBuy(PayPalPayment.PAYMENT_INTENT_SALE);
        Intent intent = new Intent(mActivity, PaymentActivity.class);
        intent.putExtra(PayPalService.EXTRA_PAYPAL_CONFIGURATION, config);
        intent.putExtra(PaymentActivity.EXTRA_PAYMENT, payment);
        mActivity.startActivityForResult(intent, REQUEST_CODE_PAYPAL);
    }

    private PayPalPayment getThingToBuy(String paymentIntent) {
        //获取封装的支付对象,参数分别是:商品价格、币种、名称、类型(这里选择即时购买)
          PayPalPayment payPalPayment = new PayPalPayment(new BigDecimal(mGoodsDetailBean.getPrice()),
                mGoodsDetailBean.getCurrency(),
                mGoodsDetailBean.getGoodsName(),
                paymentIntent);
        return payPalPayment;
    }

(6)然后就是在Activity的onActivityResult中处理结果

if (resultCode == Activity.RESULT_OK) {
                PaymentConfirmation paymentResult =
                        data.getParcelableExtra(PaymentActivity.EXTRA_RESULT_CONFIRMATION);
               if(paymentResult != null){
                  //这里我是把结果回调到支付的封装类中去处理
               }
            } else if (resultCode == Activity.RESULT_CANCELED) {
                LogUtils.i("The user canceled.");
            } else if (resultCode == PaymentActivity.RESULT_EXTRAS_INVALID) {
                LogUtils.i(
                        "An invalid Payment or PayPalConfiguration was submitted. Please see the docs.");
            }

(7)回调主要是做后台的订单校验逻辑
(8)界面销毁时,停止服务
总体还是比较简单的。就是前面使用系统分配的商家账号来新建应用,测试的时候死活连不上,差点开始怀疑人生。。。

你可能感兴趣的:(日常开发笔记)