请点击此处输入图片描述
作为开放式的B/S架构程序,无论所属电商,金融,机械制造,企业OA,ERP,CRM,CMS等等行业或系统中,第三方支付以及银联支付的业务一定是客户关心所在,也是保证客户系统盈利运营的一个重要保障。通常这种B2C或者C2C系统的开发,商户用户所关注的支付平台大多离不开“阿里支付宝,快钱,腾讯财付通,易宝支付这种第三方支付平台以及中国银联UnionPay....等等”这些方式。
最近某项目中涉及到支付的模块与涉及流程,在此和大家分享一下。
1,名词释义
商户网站:比如淘宝,聚美,唯品会这种B2C/C2C的网站及后台的管理系统,统称为商户网站;主要负责对买家订单数据的封装,加密,
及支付平台回调的订单处理。
支付平台:我们需要开发的支付平台,支付接口,支付模拟的Servlet,暴露出来的WebService接口url等;主要负责对买家请求来的
加密后的订单数据进行解密,构造请求的URL,拼接参数,对Sign进行加密,对支付机构异步(或同步)请求回调的数据
进行封装,解密回传给商户网站。
支付机构:比如阿里支付宝,快钱,腾讯财付通,易宝支付这种第三方支付平台等支付机构。
Sign:支付机构为商户分配的一把“密钥”与”合作者ID“同时分配,用做调用Base64,MD5等加密算法在加密解密时的一种私钥,通常
与此相关联的还有signType,就是加密方式。
回调:对上次请求端request中的url或指定的url进行http请求,或https请求
支付平台请求,响应,及回调流程图:
请点击此处输入图片描述
2,业务流设计(本文只介绍alipay的即时到账接口:"create_direct_pay_by_user")
2.1 商户网站对数据封装加密,调用支付接口:
2.1.1)商户网站后台对买家的订单进行封装,插入商户网站db中的订单表(比如:xxx_order);
PayReturnVovo = new PayReturnVo();
vo.setOrderId("kuaiqian00232");
vo.setOrderAmount("20");
vo.setOrderTime("20140504121020");
vo.setProductName("3M网线,送水晶头");
vo.setProductId("2213229319378");
vo.setProductNum("2");
vo.setPayType("00");*/
// 把模拟的表单数据转成Json
StringorderJson= PaymentJsonUtil.beanToJson(vo);
// 通过db获取商家key密钥
Stringkey = dao.getKeyByUserId(userId);
// 根据key使用base64加密算法对订单信息进行加密
StringSignedJson = CryptUtil.encryptBase64Des(orderJson, key);
2.1.2)于此同时调用dao层查询买家用户平台账户余额,并进行锁表:在SQL的select后加入 forupdate wait n(最好
为1-5秒,此处的 数值为httpclient请求超时时长)为防止订单被多用户修改。