前言:

我们在2017年,在我们的业务中接入了paypal支付,当时使用的PayPal Android SDK,github地址  ,期间一切正常,最近paypal官方发来一封邮件,重要集成变更

在PayPal,我们始终将为用户及其客户提供安全、可靠的网上购物和移动支付体验作为我们的一项首要任务。为最大程度确保客户和交易数据的安全,我们将从2020年12月7日起停止使用PayPal的手机软件开发工具包(SDK)和通过Braintree JS SDK版本2进行的PayPal付款。

我们的记录显示,您的账户正在使用PayPal手机软件开发工具包(SDK)或Braintree的JS SDK v2在您的应用程序中进行PayPal支付。为避免在使用PayPal时遭遇服务中断,您必须在12月7日之前以其他方式与PayPal Checkout进行集成。

您需要做什么?

为避免服务停用,我们建议您使用以下集成选项之一:选项1:直接与v2/订单 API集成 此选项是一种基于网络的结账体验,必须与API集成。如需详细了解如何通过此API集成,请参阅以下开发者参考资料: •    订单API集成指南 •    也可与Direct SDK一起使用 •    Direct SDK快速入门指南选项2:与PayPal JavaScript SDK集成 通过此基于网络的选项,交易将通过添加到您网站的按钮重定向到PayPal或Venmo移动应用程序。 您还可以参考以下开发者资源指南: •    概述 •    集成指南 •    自定义SDK脚本 •    最佳做法 •    用于服务器端集成的Direct SDK选项3:从Braintree JS SDK v2升级到JS SDK v3以支持PayPal付款。

PayPal Android SDK ,github上也早就标注:是的,12月7日要修改,不然要停服!

Important: PayPal Mobile SDKs are Deprecated. The APIs powering them will remain operational long enough for merchants to migrate, but the SDKs themselves will no longer be updated. Please use Braintree Direct in supported countries. In other countries, use Express Checkout and choose the Braintree SDK integration option.

 

下面开始改造。

针对3种方案:

我优先选择的是Braintree,网上也能查到一些资料,并且我们在沙箱环境下已经验证通过,但是最终放弃,选择的是 选项2:PayPal JavaScript SDK集成

一些弯路:

与paypal方沟通如下:



关于您现在更换集成Braintree的事宜,首先,Sandbox是PayPal的测试环境,可供我们的用户测试所有的相关产品,没有地域限制。但是在正式环境中,一些产品的集成是有国家或地域限制的,不同国家或地区各有不同的集成产品。而对于Braintree来说,在正式环境中,中国大陆的PayPal账户是不支持的,也就是您无法集成Braintree,目前仅支持美国等少数一些国家和地区的PayPal账户。

而针对于此次的PayPal手机软件开发工具包更换集成的工作,您其实只需要选择以下两种方案之一即可,无需更换集成BrainTree,这两种方式较之Braintree来说,是比较简单且易于集成的。您可以参阅以下的详细内容:

我优先准备选择Braintree的, 关于您现在更换集成Braintree的事宜,首先,Sandbox是PayPal的测试环境,可供我们的用户测试所有的相关产品,没有地域限制。但是在正式环境中,一些产品的集成是有国家或地域限制的,不同国家或地区各有不同的集成产品。而对于Braintree来说,在正式环境中,中国大陆的PayPal账户是不支持的,也就是您无法集成Braintree,目前仅支持美国等少数一些国家和地区的PayPal账户。

 

  • 您说的“对于Braintree来说,在正式环境中,中国大陆的PayPal账户是不支持的”,这个paypal账户 是指商家账户还是终端客户?我们场景是:我们是中国大陆企业,提供服务给海外客户,也就是 海外客户 通过我们的app 向我们付款,请帮忙确认一下。

不支持,指的是收款方PayPal账户,也就是您的中国大陆PayPal账户(xx×××xxx@qq.com)。您的海外客户,乃至全球的其他买家,由于其是付款方,并不涉及到任何技术集成问题,他们仅是按照收款方/卖家的相应技术集成来进行付款,即:收款方/卖家/商家采用什么样的收款集成方式,他们就用什么样的方式来付款。所以,与您的买家/海外客户/终端客户是没有任何关系的。
 

  • 我大概看了一下方案1 和 方案2 是基于网站的集成方式,我们之前的场景是 通过App 跳转paypal支付,目前根据规则 需要替换“PayPalAndroidSDK-2.16.0.aar”,我们还是 用方案1或者方案2吗?

您是需要替换PayPalAndroidSDK的集成方式,也就是,之前通过以下两种方式集成的手机端App,将会在2020年12月7日以后失效。取而代之的就是之前回复您的几种方案,您可以任选一种。

https://github.com/paypal/PayPal-iOS-SDKhttps://github.com/paypal/PayPal-Android-SDK  

  • 我们如果在12月7日前 没有更改,我们的用户是不是将无法通过paypal给我们支付

