package org.lot.lotfilter.action.web.user;
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.lot.lotfilter.action.web.LotFilterAction;
import org.lot.lotfilter.action.web.utils.MoNPlam;
import org.lot.lotfilter.common.Application;
import org.lot.lotfilter.common.core.ConfigureManager;
import org.lot.lotfilter.common.util.LotConfigConstants;
import org.lot.lotfilter.common.util.MD5;
import org.lot.lotfilter.entity.module.AllLotIssue;
import org.lot.lotfilter.entity.module.BetProject;
import org.lot.lotfilter.entity.module.ShopMaster;
import org.lot.lotfilter.entity.module.Userinfo;
import org.lot.lotfilter.service.issue.impl.AllLotIssueServiceImpl;
import org.lot.lotfilter.service.project.BetProjectService;
import org.lot.lotfilter.service.shop.impl.ShopMasterServiceImpl;
import org.lot.lotfilter.service.user.impl.UserinfoServiceImpl;
import org.xml.sax.InputSource;
@SuppressWarnings({ "rawtypes", "serial","unchecked" })
@Results({ @Result(name = "info", location = "user-send-result.jsp") })
public class SendTouZhuAction extends LotFilterAction {
@Resource(name = "betProjectService")
private BetProjectService betProjectService;
public String touZhu() {
BetProject betProject = this.getProject();
if (betProject == null) {
return "info";
}
this.buildXml(betProject);
return "info";
}
public String searchResult() {
BetProject betProject = this.getProject();
if (betProject == null) {
return "info";
}
MoNPlam monPlam = MoNPlam.getInStance();
List<String> list = this.getParameters(betProject.getSponsorId());
String body = "<queryticket id=\"" + betProject.getProjectId()
+ "\" gameid=\"" + betProject.getLotCode() + "\" issue=\""
+ betProject.getIssueId() + "\"/>";
// 查看投注之前 修改投注处理状态250
betProjectService.updateBetProject(betProject.getProjectId(),
betProject.getSponsorId(), "250");
message = monPlam.sendXml("105", list.get(0), body, list.get(1));
String xml = message.substring(message.indexOf("&msg=") + 5,
message.indexOf("</msg>") + 6);
// 判断message
String status = this.compile(xml);
betProjectService.updateBetProject(betProject.getProjectId(),
betProject.getSponsorId(), status);
return "info";
}
private BetProject getProject() {
super.initData();
String projectid = request.getParameter("projectId");
if ("".equals(projectid)) {
message = "投注的方案id【" + projectid + "】不能为空";
return null;
}
BetProject betProject = betProjectService.selectBetProject(Long
.parseLong(projectid));
if (betProject == null) {
message = "没有对应的方案【ID=" + projectid + "】投注信息";
return null;
}
return betProject;
}
private void buildXml(BetProject betProject) {
String gameid = String.valueOf(betProject.getLotCode());
String ticketsnum = String.valueOf(betProject.getTotalUnit());
String id = String.valueOf(betProject.getProjectId());
String multiple = String.valueOf(betProject.getMultiple());
String issue = this.getIssueCode(betProject.getIssueId());// 这个是需要传递code,不是id
String playtype = String.valueOf(betProject.getPlayId());
String ggtype = String.valueOf(betProject.getGgCode());// 待添加
String money = String.valueOf(betProject.getTotalAmount());
String addflag = String.valueOf(this.isAdd(gameid,
Integer.parseInt(playtype)));// 是否追加
String noteCount = String.valueOf(betProject.getNote());// 投注注数
String betway = String.valueOf("100");// 投注方式
String ball = String.valueOf(betProject.getBetNumber());
// String.valueOf(betProject.getSponsorId());//这个需要修改
List<String> list = this.getParameters(betProject.getSponsorId());
String partnerid = list.get(0);
String body = "<ticketorder gameid=\"" + gameid + "\" ticketsnum=\""
+ ticketsnum + "\" province=\"\"><tickets>" + "<ticket id=\""
+ id + "\" multiple=\"" + multiple + "\" issue=\"" + issue
+ "\" " + "playtype=\"" + playtype + "\" ggtype=\"" + ggtype
+ "\" money=\"" + money + "\" addflag=\"" + addflag
+ "\" noteCount=\"" + noteCount + "\" " + "betway=\"" + betway
+ "\"><ball>" + ball + "</ball></ticket>"
+ "</tickets></ticketorder> ";
String transcode = "104";// 直接调用投注接口
String key = list.get(1);
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<msg><head transcode=\"" + transcode + "\" partnerid=\""
+ partnerid + "\" version=\"2.0\" time=\"20130808103728\"/>"
+ "<body>";
String url = ConfigureManager.getProperties("lot.ticket.api.url");
// 发送投注之前 修改投注处理状态100
betProjectService.updateBetProject(Long.parseLong(id),
betProject.getSponsorId(), "100");
this.sendRequest(header, body, url, transcode, partnerid, key,
Long.parseLong(id), betProject.getSponsorId());
}
private void sendRequest(String header, String body, String url,
String transcode, String partnerid, String key, long projectid,
long userid) {
String msg = header + body + "</body></msg>";
HttpClient httpclient = new HttpClient();
HttpConnectionManagerParams httpParams = httpclient
.getHttpConnectionManager().getParams();
// 设置连接超时时间(单位毫秒)
// httpParams.setConnectionTimeout(CONNECTION_TIME_OUT);
// 设置读数据超时时间(单位毫秒)
httpParams.setSoTimeout(40000);
// post请求
PostMethod postmethod = new PostMethod(url);
postmethod.addRequestHeader("Connection", "Keep-Alive");
postmethod.getParams().setContentCharset("utf-8");
try {
NameValuePair[] postData = new NameValuePair[5];
postData[0] = new NameValuePair("partnerid", partnerid);
postData[1] = new NameValuePair("transcode", transcode);
postData[2] = new NameValuePair("version", "2.0");
String pakey = MD5.encrypt(transcode + msg + key).toUpperCase();
postData[3] = new NameValuePair("key", pakey);
postData[4] = new NameValuePair("msg", msg);
postmethod.addParameters(postData);
String data = "transcode=" + transcode + "&msg=" + msg + "&key="
+ pakey + "&partnerid=" + partnerid;
System.out.println("发送数据::" + data);
int sendStatus = 0;
sendStatus = httpclient.executeMethod(postmethod);
if (sendStatus != HttpStatus.SC_OK) {
// throw new
// Exception("HttpClient.executeMethod response statusCode not correct!");
}
// 发送投注之后 修改投注处理状态200
betProjectService.updateBetProject(projectid, userid, "200");
System.out.println("接收数据:" + postmethod.getResponseBodyAsString());
message = postmethod.getResponseBodyAsString();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放
postmethod.releaseConnection();
}
}
// 获取用户 和 用户私钥
private List<String> getParameters(Long userId) {
List<String> list = new ArrayList<String>();
UserinfoServiceImpl userServ = (UserinfoServiceImpl) Application.get()
.getContext().getBean("userinfoService");
Userinfo userinfo = userServ.getUser(userId);
if (userinfo != null) {
list.add(userinfo.getUserName());
ShopMasterServiceImpl shopMasterServ = (ShopMasterServiceImpl) Application
.get().getContext().getBean("shopMasterService");
ShopMaster shopmaster = shopMasterServ.getShopMaster(userinfo
.getShopMasterId());
list.add(shopmaster.getPrikey());
}
return list;
}
// 判断是否追加
private String isAdd(String gameid, int playid) {
if (LotConfigConstants.DLT_PLAY_ADD == playid
|| LotConfigConstants.DLT_PLAY_DANTUO_ADD == playid) {
return "1";
} else {
return "0";
}
}
private String getIssueCode(long issueid) {
AllLotIssueServiceImpl issueServ = (AllLotIssueServiceImpl) Application
.get().getContext().getBean("allLotIssueService");
AllLotIssue alllotIssue = issueServ.getIssueId(issueid);
if (alllotIssue != null) {
return alllotIssue.getIssueCode();
}
return String.valueOf(issueid);
}
private String compile(String xmlStr) {
try {
// 创建一个新的字符串
StringReader read = new StringReader(xmlStr);
// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(read);
// 创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder(false);
// 通过输入源构造一个Document
Document doc = sb.build(source);
Element root = doc.getRootElement();
Element body = root.getChild("body");
Element result = body.getChild("ticketresult");
String code = result.getAttributeValue("statuscode");
if (code.equals("9015") || code.equals("0003")) {
return "-100"; // 订单不存在或者交易失败
} else if (code.equals("0002")) {
return "300"; // 交易成功
} else if (code.equals("0005")) {
return "250"; // 部分成功
} else if (code.equals("0000")) {
return "250"; // 交易中
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "0";
}
}
import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.lot.lotfilter.action.web.LotFilterAction;
import org.lot.lotfilter.action.web.utils.MoNPlam;
import org.lot.lotfilter.common.Application;
import org.lot.lotfilter.common.core.ConfigureManager;
import org.lot.lotfilter.common.util.LotConfigConstants;
import org.lot.lotfilter.common.util.MD5;
import org.lot.lotfilter.entity.module.AllLotIssue;
import org.lot.lotfilter.entity.module.BetProject;
import org.lot.lotfilter.entity.module.ShopMaster;
import org.lot.lotfilter.entity.module.Userinfo;
import org.lot.lotfilter.service.issue.impl.AllLotIssueServiceImpl;
import org.lot.lotfilter.service.project.BetProjectService;
import org.lot.lotfilter.service.shop.impl.ShopMasterServiceImpl;
import org.lot.lotfilter.service.user.impl.UserinfoServiceImpl;
import org.xml.sax.InputSource;
@SuppressWarnings({ "rawtypes", "serial","unchecked" })
@Results({ @Result(name = "info", location = "user-send-result.jsp") })
public class SendTouZhuAction extends LotFilterAction {
@Resource(name = "betProjectService")
private BetProjectService betProjectService;
public String touZhu() {
BetProject betProject = this.getProject();
if (betProject == null) {
return "info";
}
this.buildXml(betProject);
return "info";
}
public String searchResult() {
BetProject betProject = this.getProject();
if (betProject == null) {
return "info";
}
MoNPlam monPlam = MoNPlam.getInStance();
List<String> list = this.getParameters(betProject.getSponsorId());
String body = "<queryticket id=\"" + betProject.getProjectId()
+ "\" gameid=\"" + betProject.getLotCode() + "\" issue=\""
+ betProject.getIssueId() + "\"/>";
// 查看投注之前 修改投注处理状态250
betProjectService.updateBetProject(betProject.getProjectId(),
betProject.getSponsorId(), "250");
message = monPlam.sendXml("105", list.get(0), body, list.get(1));
String xml = message.substring(message.indexOf("&msg=") + 5,
message.indexOf("</msg>") + 6);
// 判断message
String status = this.compile(xml);
betProjectService.updateBetProject(betProject.getProjectId(),
betProject.getSponsorId(), status);
return "info";
}
private BetProject getProject() {
super.initData();
String projectid = request.getParameter("projectId");
if ("".equals(projectid)) {
message = "投注的方案id【" + projectid + "】不能为空";
return null;
}
BetProject betProject = betProjectService.selectBetProject(Long
.parseLong(projectid));
if (betProject == null) {
message = "没有对应的方案【ID=" + projectid + "】投注信息";
return null;
}
return betProject;
}
private void buildXml(BetProject betProject) {
String gameid = String.valueOf(betProject.getLotCode());
String ticketsnum = String.valueOf(betProject.getTotalUnit());
String id = String.valueOf(betProject.getProjectId());
String multiple = String.valueOf(betProject.getMultiple());
String issue = this.getIssueCode(betProject.getIssueId());// 这个是需要传递code,不是id
String playtype = String.valueOf(betProject.getPlayId());
String ggtype = String.valueOf(betProject.getGgCode());// 待添加
String money = String.valueOf(betProject.getTotalAmount());
String addflag = String.valueOf(this.isAdd(gameid,
Integer.parseInt(playtype)));// 是否追加
String noteCount = String.valueOf(betProject.getNote());// 投注注数
String betway = String.valueOf("100");// 投注方式
String ball = String.valueOf(betProject.getBetNumber());
// String.valueOf(betProject.getSponsorId());//这个需要修改
List<String> list = this.getParameters(betProject.getSponsorId());
String partnerid = list.get(0);
String body = "<ticketorder gameid=\"" + gameid + "\" ticketsnum=\""
+ ticketsnum + "\" province=\"\"><tickets>" + "<ticket id=\""
+ id + "\" multiple=\"" + multiple + "\" issue=\"" + issue
+ "\" " + "playtype=\"" + playtype + "\" ggtype=\"" + ggtype
+ "\" money=\"" + money + "\" addflag=\"" + addflag
+ "\" noteCount=\"" + noteCount + "\" " + "betway=\"" + betway
+ "\"><ball>" + ball + "</ball></ticket>"
+ "</tickets></ticketorder> ";
String transcode = "104";// 直接调用投注接口
String key = list.get(1);
String header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<msg><head transcode=\"" + transcode + "\" partnerid=\""
+ partnerid + "\" version=\"2.0\" time=\"20130808103728\"/>"
+ "<body>";
String url = ConfigureManager.getProperties("lot.ticket.api.url");
// 发送投注之前 修改投注处理状态100
betProjectService.updateBetProject(Long.parseLong(id),
betProject.getSponsorId(), "100");
this.sendRequest(header, body, url, transcode, partnerid, key,
Long.parseLong(id), betProject.getSponsorId());
}
private void sendRequest(String header, String body, String url,
String transcode, String partnerid, String key, long projectid,
long userid) {
String msg = header + body + "</body></msg>";
HttpClient httpclient = new HttpClient();
HttpConnectionManagerParams httpParams = httpclient
.getHttpConnectionManager().getParams();
// 设置连接超时时间(单位毫秒)
// httpParams.setConnectionTimeout(CONNECTION_TIME_OUT);
// 设置读数据超时时间(单位毫秒)
httpParams.setSoTimeout(40000);
// post请求
PostMethod postmethod = new PostMethod(url);
postmethod.addRequestHeader("Connection", "Keep-Alive");
postmethod.getParams().setContentCharset("utf-8");
try {
NameValuePair[] postData = new NameValuePair[5];
postData[0] = new NameValuePair("partnerid", partnerid);
postData[1] = new NameValuePair("transcode", transcode);
postData[2] = new NameValuePair("version", "2.0");
String pakey = MD5.encrypt(transcode + msg + key).toUpperCase();
postData[3] = new NameValuePair("key", pakey);
postData[4] = new NameValuePair("msg", msg);
postmethod.addParameters(postData);
String data = "transcode=" + transcode + "&msg=" + msg + "&key="
+ pakey + "&partnerid=" + partnerid;
System.out.println("发送数据::" + data);
int sendStatus = 0;
sendStatus = httpclient.executeMethod(postmethod);
if (sendStatus != HttpStatus.SC_OK) {
// throw new
// Exception("HttpClient.executeMethod response statusCode not correct!");
}
// 发送投注之后 修改投注处理状态200
betProjectService.updateBetProject(projectid, userid, "200");
System.out.println("接收数据:" + postmethod.getResponseBodyAsString());
message = postmethod.getResponseBodyAsString();
} catch (HttpException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放
postmethod.releaseConnection();
}
}
// 获取用户 和 用户私钥
private List<String> getParameters(Long userId) {
List<String> list = new ArrayList<String>();
UserinfoServiceImpl userServ = (UserinfoServiceImpl) Application.get()
.getContext().getBean("userinfoService");
Userinfo userinfo = userServ.getUser(userId);
if (userinfo != null) {
list.add(userinfo.getUserName());
ShopMasterServiceImpl shopMasterServ = (ShopMasterServiceImpl) Application
.get().getContext().getBean("shopMasterService");
ShopMaster shopmaster = shopMasterServ.getShopMaster(userinfo
.getShopMasterId());
list.add(shopmaster.getPrikey());
}
return list;
}
// 判断是否追加
private String isAdd(String gameid, int playid) {
if (LotConfigConstants.DLT_PLAY_ADD == playid
|| LotConfigConstants.DLT_PLAY_DANTUO_ADD == playid) {
return "1";
} else {
return "0";
}
}
private String getIssueCode(long issueid) {
AllLotIssueServiceImpl issueServ = (AllLotIssueServiceImpl) Application
.get().getContext().getBean("allLotIssueService");
AllLotIssue alllotIssue = issueServ.getIssueId(issueid);
if (alllotIssue != null) {
return alllotIssue.getIssueCode();
}
return String.valueOf(issueid);
}
private String compile(String xmlStr) {
try {
// 创建一个新的字符串
StringReader read = new StringReader(xmlStr);
// 创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入
InputSource source = new InputSource(read);
// 创建一个新的SAXBuilder
SAXBuilder sb = new SAXBuilder(false);
// 通过输入源构造一个Document
Document doc = sb.build(source);
Element root = doc.getRootElement();
Element body = root.getChild("body");
Element result = body.getChild("ticketresult");
String code = result.getAttributeValue("statuscode");
if (code.equals("9015") || code.equals("0003")) {
return "-100"; // 订单不存在或者交易失败
} else if (code.equals("0002")) {
return "300"; // 交易成功
} else if (code.equals("0005")) {
return "250"; // 部分成功
} else if (code.equals("0000")) {
return "250"; // 交易中
}
} catch (JDOMException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return "0";
}
}