1.关于paypal收银台支付页面显示配送信息的设置
paypal收银台对于配送信息有3种显示形式
1.显示配送信息并可以修改
ShippingPreferenceEnum.GET_FROM_FILE
这种我们是不会考虑的,因为有自己的网站,地址信息都是在网站上用户填写并在提交订单的时候就会选好地址,然后在支付
ShippingPreferenceEnum.SET_PROVIDED_ADDRESS
显示配送信息但是不可以编辑
根据实际情况,这种是我们最终采用的方式
有一点需要注意如果使用的是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
也是考虑到体验的问题,这种也不会选择
具体使用的话在构造paypal上下文对象ApplicationContext的时候指定一下即可
ApplicationContext applicationContext = new ApplicationContext().shippingPreference(shippingPreference.toString());
可以参考官方文档:
https://developer.paypal.com/docs/api/orders/v2#definition-order_application_context
可以搜索关键字来定位一下shipping_preference
2.关于paypal支付url的有效期
paypal的话默认3小时但是可以修改为24/48/72小时
https://developer.paypal.com/docs/api/orders/v2/#orders_authorize
如果支付是做的幂等的话,订单取消时间最好小于这个时间,否则的话会增加后续的流程,比如订单支付成功后取消订单这种异常的情况就需要处理
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/
注意这里
快捷支付支持的币种
https://developer.paypal.com/docs/checkout/reference/customize-sdk/
关于paypal收银台显示商品信息的设置
image.png