Paypal 实现自动订阅「建议收藏」

Paypal 实现自动订阅

大家好,又见面了,我是全栈君。

官方给出的自动续费分五步 Intergrate Subscriptions。实际开发中,还需要实现支付结果处理和订阅管理等:

  1. 事先创建计划,并激活;
  2. 用户创建订阅,跳转到paypal网站等待用户同意;
  3. 用户同意后,跳转回网站,执行订阅;
  4. 获取用户账单,包括每次扣款结果通知的接收或支付结果的主动查询;
  5. 处理用户取消订阅等通知。

使用 Palpal SDK

composer require paypal/rest-api-sdk-php

 

官方有完整的 Samples

可以通过 Paypal Sandbox 方便的进行调试。

创建订阅计划并激活

  • 订阅计划(Billing Plan)等同于的产品,需要为每个商品不同价格创建不同的计划。不过可以针对不同用户在创建协议时更改;
  • Payment 中创建 TRIAL 类型支付时,也必须存在 REGULAR 的支付。TRAIL 并不能自动判断是否为新用户等条件,所以新用户首次的优惠需要业务代码自己实现。
  • 由于创建用户订阅协议时,协议生效时间必须在当前时间24小时以后,所以循环扣款的设置无法立刻扣款,最早也需要24小时。一般业务需要立刻进行首次扣款,可以用 MerchantPreferences 的 setSetupFee 来设置首次扣款的费用;
  • Paypal SDK 会报错 "NotifyUrl" value is NULL,该错误为 Paypal 服务端错误,但官方未修复,解决办法见 issue

创建订阅

  • 用户可以创建针对同一订阅计划的多个订阅协议(Billing Agreement),创建后跳转至 Paypal 网站等待用户同意协议;

  • 因协议开始时间 start_date 最早为当前时间24小时之后,所以该值实际上设置的是第二次扣款时间。所以,若设置按月付款,start_date 需要设置成一个月以后,然后通过设置 setSetupFee 价格来设置首次扣款费用;

  • 创建订阅后,还没有生成 Agreement.id,这时候需要从跳转链接中提取出 token 来使创建的订阅与用户同意后跳转的回来的协议信息相对应。

$link = $agreement->getApprovalLink();
parse_str(parse_url($link, PHP_URL_QUERY), $params);
$token = $params['token'];
  •  

执行订阅

  • 同一个订阅计划可以被同一个用户多次订阅。所以根据需要,需要在执行新协议时,手动取消该用户之前的协议;
  • 实际扣款时间有延迟,每次循环扣款执行的时间,都会比AgreementDetail.next显示的时间晚几个小时。所以为保证连续性,可以设置提前一天扣款。

支付结果接收与查询

  • 可以在 My Apps -> REST API apps -> WEBHOOKS 设置 webhook 通知。当每次循环扣款成功时,Paypal 都会发送 PAYMENT.SALE.COMPLETED 的事件通知,可以通过其中的 billing_agreement_id 字段与已创建的订阅相匹配,找出对应付款的协议。
  • 每次 AgreementDetail 都会返回下次收款时间 next 参数。可以在超过这个时间后,通过 Agreement::searchTransactions 方法查询该协议的所有交易。需要注意的是,Paypal 实际的扣款时间一般都会延迟,所以需要多次重试。

用户订阅取消与删除等

  • 取消订阅会通过 webhook 发送 BILLING.SUBSCRIPTION.CANCELLED 通知,订阅暂停会发送 BILLING.SUBSCRIPTION.SUSPENDED 通知
  • 直接删除计划并不会自动删除基于该计划的协议,所以再删除计划前,需要手动取消所有订阅该计划的协议。

参考资料

https://developer.paypal.com/docs/subscriptions/

https://paypal.github.io/PayPal-PHP-SDK/sample/

https://www.cnblogs.com/pheye/p/6603126.html

https://bootell.net/2018/08/30/Paypay-Subscriptions-Integrate/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111576.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux修改文件权限的命令_chmod递归修改目录权限

    linux修改文件权限的命令_chmod递归修改目录权限当在ubuntushell下键入ls-lh时,会列出该目录下的文件,如:而每个文件显示前都有类似红框里的内容,这些东西代表的含义是:-代表文件d代表目录,也就是文件夹之后有三组字符的编码,每一组定义了3种访问权限r代表对象是可读的w代表对象是可写的x代表对象是可执行的若没有某种权限,在该权限为会出现单破折线,这三组权限分别…

    2025年11月1日
    2
  • linux 网络ip设置方法,Linux配置ip地址的两种方法

    linux 网络ip设置方法,Linux配置ip地址的两种方法Linux配置ip地址的两种方法,实验环境为centos7.6方法1:nmcli工具配置(centos7以下版本不支持该方法)第一步,通过nmcliconnection查看网卡名称[root@localhost~]#nmcliconnectionNAMEUUIDTYPEDEVICEeth009be0948-faf1-43b6-a5a4-c19efab0bb48ethernet…

    2022年6月7日
    48
  • 憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台「建议收藏」

    憨批的语义分割重制版6——Pytorch 搭建自己的Unet语义分割平台「建议收藏」憨批的语义分割13——Pytorch搭建自己的Unet语义分割平台注意事项学习前言什么是Unet模型代码下载Unet实现思路一、预测部分1、主干网络介绍2、加强特征提取结构3、利用特征获得预测结果二、训练部分1、训练文件详解2、LOSS解析训练自己的Unet模型注意事项这是重新构建了的Unet语义分割网络,主要是文件框架上的构建,还有代码的实现,和之前的语义分割网络相比,更加完整也更清晰一些。建议还是学习这个版本的Unet。学习前言还是快乐的pytorch人。什么是Unet模型Unet是一个

    2022年6月15日
    24
  • Jetty 与 Tomcat

    Jetty 与 TomcatJetty也是一个“HTTP服务器+Servlet容器Jetty整体架构简单来说,JettyServer就是由多个Connector(连接器)、多个Handler(处理器),以及一个线程池组成。整体结构请看下面这张图。JettyServer可以有多个Connector在不同的端口上监听客户请求。对比一下Tomcat的整体架构,两者非常的相像。区别:第一个区别是Jetty中没有Service的概念,Tomcat中的Service包装了多个连接器和.

    2025年7月6日
    2
  • Windows7在自由的虚拟机(微软官方虚拟机)

    Windows7在自由的虚拟机(微软官方虚拟机)

    2021年12月17日
    51
  • 查看Linux端口占用,并kill掉相关进程「建议收藏」

    话不多说,本文介绍Linux常规操作:查看端口占用进程,根据PIDkill掉相关进程。另外补充:根据程序名查看进程PID。首先,两条命令,lsof命令和netstat命令。方式一:lsof命令1、查看占用端口进程的PID:lsof-i:{端口号}2、根据PIDkill掉相关进程:kill-9{PID}方式二:net…

    2022年4月6日
    134

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号