paypal开发笔记

1.关于paypal收银台支付页面显示配送信息的设置

paypal收银台对于配送信息有3种显示形式
1.显示配送信息并可以修改

ShippingPreferenceEnum.GET_FROM_FILE
image.png

image.png

这种我们是不会考虑的,因为有自己的网站,地址信息都是在网站上用户填写并在提交订单的时候就会选好地址,然后在支付

ShippingPreferenceEnum.SET_PROVIDED_ADDRESS

显示配送信息但是不可以编辑


image.png

根据实际情况,这种是我们最终采用的方式
有一点需要注意如果使用的是SET_PROVIDED_ADDRESS那么必须要传递shipping信息

        ApplicationContext applicationContext = new ApplicationContext().brandName(displayTitle).landingPage(landingPage.toString())
                .cancelUrl(cancelUrl).returnUrl(successUrl).userAction(userAction.toString()).shippingPreference(shippingPreference.toString());

        List<PurchaseUnitRequest> purchaseUnitRequests = new ArrayList<PurchaseUnitRequest>();
        PurchaseUnitRequest purchaseUnitRequest = new PurchaseUnitRequest().description(description).amountWithBreakdown(amountWithBreakdown);

        purchaseUnitRequest.shippingDetail(new ShippingDetail().name(new Name().fullName(fullName)).addressPortable(new AddressPortable().addressLine1(shippingAddress.getAddressLineOne()).addressLine2(shippingAddress.getAddressLineTwo()).adminArea2(shippingAddress.getCity()).adminArea1(shippingAddress.getProvince()).postalCode(shippingAddress.getPostCode()).countryCode(shippingAddress.getIso())));
        purchaseUnitRequests.add(purchaseUnitRequest);

        OrderRequest order = new OrderRequest().checkoutPaymentIntent(intent.toString()).applicationContext(applicationContext).purchaseUnits(purchaseUnitRequests);

        OrdersCreateRequest request = new OrdersCreateRequest().requestBody(order);

        HttpResponse<Order> response = payPalHttpClient.execute(request);
        主要是这里的
        purchaseUnitRequest.shippingDetail(new ShippingDetail().name(new Name().fullName(fullName)).addressPortable(new AddressPortable().addressLine1(shippingAddress.getAddressLineOne()).addressLine2(shippingAddress.getAddressLineTwo()).adminArea2(shippingAddress.getCity()).adminArea1(shippingAddress.getProvince()).postalCode(shippingAddress.getPostCode()).countryCode(shippingAddress.getIso())));

3.不显示配送信息

ShippingPreferenceEnum.NO_SHIPPING
image.png

也是考虑到体验的问题,这种也不会选择

具体使用的话在构造paypal上下文对象ApplicationContext的时候指定一下即可

   ApplicationContext applicationContext = new ApplicationContext().shippingPreference(shippingPreference.toString());

可以参考官方文档:
https://developer.paypal.com/docs/api/orders/v2#definition-order_application_context
可以搜索关键字来定位一下shipping_preference

image.png

2.关于paypal支付url的有效期

paypal的话默认3小时但是可以修改为24/48/72小时
https://developer.paypal.com/docs/api/orders/v2/#orders_authorize

image.png

如果支付是做的幂等的话,订单取消时间最好小于这个时间,否则的话会增加后续的流程,比如订单支付成功后取消订单这种异常的情况就需要处理

3.关于paypal取消订单功能的实现

有这样一种场景:
前置条件:订单取消时间为30分钟(未支付取消),paypal的收银台失效时间为3小时
如果用户下单之后跳转到paypal在收银台页面停留了1小时之后在支付,支付是可以成功的但是订单已经取消了.
解决的话:
1)可以将这种情况作为支付异常订单来走后续流程.
2)如果paypal有取消订单的功能的话也可以实现
1)的情况在这里就不说了主要说下2)
首先api版本为v1的话确实有取消订单的功能
https://developer.paypal.com/docs/api/orders/v1#orders_cancel
但是v2是没有的,所以需要变通一下来实现订单取消之后要阻止支付成功的情况发生,其实也很简单,因为扣款的操作是用户在paypal收银台界面操作付款之后302到发起支付时配置的success的地址然后执行扣款的,在这里的话可以加个查询订单状态的逻辑,如果订单为待支付状态那么在执行扣款就可以了.实现是可以实现缺点就是:要耦合查询订单的逻辑.

4.paypal收银台页面的连接每次访问会重置订单状态

比如一个收银台支付连接

https://www.sandbox.paypal.com/checkoutnow?token=xxxxxx

首次访问连接后状态为"status": "CREATED"

{
    "id": "xxxxxx",
    "intent": "CAPTURE",
    "status": "CREATED",
    "purchase_units": [
        .....
        ]       
}

当操作付款后在查看状态

{
    "id": "xxxxxx",
    "intent": "CAPTURE",
    "status": "APPROVED",
    "purchase_units": [
            .....
            ]
}

当APPROVED的时候会触发success回调,假设服务端处理失败之后通过定时任务查询到的状态会是

"status": "APPROVED",

其实这种状态下定时任务如果发现"status": "APPROVED"是可以在扣款一次的,这是没问题的
但是
如果在访问一次

https://www.sandbox.paypal.com/checkoutnow?token=xxxxxx

这个连接的话会发现状态又变为了 "status": "CREATED"

5.paypal支持的币种

rest_api支持的币种

https://developer.paypal.com/docs/api/reference/currency-codes/

注意这里


image.png

快捷支付支持的币种

https://developer.paypal.com/docs/checkout/reference/customize-sdk/
image.png

关于paypal收银台显示商品信息的设置
image.png

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容