iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >java后端PayPal支付如何实现
  • 401
分享到

java后端PayPal支付如何实现

2023-06-22 03:06:47 401人浏览 安东尼
摘要

这篇文章给大家分享的是有关java后端PayPal支付如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。首先引入 PayPal的sdk 这里我引入的是1.0.4版本的<!-- 贝宝支付&nbs

这篇文章给大家分享的是有关java后端PayPal支付如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

首先引入 PayPal的sdk 这里我引入的是1.0.4版本的

<!-- 贝宝支付  SDK   -->            <dependency>                <groupId>com.paypal.sdk</groupId>                <artifactId>checkout-sdk</artifactId>                <paypal-sdk.version>1.0.4</paypal-sdk.version>            </dependency>

yml文件引入公司在官网的相关配置

这里我做了yml的文件环境隔离,限免的配置做了示例

  #  贝宝支付的测试服pay:    paypal:    clientId: AeEX1PNMNaP3RuV8JTBMznAhs_GofFwloG6SG3TiQh2_MBj0    clientSecret: EMDda7g_Q7KmOiH08qJfg-dAb8d2THkYtzRR    #测试的mode    mode: sandbox    #正式的mode    mode: live
@Data@AllArgsConstructor@NoArgsConstructor@apiModelpublic class PayPalVo extends RequestModel {        @ApiModelProperty(value = "本站订单号")    private String orderNo;        @ApiModelProperty(value = "本站订单号")    private String outOrderNo;        @ApiModelProperty(value = "1 书币充值 ; 2 plus会员充值;3 premium会员充值")    private Integer orderType;}

