技术笔录资料整理

翼支付网关接口开发-Web支付开发流程.

FavoriteLoadingAdd to favorites

        引言:写这篇文章之前,先回顾一下年初的“2015年中国(深圳)IT领袖峰会”,其中说到,现在正是从IT走向DT时代的阶段,也道出了IT和DT的区别(DT和IT时代区别,IT以我为中心,DT以别人为中心),不光是中国,海外也一样,都相信整个DT时代会慢慢到来,海外有趣的称之为“D经济”。

        支付的便捷明显对社会产生了很大的影响,已不可否认。

        博主也是刚接触“翼支付”不久,下面就翼支付中Web支付做一些介绍。

        首先看下,支付的流程:

 
      翼支付流程

        流程说明:用户在商户交易网站选择产品或服务,在下订单支付完成后,商户网站会将该订单号及对应订单金额等相关信息提交到翼支付网关,然后跳转到翼支付网关页面进行支付。当支付完成后,翼支付网关将支付结果返回商户,并且根据商户指定的地址跳转到商户指定页面。商户系统后台接收到支付结果之后,对数据库进行相应更新,然后在显示给用户的页面中作出相应提示。

        以上是官方提供的说明, 在此就不多言了,下面主要介绍如何去实现,这才是应该真正在意的。

        需要申明的是,博主的项目用的是Spring MVC,以下展示的代码都是基于该框架,如果使用其他框架或者非Java技术的,只需要看实现流程即可。 依照上面的流程,商户开发接口之前,前提是用户可以在商户交易网站上提交订单,不然就没有下面的支付操作了。  
 
一、准备

 

1. 商户注册签约

2. 下载用户操作文档和开发文档

3. 下载商户秘钥

4. 分析接口

 

二、开发

 

  • 前提假设

现“用户”已可以提交“订单”至“商户”的平台。

此订单中必须要包含的信息如下:订单号,订单请求交易流水号,订单总额,订单描述。其他的字段可依照具体需求实现。

一种是,点击“提交订单”时,就去支付;一种是提交订单时不支付,后续再支付。假设是第一种情况,第二种情况类似。

 

  •  提交支付接口

        开发一个页面,里面是一个表单的提交(按钮显示为支付),用于提交支付接口。

        当用户点击“提交订单”,此时,商户应先将订单信息保存至系统(后台操作不可见),并且提示“准备跳转至支付”之类的信息,一般都有“等待几秒”的提示,等待结束之后,跳转至当前开发的页面,展现订单的相关信息,点击提交。

        当前开发的页面呢,主要开发的功能就是一个表单的提交,具体的表单展现涉及保密信息就不展示了,下面介绍几个重要字段的处理。

        先看一下翼支付Web支付接口的数据模型:

public class PayModel {
      private String merchantID;// 商户代码
      private String orderSeq;// 订单号
      private String orderReqTranSeq;// 订单请求流水号
      private String orderDate;// 订单日期
      private String orderAmount;// 总金额,单位为分
      private String productAmount;// 产品金额,单位为分
      private String attachAmount;// 附加金额,单位为分
      private String curType;// 币种
      private String encodeType;// 加密方式
      private String merchantUrl;// 前台地址
      private String backMerchantUrl;// 后台地址
      private String busiCode;// 业务类型代码
      private String productDesc;// 产品描述
      private String mac;// MAC校验域
      private String clientIp;// 客户端IP
         /**
          * 省略get和set方法,以上只包含翼支付接口必须提供的参数,其他参数根据需求添加即可
          **/
}
        有如下参数根据各自的系统可能需要做处理。
 

1)orderReqTranSeq(订单流水号):博主的系统中,订单原型中没有定义订单的流水号,此时根据要求在订单号后面添加“4-6位的数字和字母组合”来生成响应的流水号,当然该流水号最好有一定的增长性,不要过于复杂,最简单使用“000001”即可,后面如果有同样的订单号,最下一次交易时,流水号即为“000002”,简单易懂;

2)orderDate(订单日期):日期要注意的就是格式问题,格式为“yyyyMMddhhmmss”,做好formatter即可;  

3)orderAmount(总金额)、productAmount(产品金额)、attachAmount(附加金额):在这几个金额中,第一要注意的是,单位是“分”,一般给客户看的都是以元为单位,提交至翼支付接口时,需要转换为分;第二,这三者的关系,总金额=产品金额+附加金额,在博主的系统中,是没有附加金额的,而且金额的计算都是靠商户自己的系统结算的,最终的结果就是总金额了,所以附加金额就默认为0即可; 单位的转换方法:

  /**
    * 转换订单总额,以分为单位
    * @param orderAmount
    * @return
    */
    public static String convertOrderAmount(BigDecimal orderAmount){
        BigDecimal _m = new BigDecimal(“100”);
        return Integer.toString(orderAmount.multiply(_m).intValue());
     }

