鉴于前段时间自己开发的paypal支付功能出现客户纠纷的问题,觉得有必要对客户纠纷进行深入的了解,故写篇手记记录下自己了解该功能的过程。这里我使用了sandbox的两个账户用来演示,商家账户简称为father,个人账户简称为son。
纠纷订单是如何产生的?
纠纷产生的原因就很简单了,因为客户在购买商品的时候,如果使用的是paypal进行付款的,那么如果客户没有收到货,那么就能登录自己的paypal账号,将对应的账单进行申诉,就会生成一个纠纷订单,客户可以在自己的paypal界面查看到这些订单。如:
当客户申请了纠纷后,此时商家账户的该笔资金是会被paypal进行冻结的,所以商家必须给客户一个处理结果。那么此时我首先想到的是,既然paypal能提供这个功能,应该是有提供第三方的api的吧,确实能在https://developer.paypal.com/docs/api/customer-disputes/v1/#disputes_get-disputes这个网址中看到这些争议订单的api,但是神奇的是:
也就是说这个功能里面的api是没有集成到sdk中去的,不管怎么样,我感觉有点心慌,不过没关系,我们找找有没有其他办法来处理。
纠纷订单的生命周期
如何集成客户纠纷的API
虽然官网说需要是paypal的合作伙伴才能使用这个API,但是我觉得程序员就应该多尝试,所以决定玩玩,步骤如下
启用客服纠纷的功能,该功能默认就是开启的。
获取访问令牌:通过如下命令获取到token
curl -v https://api.sandbox.paypal.com/v1/oauth2/token \
-H "Accept: application/json" \
-H "Accept-Language: en_US" \
-u "client_id:secret" \
-d "grant_type=client_credentials"
3、查询出所有争议订单:
然后我们竟然神奇的查询到了争议订单id值
既然如此,我们继续查询出该争议订单的详细信息:
那么也就是说,我们能够通过自己发送post、get请求来实现查询争议订单的功能的,但是问题就是我们必须自己手动来写这些sdk。写这些sdk的工作量那就比较大了,不过如果有兴趣的话可以自己写个试试。这里我就想其他办法来处理了。
草根处理方法思路
根据自己的使用情景,我决定还是不使用客户纠纷的API来处理纠纷订单,第一个是集成比较麻烦,第二个就是就算集成了,业务逻辑处理起来也存在很多的不确定性。个人觉得paypal的纠纷订单直接通过人工处理即可。我们第三方程序需要做的只是当出现了纠纷订单的时候,第一个是能直接通知收到了纠纷订单,通知客服处理。第二个是能查询到纠纷订单的详细信息,从而来对订单里面的货物进行相应的处理即可。于是,我决定使用webhook。
仔细分析了下业务,对于这种争议订单需要我们第三方系统知道的,应该只有三种状态,分别是:
a、纠纷订单创建
b、纠纷订单解决(客户和商家达成一致,客户将纠纷手动更新为完成,商家没有退款操作)
c、订单退款成功
为了查看该webhook的相关信息,在paypal的官网上查看了相关文档:https://developer.paypal.com/docs/integration/direct/webhooks/
测试webhook
既然paypal提供了对应的事件,为了测试准确性,也只能自己来测试了。
一、CUSTOMER.DISPUTE.CREATED事件测试:
1、配置webhook
2、通过测试买家用户son,申请纠纷订单。
首先我给father用户付款了300元,此时的账户余额为708元。
然后此时son申请没有收到产品,也就是创建纠纷订单事件触发。
如果你使用的是sandbox的测试用户,你可以会发现很难出现回调的情况,这个问题我重试了很多次,对比着真实环境,得出的结论是:sandbox的webhook很不稳定!!所以如果你折腾了一天都没有成功,那么建议你可以尝试使用真实环境试试。我就是使用真实环境来测试的。
预知后事如何,且听下回分解。。。。