在骚扰了PayPal的技术支持好几天之后终于成功对接了PayPal支付,非常感谢PayPal的技术支持人员,没有她估计一周都搞不定。记录一下这个过程。

接到这个任务联系了PayPal的技术之后,第一件事就是向她要了一些文档。PayPal提供了一个demo商店https://demo.paypal.com/c2/demo/navigation?merchant=bigbox&page=shoppingCart&locale.x=zh_XC&token=EC-8F899625FB177521V

,首先我在上面体验了一把PayPal支付的整个流程,登录sandbox账号然后支付就行了,可以看下面的截图感受一下,

sandbox账号是你注册了企业账号之后PayPal送给你的两个测试用账号,你可以在sandbox环境中测试你的代码,当然你也可以自己注册sandbox账号,当商务部给我一个企业账号密码时,我登录https://developer.paypal.com/developer/accounts?event=linkAccountAssociated

可以看到里面的sandbox账户,我选择新建一个自己的sandbox商家账户,与live环境同样且必须要做的是申请签名:https://www.sandbox.paypal.com/webapps/customerprofile/summary.view

(切记!!!sandbox环境用live环境的签名会报"security header is not valid",这是sandbox的签名,同样的,live环境只需要域名中去掉

sandbox即可找到),如下图

PayPal的API有提供两种调用方式,NVP和SOAP,我选择了前者。支持方式是IPN,一般都是选择IPN,因为我们开发基本上都要根据支付平台的结果处理一下自己的业务,在看了IPN这个文档https://www.paypal-biz.com/product/pdf/PayPal_IPN&PDT_Guide_V1.0.pdf之后,大致了解了和PayPal的交互流程,文档中的notify_url是PayPal在你调用DoEC后回调你的链接,PayPal会在请求你链接时带上一些订单的参数,详请点击

https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNandPDTVariables/

做了这些准备工作之后我们可以开始写代码了。

此处应当插入个时序图的-_-!!

调用API都会用到的公共参数是:"USER=""PWD=""SIGNATURE=""VERSION=",后面不再赘述

下订单调用PayPal的SetExpressCheckout方法,可以参考这个已经过验证的示例(密码签名记得用自己申请的哦_):

附上你们也许用得着的代码:

Map nvpMap =PayPalUtil.setExpressCheckout(params);if (nvpMap != null && nvpMap.get("ACK") != null) {

String strAck= nvpMap.get("ACK").toUpperCase();if (strAck.equals("SUCCESS")|| strAck.equals("SUCCESSWITHWARNING")) {

String checkoutUrl=PayPalUtil.checkoutUrl;

String token= checkoutUrl, nvpMap.get("TOKEN");//下单成功之后可以保存此token以做后续调用API之用//do something

}else{

String ErrorCode= nvpMap.get("L_ERRORCODE0");

String ErrorShortMsg= nvpMap.get("L_SHORTMESSAGE0");

String ErrorLongMsg= nvpMap.get("L_LONGMESSAGE0");

String ErrorSeverityCode= nvpMap.get("L_SEVERITYCODE0");

String errorString= "SetExpressCheckout API call failed. "

+ "Detailed Error Message: " +ErrorLongMsg+ "Short Error Message: " +ErrorShortMsg+ "Error Code: " +ErrorCode+ "Error Severity Code: " +ErrorSeverityCode;

log.error(errorString);

}

}

具体的请求参数以及响应说明在这里:https://developer.paypal.com/webapps/developer/docs/classic/api/merchant/SetExpressCheckout_API_Operation_NVP/

下单成功拿到与此订单相关的token之后,用户点击continue付款之后PayPal会请求你在setExpressCheckout中传给PayPal的RETURNURL,PayPal带来的请求参数中只有两个参数,

一个token,一个payerID这两个参数都是在调用最后一个DoExpressCheckout API的时候要传的,PayPal的请求可能如下示例:

