一、文檔說(shuō)明
該方案雖然沒(méi)有用到PAYPAL提供的高階特性,也考慮了安全驗(yàn)證以及郵件消息通知的實(shí)現(xiàn)。由于只是基本功能,只用到三個(gè)頁(yè)面(JSP實(shí)現(xiàn))。以下將詳細(xì)說(shuō)明各個(gè)頁(yè)面的關(guān)系和職責(zé)。
二、頁(yè)面說(shuō)明
1.提交頁(yè)面(test.jsp) 該頁(yè)面的代碼可以嵌入到購(gòu)買(mǎi)頁(yè)面里,主要功能是按照PAYPAL的接口規(guī)則提交相應(yīng)的參數(shù),供PAYPAL處理訂單的支付請(qǐng)求。
下面是該頁(yè)面的參數(shù)配置
參數(shù)含義
|
參數(shù)名稱
|
參數(shù)示例
|
備注
|
action
|
真實(shí)用
https://www.
|
|
測(cè)試用https://www.
|
提交模式
|
cmd
|
_xclick
|
可以寫(xiě)死
|
商務(wù)網(wǎng)站的郵箱
|
business
|
Seller_1210746445_biz@21cn.com
|
可以寫(xiě)死
|
*商品名稱
|
item_name
|
Productor/商品一
|
如果用中文要設(shè)置charset參數(shù)
|
*商品編號(hào)
|
item_number
|
88888111
|
也可含英文字母
|
商品數(shù)量
|
quantity
|
10
|
|
*自定義用于加密
|
custom
|
sessionID
|
建議將該ID用MD5加密,為以后驗(yàn)證做準(zhǔn)備
|
*商品價(jià)格
|
amount
|
119.00
|
為double型
|
商品運(yùn)費(fèi)
|
shipping
|
10.00
|
為double型
|
貨幣類型
|
currency_code
|
USD
|
CNY:人民幣,USD:美元
|
字符編碼
|
charset
|
gb2312
|
不寫(xiě)為默認(rèn) 默認(rèn)為ISO8859-1
|
1.驗(yàn)證頁(yè)面(back.jsp)
用于接有PAYPAL傳過(guò)來(lái)的信息,通過(guò)里面的字段CUSTOM來(lái)驗(yàn)證是否剛才提交的支付信息是否一致。該驗(yàn)證頁(yè)的配置在補(bǔ)充說(shuō)明里參看。
2.取消頁(yè)面(cancel.jsp)
客戶可能在支付時(shí)臨時(shí)決定取消這次支付,取消后將返回的頁(yè)面。該取消頁(yè)的配置在補(bǔ)充說(shuō)明里參看。
二、補(bǔ)充說(shuō)明
1.驗(yàn)證和取消頁(yè)面的配置在提交頁(yè)加入以下兩個(gè)參數(shù),參數(shù)為實(shí)際驗(yàn)證頁(yè)和取消頁(yè)。
參數(shù)含義
|
參數(shù)名稱
|
參數(shù)示例
|
備注
|
取消后返回到的頁(yè)面
|
cancel_return
|
http://localhost/howie/fail.jsp
|
|
確認(rèn)以及驗(yàn)證頁(yè)面
|
return
|
http://localhost/howie/back.jsp
|
|
1.驗(yàn)證頁(yè)在PAYPAL里的設(shè)置
在Profile的Selling Preferences一欄,進(jìn)入“Instant Payment Notification Preferences”,然后Edit,選中checkbox,填入notify_url地網(wǎng)址。
二、各頁(yè)面源碼
1.test.jsp
<%@ page language="java" import="java.util.*,cn.howie.util.*" pageEncoding="gbk"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'test.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<%
//對(duì)sessionID進(jìn)行加密和驗(yàn)證傳回來(lái)的加密碼比較
MD5Code md5 = new MD5Code();
String custom_Encrypt = md5.getMD5ofStr(session.getId());
%>
<body>
<form action="https://www." method="post">
<!-- 真實(shí)用 -->
<!-- <form action="https://www." method="post"> -->
<!-- 提交模式 -->
<input type="hidden" name="cmd" value="_xclick">
<!-- 商務(wù)網(wǎng)站的郵箱 -->
<input type="hidden" name="business" value="Seller_1210746445_biz@21cn.com">
<!-- 商品名稱 -->
<input type="hidden" name="item_name" value="productor-1">
<!-- 商品編號(hào) -->
<input type="hidden" name="item_number" value="productor-number">
<!-- 商品數(shù)量 -->
<input type="hidden" name="quantity" value="1">
<!-- 自定義用于加密-->
<input type="hidden" name="custom" value="<%=custom_Encrypt %>">
<!-- 商品價(jià)格 -->
<input type="hidden" name="amount" value="119.00">
<!-- 商品運(yùn)費(fèi) -->
<input type="hidden" name="shipping" value="2">
<!-- 貨幣類型 CNY:人民幣,USD:美元 -->
<input type="hidden" name="currency_code" value="USD">
<!-- 字符編碼 -->
<input type="hidden" name="charset" value="gb2312">
<!-- 取消后返回到的頁(yè)面 -->
<input type="hidden" name="cancel_return"
value="http://localhost/howie/fail.jsp">
<!-- 確認(rèn)以及驗(yàn)證頁(yè)面 -->
<input type="hidden" name="return"
value="http://localhost/howie/back.jsp">
<input type="submit" value="buy now">
</form>
</body>
</html>
2.back.jsp
<%@ page language="java" import="java.util.*,cn.howie.util.*" pageEncoding="gbk"%>
<%@ page import="java.net.*"%>
<%@ page import="java.io.*"%>
<%
//對(duì)sessionID進(jìn)行加密和驗(yàn)證傳回來(lái)的加密碼比較
MD5Code md5 = new MD5Code();
String custom_Encrypt = md5.getMD5ofStr(session.getId());
%>
<%
String str = "cmd=_notify-validate";
String validate = "";
Enumeration en = request.getParameterNames();
while (en.hasMoreElements()) {
String paramName = (String) en.nextElement();
String paramValue = request.getParameter(paramName);
if("custom".equals(paramName)) {
validate = paramValue;
}
str = str + "&" + paramName + "=" + URLEncoder.encode(paramValue);
}
URL url = new URL("https://www.");//測(cè)試用URL
//URL url = new URL("https://www.");//真是用URL
URLConnection uc = url.openConnection();
uc.setDoOutput(true);
uc.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
PrintWriter pw = new PrintWriter(uc.getOutputStream());
pw.println(str);
pw.close();
BufferedReader in = new BufferedReader(new InputStreamReader(uc
.getInputStream()));
String res = in.readLine();
in.close();
//out.println(str+"<br/>");
//out.println(res);
//out.println(session.getId());
if ("VERIFIED".equals(res) && custom_Encrypt.equals(validate) ) {
// 支付成功
out.println("successful");
// 加入數(shù)據(jù)庫(kù)的操作
}else if ("INVALID".equals(res)) {
// 支付失敗
out.println("fail");
} else {
// 支付錯(cuò)誤
out.println("error");
}
%>
3.cancel.jsp
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'test.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
Cancel !
</body>
</html>