美文网首页
java服务器端接入paypal移动支付

java服务器端接入paypal移动支付

作者: Slience无言 | 来源:发表于2017-07-20 10:42 被阅读0次

    前段时间app要推广到香港,那边人微信支付宝用的少,所以就接入了paypal支付,paypal支付比支付宝支付要简单,前提是你有一个网速不错的办公环境(翻墙看youtube不卡就行)和良好的英文阅读水平(开发文档全英文)
    首先访问开发者中心,选择【Braintree SDK】开发的方式,首先是将SDK导入到自己的项目,具体可以看https://developer.paypal.com/docs/accept-payments/express-checkout/ec-braintree-sdk/server-side/java/ ,之后获取自己的access_token,这个可以在https://developer.paypal.com/developer/applications/editbtcredLive 中看到。做好了准备工作就要开始和前端对接了。
    首先前端要唤起paypal支付需要一个token,它的获取方式如下

    com.braintreegateway.BraintreeGateway gateway = new BraintreeGateway("access_token$production$cky62c7dfgrt2sn你的token");
    String token = gateway.clientToken().generate();
    
    

    之后把token传给前端,建议做这一步的时候生成一个本地订单标记为【未支付】状态,并把订单id一并给前端,以便前端支付成功后通过订单id定位唯一订单做后续操作。
    之后麻烦前端同事去接paypal,在支付完成(不一定支付成功)的回调函数中可以获取到一个nonce字符串,获取到这个之后再把nonce和刚刚生成的订单id回传给后端,后端需要做的就是验证它是不是支付成功了,验证方法如下

    BraintreeGateway gateway = new BraintreeGateway("access_token$production$cky你的access_token");
            TransactionRequest request = new TransactionRequest().paymentMethodNonce(nonce)
                    .amount(pp.getMoney())
                    .merchantAccountId("HKD")     //货币类型
                    .orderId(pp.getId())
                    .descriptor().name("商户姓*名").done();
            //商户名(好像是商户名,记不清了)有限制的,姓名之间不要用空格而要用*,而且是一定要有*号
            //不然可能会报Company name/DBA section must be either 3,7 or 12 characters and the produce descriptor can be up to 18,14, or 9 character between for a total descriptor nam of 22 characters错误
            request.shippingAddress().firstName("Jen")
            .lastName("Smith").company("公司名").streetAddress("1 E 1st St")//company中的内容不能有*号,最好是3、7或12位
            .extendedAddress("Suite 403")
            .locality("Bartlett")
            .region("IL")
            .postalCode("60103")
            .countryCodeAlpha2("US").done();     //一些支付的相关参数
            request.options().paypal().customField("PayPalcustom field").description("cmp wonderful product").done();
            request.options().storeInVaultOnSuccess(true).
            done();
            Result<Transaction> saleResult = gateway.transaction().sale(request);
            if (saleResult.isSuccess()) {
                Transaction transaction = saleResult.getTarget();
                System.out.println("Success ID: " + transaction.getId());
                System.out.println("transaction");
                Gson gson = new Gson();
                System.out.println(gson.toJson(transaction));
                //订单号,可以通过它在paypal商户管理的->交易记录中使用交易号查询到,方便后期退款方便,可以存在本地
                String txn_id = transaction.getPayPalDetails().getCaptureId();     
                String name = transaction.getPayPalDetails().getPayerFirstName() + " " + transaction.getPayPalDetails().getPayerLastName();
                String email = transaction.getPayPalDetails().getPayerEmail();
                            //支付成功,进行更多操作
            } else {
                //支付失败的情况
                System.out.println("Message: " + saleResult.getMessage());
                System.out.println("Error:"+saleResult.getErrors().toString());
                Gson gson = new Gson();
                System.out.println("Error-JSON:" + gson.toJson(saleResult.getErrors()));
                msg.setCode(CodeTool.ERR);
                msg.setMessage("支付失败:" + saleResult.getMessage());
            }
    

    如此就可以即时的对用户的支付进行一些处理了

    其实还有一种更简单的方法

    连paypal的sdk都不需要,直接通过支付成功之后paypal服务器发给我们服务器的信息进行支付处理的,那就是通过【异步回调IPN】的方式进行,这是设置地址,设置之后用户支付成功了paypal服务器就会向设置的服务器发送一个请求,里面就包含这订单号等信息,这种方式前端也比较简单,不需要向后台请求token,但是这种方式有个很明显的缺点就是【不及时】,遇到同时支付的人比较多的时候会有通知被排队

    被排队的样子

    造成支付成功之后用户不能马上看到效果(大约延时10秒),所以不建议大家用这种方式

    还有就是paypal商户最好别注册为中国大陆,如果你想明白自己的产品是面向大陆以外的地方的话,不然在国外支付的时候可能会出现【We're sorry. We can't complete your purchase at this time】错误

    相关文章

      网友评论

          本文标题:java服务器端接入paypal移动支付

          本文链接:https://www.haomeiwen.com/subject/naluhxtx.html