PayPal支付

    @PostMapping("/payPalNotify")    @ApiOperation(value = "贝宝支付二次验证")    @Deprecated    public ResponseModel<PayOrderDto> payPalNotify(@RequestBody PayPalVo payPalVo){        if (ObjectUtils.isEmpty(payPalVo.getOrderNo()) || ObjectUtils.isEmpty(payPalVo.getOutOrderNo()) || ObjectUtils.isEmpty(payPalVo.getOrderType())){            return ResponseModel.error(appConfigStatusCodeService.getStatusCode(payPalVo.getLanguage(), ResponseCnSate.PARAM_EXCEPTION));        }        // 根据paypal的订单id,捕获订单付款        String outOrderNo = payPalVo.getOutOrderNo();        String orderNo = payPalVo.getOrderNo();        Integer orderType = payPalVo.getOrderType();        // 校验该订单是否处理        if (payOrderService.isDispose(orderNo) == PayConstants.ORDER_IS_DISPOSE) {            return ResponseModel.error(appConfigStatusCodeService.getStatusCode(payPalVo.getLanguage(), ResponseCnSate.ORDER_PROCESSED));        }        //进行二次验证        Boolean pay = payPalUtils.verifyOrderInfo(outOrderNo);        //如果成功则执行后面的逻辑        if (pay){            boolean b = orderService.finishOrder(orderNo, orderType,payPalVo.getLanguage());            if (!b){                return ResponseModel.error(appConfigStatusCodeService.getStatusCode(payPalVo.getLanguage(), ResponseCnSate.ORDER_HANDLER_FaiL));            }            //保存订单号返回订单信息            PayOrderDto payOrderDto =orderService.saveAndGetOrderInfo(payPalVo.getUserId(),outOrderNo,orderNo);            if (ObjectUtils.isNotEmpty(payOrderDto)){                return ResponseModel.success(payOrderDto);            }            return ResponseModel.error(appConfigStatusCodeService.getStatusCode(payPalVo.getLanguage(), ResponseCnSate.RETURN_ORDER_INFO_FAIL));        }        //失败返回提示        return ResponseModel.error(appConfigStatusCodeService.getStatusCode(payPalVo.getLanguage(), ResponseCnSate.AUTH_FAIL_TWO));    }

后面为了让大家都看的明白 我单独抽取了一个工具,简单的做了描述

package com.wyzz.global.untils.paypal;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;import com.paypal.core.PayPalEnvironment;import com.paypal.core.PayPalHttpClient;import com.paypal.http.HttpResponse;import com.paypal.http.serializer.JSON;import com.paypal.orders.*;import com.paypal.payments.CapturesGetRequest;import lombok.extern.slf4j.Slf4j;import java.io.IOException;import java.util.HashMap;import java.util.List;import java.util.Map;import org.json.JSONObject;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Service;@Service@Slf4jpublic class PayPalUtils {        @Value("${pay.paypal.clientId}")    private String clientId;        @Value("${pay.paypal.clientSecret}")    private String clientSecret;        @Value("${pay.paypal.mode}")    private String mode;        public PayPalHttpClient client(String mode, String clientId, String clientSecret) {        log.info("mode={}, clientId={}, clientSecret={}", mode, clientId, clientSecret);        PayPalEnvironment environment = mode.equals("live") ? new PayPalEnvironment.Live(clientId, clientSecret) : new PayPalEnvironment.Sandbox(clientId, clientSecret);        return new PayPalHttpClient(environment);    }        public OrderRequest buildRequestBody() {        return new OrderRequest();    }        public Boolean verifyOrderInfo(String orderId) {        Boolean f = false;        try {            // 1.用户授权支付成功,进行扣款操作            this.captureOrder(orderId);        } catch (Exception e) {            e.printStackTrace();        } finally {            // 2.扣款操作失败时也要查询订单,确认是否已扣款            try {                OrdersGetRequest request = new OrdersGetRequest(orderId);                HttpResponse<Order> response = client(mode, clientId, clientSecret).execute(request);                System.out.println("Status Code: " + response.statusCode());                System.out.println("Status: " + response.result().status());                System.out.println("Order id: " + response.result().id());                if(response.result().purchaseUnits().get(0).payments() != null) {                    List<Capture> captures = response.result().purchaseUnits().get(0).payments().captures();                    if(captures != null) {                        for (Capture capture : captures) {                            if (capture.id() != null && capture.id().length() > 0) {                                f = true;                            }                        }                    }                }            } catch (Exception e2) {                e2.printStackTrace();            }        }        return f;    }        public void captureOrder(String orderId){        OrdersCaptureRequest request = new OrdersCaptureRequest(orderId);        request.requestBody(this.buildRequestBody());        HttpResponse<Order> response = null;        try {            response = client(mode, clientId, clientSecret).execute(request);        } catch (IOException e1) {            try {                log.error("第1次调用paypal扣款失败");                response = client(mode, clientId, clientSecret).execute(request);            } catch (Exception e) {                try {                    log.error("第2次调用paypal扣款失败");                    response = client(mode, clientId, clientSecret).execute(request);                } catch (Exception e2) {                    log.error("第3次调用paypal扣款失败,失败原因 {}", e2.getMessage() );                }            }        }        if (ObjectUtils.isNotEmpty(response)) {            log.info("Status Code = {}, Status = {}, OrderID = {}", response.statusCode(), response.result().status(), response.result().id());            for (LinkDescription link : response.result().links()) {                log.info("Links-{}: {}    \tCall Type: {}", link.rel(), link.href(), link.method());            }            for (PurchaseUnit purchaseUnit : response.result().purchaseUnits()) {                for (Capture capture : purchaseUnit.payments().captures()) {                    log.info("Capture id: {}", capture.id());                    log.info("status: {}", capture.status());                    log.info("invoice_id: {}", capture.invoiceId());                    if("COMPLETED".equals(capture.status())) {                        //进行数据库操作,修改订单状态为已支付成功,尽快发货(配合回调和CapturesGet查询确定成功)                        log.info("支付成功,状态为=COMPLETED");                    }                    if("PENDING".equals(capture.status())) {                        log.info("status_details: {}", capture.captureStatusDetails().reason());                        String reason = "PENDING";                        if(capture.captureStatusDetails() != null && capture.captureStatusDetails().reason() != null) {                            reason = capture.captureStatusDetails().reason();                        }                        //进行数据库操作,修改订单状态为已支付成功,但触发了人工审核,请审核通过后再发货(配合回调和CapturesGet查询确定成功)                        log.info("支付成功,状态为=PENDING : {}", reason);                    }                }            }            Payer buyer = response.result().payer();            log.info("Buyer Email Address: {}", buyer.email());            log.info("Buyer Name: {} {}", buyer.name().givenName(), buyer.name().surname());        }    }        public void ordersGetRequest(String orderId) throws IOException {        OrdersGetRequest request = new OrdersGetRequest(orderId);        HttpResponse<Order> response = null;        try {            response = client(mode, clientId, clientSecret).execute(request);        } catch (Exception e) {            try {                System.out.println("调用paypal订单查询失败,链接异常1");                response = client(mode, clientId, clientSecret).execute(request);            } catch (Exception e2) {                try {                    System.out.println("调用paypal订单查询失败,链接异常2");                    response = client(mode, clientId, clientSecret).execute(request);                } catch (Exception e3) {                    System.out.println("调用paypal订单查询失败,链接异常3");                    System.out.println(e3.getMessage());                }            }        }        System.out.println("Status Code: " + response.statusCode());        System.out.println("Status: " + response.result().status());        System.out.println("Order id: " + response.result().id());        if(response.result().purchaseUnits().get(0).payments() != null) {            List<Capture> captures = response.result().purchaseUnits().get(0).payments().captures();            if(captures != null) {                for (Capture capture : captures) {                    System.out.println("\t订单编号= " + capture.invoiceId() + "\tCapture Id= " + capture.id() + "\tCapture status= " + capture.status() + "\tCapture amount= " + capture.amount().currencyCode() + ":" + capture.amount().value());                }            }            List<Refund> refunds = response.result().purchaseUnits().get(0).payments().refunds();            if(refunds != null) {                for (Refund refund : refunds) {                    System.out.println("\t售后编号= " + refund.invoiceId() + "\tRefund Id= " + refund.id() + "\tRefund status= " + refund.status() + "\tRefund amount= " + refund.amount().currencyCode() + ":" + refund.amount().value());                }            }        }        System.out.println("Links: ");        for (LinkDescription link : response.result().links()) {            System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method());        }    }        public void capturesGetRequest(String orderId) throws IOException {        CapturesGetRequest request = new CapturesGetRequest(orderId);        HttpResponse<com.paypal.payments.Capture> response = client(mode, clientId, clientSecret).execute(request);        System.out.println("Status Code: " + response.statusCode());        System.out.println("Status: " + response.result().status());        System.out.println("Capture ids: " + response.result().id());        System.out.println("Links: ");        for (com.paypal.payments.LinkDescription link : response.result().links()) {            System.out.println("\t" + link.rel() + ": " + link.href() + "\tCall Type: " + link.method());        }    }    public Map<String,Object> createOrder(OrderRequest orderRequest) {        OrdersCreateRequest request = new OrdersCreateRequest();        request.header("prefer","return=representation");        request.requestBody(orderRequest);//        PayPalClient payPalClient = new PayPalClient();        HttpResponse<Order> response = null;        try {            response = client(mode, clientId, clientSecret).execute(request);        } catch (IOException e1) {            try {                log.error("第1次调用paypal订单创建失败");                response = client(mode, clientId, clientSecret).execute(request);            } catch (Exception e) {                try {                    log.error("第2次调用paypal订单创建失败");                    response = client(mode, clientId, clientSecret).execute(request);                } catch (Exception e2) {                    log.error("第3次调用paypal订单创建失败,失败原因:{}", e2.getMessage());                }            }        }//        String approve = "";        Map<String,Object> map = new HashMap();        if (response.statusCode() == 201) {            log.info("Status Code = {}, Status = {}, OrderID = {}, Intent = {}", response.statusCode(), response.result().status(), response.result().id(), response.result().checkoutPaymentIntent());            map.put("Id",response.result().id());            for (LinkDescription link : response.result().links()) {                log.info("Links-{}: {}    \tCall Type: {}", link.rel(), link.href(), link.method());                if(link.rel().equals("approve")) {//                    approve = link.href();                    map.put("outOrderNo",link.href());                }            }            String totalAmount = response.result().purchaseUnits().get(0).amountWithBreakdown().currencyCode() + ":" + response.result().purchaseUnits().get(0).amountWithBreakdown().value();            log.info("Total Amount: {}", totalAmount);//            String json= new JSONObject(new Json().serialize(response.result())).toString(4);//            log.info("createOrder response body: {}", json);        }        return map;    }//    public static void main(String[] args) throws Exception {//        PayPalUtils payPalUtils = new PayPalUtils();//        payPalUtils.verifyOrderInfo("45S82276S8854414K");//        payPalUtils.ordersGetRequest("45S82276S8854414K");//        payPalUtils.captureOrder("18K07174PX6483500");//        payPalUtils.capturesGetRequest("31V65486WC667442G");//        // issue : ORDER_ALREADY_CAPTURED 订单已被捕获//        // intent=CAPTURE 每个订单只允许捕获一次//    }}

感谢各位的阅读!关于“java后端PayPal支付如何实现”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: java后端PayPal支付如何实现

本文链接: https://www.lsjlt.com/news/302368.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ 生态系统中流行库和框架的贡献指南
    作为 c++++ 开发人员,通过遵循以下步骤即可为流行库和框架做出贡献:选择一个项目并熟悉其代码库。在 issue 跟踪器中寻找适合初学者的问题。创建一个新分支,实现修复并添加测试。提交...
    99+
    2024-05-15
    框架 c++ 流行库 git
  • C++ 生态系统中流行库和框架的社区支持情况
    c++++生态系统中流行库和框架的社区支持情况:boost:活跃的社区提供广泛的文档、教程和讨论区,确保持续的维护和更新。qt:庞大的社区提供丰富的文档、示例和论坛,积极参与开发和维护。...
    99+
    2024-05-15
    生态系统 社区支持 c++ overflow 标准库
  • c++中if elseif使用规则
    c++ 中 if-else if 语句的使用规则为:语法:if (条件1) { // 执行代码块 1} else if (条件 2) { // 执行代码块 2}// ...else ...
    99+
    2024-05-15
    c++
  • c++中的继承怎么写
    继承是一种允许类从现有类派生并访问其成员的强大机制。在 c++ 中,继承类型包括:单继承:一个子类从一个基类继承。多继承:一个子类从多个基类继承。层次继承:多个子类从同一个基类继承。多层...
    99+
    2024-05-15
    c++
  • c++中如何使用类和对象掌握目标
    在 c++ 中创建类和对象:使用 class 关键字定义类,包含数据成员和方法。使用对象名称和类名称创建对象。访问权限包括:公有、受保护和私有。数据成员是类的变量,每个对象拥有自己的副本...
    99+
    2024-05-15
    c++
  • c++中优先级是什么意思
    c++ 中的优先级规则:优先级高的操作符先执行,相同优先级的从左到右执行,括号可改变执行顺序。操作符优先级表包含从最高到最低的优先级列表,其中赋值运算符具有最低优先级。通过了解优先级,可...
    99+
    2024-05-15
    c++
  • c++中a+是什么意思
    c++ 中的 a+ 运算符表示自增运算符,用于将变量递增 1 并将结果存储在同一变量中。语法为 a++,用法包括循环和计数器。它可与后置递增运算符 ++a 交换使用,后者在表达式求值后递...
    99+
    2024-05-15
    c++
  • c++中a.b什么意思
    c++kquote>“a.b”表示对象“a”的成员“b”,用于访问对象成员,可用“对象名.成员名”的语法。它还可以用于访问嵌套成员,如“对象名.嵌套成员名.成员名”的语法。 c++...
    99+
    2024-05-15
    c++
  • C++ 并发编程库的优缺点
    c++++ 提供了多种并发编程库,满足不同场景下的需求。线程库 (std::thread) 易于使用但开销大;异步库 (std::async) 可异步执行任务,但 api 复杂;协程库 ...
    99+
    2024-05-15
    c++ 并发编程
  • 如何在 Golang 中备份数据库?
    在 golang 中备份数据库对于保护数据至关重要。可以使用标准库中的 database/sql 包,或第三方包如 github.com/go-sql-driver/mysql。具体步骤...
    99+
    2024-05-15
    golang 数据库备份 mysql git 标准库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作