是的,如果您届时还没有进行更改,那么您的用户将无法通过之前的App给您付款。
 

  • 是否有相关集成示例demo(Android & IOS)?

Android 或者 IOS其本身的SDK是没有的,因为即将失效了。但是您可以参阅以下的Demo,一样可以完成集成技术工作。

- 介绍与集成文档     https://developer.paypal.com/docs/checkout/integrate/ - 在线 DEMO     https://developer.paypal.com/demo/checkout/#/pattern/checkout
另外,如果您希望纯后端API调用的方式集成我们的支付产品,而不需要在HTML页面上展示PayPal支付按钮,也可以选择直接调用我们的REST API 的方式来集成支付功能,详细文档请参考:

- REST API 调用基础 https://developer.paypal.com/docs/api/overview/ - Server端接口调用文档 https://developer.paypal.com/docs/checkout/reference/server-integration/  

Important: PayPal Mobile SDKs are Deprecated. The APIs powering them will remain operational long enough for merchants to migrate, but the SDKs themselves will no longer be updated. Please use Braintree Direct in supported countries. In other countries, use Express Checkout and choose the Braintree SDK integration option.

关于这点,首先,Supported country里显示的是“Hong Kong SAR, China”,指的是“中国香港地区”,而不是“中国大陆”,您的PayPal账户是属于“中国大陆”的账户。中国香港地区的PayPal账户是可以集成Braintree的。其次,这句话“In other countries, use Express Checkout and choose the Braintree SDK integration option.”的意思是,您/中国大陆的PayPal收款方/商家账户是可以通过Express Checkout via Braintree来集成(简称ECBT),该集成方式与Braintree SDK是不同的产品,虽然名称上很相近,但却是不一样的集成方式。但是如果您做手机端App的集成,我们不推荐您使用ECBT来完成,因为该产品目前还有一些不完善的地方,所以我们还是依然建议您使用方案1或者方案2。

 

好了,正文来了。

 

付款流程:

android集成paypal支付 安卓 paypal_javascript

 

1.整合Smart PayMent Button 到页面中;

2.用户点击支付按钮

3.按钮自动调用 Order API 创建交易

4.进入paypal支付界面

5.用户参与:登录 、确认等支付

6.集成的paypal自动继续调用Order API 完成交易

7.显示成功信息

整个支付过程都由JS 中完成

 

代码整合:

在项目assets 中 放入index.html

<!DOCTYPE html>
<html lang="en">

<head>
    <!-- Add meta tags for mobile and IE -->
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
    <title> PayPal Smart Payment Buttons Integration | Client Demo </title>
</head>

<body>
<!-- Set up a container element for the button -->
<div id="paypal-button-container"></div>

<!-- Include the PayPal JavaScript SDK -->
<script src="https://www.paypal.com/sdk/js?client-id=sb¤cy=USD"></script>


</body>

</html>

其中client-id = sb 为沙箱环境,也可以替换成子机的沙箱id ,正式环境再更换成正式的id

 

在js中写入

<script >
            let invoiceid = '';//服务器下单,订单号
            let custom = '';//构造的用户id,sourceID
            let amount = '0.0';//金额(美金)
            //传递参数,用于调起web paypal时,传递订单号+金额等
            function initData(invoice,customtmp,amounttmp){
                console.log("initData:"+invoice+","+customtmp+","+amounttmp)
                invoiceid = invoice;
                custom = customtmp;
                amount = amounttmp;
                return "OK";
            };
        // Render the PayPal button into #paypal-button-container
        paypal.Buttons({

            // Set up the transaction
            createOrder: function(data, actions) {
                //console.log("invoiceid:"+invoiceid+",custom:"+custom+",amount:"+amount);
                return actions.order.create({
                    purchase_units: [{
                        invoice_id:invoiceid,
                        custom_id:custom,
                        amount: {
                            value: amount
                        }
                    }]
                });
            },

            // Finalize the transaction
            onApprove: function(data, actions) {
                return actions.order.capture().then(function(details) {
                    // Show a success message to the buyer
                    //alert('Transaction completed by ' + details.payer.name.given_name + '!');
                //这里可以加个回调
                    javascript:obj.onApproveSuccess()

                });
            },
            onError: function (err) {
                //console.log(err);
                javascript:obj.onApproveFailue(err);
            }


        }).render('#paypal-button-container');

</script>

 

createOrder为创建订单,onApprove为用户授权并付款完成,OnError:出错了,OnCancel:取消了

上面加了个自定义函数:

initData目的为了传参,携带订单号、金额等信息至js

app 调用 并完成支付后,通过后台配置的IPN通知回调,服务器将获取paypal方发来的回调,并通过此订单号对接 相关业务。