如果你是第一次接入paypal,相信本文的每一个地方都会对你有帮助的!!因为这篇文章都是一个一个的坑踩出来的!

一、接入paypal环境准备:

1、注册paypal账号

https://www.paypal.com
注册“商家账号”,完成验证

2、登录paypal开发者平台

用上一步创建好的账号登陆:https://developer.paypal.com

3、创建测试用户和商家账号

个人和商家账号都选中国就行

那三个点里面可以设置账号的一些信息,还有余额之类的

4、创建应用,生成用于测试的clientID 和 密钥

当前页面创建应用

这里面有一个默认的还有一个我已经创建好的测试应用,这里:如果要创建线上账号,点击右侧live,可能需要邮箱验证,可以到自己的邮箱中查看,其他的不变

点击按钮创建自己的应用,选择好我们之前创建的收款账号

这样我们的id和密匙都创建好了

二、使用java(springboot)实现paypal支付:

下面是调接口的方式直接接入

使用基本的web项目即可
pom引入:

<dependency><groupId>com.paypal.sdk</groupId><artifactId>rest-api-sdk</artifactId><version>1.4.2</version>
</dependency>

代码的基本流程:

接口调用→调用service→创建订单→重定向到paypal的页面(后面的支付流程交给了paypal,这个页面就是在那个for循环里面的那个条件甄别出来的那个url,看了下面的代码你才能明白我说的哦)→登录→支付

代码参考(我也是参考这篇文章,自己改造的):https://www.cnblogs.com/jpfss/p/9945845.html

其中的不足:

1、在创建订单的时候:其一在自己的业务系统中有一些必要的信息需要PayPal通知的时候回传,比如id等字段,这个可以放到custom这个字段里面;其二购物车的信息,可以自行理解下面的代码,item→items→itemsList→transaction→transactions

甚至一些收货地址,信息什么的,我都没看到,我这里也没用到,所以我也没关注,需要自己研究下,总之都在这一步,下面的代码是我自己的一些设置,供参考

2、没有集成通知:

在这里我简单提一下:

登录商家账号:https://www.sandbox.paypal.com/
右上角头像→Account Settings→左侧栏通知→即时通知付款→更新

填写自己的接口:这个接口需要域名哦,可以用内网穿透工具转发哦。