http://XXX.com/paypal?token=EC-0B0244963D237432J&PayerID=93JGVG4CSVCN4 ,PayerID为买家的account ID.因此,你必须提供一个处理类来处理PayPal的请求,接到PayPal请求之后,接下来你要做的是调用API GetExpressCheckoutDetails

需要带上两个参数:METHOD=GetExpressCheckoutDetails&TOKEN=DJFJSLDFJS ,这个API并不是必须调用,建议调用来获取订单信息和订单状态,比如金额等做风控校验。响应码详情请参考:

https://developer.paypal.com/docs/classic/api/merchant/GetExpressCheckoutDetails_API_Operation_NVP/

来到这里,离成功只差一步了,那就是在上面确认了订单无误之后调用API DoExpressCheckoutPayment告诉PayPal这个交易没错,你可以扣钱了~~~最后你可以再重定向到自己的商户页面。以下参数为必须:

parasMap.put("METHOD", "DoExpressCheckoutPayment");

parasMap.put("TOKEN", token);

parasMap.put("PAYERID", payerId);

parasMap.put("PAYMENTREQUEST_0_PAYMENTACTION", "Sale");//sale是立即到账,order是预授权,一般都是sale

parasMap.put("PAYMENTREQUEST_0_AMT", amount);

parasMap.put("PAYMENTREQUEST_0_NOTIFYURL", notify_url);//这个notify_url是成功调用DoExpressCheckoutPayment后PayPal最后请求你的处理器,你可以做一些风险控制。里面同样会传很多的订单数据给你。

DoExpressCheckoutPayment的请求与相应:

https://developer.paypal.com/webapps/developer/docs/classic/api/merchant/DoExpressCheckoutPayment_API_Operation_NVP/

PayPal在最后请求你的notify_url中所带来的参数如下:

https://developer.paypal.com/webapps/developer/docs/classic/ipn/integration-guide/IPNandPDTVariables/

另外的两个用于查询订单的API你也许也会用得到:

TransactionSearch API Operation (NVP) : https://developer.paypal.com/docs/classic/api/merchant/TransactionSearch_API_Operation_NVP/

GetTransactionDetails API Operation (NVP) : https://developer.paypal.com/docs/classic/api/merchant/GetTransactionDetails_API_Operation_NVP/

然而有一个问题,所需的参数txn_id是PayPal在notify_url请求时才带来的,这可是最后一个交互了,万一丢了这个订单岂不是再也查不到了?别急,看本文最后的说明。

PayPal错误码参考:

https://developer.paypal.com/docs/classic/api/errorcodes/

有几点最后但却非常重要的需要说明:

1.用心的同学估计已经发现了,以上所述与IPN的文档少了一步,那就是IPN文档"1.3 通知确认- 给PayPal的https回拨",这步在我咨询了PayPal的技术支持后我直接省略了,正如文档中所说,假如你满足如下条件,建议保留此步:

您的网站是放在共享服务器上的;您未在您的 Web 服务器上启用 SSL;

2.若是你丢失了PayPal的notify_url请求,你可以根据TransactionSearch这个API去查某个订单详情,有一个INVNUM的参数,如果你在SetExpressCheckOut时传过去了,PayPal会帮你保存在订单中,你可以用此参数获得某一个订单,因此这个参数你在SetEC

的时候便可以传给PayPal,值一般取自己这边的订单号。这样即使你最后收不到notify_url你后续也可以根据你自己的订单号去获取订单。这里也有一个问题需要切记,这个API中的STARTDATE必须要是GMT时间,转换代码如下可以参考:

//Must be a valid date, in UTC/GMT format; for example,//2013-08-24T05:38:48Z.//将北京时间转为GMT时间,此处直接减一天好了,虽然只是相差8个小时

SimpleDateFormat pSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

DateFormat fSdf= new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");

