最新公告
  • 欢迎您光临三优资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 沙箱环境和正式环境【PayPal接入(java)】【IPN通知问题】项目实战干货总结记录!

    如果你是第一次接入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

     /**
         * 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

    1. 本站所有资源来源于用户上传和网络,因此不包含技术服务请大家谅解!如有侵权请邮件联系客服!3165260857@qq.com
    2. 本站不保证所提供下载的资源的准确性、安全性和完整性,资源仅供下载学习之用!如有链接无法下载、失效或广告,请联系客服处理,有奖励!
    3. 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源!如用于商业或者非法用途,与本站无关,一切后果请用户自负!
    4. 如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!


    三优资源网 » 沙箱环境和正式环境【PayPal接入(java)】【IPN通知问题】项目实战干货总结记录!

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    三优资源网
    一个高级程序员模板开发平台

    发表评论

    • 232会员总数(位)
    • 1266资源总数(个)
    • 0本周发布(个)
    • 0 今日发布(个)
    • 1476稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情