在代码中怎么做呢?

 @RequestMapping(value = "notify", method = RequestMethod.POST)public void notify(@RequestBody String body, final HttpServletResponse response) throws IOException {//原始请求的body,kv,在回复paypal通知的有用,这里卡了我好久,在后面的问题模块也有提到var kv = URLEncodedUtils.parse(body, Charset.forName("utf-8"));//下面就是转换成我们自己的实体类,用来接收paypal通知的所有字段,如果不知道有什么字段。可以看看body里面具体的内容哦Map<String, String> map = kv.stream().collect(Collectors.toMap(NameValuePair::getName, NameValuePair::getValue));PostPayPalNotifyRequest postPayPalNotifyRequest = PostPayPalNotifyRequest.getInstanceFromMap(map);try {//处理通知payPalPaymentService.handlePayPalPaymentSuccessNotification(postPayPalNotifyRequest, body);response.getWriter().write("success");} catch (DuplicateKeyException exception) {log.warn("payPal notify for order id " + postPayPalNotifyRequest.getTxnId() + " has been already received. ignored! ");}}

处理通知的时候要做什么呢?

参考:https://www.paypal.com/c2/cgi-bin/webscr?cmd=p/acc/ipn-info-outside,这里提一下,网站感觉很久没有维护了,最新的通知回验url为:

#正式环境:
payPal.verifyUrl=https://ipnpb.paypal.com/cgi-bin/webscr
#沙箱环境:
#payPal.verifyUrl=https://ipnpb.sandbox.paypal.com/cgi-bin/webscr

三、我遇到的问题

1、paypal通知(ipn)遇到:支付返回的状态为:Pending

解决:√

这个页面来源,参考,本文的“接入paypal”的第三步

注意,如果为线上环境,会有一个 “卖家成长计划的限制”,前期的收款状态为:Pending状态,因为钱都是冻结的状态,同事满足三个条件以后,才可以“毕业”,具体条例为下:

  • 1、账户收款满250美金
  • 2、账户收款满10笔交易
  • 3、从您第一次收款往后顺延60天。

在任意一个条件不满足的情况下,每笔收款都会被冻结21天。21天之后会转到余额中。

2、回调通知的时候,得不到 VERIFIED

解决:√

主要需要的cmd=_notify-validate+&+原始通知这个kv来回调的哦
所以我们需要保留原始的body然后加&cmd=_notify-validate

代码参考:这个body前面我们是有拿到的哦

 /*** sandbox为:https://www.sandbox.paypal.com/cgi-bin/webscr* live为:https://www.paypal.com/cgi-bin/webscr* 将paypal发送过来的所有信息加上一个&cmd=_notify-validate参数,表示对这个信息进行验证,全部发送回paypal验证,如果信息确实存在,则返回VERIFIED字符串。** @param request* @return*/public boolean verifyNotify(final PostPayPalNotifyRequest request, final String body) {log.info("开始回调PayPal接口,验证通知...");String callBackBody = "cmd=_notify-validate&" + body;try {String verifyRes = HttpUtils.doPost(verifyUrl, callBackBody, "utf-8");log.info("验证结果为:{}", verifyRes);return verifyRes.equals(VERIFIED);} catch (Exception e) {log.error("payPal验证通知异常" + e.getMessage());}return false;}

这里着重说一下, 这里在上线的时候也遇到了很多坑!!一直收不到VERIFIED,此时我们要注意,以下几个点:

  • 1、原来的字符串的次序不能乱
  • 2、编码问题:打开https://www.paypal.com/cgi-bin/webscr?cmd=_profile-language-encoding用你的账号登陆,设置语言为中文,更多选项里面编码设置为utf-8

3、正式环境的切换:

解决:√

更换正式环境的id和密匙,
修改配置文件:
payPal.mode=sandbox为payPal.mode=live

其他

PayPal开发手册

部分PayPal通知的字段含义

github上ipn示例代码

paypal返回的错误字段已经含义对照

例如:{“name”:“INSTRUMENT_DECLINED”,“message”:“The instrument presented was either declined by the processor or bank, or it can’t be used for this payment.”,“information_link”:“https://developer.paypal.com/docs/api/payments/#errors”,“debug_id”:“c16fbeac17bf1”}

联系技术支持的步骤:

  1. 访问www.paypal-support.com
  2. 页面右下方可以将语言更改为中文
  3. 点击“联系我们”
  4. 使用您的PayPal账户登陆后,进行提问
    提问后他们会在3-5个工作日中文邮件回复您的。很抱歉他们是没有在线客服或者电话服务的。

沙箱环境和正式环境【PayPal接入(java)】【IPN通知问题】项目实战干货总结记录!相关推荐

  1. vue cli3 一键 build 区分测试环境和正式环境

    vue cli3 打包 build 区分测试环境和正式环境 通过自定义环境变量文件进行配置 思路: 默认情况下,执行 npm run serve 会以 development 的模式启动 执行 npm ...

  2. vue开发环境、正式环境的配置及原理

    一.生产环境及正式环境的配置(为了更好地理解,我把起始项目中的代码也进行了展示) congif > dev.env.js:开发环境 congif > prod.env.js:正式(生产)环 ...

  3. 《Java从入门到项目实战(全程视频版)》(李兴华 著)【配套资源及赠送资源】

    <Java从入门到项目实战(全程视频版)>(李兴华 著)[配套资源及赠送资源] 其他Java全部资料 公号:纯洁的明依.回复 Java从入门到项目实战

  4. Java高级开发0-1项目实战-青鸟商城-Day03

    作者:田超凡 原创博文,严禁复制转载,仿冒必究 项目计划 第三天: 前台系统搭建 商城首页展示 Cms系统的实现 内容分类管理 内容管理 前台内容动态展示 1. 商城首页展示 系统架构: 页面位置: ...

  5. java web网上商城项目实战与源码

    java web网上商城项目实战与源码 点击这里,轻松完成毕设https://x-x.fun/i/AAbf595445aBT

  6. Spring Boot Spring Cloud 区分 开发环境 测试环境 预发布环境(灰度环境) 正式环境

    各环境的区别 开发环境(dev):开发的时候用的环境 测试环境(test):日常测试或者是上线前测试. 预发布环境(灰度环境)(pre):发布前的最后调试,数据源与正式环境一致. 正式环境(prod) ...

  7. 设置PHP的环境变量,区分PHP的测试环境和正式环境【php】

    一,查看环境变量 1,查看 env  查看全局环境变量 set  查看所有环境变量 echo $SHLVL  查看单个环境变量 unset name  删除环境变量 针对本次会话有效 2,设置 设置环 ...

  8. vue cli3 打包build 区分测试环境和正式环境

    vue cli3没有了和之前vue cli2一样的配置文件, 但项目中 经常会有测试环境和生产环境,经常不同环境的域名是不一致的,因为build构建打包时,process.env.NODE_ENV默认 ...

  9. Windows环境部署悟空CRM9.0(JAVA版)开源项目

    小白首次部署项目,过程中收获颇多,以此文记录下来. 一.gitee了解项目基本信息,技术栈 72crm-9.0-Jfinal: 悟空CRM-基于jfinal+vue+ElementUI的前后端分离CR ...

  10. vue3.0生产环境和正式环境配置_vue开发环境和生产环境配置

    开发环境配置 一般情况下开发环境是会跨域的,所以我们只需要在跨域的位置配置即可.进入config/index.js,在proxyTable对象里面添加代码,如下: '/api': { target: ...

最新文章

  1. FLASH与ASP.NET通讯
  2. public void DeleteT(ListT EntityList) where T : class, new() 这是什么意思
  3. android studio 开发android app 真机调试
  4. OSChina 周五乱弹 —— 一句话证明你看过此乱弹~
  5. 动态网页中隐藏url参数传递的方法
  6. 卫星导航 | 整秒转时分秒(时间转换)
  7. python如何删除代码_Python如何删除除字母和数字之外的所有字符?(代码示例)
  8. Mybatis占位符问题—ReflectionException: There is no getter for property named xxx
  9. 【读书笔记】MSDN 上关于加密解密的一个例子
  10. jupyter notebook使用入门2——创建一个基于scikit-Learn的线性预测ipynb文件
  11. okhttp框架学习
  12. ubuntu14.10环境下Apeach的安装配置
  13. 第十节 4基于ashx方式的ASP.Net开发
  14. argparse及logging的相关用法
  15. Linux kernel路由机制分析(上)
  16. 在ASP.NET 2.0中配置 AspNetSqlMembershipProvider(AspNetSqlProvider )
  17. java计算机毕业设计基于安卓Android微信的团务智慧管理小程序uniAPP
  18. 杰奇1.7--关关采集器使用教程
  19. web前端html代码,WEB前端--HTML(示例代码)
  20. 安卓支付宝抢红包脚本软件

热门文章

  1. 下载谷歌浏览器官方正式(稳定)版以及历史各种版本
  2. 客户成功服务市场现状研究分析报告 -
  3. 卫星导航术语 -- 词汇与概念解释(200条)(转自今日北斗)
  4. 5G 网络的移动性管理上下文对比介绍
  5. Pentaho 参数输入框横向排列
  6. office word 页码从任意页开始
  7. python简易中文名转英文小程序
  8. linux环境做路径左斜杠和右斜杠,不同操作系统下的路径分隔符—反斜杠与斜杠...
  9. 全栈项目-乐优商场-分类管理-前端-页面渲染
  10. 股票估值法研究报告_论述股票的估值方法