海外支付:遍及全球的Paypalhtml
吴剑 2015-11-26web
原创文章,转载必需注明出处:http://www.cnblogs.com/wu-jianapi
吴剑 http://www.cnblogs.com/wu-jian浏览器
前言安全
Paypal是全球在线支付的领导者,2002年被eBay收购,2015年又戏剧性的从eBay分离,以500亿美圆市值反超eBay。创始人 Elon Musk 同时是Paypal、空间探索技术公司、以及特斯拉汽车三家公司的CEO,电影“钢铁侠”的人物原型就是这哥们。服务器
吴剑 http://www.cnblogs.com/wu-jian架构
概述app
Paypal为商家提供了多种支付对接方式,其中Paypal Express Checkout最为常见、方便、以及自定义扩展性最强。下图是Paypal Express Checkout支付的一个标准时序图,注意这是一个纯技术层面的API调用流程,在此基础上,咱们能够组合出三种Paypal通用的用户支付体验:
快捷支付,直接去Paypal付款并使用Paypal上存储的地址发货。很明显,Paypal但愿把本身打形成一个用户中心,也花了血原本推广这种方式,具我所知,该方式也是海外用户使用占比最高的。
标准支付,就像咱们国内的天猫淘宝同样,填好了收件地址,完了再去支付。
游客支付,或称之为信用卡支付。固然信用卡不是Paypal强项,Paypal跟支付宝同样充当的是银行与用户之间的中间人角色。在信用卡领域,VISA是老大,同时信用卡涉及到至关高的安全层面风险,具体请参考个人另外一篇文章 海外支付:抵御信用卡欺诈的CyberSource 。
这三种支付方式都是基于下图中相同API,只是组合序顺或传递的参数稍有差别而以。
<图1.Paypal Express Checkout API接口>
吴剑 http://www.cnblogs.com/wu-jian
SetExpressCheckout
这是一个同步的API接口,将交易相关的全部数据首先经过SetExpressCheckout传递给Paypal,而后Paypal响应一个Token用于后续支付步骤,Token有效时间为3小时。
从接口前缀Set能够看出该接口是一个预交易步骤,比如咱们去银行提大额现金,须要提早一天给银行通知,一来有助于银行备齐现金,二来也有助于交易安全,银行有充分时间评估交易的可靠性。后来在架构多平台的支付中心时,我也参考和使用了Paypal的这个结构。
SetExpressCheckout的参数不少,具体可参见Paypal官方文档:https://developer.paypal.com/docs/classic/api/merchant/SetExpressCheckout_API_Operation_NVP/ ,下面列出一些经常使用参数:
参数名称 | 参数说明 |
---|---|
VERSION | 接口版本号 |
METHOD | API名称,使用“SetExpressCheckout”便可 |
REQCONFIRMSHIPPING | 商家是否须要买家在PayPal帐户中的邮寄地址是已经被确认的地址 |
PAYMENTREQUEST_{m}_PAYMENTACTION | 但愿获取付款的方式 |
ALLOWNOTE | 容许买方在PayPal结帐页面上输入了一条文本信息给商家 |
LOCALECODE | PayPal付款页面显示语言的设置 |
RETURNURL | 客户选择经过PayPal付款后其浏览器将返回的URL |
CANCELURL | 客户取消使用PayPal付款时返回的URL |
结帐时输入的买家电子邮件。 PayPal使用该值预填PayPal登陆页面的PayPal会员注册部分 | |
PAYMENTREQUEST_{m}_CURRENCYCODE | PayPal支持的交易币种中所列币种之一的三字符币种代码 |
PAYMENTREQUEST_{m}_AMT | 交易总费用 |
PAYMENTREQUEST_{m}_ITEMAMT | 订单全部物品的价格 |
PAYMENTREQUEST_{m}_SHIPPINGAMT | 邮费总额 |
NOSHIPPING | 是否不在PayPal付款页面展现邮寄地址 |
LANDINGPAGE | 付款页面展现类型 |
SOLUTIONTYPE | 结帐流程的类型 |
HDRIMG | 付款页面左上角显示的图片的URL |
HDRBACKCOLOR | 付款页面标题的背景色 |
PAYFLOWCOLOR | 付款页面设置背景色 |
HDRBORDERCOLOR | 付款页面标题边框颜色 |
L_PAYMENTREQUEST_{m}_NUMBER{n} | 商品编号 |
L_PAYMENTREQUEST_{m}_NAME{n} | 商品名称 |
L_PAYMENTREQUEST_{m}_QTY{n} | 商品数量 |
L_PAYMENTREQUEST_{m}_AMT{n} | 商品单价 |
PAYMENTREQUEST_{m}_INVNUM | 商家订单编号 |
吴剑 http://www.cnblogs.com/wu-jian
GetExpressCheckoutDetails
如图1所示,在经过SetExpressCheckout接口获取到Token后,就须要跳转页面去Paypal了。用户在Paypal站点登陆,确认支付信息,完成支付,最后Paypal将URL重定向回商家页面。
此时,咱们能够获取用户在Paypal的相关信息。接口的详细参数可参见Paypal官方文档:https://developer.paypal.com/docs/classic/api/merchant/GetExpressCheckoutDetails_API_Operation_NVP/ ,下面列出经常使用的响应参数:
参数名称 | 参数说明 |
---|---|
TOKEN | Token |
PAYERID | Paypal用户ID |
Paypal帐号(Email) | |
PAYMENTREQUEST_{n}_SHIPTONAME | 货运地址姓名 |
PHONENUM | 货运地址电话 |
PAYMENTREQUEST_{n}_SHIPTOCOUNTRYCODE | 货运地址国家ID |
PAYMENTREQUEST_{n}_SHIPTOSTATE | 货运地址省份 |
PAYMENTREQUEST_{n}_SHIPTOCITY | 货运地址城市 |
PAYMENTREQUEST_{n}_SHIPTOZIP | 货运地址邮编 |
PAYMENTREQUEST_{n}_SHIPTOSTREET | 货运地址街道1 |
PAYMENTREQUEST_{n}_SHIPTOSTREET2 | 货运地址街道2 |
在此须要提一下的是,Paypal的接口很是灵活,它最大限度让商家可使用相同的API来组合不一样的支付逻辑以提升用户体验。好比在标准支付时,用户在商家网站填写并存储了邮寄地址,所以邮寄地址不须要与Paypal交互;而在快捷支付时,则能够经过GetExpressCheckoutDetails接口获取用户存储在Paypal上的地址信息而且在商家页面上显示给用户确认。
吴剑 http://www.cnblogs.com/wu-jian
DoExpressCheckoutDetails
DoExpressCheckoutDetails是Paypal实时交易的最后一步,它告诉并向Paypal确认最终的支付信息,当完成对它的调用,就表明了Paypal实时支付的完成,也表明Money从用户帐户到了商家帐户。详细官方API文档请参考:https://developer.paypal.com/webapps/developer/docs/classic/api/merchant/DoExpressCheckoutPayment_API_Operation_NVP/ ,以下列出了接口响应结果:
参数名称 | 参数说明 |
---|---|
PAYMENTINFO_{n}_PAYMENTSTATUS | 付款结果状态 |
PAYMENTINFO_{n}_CURRENCYCODE | 成功币种 |
PAYMENTINFO_{n}_AMT | 成功金额 |
PAYMENTINFO_{n}_TRANSACTIONID | Paypal交易ID |
在快捷支付时,由于用户的邮寄地址存放在Paypal中,所以在GetExpressCheckoutDetails前,咱们没法知道用户是哪一个国家,也就不能计算出运费金额。因此一般在快捷支付时,咱们会在GetExpressCheckoutDetails中获取用户邮寄地址来计算运费,在DoExpressCheckoutDetails中更新运费并确认最终金额。
吴剑 http://www.cnblogs.com/wu-jian
异步IPN通知
IPN全称为 Instant Payment Notification,在每笔交易完成后,Paypal可提供通知服务,即商家提供一个URL,Paypal向这个URL发送交易结果。这个过程是异步的,好比由于网络繁忙或你的服务器故障,IPN会在连续4天内最大15次持续发送结果,直到你收到为止。Paypal不建议在实时的支付流程中使用IPN,但咱们可使用IPN做为交易安全辅助或交易提醒等用途。
IPN开发概要:https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNIntro/
IPN详细参数:https://developer.paypal.com/docs/classic/ipn/integration-guide/IPNandPDTVariables/
在Paypal商户后台中开启IPN:用户信息 -> 即时付款通知
IPN基于HTTP的POST规范,当成功接收到IPN结果后响应HTTP 200便可:
附录:Paypal商户后台API设置截图
吴剑 http://www.cnblogs.com/wu-jian
结束语
本文对Paypal支付流程和API进行了概要性描述,并未涉及到具体代码细节,有了清晰的思路再编码是事半功倍的事,但愿对从业的开发人员有所帮助。也但愿中国的产品有朝一日再也不是廉价和仿冒的代名词,但愿中国的海外卖家能把咱们的创新展示给世界人民,但愿更多的站点可以崛起和打破阿里的垄断。
最后友情提示,在海外大多数国家,对侵权的打击仍是至关严厉的。Paypal是一家美国公司,遵照的是美国司法体系,若是你的站点销售侵权产品,一般Paypal会给你警告,据我所知他们也有专门的巡查部门。但若是一旦你被海外用户取证和诉讼而且事实成立,你的资金就有可能被Paypal冻结。
吴剑 http://www.cnblogs.com/wu-jian
<全文完>
吴剑 http://www.cnblogs.com/wu-jian