上周开始接触这块,真是毫无头绪啊,然后就联系paypal那边技术,说实话真的很不方便,只能通过邮件,效率比较慢,但是还是感谢他们技术工程师Vicaci支持。下面简单记录下调试过程。
TransactionSearch:搜索一些交易,如某一段时间内。最多返回100条记录
GetTransactionDetails:根据传递的TransactionID来获取这笔交易的相关数据
一、两个接口的API官网介绍。
首先需要连接一下两个接口的参数,您可以参考如下Paypal的API的介绍:
https://developer.paypal.com/docs/classic/api/merchant/GetTransactionDetails_API_Operation_NVP/https://developer.paypal.com/docs/classic/api/merchant/TransactionSearch_API_Operation_NVP/
二、目前Paypal提供的SDK sample是SOAP方式的。所以NVP的需要自己写测试
(如果是使用真实账户的话,替换请求地址为:https://api-3t.paypal.com/nvp):
1、TransactionSearch
简单附上示例代码:
String gvAPIEndpoint = "https://api-3t.sandbox.paypal.com/nvp";
String gvAPIUserName = "XXXX";
String gvAPIPassword = "XXXX";
String gvAPISignature = "XXXX";
String gvVersion = "109.0";
String methodName = "TransactionSearch";
String nvpStr = "&STARTDATE=2016-07-27T00:00:00Z&ENDDATE=2016-07-28T00:00:00Z&TRANSACTIONCLASS=All";
String agent = "Mozilla/5.0";
StringBuilder respText = new StringBuilder("");
HashMap nvp = null;
StringBuilder encodedData = new StringBuilder("METHOD=").append(methodName).append("&VERSION=").append(gvVersion).append("&PWD=").append(gvAPIPassword).append("&USER=").append(gvAPIUserName).append("&SIGNATURE=").append(gvAPISignature).append(nvpStr);
URL postURL = new URL(gvAPIEndpoint);
HttpsURLConnection conn = (HttpsURLConnection) postURL.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");// 窗体数据被编码为名称/值对
conn.setRequestProperty("User-Agent", agent);
conn.setRequestProperty("Content-Length", String.valueOf(encodedData.length()));
conn.setRequestMethod("POST");
// get the output stream to POST to.
DataOutputStream output = new DataOutputStream(conn.getOutputStream());
output.writeBytes(encodedData.toString());
output.flush();
output.close();
int rc = conn.getResponseCode();
if (rc != -1) {
BufferedReader is = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
while (((line = is.readLine()) != null)) {
respText.append(line);
}
nvp = deformatNVP(respText.toString());
}
conn.disconnect();
****************************************完美分割******************************************************
贴上deformatNVP代码:
public HashMap deformatNVP(String pPayload) { HashMap nvp = new HashMap(); StringTokenizer stTok = new StringTokenizer(pPayload, "&"); while (stTok.hasMoreTokens()) { StringTokenizer stInternalTokenizer = new StringTokenizer(stTok.nextToken(), "="); if (stInternalTokenizer.countTokens() == 2) { String key; try { key = URLDecoder.decode(stInternalTokenizer.nextToken(), "UTF-8"); String value; value = URLDecoder.decode(stInternalTokenizer.nextToken(), "UTF-8"); nvp.put(key.toUpperCase(), value); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); Util4Logger.LOG_CHARGEERROR.info(e,e); } } } return nvp; }
结果返回的内容如下,仅供参考:
NVP Response:
{
L_TIMEZONE1=GMT, //交易时区,总是GMT
L_TYPE1=Payment, //交易类型,Payment是付款,Currency Conversion(credit)是信用卡货币转换,或者是借记卡货币转换Currency Conversion(debit)
L_CURRENCYCODE1=USD, //货币单位
L_FEEAMT1=-7.52, //Paypal提走的金额
L_NAME1=ls l, //付款者名字
L_NETAMT1=241.48, //所剩金额
L_STATUS1=Completed,
L_AMT1=249.00, //总付款金额
L_EMAIL1=11@qq.com, //付款者邮件地址
L_TIMESTAMP1=2016-07-19T11:29:53Z, //交易日期时间(UTC/GMT)
L_TRANSACTIONID1=4FH98116D5855181S, //交易号,注意,通过GetTransactionDetails获取交易的更详细的信息需要这个
L_TIMEZONE0=GMT,
L_TYPE0=Payment,
L_CURRENCYCODE0=USD,
L_FEEAMT0=-13.32,
L_NAME0=ls l,
L_NETAMT0=435.68,
L_AMT0=449.00,
L_STATUS0=Completed,
L_EMAIL0=11@qq.com,
L_TIMESTAMP0=2016-07-19T11:33:01Z,
L_TRANSACTIONID0=0KY76585WT3587236,
BUILD=22386173,
TIMESTAMP=2016-07-25T06:14:49Z,
CORRELATIONID=c46f87f276fe7,
ACK=Success,
VERSION=109.0,
}
NVP Response:
{
L_TIMEZONE1=GMT, //交易时区,总是GMT
L_TYPE1=Payment, //交易类型,Payment是付款,Currency Conversion(credit)是信用卡货币转换,或者是借记卡货币转换Currency Conversion(debit)
L_CURRENCYCODE1=USD, //货币单位
L_FEEAMT1=-7.52, //Paypal提走的金额
L_NAME1=ls l, //付款者名字
L_NETAMT1=241.48, //所剩金额
L_STATUS1=Completed,
L_AMT1=249.00, //总付款金额
L_EMAIL1=11@qq.com, //付款者邮件地址
L_TIMESTAMP1=2016-07-19T11:29:53Z, //交易日期时间(UTC/GMT)
L_TRANSACTIONID1=4FH98116D5855181S, //交易号,注意,通过GetTransactionDetails获取交易的更详细的信息需要这个
L_TIMEZONE0=GMT,
L_TYPE0=Payment,
L_CURRENCYCODE0=USD,
L_FEEAMT0=-13.32,
L_NAME0=ls l,
L_NETAMT0=435.68,
L_AMT0=449.00,
L_STATUS0=Completed,
L_EMAIL0=11@qq.com,
L_TIMESTAMP0=2016-07-19T11:33:01Z,
L_TRANSACTIONID0=0KY76585WT3587236,
BUILD=22386173,
TIMESTAMP=2016-07-25T06:14:49Z,
CORRELATIONID=c46f87f276fe7,
ACK=Success,
VERSION=109.0,
}
注意:ACK返回success就说明API已经调用成功。如果是Failure则调用失败,检查下参数传递是否有问题。另如果调用成功但没有返回数据的结果可能搜索条件下本身没有交易数据。可以调整搜索条件,如扩大搜索的时间,交易类型等。
测试时遇到问题:post请求握手失败,最后检查是因为jdk1.7的原因,然后把jdk换成1.8就可以了
https://api-3t.sandbox.paypal.com/nvp?USER=XXXX&PWD=XXXXX&SIGNATURE=XXXXXX&VERSION=109.0&METHOD=GetTransactionDetails&TRANSACTIONID=XXXX
请求可以参考TransactionSearch
注:TransactionSearch 这个API 最多只允许返回100条记录,可以根据自己的需求通过其它一些参数,例如 STARTDATE, ENDDATE, TRANSACTIONCLASS 等一些参数来缩小范围或查询得到不同的结果。
2、GetTransactionDetails
https://api-3t.sandbox.paypal.com/nvp?USER=XXXX&PWD=XXXXX&SIGNATURE=XXXXXX&VERSION=109.0&METHOD=GetTransactionDetails&TRANSACTIONID=XXXX
请求可以参考TransactionSearch
注:TransactionSearch 这个API 最多只允许返回100条记录,可以根据自己的需求通过其它一些参数,例如 STARTDATE, ENDDATE, TRANSACTIONCLASS 等一些参数来缩小范围或查询得到不同的结果。
祝大家工作愉快。