paypal 根据PAY-XXXX查询订单的详情状态
这里主要是根据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查询订单的详情状态相关推荐
- (二十二)查询订单的详情
(二十二)查询订单的详情 案例2-查询订单的详情 需求:只有未付款的订单,点击"付款",跳转到订单的详情页面 步骤分析:1.在订单列表,点击付款,/store/order?meth ...
- 案例39-后台查询订单详情代码实现
1 admin/order/list.jsp代码 <%@ page language="java" pageEncoding="UTF-8"%> & ...
- java微信支付v3系列——6.微信支付查询订单API
目录 java微信支付v3系列--1.微信支付准备工作 java微信支付v3系列--2.微信支付基本配置 java微信支付v3系列--3.订单创建准备操作 java微信支付v3系列--4.创建订单的封 ...
- 在线支付系列【15】微信支付实战篇之集成查询订单、支付通知API
有道无术,术尚可求,有术无道,止于术. 文章目录 前言 主动调用 商户订单号查询 回调通知 1. 添加通知回调地址 2. 通知处理 3. 通知接口 4. 测试 前言 在上篇文档中,我们简单实现了Nat ...
- 微信查询订单API与商派ecstore订单状态对接
2019独角兽企业重金招聘Python工程师标准>>> 今天一个项目用微信扫码支付,客户扫码后卡死在前台.但是金额已经支付成功了.通过百度发现https://pay.weixin.q ...
- go语言google pay支付验证订单
访问google pay的接口,国内需要翻墙 1获取code 需要在浏览器登录谷歌账号,填写redirect_uri和client_id(在谷歌后台里面获取),然后在浏览器中访问https://acc ...
- 微信支付查询订单java_微信支付java版本之查询订单
本文实例为大家分享了微信支付订单的查询接口,供大家参考,具体内容如下 1.接口简介 2.代码实现 package com.zhrd.bussinss.platform.controller.shop; ...
- wx小程序学习Day9 创建订单、准备预支付、发起微信支付、查询订单
学习内容 1. 支付页-数据展示 2. 支付页-支付流程 3. 支付页-创建订单 3. 支付页-准备预支付和发起微信支付 4. 支付页-查询订单 5. 支付页-错误处理 6. 支付页-移除购物车已支付 ...
- java连接销售订单查询_(三十一)订单管理-查询订单
查询订单: 所有的订单 不区分用户 基本的sql select* from orders where 1=1判断是否有state 若有则添加state 最后order by ordertime des ...
最新文章
- linux磁盘i o跟踪,利用zabbix动态监控磁盘I/O
- 【Linux】 JDK安装及配置 (tar.gz版)
- Oracle表空间查询及扩充表空间
- 【MM配置】评估和账户确定(Valuation Account Determination) - 1
- Python中collections模块
- delphi 解析一维条码_一维码和二维码区别有哪些
- 用toString生成随机字符
- 【实践】基于强化学习的 Contextual Bandits 算法在推荐场景中的应用
- 一次cpu占用高的定位分析
- 为什么每个程序员都应该学习C语言?
- 一行命令获取当前JVM所有可设置的参数以及当前默认值
- A1089. 阶乘计算
- 基于Javaweb的机房预约管理系统
- 中国雅虎首页改版彻底与口碑网剥离
- 中标麒麟NeoKylin系统使用--使用UFEI安装中标麒麟系统过程中/dev/disk/by-label/NeoKylin does not exit问题的解决
- 羞羞的报告:2020年轻人性爱数据报告。
- 网络请求及各类错误代码含义总结(Errors Code)
- PDF转换成excel的绿色版软件推荐
- 计算机视觉(五)--图像全景拼接原理及实现
- rs_D455相机内外参标定+imu联合标定