4)encodeType(加密方式):参照文档,默认且必须为1,使用加密方式;  

5)merchantUrl(前台地址):该地址是,商户系统需要开发的支付结果页面跳转地址,通俗一点,该地址最终是给客户看的,客户需要看到的支付结果页面。  

6)backMerchantUrl(后台地址):该地址,是商户接受翼支付接口反馈的结果,再做相应处理的请求地址,通俗一点,这个地址,就是让商户系统接受到反馈之后需要做相应的处理,比如订单状态的更新等。  

7)mac(校验域):该参数是重点,一定要根据文档的要求去生成,参数的顺序,大小写都一定要规范,官网提供的demo中,有名为CryptTool的工具类,可以加密,其中将编码改成UTF-8,不然会遇到数字签名验证不正确的问题;  

8)clientIp(客户端IP):该参数是为了防止钓鱼,保证安全性。 获取客户端服务期IP的方法:

    /**
    * 获取服务器端ip地址
    * @param request
    * @return
    */
    public static String getIpRemote(HttpServletRequest request){
        String ip = request.getHeader(“x-forwarded-for”);
        if(ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)){
            ip = request.getHeader(“Proxy-Client-IP”);
        }
        if(ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)){
            ip = request.getHeader(“WL-Proxy-Client-IP”);
        }
        if(ip == null || ip.length() == 0 || “unknown”.equalsIgnoreCase(ip)){
            ip = request.getRemoteAddr();
        }
        return ip.equals(“0:0:0:0:0:0:0:1″)?”127.0.0.1”:ip;
    }

        页面的开发很简单,将商户系统中的订单信息和相关参数,写到这个数据模型中,将该模型对象传到页面,放入表单值中,其中保重所有参数是不可编辑的,当然也可以用样式,将表单美化,可以完全看不出来是表单,有些商户信息,具体的处理因人而异,涉及到保密的信息,尽量不要暴露出来。

 

  • 翼支付中转
        当用户点击表单的“提交”时,此时就会请求翼支付的接口,将会跳到翼支付的支付页面,下面就是熟悉的选择银行等支付信息,按照正常的支付下去即可。在银行页面支付成功后,会跳回翼支付的页面,再由翼支付的页面,跳转至商户页面。
 
  • 结果反馈
        需要开发一个,支付结果展示的页面。
当翼支付接受到银行信息后,会POST商户提供的“前台地址(merchantUrl)”,此时会将很多信息反馈给商户,商户只需要将接受到交易结果信息,展示给客户即可。
这里面就提供具体的反馈数据模型了。里面会涉及到银行流水号,翼支付平台交流流水号等,最好能保存至商户系统中,便于以后对账使用。
 
  • 商户处理
        与上一步相同,翼支付会将结果传到“后台地址”中,商户在接受到结果信息后,要对自己系统的订单信息做相应的变更,同时做好相应的记录,并且要给翼支付一个回馈,让翼支付网关知道,已经通知成功了。
 
 
        以上的开发是最简单的Web流程,也只是说是跑通了支付,其实翼支付提供了很多的功能,比如自定义接口,可以开发个性化的选择银行页面,同事还提供了很多的电信的业务,如充值等,还有三方支付平台的支持,都需要慢慢去摸索。
 

      题外话:
 
        以下是“2015年中国(深圳)IT领袖峰会”中马云的言辞。
        “过去7年我们从互联网创业到互联网产业,很快进入互联网经济,而且正在从IT走向DT时代,也许昨天称为IT领袖峰会,未来要称DT领袖峰会,DT不仅仅是技术提升,而是思想观念的提升。DT和IT时代区别,IT以我为中心,DT以别人为中心,DT要让企业越来越强大,让你员工强大。DT越来越讲究开放、透明。我们所有企业都要思考什么样的文化、什么样的组织、什么样的人才才能适应未来DT时代,相信整个DT时代到来,在海外这被称为D经济。无论今天讲的互联网+还是工业4.0,我们正在努力把互联网从一个产业变成一个互联网经济时代。而真正我们面临巨大机会所在也是我们互联网公司必须活长、活久、活好,像其他传统产业一样,我们要思考如何用互联网技术、理念、思想去与传统行业进行交融和共同发展。”
        这其中有很多应该注意的,如“IT”、“DT”、“互联网+”、“工业4.0”、“产业”和“互联网与传统企业的融合”等,记得之前看过一本书《移动生产力》,其中留予印象最深的是就是“工业革命4.0”,也是推动工业智能化等,想想在无形中,其实大家都在这个时期中付出了绵薄之力,参与着科技和产业的变革,先不谈“工业革命4.0”,也不管是否真的发生,但在这其中,必然富含革新和机遇,这必须靠自己将其紧紧握于手心。