最近剛開始接觸移動支付(移動支付項目組),對於業務流程還不是很清楚,今天整了一天的渠道接口demo,對其中有些流程和問題有了更深入的
理解。這個demo是高陽點卡的網關接入接口,大體流程如下:
然後是高陽提供的demo,裏面有三個jsp文件,一個md5加密文件夾(裏面是md5的相關加密java類),首先是Sctest.jsp文件,裏面有一些相關的卡信息
(注意這裏千萬不能寫錯,比如商戶代碼,後臺通知url,pmid--支付方式,pcid--支付通道,卡號是沒有加密的,在jsp裏面實現加密,密碼也是沒有後加密的
也是在jsp裏面實現加密),代碼如下:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.text.*"%>
<%@ page import="java.util.*"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>接口1,發送訂單</title>
</head>
<%
String randomcode = ""+(int)(100000*Math.random()); //隨機數
String version_id = "2.00"; //版本號
String merchant_id = "MX_TEST"; //商戶ID, 分配的商戶ID號
String order_date="20061101"; //格式yyyyMMdd
String order_id =randomcode; //商戶訂單號,不要隨意填寫
String amount = "0.01"; //訂單金額
String currency = "RMB"; //大寫RMB
String notify_url = ""; //返回URL,支付完成後通知此地址結果
String pm_id = ""; //支付方式ID,非空
String pc_id = ""; //支付方式ID,非空
String order_pdesc = "商品描述"; //商品描述
String user_name = "孫燕姿"; //購買者用戶名
String user_phone = "03167907313"; //購買者電話
String user_mobile = "13722644881"; //購買者手機號
String user_email = "[email protected]"; //購買者郵件
String order_pname = "魔獸世界點卡"; //訂單商品,注:商品列表需向捷迅備份
String merchant_key = "123456789"; //商戶密鑰, 分配的商戶ID號,測試環境默認爲:123456789
String retmode = "1";
String cardnum1="";
String cardnum2="";
%>
<body>
<p>模擬商城訂單!</p>
<form action="process.jsp" method="post">
<table width="545" border="1">
<tr>
<td width="101">版本號</td>
<td width="175"><input type="text" name="version_id" value="<%=version_id %>"/></td>
<td width="73">商戶代碼</td>
<td width="168"><input type="text" name="merchant_id" value="<%=merchant_id %>"/></td>
</tr>
<tr>
<td>訂單日期</td>
<td><input type="text" name="order_date" value="<%=order_date %>"/></td>
<td>商戶訂單號</td>
<td><input type="text" name="order_id" value="<%=order_id%>"/></td>
</tr>
<tr>
<td>訂單金額</td>
<td><input type="text" name="amount" value="<%=amount%>"/></td>
<td>貨幣類型</td>
<td><input type="text" name="currency" value="<%=currency %>"/></td>
</tr>
<tr>
<td>後臺通知url</td>
<td><input type="text" name="notify_url" value="<%=notify_url %>"/></td>
<td>PMID</td>
<td>
<input type="text" name="pm_id" value="<%=pc_id %>"/>
</select>
</td>
</tr>
<tr>
<td>PCID</td>
<td>
<input type="text" name="pc_id" value="<%=pc_id %>"/>
</td>
<td>商品描述</td>
<td><input type="text" name="order_pdesc" value="<%=order_pdesc %>"/></td>
</tr>
<tr>
<td>訂貨人姓名</td>
<td><input type="text" name="user_name" value="<%=user_name %>"/></td>
<td>用戶電話</td>
<td><input type="text" name="user_phone" value="<%=user_phone %>"/></td>
</tr>
<tr>
<td>用戶手機號</td>
<td><input type="text" name="user_mobile" value="<%=user_mobile %>"/></td>
<td>用戶EMAIL</td>
<td><input type="text" name="user_email" value="<%=user_email %>"/></td>
</tr>
<tr>
<td></td>
<td><input type="hidden" name="verifystring" value="12v23s90cf4839g29s4"/></td>
<td>商品編碼</td>
<td><input type="text" name="order_pname" value="<%=order_pname %>"/></td>
</tr>
<tr>
<td>卡號</td>
<td><input type="text" name="cardnum1" value="<%=cardnum1 %>"/></td>
<td>select_amount</td>
<td><input type="text" name="select_amount" value="50"/></td>
</tr>
<tr>
<td>返回類型</td>
<td><input type="text" name="retmode" value="<%=retmode%>"/></td>
<td></td>
<td><input type="hidden" name="save_loginname" value=""/></td>
</tr>
<tr>
<td>密碼</td>
<td><input id="cardnum2" type="text" name="cardnum2" value="<%=cardnum2 %>"/></td>
<td colspan="2"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
<td></td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
注意jsp前面的導入也就是import,一定要導入正確,不然後面無法解析到正確的類,會報無法處理這種類型的錯誤,這個會將表單數據post到process.jsp,然後這個jsp通過
getparameter方法獲取到相應參數。然後由商戶對這些參數進行處理,處理完後再將‘Y’返回給高陽服務器就可以了,process.jsp如下:
這是生成的表單截圖
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page import="java.text.*"%>
<%@ page import="java.util.*,java.io.*"%>
<%@ page import="until.*"%>
<%
String version_id = request.getParameter("version_id");
String merchant_id = request.getParameter("merchant_id");
String order_date=request.getParameter("order_date");
String order_id =request.getParameter("order_id");
String amount = request.getParameter("amount");
String currency = request.getParameter("currency");
String pm_id = request.getParameter("pm_id");
String pc_id = request.getParameter("pc_id");
String order_pdesc = request.getParameter("order_pdesc");
String user_name = request.getParameter("user_name");
String user_phone = request.getParameter("user_phone");
String user_mobile =request.getParameter("user_mobile");
String user_email = request.getParameter("user_email");
String order_pname = request.getParameter("order_pname");
String cardnum1=request.getParameter("cardnum1");
String cardnum2=request.getParameter("cardnum2");
String select_amount=request.getParameter("select_amount");
String notify_url = request.getParameter("notify_url");
String url = "http://219.143.36.225/card/pgworder/orderdirect.do";
String key="123456789"; //需要修改爲商戶自己的密鑰
CipherUtil util = new CipherUtil();
cardnum1= util.encryptData(cardnum1,key);
cardnum2=util.encryptData(cardnum2,key);
String verifystring= "version_id="+version_id+"&merchant_id="+merchant_id+"&order_date="+order_date+"&order_id="+order_id+
"&amount="+amount+"¤cy="+currency+"&cardnum1="+cardnum1+"&cardnum2="+cardnum2+"&pm_id="+pm_id+
"&pc_id="+pc_id+"&merchant_key="+key; //商戶代碼源串
verifystring = KeyedDigestMD5.getKeyedDigest(verifystring,"");
String paramContent="version_id="+version_id+"&merchant_id="+merchant_id+"&order_date="+order_date+"&order_id="+order_id+
"&amount="+amount+"¤cy="+currency+"&cardnum1="+cardnum1+"&cardnum2="+cardnum2+"&pm_id="+pm_id+
"&pc_id="+pc_id+"&verifystring="+verifystring+"&order_pdesc="+order_pdesc+"&user_name="+user_name
+"&user_phone="+user_phone+"&user_email="+user_email+"&order_pname="+order_pname+"&select_amount="+select_amount+"¬ify_url="+notify_url;
StringBuffer responseMessage = null;
java.net.URLConnection connection = null;
java.net.URL reqUrl = null;
OutputStreamWriter reqOut = null;
InputStream in = null;
BufferedReader br = null;
String param = paramContent;
responseMessage = new StringBuffer();
reqUrl = new java.net.URL(url);
connection = reqUrl.openConnection();
connection.setDoOutput(true);
connection.setConnectTimeout(300*1000);
connection.setReadTimeout(300*1000);
reqOut = new OutputStreamWriter(connection.getOutputStream());
reqOut.write(paramContent);
reqOut.flush();
int charCount = -1;
in = connection.getInputStream();
br = new BufferedReader(new InputStreamReader(in,
"GBK"));
while ( (charCount = br.read()) != -1) {
responseMessage.append( (char) charCount);
}
in.close();
reqOut.close();
String res = responseMessage.toString();
System.out.println(res);
%>
<%=res%>
String url = "http://219.143.36.225/card/pgworder/orderdirect.do";
這個url地址是高陽測試服務器地址,前面表單裏面的數據傳到這個測試接口地址,和高陽的接口進行比對,打印出res,就是高陽返回給商戶服務器的信息,就可以了
<?xml version="1.0" encoding="ISO-8859-1"?><response><version_id>2.00</version_id><merchant_id>220291</merchant_id><verifystring>514ee104b33d1f120e6f9237b6389e81</verifystring><order_date>20061101</order_date><order_id>95607</order_id><amount>0.01</amount><currency>RMB</currency><pay_sq></pay_sq><pay_date></pay_date><pc_id>DXJFK00010001</pc_id><pm_id></pm_id><result>F</result><resultstr>10016</resultstr></response>
這就是服務器端接收到的支付信息,10016意思就是支付已成功,不需要重複提交(這裏之前已經提交過了,所以會出現這個狀態碼)