这里主要是根据paypay返回的payid做查询订单,paypal的整个流程请参见:https://blog.csdn.net/u014508939/article/details/87929219

1.首先需要引入的maven:

paypal的sdk

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

JsonArray 用于json解析

<dependency>
            <groupId>net.sf.json-lib</groupId>
            <artifactId>json-lib</artifactId>
            <version>2.4</version>
            <classifier>jdk15</classifier>
</dependency>

2.导入后台代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Service;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

@Service
public class PaypalCommonController {
    private static final String TOKEN_URL = "https://api.sandbox.paypal.com/v1/oauth2/token";
    private static final String PAYMENT_DETAIL = "https://api.sandbox.paypal.com/v1/payments/payment/";
    private static final String clientId = "clientid";
    private static final String secret = "secret";

/**
     * 获取token
     * 了解更多:https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/
     * @return
     */
    private String getAccessToken(){
        try{
            URL url = new URL(TOKEN_URL);
            String authorization = clientId+":"+secret;
            authorization = Base64.encodeBase64String(authorization.getBytes());

HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("POST");// 提交模式
            //设置请求头header
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Accept-Language", "en_US");
            conn.setRequestProperty("Authorization", "Basic "+authorization);
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            conn.setDoOutput(true);// 是否输入参数
            String params = "grant_type=client_credentials";
            conn.getOutputStream().write(params.getBytes());// 输入参数

InputStreamReader inStream = new InputStreamReader(conn.getInputStream());
            BufferedReader reader = new BufferedReader(inStream);
            StringBuilder result = new StringBuilder();
            String lineTxt = null;
            while((lineTxt = reader.readLine()) != null){
                result.append(lineTxt);
            }
            reader.close();
            String accessTokey = JSONObject.fromObject(result.toString()).optString("access_token");
            System.out.println("getAccessToken:"+accessTokey);
            return accessTokey;
        }catch(Exception err){
            err.printStackTrace();
        }
        return null;
    }
    /**
     * 获取支付详情
     * 了解更多:https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/
     * @param paymentId 支付ID,来自于用户客户端
     * @return
     */
    public String getPaymentDetails(String paymentId){
        try{
            URL url = new URL(PAYMENT_DETAIL+paymentId);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod("GET");// 提交模式
            //设置请求头header
            conn.setRequestProperty("Accept", "application/json");
            conn.setRequestProperty("Authorization", "Bearer "+getAccessToken());
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            InputStreamReader inStream = new InputStreamReader(conn.getInputStream());
            BufferedReader reader = new BufferedReader(inStream);
            StringBuilder result = new StringBuilder();
            String lineTxt = null;
            while((lineTxt = reader.readLine()) != null){
                result.append(lineTxt);
            }
            reader.close();
            return result.toString();
        }catch(Exception err){
            err.printStackTrace();
        }
        return null;
    }
    /**
     * 获取支付详情
     * 了解更多:https://developer.paypal.com/webapps/developer/docs/integration/mobile/verify-mobile-payment/
     * @param paymentId 支付ID,来自于用户客户端
     * @return
     */
    public boolean verifyPayment(String paymentId) throws Exception {
        String str = getPaymentDetails(paymentId);
        System.out.println("paypal回传的json信息;"+str);
        JSONObject detail = JSONObject.fromObject(str);
        //校验订单是否完成
        if("approved".equals(detail.optString("state"))){
            JSONObject transactions = detail.optJSONArray("transactions").optJSONObject(0);
            JSONObject amount = transactions.optJSONObject("amount");
            JSONArray relatedResources = transactions.optJSONArray("related_resources");
            //从数据库查询支付总金额与Paypal校验支付总金额
            double total = 0;
            System.out.println("amount.optDouble('total'):"+amount.optDouble("total"));
            /*if( total != amount.optDouble("total") ){
                return false;
            }*/
            //校验交易货币类型
            String currency = "USD";
            if( !currency.equals(amount.optString("currency")) ){
                return false;
            }
            //校验每个子订单是否完成
            for (int i = 0,j = relatedResources.size(); i < j; i++) {
                JSONObject sale = relatedResources.optJSONObject(i).optJSONObject("sale");
                if(sale!=null){
                    if( !"completed".equals(sale.optString("state")) ){
                        System.out.println("子订单未完成,订单状态:"+sale.optString("state"));
                    }
                }
            }
            return true;
        }
        return false;
    }

public static void main(String[] args) {
        PaypalCommonController payment = new PaypalCommonController();
        boolean success = false;
        try {
            success = payment.verifyPayment("PAY-8EX46500R12420142LSAIIJY");
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(success ? "支付完成" : "支付校验失败");
    }
}

注释:clientid和secret是从paypal网站注册后创建APP应用获取的。PAY-XXX是前端支付之后后paypal回传的json中的一个id 可以用它来查看该笔订单的详情,比如支付金额,时间 支付结果等信息。

paypal 根据PAY-XXXX查询订单的详情状态相关推荐

