使用SoapHeader实现Soap请求验证 本帖最后由 ron_xin 于 2014-11-07 10:00:52 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 错误信息显示https://202.82.66.148:8443/ptms4541/ws/CksServices 是非法的期望是 http://ws.service.gen.cks.com/将 uri 改为 http://ws.service.gen.cks.com/ 后会有 err_code00005 错,不是很清楚纠正几处数据格式错误:pwd 登录密码 是 String MD5(account+MD5(pwd)+ timestamp) 需要大写你写作 $pwd2 =strtoupper(MD5($account+MD5($pwd)+ $timestamp));正确的写法是 $pwd2 =strtoupper(MD5($account . MD5($pwd) . $timestamp));timestamp 时间戳 是 string yyyyMMddHHmm你写作 $timestamp =date('yyyyMMddHHmm',time());正确的写法是 $timestamp =date('YmdHm', time());当给 getAirLine 方法加上参数,会有Unmarshalling Error: 意外的元素 (uri:"", local:"param0")。所需元素为(none) SoapFault Object显然已能进入了能力有限,只能分析到这里了 异常代码对照err_code00001=用戶為空err_code00002=密碼不匹配err_code00003=系統中無此用戶err_code00004=密碼為空err_code00005=用戶驗證失敗err_code00006=worksite不能為空err_code00007=IP驗證失敗err_code00008=discount不適用于此worksiteerr_code00009=此worksite不包含任何discounterr_code01001=可用航線信息為空err_code01002=獲取可用航線信息失敗err_code01003=worksite傳遞錯誤err_code01011=當天未有該類型航班票務信息err_code01012=當天未有該類型航班票務去程信息err_code01013=當天未有該類型航班票務回程信息err_code01014=filterXml參數為空err_code01015=SAILDATE未填寫err_code01016=FROMPORTCODE未填寫err_code01017=TOPORTCODE未填寫err_code01019=discount_id傳遞錯誤err_code01020=ISROUNDTRIP未填寫err_code01021=LANG未填寫err_code01022=filterXml格式錯誤err_code01023=filterXml资料无法获取航班票务信息err_code01024=獲取航班票務信息失敗err_code01051=ticketsInfoXML參數為空err_code01052=ticketsInfoXML格式錯誤err_code01053=購票訂單提交失敗err_code01055=機場線和市區線不能在同在訂單下購票err_code01056=金珠線和珠江線不能在同在訂單下購票err_code01057=機場線不允許應用ETicket售票err_code01058=非會員,不符合ETicket售票err_code01059=超過會員限額,不符合ETicket售票err_code01060=乘客已購票,不符合ETicket售票err_code01061=按金不足err_code01063=不存在此臨時用戶err_code01064=獲取臨時用戶失敗err_code01065=鎖位失敗err_code01066=餘票不足,無法提交訂單err_code01067=無法鎖位err_code01068=獲取交易號失敗err_code01069=獲取票價記錄失敗err_code01070=鎖位數與傳入記錄數不符err_code01071=獲取港口公司失敗err_code01091=confirmXML參數為空err_code01092=confirmXML格式錯誤err_code01201=EMAIL未填寫err_code01202=REFNO未填寫err_code01203=ISETICKET未填寫err_code01204=ADDRESS未填寫err_code01205=SEATRANK_ID未填寫err_code01206=PRICE未填寫err_code01207=DETAILID未填寫err_code01208=VOYAGEROUTEID未填寫err_code01209=CLIENTTYPE未填寫err_code01210=PASSENGER未填寫err_code01211=PASSENGERID未填寫err_code01212=PAYMENT未填寫err_code01231=TRANSACTION_ID未填寫err_code01251=TRANSACTION_ID對應的臨時售票記錄不存在err_code01252=確認訂單失敗err_code01253=訂單確認成功,但返回XML失敗err_code02000=交易号不存在err_code02001=验证码不存在err_code02002=无效的日期err_code02003=闸口不能为空err_code03001= ticketXml參數為空err_code03002= 输入的Xml參數為空err_code99999=其它异常 IcksServices.javapackage com.cks.gen.service.ws;import java.util.List;import javax.jws.WebParam;import javax.jws.WebResult;import javax.jws.WebService;import org.apache.cxf.feature.Features;import org.apache.cxf.interceptor.Fault;@WebService@Features(features = "org.apache.cxf.feature.LoggingFeature")public interface IcksServices { /** * 測試驗證信息 * @throws Exception */ public void testAuthentication() throws Exception; /** * 获取可用航线信息 * @return */ public String getShippingLine() throws Exception; /** * 获取可用航班票务信息 * @param filterXml * @return */ public String getVoyage(@WebParam(name="filterXml")String filterXml) throws Exception; /** * 提交购票信息 * @param ticketsInfoXML * @return */ public String submitBooking(@WebParam(name="ticketsInfoXML")String ticketsInfoXML) throws Exception; /** * 确认订单信息 * @param confirmXML * @return */ public String confirmBooking(@WebParam(name="confirmXML")String confirmXML) throws Exception; } LocaleInterceptor.javapackage com.cks.gen.service.ws.interceptor;import java.util.List;import java.util.Locale;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import javax.xml.namespace.QName;import javax.xml.soap.SOAPException;import javax.xml.ws.WebServiceContext;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import org.apache.cxf.binding.soap.SoapHeader;import org.apache.cxf.binding.soap.SoapMessage;import org.apache.cxf.headers.Header;import org.apache.cxf.helpers.DOMUtils;import org.apache.cxf.interceptor.Fault;import org.apache.cxf.logging.FaultListener;import org.apache.cxf.message.Message;import org.apache.cxf.phase.AbstractPhaseInterceptor;import org.apache.cxf.phase.Phase;import org.apache.cxf.transport.http.AbstractHTTPDestination;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import com.cks.gen.service.ws.WsConst;import com.cks.ums.service.LoginService;import com.cks.util.security.encrypt.MD5;import com.cks.util.web.WebUtils;public class LocaleInterceptor extends AbstractPhaseInterceptor<SoapMessage> { private static final Log log = LogFactory.getLog(LocaleInterceptor.class); // private static String nameURI="https://localhost:8443/PTMSinterface/ws/CksServices"; private static String nameURI=""; private static String spName=""; private static String spPassword=""; private static String times=""; private static String site=""; private static String opt=""; public LocaleInterceptor(String nameURI,String spName,String spPassword,String times,String site,String opt) {// super(Phase.PRE_INVOKE);// System.out.println("handleMessage"); super(Phase.WRITE); this.nameURI=nameURI; this.spName=spName; this.spPassword=spPassword; this.times=times; this.site=site; this.opt=opt; } @Override public void handleMessage(SoapMessage message) throws Fault { // String spName="BillZou"; // String spPassword="elm"; // String times="201401200800";// String site="1112";// String opt=""; MD5 m = new MD5(); String pwa = m.getMD5ofStr(spPassword).toUpperCase(); String pwdau = m.getMD5ofStr(spName+pwa+times).toUpperCase(); QName qname=new QName("RequestSOAPHeader"); Document doc=DOMUtils.createDocument(); //自定义节点 Element account=doc.createElement("tns:account"); account.setTextContent(spName); //自定义节点 Element pwd=doc.createElement("tns:pwd"); pwd.setTextContent(pwdau); Element timestamp=doc.createElement("tns:timestamp"); timestamp.setTextContent(times); Element worksite=doc.createElement("tns:worksite"); worksite.setTextContent(site); Element discount_id=doc.createElement("tns:discount_id"); discount_id.setTextContent(opt); Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader"); root.appendChild(account); root.appendChild(pwd); root.appendChild(timestamp); root.appendChild(worksite); root.appendChild(discount_id); SoapHeader head=new SoapHeader(qname,root); List<Header> headers=message.getHeaders(); headers.add(head); System.out.println(">>>>>添加header<<<<<<<"); // HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);// HttpSession session = request.getSession();// try// {// if(session.getAttribute(WsConst.CUR_LOCALE) == null)// {// QName qname = new QName(WsConst.NAME_SPACE,WsConst.AUTH_HEADER,WsConst.AUTH_PREFIX);// SoapHeader header = (SoapHeader)message.getHeader(qname);// Element element = (Element)header.getObject();// // NodeList list = element.getElementsByTagNameNS(WsConst.NAME_SPACE, WsConst.TAG_LANGUAGE);// Node node = list.item(0);// String language = node.getFirstChild().getTextContent();// // list = element.getElementsByTagNameNS(WsConst.NAME_SPACE, WsConst.TAG_COUNTRY);// node = list.item(0);// String country = node.getFirstChild().getTextContent();// // if(country == null || "".equals(country))// {// Locale locale = new Locale(language);// session.setAttribute(WsConst.CUR_LOCALE, locale);// }// else// {// Locale locale = new Locale(language,country);// session.setAttribute(WsConst.CUR_LOCALE, locale);// }// }// }// catch(Exception e)// {// log.warn(e.getMessage(), e);// session.setAttribute(WsConst.CUR_LOCALE, request.getLocale());// } } @Override public void handleFault(SoapMessage message) { // TODO Auto-generated method stub super.handleFault(message); } public static void main(String[] args) { }} file()函数读取txt文件的内容出现乱码。 php 如何配置 使一些文件夹不能访问?? 想用soap写接口 PHP在windows下环境配置问题 求一个正则表达式 啊啊啊,到底该怎么办?! var $path="c:/1.xtx" 有没有直接用$path将1.txt打开的可能? 音乐下载的想法,不知道这么想对不对? 为什么会出现这样的错误?? PHP Appache配置 项目中的相对路径不对 swfupload 500错误 这个是什么加密,能解开吗?
https://202.82.66.148:8443/ptms4541/ws/CksServices 是非法的
期望是 http://ws.service.gen.cks.com/
将 uri 改为 http://ws.service.gen.cks.com/ 后
会有 err_code00005 错,不是很清楚纠正几处数据格式错误:
pwd 登录密码 是 String MD5(account+MD5(pwd)+ timestamp) 需要大写
你写作 $pwd2 =strtoupper(MD5($account+MD5($pwd)+ $timestamp));
正确的写法是 $pwd2 =strtoupper(MD5($account . MD5($pwd) . $timestamp));timestamp 时间戳 是 string yyyyMMddHHmm
你写作 $timestamp =date('yyyyMMddHHmm',time());
正确的写法是 $timestamp =date('YmdHm', time());当给 getAirLine 方法加上参数,会有
Unmarshalling Error: 意外的元素 (uri:"", local:"param0")。所需元素为(none) SoapFault Object
显然已能进入了能力有限,只能分析到这里了
err_code00001=用戶為空
err_code00002=密碼不匹配
err_code00003=系統中無此用戶
err_code00004=密碼為空
err_code00005=用戶驗證失敗
err_code00006=worksite不能為空
err_code00007=IP驗證失敗
err_code00008=discount不適用于此worksite
err_code00009=此worksite不包含任何discounterr_code01001=可用航線信息為空
err_code01002=獲取可用航線信息失敗
err_code01003=worksite傳遞錯誤err_code01011=當天未有該類型航班票務信息
err_code01012=當天未有該類型航班票務去程信息
err_code01013=當天未有該類型航班票務回程信息
err_code01014=filterXml參數為空
err_code01015=SAILDATE未填寫
err_code01016=FROMPORTCODE未填寫
err_code01017=TOPORTCODE未填寫
err_code01019=discount_id傳遞錯誤
err_code01020=ISROUNDTRIP未填寫
err_code01021=LANG未填寫
err_code01022=filterXml格式錯誤
err_code01023=filterXml资料无法获取航班票务信息
err_code01024=獲取航班票務信息失敗err_code01051=ticketsInfoXML參數為空
err_code01052=ticketsInfoXML格式錯誤
err_code01053=購票訂單提交失敗
err_code01055=機場線和市區線不能在同在訂單下購票
err_code01056=金珠線和珠江線不能在同在訂單下購票
err_code01057=機場線不允許應用ETicket售票
err_code01058=非會員,不符合ETicket售票
err_code01059=超過會員限額,不符合ETicket售票
err_code01060=乘客已購票,不符合ETicket售票
err_code01061=按金不足
err_code01063=不存在此臨時用戶
err_code01064=獲取臨時用戶失敗
err_code01065=鎖位失敗
err_code01066=餘票不足,無法提交訂單
err_code01067=無法鎖位
err_code01068=獲取交易號失敗
err_code01069=獲取票價記錄失敗
err_code01070=鎖位數與傳入記錄數不符
err_code01071=獲取港口公司失敗err_code01091=confirmXML參數為空
err_code01092=confirmXML格式錯誤err_code01201=EMAIL未填寫
err_code01202=REFNO未填寫
err_code01203=ISETICKET未填寫
err_code01204=ADDRESS未填寫
err_code01205=SEATRANK_ID未填寫
err_code01206=PRICE未填寫
err_code01207=DETAILID未填寫
err_code01208=VOYAGEROUTEID未填寫
err_code01209=CLIENTTYPE未填寫
err_code01210=PASSENGER未填寫
err_code01211=PASSENGERID未填寫
err_code01212=PAYMENT未填寫err_code01231=TRANSACTION_ID未填寫
err_code01251=TRANSACTION_ID對應的臨時售票記錄不存在
err_code01252=確認訂單失敗
err_code01253=訂單確認成功,但返回XML失敗
err_code02000=交易号不存在
err_code02001=验证码不存在
err_code02002=无效的日期
err_code02003=闸口不能为空err_code03001= ticketXml參數為空
err_code03002= 输入的Xml參數為空err_code99999=其它异常
import javax.jws.WebResult;
import javax.jws.WebService;import org.apache.cxf.feature.Features;
import org.apache.cxf.interceptor.Fault;@WebService
@Features(features = "org.apache.cxf.feature.LoggingFeature")
public interface IcksServices {
/**
* 測試驗證信息
* @throws Exception
*/
public void testAuthentication() throws Exception;
/**
* 获取可用航线信息
* @return
*/
public String getShippingLine() throws Exception;
/**
* 获取可用航班票务信息
* @param filterXml
* @return
*/
public String getVoyage(@WebParam(name="filterXml")String filterXml) throws Exception;
/**
* 提交购票信息
* @param ticketsInfoXML
* @return
*/
public String submitBooking(@WebParam(name="ticketsInfoXML")String ticketsInfoXML) throws Exception;
/**
* 确认订单信息
* @param confirmXML
* @return
*/
public String confirmBooking(@WebParam(name="confirmXML")String confirmXML) throws Exception;
}
package com.cks.gen.service.ws.interceptor;
import java.util.List;
import java.util.Locale;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.namespace.QName;
import javax.xml.soap.SOAPException;
import javax.xml.ws.WebServiceContext;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.logging.FaultListener;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;import com.cks.gen.service.ws.WsConst;
import com.cks.ums.service.LoginService;
import com.cks.util.security.encrypt.MD5;
import com.cks.util.web.WebUtils;public class LocaleInterceptor extends AbstractPhaseInterceptor<SoapMessage> {
private static final Log log = LogFactory.getLog(LocaleInterceptor.class);
// private static String nameURI="https://localhost:8443/PTMSinterface/ws/CksServices";
private static String nameURI="";
private static String spName="";
private static String spPassword="";
private static String times="";
private static String site="";
private static String opt="";
public LocaleInterceptor(String nameURI,String spName,String spPassword,String times,String site,String opt) {
// super(Phase.PRE_INVOKE);
// System.out.println("handleMessage");
super(Phase.WRITE);
this.nameURI=nameURI;
this.spName=spName;
this.spPassword=spPassword;
this.times=times;
this.site=site;
this.opt=opt;
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
// String spName="BillZou";
// String spPassword="elm";
// String times="201401200800";
// String site="1112";
// String opt="";
MD5 m = new MD5();
String pwa = m.getMD5ofStr(spPassword).toUpperCase();
String pwdau = m.getMD5ofStr(spName+pwa+times).toUpperCase(); QName qname=new QName("RequestSOAPHeader"); Document doc=DOMUtils.createDocument(); //自定义节点 Element account=doc.createElement("tns:account"); account.setTextContent(spName); //自定义节点 Element pwd=doc.createElement("tns:pwd"); pwd.setTextContent(pwdau); Element timestamp=doc.createElement("tns:timestamp"); timestamp.setTextContent(times); Element worksite=doc.createElement("tns:worksite"); worksite.setTextContent(site); Element discount_id=doc.createElement("tns:discount_id"); discount_id.setTextContent(opt); Element root=doc.createElementNS(nameURI, "tns:RequestSOAPHeader"); root.appendChild(account); root.appendChild(pwd);
root.appendChild(timestamp);
root.appendChild(worksite);
root.appendChild(discount_id); SoapHeader head=new SoapHeader(qname,root); List<Header> headers=message.getHeaders(); headers.add(head); System.out.println(">>>>>添加header<<<<<<<");
// HttpServletRequest request = (HttpServletRequest) message.get(AbstractHTTPDestination.HTTP_REQUEST);
// HttpSession session = request.getSession();
// try
// {
// if(session.getAttribute(WsConst.CUR_LOCALE) == null)
// {
// QName qname = new QName(WsConst.NAME_SPACE,WsConst.AUTH_HEADER,WsConst.AUTH_PREFIX);
// SoapHeader header = (SoapHeader)message.getHeader(qname);
// Element element = (Element)header.getObject();
//
// NodeList list = element.getElementsByTagNameNS(WsConst.NAME_SPACE, WsConst.TAG_LANGUAGE);
// Node node = list.item(0);
// String language = node.getFirstChild().getTextContent();
//
// list = element.getElementsByTagNameNS(WsConst.NAME_SPACE, WsConst.TAG_COUNTRY);
// node = list.item(0);
// String country = node.getFirstChild().getTextContent();
//
// if(country == null || "".equals(country))
// {
// Locale locale = new Locale(language);
// session.setAttribute(WsConst.CUR_LOCALE, locale);
// }
// else
// {
// Locale locale = new Locale(language,country);
// session.setAttribute(WsConst.CUR_LOCALE, locale);
// }
// }
// }
// catch(Exception e)
// {
// log.warn(e.getMessage(), e);
// session.setAttribute(WsConst.CUR_LOCALE, request.getLocale());
// }
}
@Override
public void handleFault(SoapMessage message) {
// TODO Auto-generated method stub
super.handleFault(message);
}
public static void main(String[] args)
{
}
}