fSdf.setTimeZone(TimeZone.getTimeZone("GMT"));try{

Calendar temp=Calendar.getInstance();

temp.setTime(pSdf.parse(startdate));

temp.add(Calendar.DAY_OF_YEAR,-1);

startdate=fSdf.format(temp.getTime());

}catch(ParseException e1) {

e1.printStackTrace();

log.error("时间转换失败,startdate为:" +startdate);return null;

}

3.若在你部署了本地环境之后,测试时PayPal无法请求到你的局域网,你可以安装localtunnel,它可以帮助你

http://stackoverflow.com/questions/11469636/paypal-sandbox-test-tool-ipn-simulator-in-localhost

https://localtunnel.me/

4.若是你的代码无法请求到PayPal的API,那很有可能你的通信协议不是TLSv1.2,PayPal会在2016年六月底全面启用TLSv1.2,这是一份声明:https://github.com/paypal/TLS-update

解决办法有两个:

一,配置你的服务器支持TLSv1.2,jdk1.7是有的,但并未显示支持,你需要配置jdk使之显示支持TLSv1.2;你可以参考

http://stackoverflow.com/questions/34963083/paypal-sandbox-api-javax-net-ssl-sslhandshakeexception-received-fatal-alert-h

http://stackoverflow.com/questions/9749339/does-tomcat-supports-tls-v1-2

二,升级至jdk8,默认支持,直接可用。

5.若是你的代码报"peer not authenticated"这个错误,说明你的服务器证书不受信任。

解决办法:增加如下方法,

HttpClient httpclient = newDefaultHttpClient();

httpclient=wrapClient(httpclient);/*** 获取可信任https链接,以避免不受信任证书出现peer not authenticated异常

*

*@parambase

*@return

*/

public staticHttpClient wrapClient(HttpClient base) {try{

SSLContext ctx= SSLContext.getInstance("TLS");

X509TrustManager tm= newX509TrustManager() {

@Overridepublic voidcheckClientTrusted(X509Certificate[] arg0,

String arg1)throwsCertificateException {//TODO Auto-generated method stub

}

@Overridepublic voidcheckServerTrusted(X509Certificate[] arg0,

String arg1)throwsCertificateException {//TODO Auto-generated method stub

}

@OverridepublicX509Certificate[] getAcceptedIssuers() {//TODO Auto-generated method stub

return null;

}

};

ctx.init(null, new TrustManager[] { tm }, null);

SSLSocketFactory ssf= newSSLSocketFactory(ctx);

ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

ClientConnectionManager ccm=base.getConnectionManager();

SchemeRegistry sr=ccm.getSchemeRegistry();

sr.register(new Scheme("https", ssf, 443));return newDefaultHttpClient(ccm, base.getParams());

}catch(Exception ex) {

ex.printStackTrace();return null;

}

}