  1. (二十二)查询订单的详情

    (二十二)查询订单的详情 案例2-查询订单的详情 需求:只有未付款的订单,点击"付款",跳转到订单的详情页面 步骤分析:1.在订单列表,点击付款,/store/order?meth ...

  2. 案例39-后台查询订单详情代码实现

    1 admin/order/list.jsp代码 <%@ page language="java" pageEncoding="UTF-8"%> & ...

  3. java微信支付v3系列——6.微信支付查询订单API

    目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...

  4. 在线支付系列【15】微信支付实战篇之集成查询订单、支付通知API

    有道无术,术尚可求,有术无道,止于术. 文章目录 前言 主动调用 商户订单号查询 回调通知 1. 添加通知回调地址 2. 通知处理 3. 通知接口 4. 测试 前言 在上篇文档中,我们简单实现了Nat ...

  5. 微信查询订单API与商派ecstore订单状态对接

    2019独角兽企业重金招聘Python工程师标准>>> 今天一个项目用微信扫码支付,客户扫码后卡死在前台.但是金额已经支付成功了.通过百度发现https://pay.weixin.q ...

  6. go语言google pay支付验证订单

    访问google pay的接口,国内需要翻墙 1获取code 需要在浏览器登录谷歌账号,填写redirect_uri和client_id(在谷歌后台里面获取),然后在浏览器中访问https://acc ...

  7. 微信支付查询订单java_微信支付java版本之查询订单

    本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; ...

  8. wx小程序学习Day9 创建订单、准备预支付、发起微信支付、查询订单

    学习内容 1. 支付页-数据展示 2. 支付页-支付流程 3. 支付页-创建订单 3. 支付页-准备预支付和发起微信支付 4. 支付页-查询订单 5. 支付页-错误处理 6. 支付页-移除购物车已支付 ...

  9. java连接销售订单查询_(三十一)订单管理-查询订单

    查询订单: 所有的订单 不区分用户 基本的sql select* from orders where 1=1判断是否有state 若有则添加state 最后order by ordertime des ...

最新文章

  1. linux磁盘i o跟踪,利用zabbix动态监控磁盘I/O
  2. 【Linux】 JDK安装及配置 (tar.gz版)
  3. Oracle表空间查询及扩充表空间
  4. 【MM配置】评估和账户确定(Valuation Account Determination) - 1
  5. Python中collections模块
  6. delphi 解析一维条码_一维码和二维码区别有哪些
  7. 用toString生成随机字符
  8. 【实践】基于强化学习的 Contextual Bandits 算法在推荐场景中的应用
  9. 一次cpu占用高的定位分析
  10. 为什么每个程序员都应该学习C语言?
  11. 一行命令获取当前JVM所有可设置的参数以及当前默认值
  12. A1089. 阶乘计算
  13. 基于Javaweb的机房预约管理系统
  14. 中国雅虎首页改版彻底与口碑网剥离
  15. 中标麒麟NeoKylin系统使用--使用UFEI安装中标麒麟系统过程中/dev/disk/by-label/NeoKylin does not exit问题的解决
  16. 羞羞的报告:2020年轻人性爱数据报告。
  17. 网络请求及各类错误代码含义总结(Errors Code)
  18. PDF转换成excel的绿色版软件推荐
  19. 计算机视觉(五)--图像全景拼接原理及实现
  20. rs_D455相机内外参标定+imu联合标定

热门文章

  1. FreeChinaNet登陆器
  2. ThreadLocal在多线程中的作用和原理浅析(模拟学生入学报到场景)
  3. cocoscreator修改鼠标图标样式
  4. sqlserver数据库同步更新数据到mysql数据库,利用ODBC
  5. 【圆梦名企】4月19日,微众银行—招聘专场,10+岗位JD解读直播预告
  6. 第十八届全国大学智能车竞赛车模作品中的电子模块: 白名单与黑名单
  7. Mysql 多表联查索引失效问题
  8. 我见过最通俗易懂的快速排序过程讲解,转自《坐在马桶上看算法:快速排序》
  9. 20、Redis集群Moved重定向与Ask重定向
  10. g6自定义html,自定义树图