Paypal支付不完全指北


Posted in Javascript onJune 04, 2020

啥都不说,先吐槽

Paypal 真心坑爹,跟国内支付完全没法比,能不接入就不接入吧!!!

准备工作

重要事情

Paypal下单支付后,需要主动跟paypal确认收款(capture),否则该笔订单并不是完成状态!!!

账号

自己前往Paypal develop注册一个吧,注意区分沙箱(sandbox)和正式(live)账号即可。
用沙盒账号开发,还可以创建多个沙盒的paypal账号,可以用于沙盒测试支付。

下单方式

跟国内的支付宝和微信有区别,paypal可以直接在客户端下单。

支持客服端、服务端下单。各有利弊,看具体需求来定咯

  • 客服端下单,可以调起Paypal APP(ios 和 android), 缺点是服务端无法及时知晓下单过程,需要客户端及时通知
  • 服务端或者webhooks服务端下单,只能打开paypal 网页支付。

无论何种下单,paypal 都没有采用加密机制,全部都是明文,所以在检校订单信息时需要格外注意

客户端下单

  • JavaScript
  • ios sdk
  • android sdk

客服端直接下单,需要保证客服端接收到的订单信息时准确的(最好后端加密订单信息,客户端解密并检验数据完整性)

JavaScript

JavaScript直接接入,是通过paypal js直接生成一个iframe用于支付。
其中需要注意的是,paypal生成的按钮只有几个基本样式可选,无法直接自定义样式(我是没有找到相关文档,不排除可以自定义的可能。如果有麻烦也告诉下我)。

使用方式

// 如果默认货币不是美元,需要在后面添加货币参数
<script src="https://www.paypal.com/sdk/js?client-id=sb"></script>
paypal.Buttons({
createOrder: function(data, actions) {
 // This function sets up the details of the transaction, including the amount and line item details.
 return actions.order.create({
  purchase_units: [{
   amount: {
    value: '0.01'
   }
  }]
 });
},
onApprove: function(data, actions) {},
onCancel: function(){},
onError: function(){}
}).render('#paypal-button-container');

虽然目前无法自定义按钮,但是我们可以是paypal生成的按钮隐藏,用自己的按钮盖住,然后是设置css属性pointer-events:none;来屏蔽事件即可。

Ios || android

Ios 和 andorid 的接入方式与JavaScript类似,只要引入相应的SDK,非常简单的就可以下单。SDK quickstart

服务端下单(推荐)

因为paypal没有采用加密机制,同时在弱网情况下无法保证客户端可以及时通知服务端订单状态的改变,选用服务端下单是相对安全的。

建议在下单时,发送完整的订单金额信息,paypal会对相关金额做检校,如果更方面金额不一致(总价 !== 运费+税费+商品数量 * 商品单价+…… ),是不能下单的。同时也可以让买家确认该笔订单的明细,用户体验和安全性都有提高。

顺便吐槽下paypal的沙盒环境,如果你请求超时,请不要见怪,这不是你的问题,是沙盒环境太烂。(PS:不知道是不是与服务端语言相关,PHP和nodejs对接paypal,性能差别很大,同一时间,同一个沙盒账号,nodejs请求基本保持在5s以内,php在15s左右)

基本下单参数

{
  "intent": "CAPTURE",
  "purchase_units": [
    {
      "reference_id": "order_id",
      // 总价
      "amount": {
        "value": "200",
        "currency_code": "RMB"
      },
      // 价格明细
      "breakdown": {
        // 商品总价
        "item_total": {
          "value": "180",
          "currency_code": "RMB"
        },
        // 运费
        "shipping": {
          "value": "20",
          "currency_code": "RMB"
        }
        // …… 还有税费之类的
      },
      // 商品明细
      "items": [
        {
          "name": "goods",
          "unit_amount": {
            "value": "90",
            "currency_code": "RMB"
          },
          "quantity": 2,// 数量
          "sku": "sku"
        }
      ]
      //...地址之类的其他参数
    }
  ],
  "application_context": {
    "cancel_url": "",
    "return_url": ""
  }
}