paypal tp 对接_PayPal支付接入相关推荐

  1. paypal tp 对接_PayPal 对接

    时间:2019-1-29 15:39:39 文章相应链接: 官方SDK:https://developer.paypal.com/docs/api/rest-sdks/ 官方API:https://d ...

  2. paypal tp 对接_Thinkphp5.1贝宝(Paypal)支付接入

    最初打算用PayPal官方的API做,但是,发现回调的信息有点少,所以就改成了form提交的,这里记录一下: 1.先去PayPal官网申请账号,然后进入开发者中心https://developer.p ...

  3. paypal tp 对接_php对接“paypal/Checkout-PHP-SDK“支付流程

    前言 公司一个网站项目有国外的用户给我们发邮件希望能用paypal支付,于是交给了我,我们这个项目两年前是有对接paypal通道的,但是一直没有开放,测试测了并不能完成付款流程. 看paypal官方是 ...

  4. paypal tp 对接_tp5实现paypal支付

    1.申请帐号 而后进入开发者网址 2.使用sanbox测试 sanbox帐号详情密码修改,点击对应email ->profile 3.支付代码 copy官网的文档 namespace app\i ...

  5. paypal tp 对接_Thinkphp对接Paypal支付

    1.首先去paypal开发者平台developer.paypal.com,去创建应用:一般我们是先创建sandbox,等sandbox跑通了再改回 live 2.将paypal的sdk放入thinkP ...

  6. Paypal+java 支付接入

    背景说明 :业务需求,需要联合APP完成Paypal的支付接入,于是开始爬坑 第一步:注册获取到paypal的商家账号(注册流程我也不知道) 第二步:登录Paypal开发者中心,创建APP应用获取到c ...

  7. 支付接入开发的陷阱有多深?

    支付接入开发的陷阱有多深? 发表于2015-10-27 15:04| 3975次阅读| 来源CSDN| 10 条评论| 作者蒲婧 CTO俱乐部CTOCTO讲堂移动支付BeeCloud width=&q ...

  8. 小程序完整对接 pingpp支付

    小程序完整对接 pingpp支付 有几个先要条件: 小程序需要企业认证且开通支付功能,个人认证是无法使用支付功能的(小程序微信支付官网) pingpp 本身接入的企业服务器(即商户服务器)并不强制要求 ...

  9. java 对接支付宝支付

    2019独角兽企业重金招聘Python工程师标准>>> 对接支付宝支付的前提: 1,商户开通支付能力 登录蚂蚁金服 开放平台:https://open.alipay.com/plat ...

  10. 【CTO讲堂】支付接入开发的陷阱有多深? 京东支付

    [CTO讲堂]支付接入开发的陷阱有多深? 发表于2015-10-27 15:04| 3926次阅读| 来源CSDN| 0 条评论| 作者蒲婧 CTO俱乐部CTOCTO讲堂移动支付BeeCloud al ...

最新文章

  1. 适合初学者的数据结构_数据结构101:图-初学者的直观介绍
  2. 万字长文带你入门 GCN
  3. SpringMVC如何是使用自动注入@autowrid
  4. Nature Methods:Rob Knight发布Striped UniFrac算法轻松分析微生物组大数据
  5. 实现dmx512_LED灯具DMX512信号与普通TTL信号区别
  6. 我的世界1.7.10java32位_我的世界1.7.10中文版
  7. opencv3.1.0 编译H3516A 成功后调用时出现的问题
  8. linux+cd英文全称,Linux命令英文全称
  9. Tomcat 7 Connector 精读(2) 协议处理器 Http11Protocol(待续)
  10. 《数值分析》-- 高斯消去法与矩阵三角分解法(LU分解)
  11. 刑事案件鉴定意见常用质证要点
  12. 鸿蒙石boss 怎么杀,《仙侠世界》沧海岛副本介绍 沧海岛副本怎么玩
  13. excel单个对象用poi导出,并设置每个sheet得最大行数防止报错
  14. 彩色图像处理(matlab)
  15. 虚拟串口VSPD_V10.0.944官方最新版
  16. 算力越大越牛逼?地平线与Mobileye等的共识是......
  17. 应用启动失败,因为没有QT平台可以初始化
  18. saf java_Android SAF实现外置SD卡的写入(JAVA层与JNI层hook)
  19. 2021首届-西部云安全峰会来了!9月26日西安见
  20. (转)Burp Suite 的一些插件

热门文章

  1. echarts折线图鼠标悬浮竖线_设置Echarts鼠标悬浮样式
  2. Unity EasyAR图像跟踪
  3. 《知乎周刊:读书这件小事》摘记及书评
  4. 【FFmpeg4.1.4 编码】h265编码
  5. 从零学爬虫:采集房天下二手房信息
  6. 5.8Gwifi信道
  7. vue 后台翻译_vue实现在线翻译功能
  8. 在线问卷调查系统分析与实现
  9. 小程序应用 饿了么美团外卖cps领券返利小程序+前端(带三级分销裂变)
  10. H3C如何配置raid1