`
JavaStudyEye
  • 浏览: 80637 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

come!教你如何搞定易宝 ePos

阅读更多
ePos 是易宝提供的一个接口,可以实现快速网上交易,它和在线支付由很多不同。
最近在做,所以写了些心得,供大家和自己参考。



背景:

流程 reqInput.jsp --> web.xml -->action -->易宝接口代码-->易宝官方服务器 --> callback.jsp
其中:reqInput.jsp的所有编码格式为 utf-8 ,
     web.xml中的编码格式是 utf-8,(我们是配置的spring过滤器CharacterEncodingFilter)
     
callback.jsp为utf-8 ,注意一定要用外网ip可以访问到的自己的项目中的页面


值的注意的地方:


1、返回网址的问题,一定要用外网。
2、中文乱码的问题,我在下面有提到
3、返回success的方法
4、p8_URL可以是点do地址,也可以是jsp页面



如何返回success呢

有几种方案,这里我只说两种方案:

1、第一种(适用于 返回地址 为 .do的情况):
		
try {
response.getWriter().write("success<br>");
return;
} catch (IOException e) {
e.printStackTrace();
}

说明:这种方式的返回一定要注意,return,并且要写在方法的最后面,因为不return的话,系统会持续的发送 success流。


2、第二种(适用于 返回地址 为 jsp等页面的情况):
  就是 callback页面中的 out.println("success"); 

说明一下:第二种方式是易宝的demo用的方式,在callback页面中你可以嵌入自己的代码,等待易宝返回,易宝异步返回的时间大概是2分钟左右
我测试的时间如下:
Wed Oct 13 13:04:53 GMT 2010updateEpos_success
Wed Oct 13 13:06:10 GMT 2010cellCenter epos return.........




中文乱码的问题

相信重构ePos的同志们,都会遇到吧,易宝要求的是 GBK或者GB2312,我这里有几种解决方案,但是在写解决方案之前,我们要理清ePos的一个简单流程:页面-->Action-->ePos源码,这样就很容易测试是哪里的问题了:


1、第一种(这里只提供提示,这种不一定真正解决问题,主要看第二种):
页面中压缩一次(ps:网上有的说可以压缩两次),action中解压一次,那么如何实现呢,看代码
页面代码:
		
<script type="text/javascript">
function verify() {
alert($("#buyName").val());
var url = "userCenter/summitmsg!subDateToYee.do?p5_Pid=" + encodeURI($("#rName").val()) 
+ "&pf_BuyerName=" + encodeURI($("#buyName").val());
}
</script>


这个页面的form,我只提供了需要的部分,如下:

<form id="fom1" onsubmit="verify()"  action="userCenter/summitmsg!subDateToYee.do" method="post">
<input id="rName" type="hidden" name="p5_Pid" value="">
<input id="buyName" type="hidden" name="pf_BuyerName" value="" >


action类中的代码:
URLEncoder.encode(request.getParameter("p5_Pid"), "GBK")



说一下这段代码,
userCenter/summitmsg!subDateToYee.do 这一句是指form中的action所指向的action地址,后面的问号不说了,p5_Pid是商品名称,它是中文的所以需要编码, 在javaScript中先通过id得到需要转码的标签的id,通过id拿到相应的值,然后用encodeURI()方法编码(ps: 关于这个方法大家可以查一下:http://www.w3school.com.cn/js/jsref_encodeURI.asp),关于Action类中的方法,大家查一下 javaAPI吧。


第二种(我自己的终极解决方案(修改了ePos源码)):
说明:ePos最终会得到一个url串,然后用url ,getConnection的方法提交到易宝去,格式如:www.xxx.action?参数1=值&参数2=值....  值的注意的是ProcessUtil类,这个类是通过key得到值的实现类,易宝首先得到form表单中的所有name值,然后再这个类里面通过形如:request.getParameter("p5_Pid")的方式拿到值。

OK!关键地方来了,在这个类中有一个方法是:
public static Map processParameterMap(HttpServletRequest request, String serverCharsetName, String pageCharsetName)

易宝将这个方法称为:“将HttpServletRequest传入获得所有参数与参数值Map的方法”,这个方法中有一句话(重要,吗的 我试了好多次,才知道是这里,晕,革命尚未成功,同志仍需努力):
value = new String(value.getBytes(serverCharsetName), pageCharsetName);

注意两个参数 serverCharsetName 和 pageCharsetName,在ServerInfo.java类中将这两个参数已经写好了,serverCharsetName 的值是 iso-8859-1 ,pageCharsetName的值是GBK,对了,你没有看错,第二个参数就是易宝最终要的编码格式。问题就出在这句话里面。一般情况下,UTF 转GBK中间是经过一道程序的那就是 UTF--》iso-8859-1---》GBK,但是,我的解决方式如下:
value = new String(value.getBytes(), pageCharsetName);

将第一个参数去掉,在运行程序,易宝账号中查看ePos账单没有问题,


但易宝返回的时候是有问题的


这是因为易宝返回的时候会调用这个processParameterMap()方法,而且易宝默认的会找到 value = new String(value.getBytes(serverCharsetName), pageCharsetName); 这一句话,也就是:value = new String(value.getBytes(iso-8859-1), "gbk");   因为我已经将这句话的第一个参数改为没有参数了,即
value = new String(value.getBytes(), pageCharsetName);
这样的话,易宝找不到它想要的那句话,就返回失败了,所以问题又来了,易宝返回乱码!

我的解决方案是:提交的时候用 value=new String(value.getBytes(), "GBK")
返回的时候 用  value=new String(value.getBytes("iso-8859-1"), "GBK");

看我修改过的易宝Process类的代码(只展示修改的部分)
public class ProcessUtil {
  private static int i = 0;//记录方法调用次数
  
  // 将HttpServletRequest传入获得所有参数与参数值Map的方法
  public static Map processParameterMap(HttpServletRequest request, String serverCharsetName, String pageCharsetName){
    final Map returnMap = new HashMap();
    String key = "";
    String value = "";
    Enumeration names = request.getParameterNames();
    while(names.hasMoreElements()){
      key = (String)names.nextElement();
      value = request.getParameter(key);
      try {
        if(i == 0) {
	      value = new String(value.getBytes(), pageCharsetName);
	      System.out.println("i为1的时候;" + value);
        } else {
	      value = new String(value.getBytes(serverCharsetName),  pageCharsetName);
	      System.out.println("i为"+i+"的时候;" + value);
        }
      } catch (UnsupportedEncodingException uee) {
	uee.printStackTrace();
      }
       returnMap.put(key, value);
	}
    //此处要注意
    i++;
    return returnMap;
 }
}



之后,我们有两种方式来设置i的值(重点看 第二种方式):

1、我们易宝成功返回后我们在action类中可以将 i 值 重新设置为 0,提交失败后也要将 i 值重新设置为0;
2、或者当提交的时候将i设置为0,回调的时候将i的值设置为1;

不然会出现乱码,原理如上文咯。




网站有关易宝支付ePos的文章很少,我只是写出自己的想法供后来人分享,谢谢大家!同时欢迎大家讨论!



分享到:
评论
5 楼 JavaStudyEye 2011-01-23  
JavaStudyEye 写道
xnz8611 写道
你好,请教你下关于易宝支付的问题。为什么易宝异步服务器点对点的通讯总是回不来呢?

不好意思啊,才看到, 易宝点对点通讯后,回不来的原因可能有如下几种:
1、权限过滤,如果你的项目中有 filter过滤的话,建议关注一下。
2、中文乱码,由于提交到易宝后,出错了,导致未收到回调
3、回调的地址可能没有 映射到外网
仅供参考啊,最后和易宝客服联调一下,看看具体原因,不过多半是自己的原因啊

xnz8611 写道
JavaStudyEye 写道
xnz8611 写道
你好,请教你下关于易宝支付的问题。为什么易宝异步服务器点对点的通讯总是回不来呢?

不好意思啊,才看到, 易宝点对点通讯后,回不来的原因可能有如下几种:
1、权限过滤,如果你的项目中有 filter过滤的话,建议关注一下。
2、中文乱码,由于提交到易宝后,出错了,导致未收到回调
3、回调的地址可能没有 映射到外网
仅供参考啊,最后和易宝客服联调一下,看看具体原因,不过多半是自己的原因啊

谢谢。有些细节还是需要请教下。方便加我msn吗?xnz8611@hotmail.com


sorry 我点电脑没有装msn。一直都用qq 呵呵
4 楼 xnz8611 2011-01-23  
JavaStudyEye 写道
xnz8611 写道
你好,请教你下关于易宝支付的问题。为什么易宝异步服务器点对点的通讯总是回不来呢?

不好意思啊,才看到, 易宝点对点通讯后,回不来的原因可能有如下几种:
1、权限过滤,如果你的项目中有 filter过滤的话,建议关注一下。
2、中文乱码,由于提交到易宝后,出错了,导致未收到回调
3、回调的地址可能没有 映射到外网
仅供参考啊,最后和易宝客服联调一下,看看具体原因,不过多半是自己的原因啊

谢谢。有些细节还是需要请教下。方便加我msn吗?xnz8611@hotmail.com
3 楼 JavaStudyEye 2011-01-20  
xnz8611 写道
你好,请教你下关于易宝支付的问题。为什么易宝异步服务器点对点的通讯总是回不来呢?

不好意思啊,才看到, 易宝点对点通讯后,回不来的原因可能有如下几种:
1、权限过滤,如果你的项目中有 filter过滤的话,建议关注一下。
2、中文乱码,由于提交到易宝后,出错了,导致未收到回调
3、回调的地址可能没有 映射到外网
仅供参考啊,最后和易宝客服联调一下,看看具体原因,不过多半是自己的原因啊
2 楼 xnz8611 2011-01-20  
你好,请教你下关于易宝支付的问题。为什么易宝异步服务器点对点的通讯总是回不来呢?
1 楼 JavaStudyEye 2010-10-13  
今天我更新了一下我的文章,上次写的,个人认为不是很好,
最后祝福大家!然后自己顶个! 呵呵

相关推荐

    java项目加入易宝支付功能

    易宝支付处理完支付请求后,会回调预先设置的商户回调地址,通知你的系统支付结果。 5. **处理回调**: 商户需要监听这个回调地址,接收到易宝支付的异步通知后,验证签名,确认支付状态(成功、失败、已退款等),...

    易宝在线支付接口文档

    易宝 支付 文档 易宝支付 易宝支付文档 易宝在线支付接口文档

    易宝支付demo示例(易宝基础产品V1.07)

    易宝支付是一款在中国广泛应用的第三方支付平台,提供各种支付解决方案和服务。"易宝支付demo示例(易宝基础产品V1.07)"是该平台为开发者提供的一个演示项目,帮助开发者理解并实现与易宝支付系统的接口集成。在这个V...

    易宝接入开发接口

    易宝接入开发接口是针对开发者提供的技术平台,用于与易宝支付系统进行交互,实现在线支付、订单管理、退款处理等功能。在这个过程中,开发者需要熟悉易宝支付的API规范,理解其请求和响应的格式,以及如何在自己的...

    PHP第三方支付易宝支付最新sdk包,其中包含回调。

    易宝支付作为国内知名的第三方支付平台,提供了一系列API和服务,帮助开发者轻松集成支付功能到自己的网站或应用程序中。本文将详细介绍PHP对接易宝支付的SDK,以及如何利用这个最新版本的SDK进行调用支付和处理回调...

    易宝php接口sdk

    易宝支付,又称为YeePay,是中国领先的第三方支付平台,提供各种支付解决方案,包括在线支付、移动支付、扫码支付等。通过使用易宝PHP接口SDK,开发者可以方便地实现与易宝支付系统的交互,进行订单创建、支付处理、...

    易宝支付PHP 版示例

    易宝支付(Yeepay)是中国的一家第三方支付平台,为商家提供安全、便捷的在线支付解决方案。在PHP环境中集成易宝支付,主要是通过API接口与易宝支付服务器进行通信,实现用户支付功能。以下是对易宝支付PHP版示例的...

    易宝支付产品通用接口

    易宝支付作为国内知名的第三方支付平台,其产品通用接口为开发者和商家提供了便捷的支付解决方案。这个接口旨在简化支付流程,提升用户体验,并确保交易的安全性。以下是对"易宝支付产品通用接口"及相关资料的详细...

    易宝支付接口调用和易宝支付开发文档

    易宝支付作为国内知名的第三方支付平台,为商家提供了一系列的支付接口和服务,使得开发者能够方便地集成支付功能到自己的系统中。这篇文档将详细介绍易宝支付接口调用和开发过程,帮助开发者理解如何将易宝支付功能...

    易宝软件培训,软件的开发过程。详细的过程教程

    易宝软件培训,软件的开发过程。详细的过程教程

    易宝支付ios类文件

    易宝支付是知名的第三方支付平台,为商家提供便捷的在线支付解决方案。在iOS平台上,开发者需要集成易宝支付的相关SDK和服务来实现应用内的支付功能。本文将深入探讨易宝支付在iOS开发中的实现细节,包括POST请求...

    易宝环迅充值接口

    "易宝环迅充值接口"是一个用于集成易宝支付(Yeepay)和环迅支付(IPS)两大在线支付平台的API解决方案。这个系统设计的主要目的是简化网站与这两个支付渠道的整合过程,允许开发者通过修改配置文件即可实现支付功能...

    EPcenter1.0盛大易宝驱动

    盛大易宝驱动是一款专为盛大易宝设备设计的软件组件,它主要负责设备与计算机之间的通信,确保用户能够顺利地通过计算机控制易宝设备。在本文中,我们将深入探讨这款驱动的重要性和工作原理,以及如何安装和使用。 ...

    易宝支付相关资料

    易宝支付,作为中国领先的第三方支付平台,为商家和消费者提供了便捷、安全的在线支付解决方案。这份"易宝支付相关资料"的压缩包文件包含了关于使用易宝支付平台的重要信息,包括封装的工具类和使用示例,对于开发者...

    易宝支付的最新接口文档

    易宝支付,作为国内知名的第三方支付平台,提供了一系列的支付接口和服务,帮助企业快速集成支付功能。这份最新的接口文档是开发者进行易宝支付集成的重要参考资料,它涵盖了从基础的支付请求到复杂的交易管理等一...

    易宝对接案例

    易宝对接案例主要涉及到的是网上银行与第三方支付平台——易宝支付的集成技术。易宝支付作为国内知名的在线支付解决方案提供商,为商家提供了一系列的支付接口,以满足不同开发环境和语言的需求。在这个案例中,我们...

    易宝支付文档及demo

    易宝支付是中国领先的独立第三方支付平台,为各类企业和个人提供安全、便捷的在线支付解决方案。在"易宝支付文档及demo"中,我们主要关注的是如何集成和使用易宝支付的服务,尤其是通过收银台接口进行交易处理。下面...

    盛大易宝遥控器驱动

    盛大易宝遥控器驱动是一款专为盛大易宝设备设计的硬件驱动程序,它使得用户可以通过易宝设备作为空中鼠标来操控电脑,极大地提升了用户的交互体验,尤其适合在演示、教学或者娱乐场景下使用。这款驱动的最新版本无需...

    易宝支付通用接口例子

    易宝支付,作为中国领先的第三方支付平台,提供了一系列的支付接口,使得商家能够方便地集成在线...无论你选择哪种开发语言,都需深入了解易宝支付的接口规范,结合具体业务场景进行适配,确保支付流程的顺畅和安全。

    MyEZPod盛大易宝遥控驱动

    《MyEZPod盛大易宝遥控驱动详解》 在数字化家居的潮流中,遥控设备的智能化与个性化成为了一种趋势。"MyEZPod盛大易宝遥控驱动"便是这样一款旨在提升用户体验,实现遥控器功能定制化的软件。这款驱动程序允许用户...

Global site tag (gtag.js) - Google Analytics