支付时序图

Paypal支付不完全指北
高清在线图片

再次强调: Paypal下单支付后,需要主动跟paypal确认收款(capture),否则该笔订单并不是完成状态!!

notify

支付回调可以通过IPN或者webhooks,基本和国内支付没有什么区别,唯一区别是paypal通知没有加密,收到回调需要服务端主动跟paypal确认信息是否正确

相关链接

PayPal Checkout
PayPal integrate doc
PayPal SDK quickstart
point-events

到此这篇关于Paypal支付不完全指北的文章就介绍到这了,更多相关Paypal支付内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Jquery为a标签的href赋值实现代码
May 03 Javascript
JavaScript语言核心数据类型和变量使用介绍
Aug 23 Javascript
js中运算符&amp;&amp; 和 || 的使用记录
Aug 21 Javascript
js跨域请求的5中解决方式
Jul 02 Javascript
jQuery插件实现表格隔行变色及鼠标滑过高亮显示效果代码
Feb 25 Javascript
浅析JavaScript回调函数应用
May 22 Javascript
JS检测数组类型的方法小结
Mar 14 Javascript
vue轮播图插件vue-awesome-swiper
Nov 27 Javascript
jQuery实现table表格信息的展开和缩小功能示例
Jul 21 jQuery
vue 登录滑动验证实现代码
Aug 24 Javascript
Element-ui tree组件自定义节点使用方法代码详解
Sep 17 Javascript
javascript中call,apply,callee,caller用法实例分析
Jul 24 Javascript
微信小程序学习总结(五)常见问题实例小结
Jun 04 #Javascript
vue样式穿透 ::v-deep的具体使用
Jun 04 #Javascript
微信小程序学习总结(四)事件与冒泡实例分析
Jun 04 #Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
Jun 04 #Javascript
微信小程序实现watch监听
Jun 04 #Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
Jun 04 #Javascript
实现一个Vue自定义指令懒加载的方法示例
Jun 04 #Javascript
You might like
让php处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
PHP邮件群发机实现代码
2016/02/16 PHP
php+js实现百度地图多点标注的方法
2016/11/30 PHP
深入解析PHP底层机制及相关原理
2020/12/11 PHP
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
jquery操作checked属性以及disabled属性的多种方法
2014/06/20 Javascript
node.js操作mongoDB数据库示例分享
2014/11/26 Javascript
在JavaScript的AngularJS库中进行单元测试的方法
2015/06/23 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
基于jQuery实现滚动刷新效果
2017/01/09 Javascript
微信小程序-获得用户输入内容
2017/02/13 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
Angularjs按需查询实例代码
2017/10/30 Javascript
Angular学习笔记之集成三方UI框架、控件的示例
2018/03/23 Javascript
vue弹窗消息组件的使用方法
2020/09/24 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
Vue中避免滥用this去读取data中数据
2021/03/02 Vue.js
[37:35]DOTA2上海特级锦标赛A组资格赛#1 Secret VS MVP.Phx第二局
2016/02/25 DOTA
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
python模拟Django框架实例
2016/05/17 Python
浅谈python numpy中nonzero()的用法
2018/04/02 Python
Python 判断文件或目录是否存在的实例代码
2018/07/19 Python
Python Web框架之Django框架文件上传功能详解
2019/08/16 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
2020/01/14 Python
python给视频添加背景音乐并改变音量的具体方法
2020/07/19 Python
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
自荐信范文
2013/12/10 职场文书
医院护士的求职信范文
2013/12/26 职场文书
元旦联欢会感言
2014/03/04 职场文书
简易离婚协议书(范本)
2014/10/25 职场文书
祝寿主持词
2015/07/02 职场文书
2015年度个人工作总结报告
2015/10/24 职场文书