Paypal提供了API供用户调取付款的订单信息,编写SuiteScript调取这个接口可以实现一个功能简单的Paypal付款与NetSuite集成,从而为系统已有的发票(Invoice)创建付款(Payment),对没有发票的订单创建客户存款(customer deposit)。本文仅提供思路和技术要点,并不是可以运行的代码;而实际应用场景中,由已有的逻辑可以灵活扩展到更多的功能。
前提
系统已有其他的方案集前台电商网站(BigCommerce、Shopify、Magento等等),电商网站的订单会被同步到NetSuite中。
设计要点
本章节对方案的一些技术要点着重介绍一下。
Paypal API的验证类型
Paypal采用的是OAuth2.0验证,因此每次请求之前需要先获取token,然后请求数据。对于Paypal的token获取请求和请求数据的请求,都需要在请求的头部声明'Accept': 'application/json'
,否则会提示错误MEDIA_TYPE_NOT_ACCEPTED。
Paypal API的选择
我选用的是https://api-m.paypal.com/v1/reporting/transactions
,这个请求的结果包含了所有的客户付款、手续费等等信息,对于客户付款的记录则包含了币种、发票号码的信息。这个API我使用了3个参数:时间范围、状态、类型。
- 时间范围:脚本每天运行,因此可以考虑取前一天的数据比较全面(下一段会介绍)
- 状态:status == S可以筛选出已经结清的交易
- 类型:
transaction_type == T0006
可以排除手续费等等噪音比较多的类型,只保留客户付款
你可能也可以选取其他report类型的API,或者在transactions的API上找到更多功能。具体参考https://developer.paypal.com/docs/api/transaction-search/v1/#search_get
Paypal API请求数据的时间问题
Paypal使用的是UTC时间戳,没有时区背景。所以为了避免混乱(此方案将在中国使用,而客户主要是北美)推荐使用前一天日期。
功能流程
方案开发完成将是一个MapReduce的脚本,每天在运行一次,获取前一天的结果。
在getIntputData阶段,请求数据,并生成一个多行的自定义记录,每一行包括了如下信息:
- 发票号码
- 金额
- 币种
- 流水号(transaction id)
- 状态(未核销,已核销,报错)
- 生成记录(transaction类型,可能是payment或者customer deposit)
- 付款时间戳
在Map阶段,对于状态不是已核销的自定义记录,查找Invoice的编号和状态,尝试创建payment或customer deposit,对必填字段赋值。
在Summarize阶段,对成功与失败的记录生成log,给管理员和财务人员发送提示邮件。
Comments