网银在线支付接口和应用(转载)关键字: 网银在线支付接口和应用最近关注项目中在线支付,所以看一下文档,在线支付应用开发:基本所有的在线支付均采用以下方式:客户点击结帐时将关于訂單的信息和货币信息,相应的信息URL,经过md5或其他方式发送(可能Socket和Http或Https)支付平台(块钱,paypal或支付宝等),支付平臺处理完毕时根据相应URL,返回相关的信息(付款信息,訂單信息,验证信息).在实际操作Money的问题人们一向关注他的安全性等问题,同时本人习惯在通过http方式访问非外网时采用Commons-httpclient的post发送实现,简单方便,所以采用此种实现:具体看以下API和原代码:网银在线支付API接口:商户>>>>>>网银在线支付:<form method=post action="https:///select_bank"> <input type=hidden name=v_mid value="1001"> 商户编号<input type=hidden name=v_oidvalue="19990720-1001-000001234"> 订单编号<input type=hidden name=v_amount value="13.45"> 订单总金额<input type=hidden name=v_moneytype value="0"> 币种<input type=hidden name=v_url value="http://domain/program">支付动作完成后返回到该url,支付结果以POST方式发送<input type=hidden name=v_md5infovalue="1630DC083D70A1E8AF60F49C143A7B95"> 订单MD5校验码<input type="hidden" name="remark1 " value="">备注字段1<input type="hidden" name="remark2" value="">备注字段2<input type=hidden name=v_rcvname value="张三"> 收货人姓名<input type=hidden name=v_rcvaddr value="北京海淀"> 收货人地址<input type=hidden name=v_rcvtel value="68475566"> 收货人电话<input type=hidden name=v_rcvpost value="100036"> 收货人邮编<input type=hidden name=v_orderstatus value="0"> 商品信息<input type=hidden name=v_ordername value="李四"> 订货人姓名<input type=hidden name= v_orderemail value="test@"> 订货人邮件<input type=submit value="网银在线支付"></form>MD5校验串生成方法:当消费者在商户端生成最终订单的时候,将订单中的v_amount v_moneytype v_oid v_mid v_url key六个参数的value值拼成一个无间隔的字符串(顺序不要改变)。
参数key是商户的MD5密钥(该密匙可在登陆商户管理界面后自行更改。
)网银在线支付>>>商户支付完成后页面转到商户,从网银在线支付返回的消息格式为:<form method=get action="v_url" target=_self><input type="hidden" name="v_oid" value=""><input type="hidden" name="v_pstatus" value=""><input type="hidden" name="v_pstring" value=""><input type="hidden" name="v_pmode" value=""><input type="hidden" name="v_md5str" value=""><input type="hidden" name="v_amount" value=""><input type="hidden" name="v_moneytype" value=""><input type="hidden" name="remark1 " value=""><input type="hidden" name="remark2" value=""></form>该消息格式详细解释如下:v_url是该笔订单提交时参数v_url 的值,即网银返回到商户的接口地址。
package .vnvtrip.china.pay.proxy;import staticmons.ChinaPayConstants.CHINABANK_NOTIF Y_URL_HTTP;import staticmons.ChinaPayConstants.CHINABANK_PAY_H TTPS;import staticmons.ChinaPayConstants.CHINABANK_PAY_M D5_KEY;import java.util.HashMap;import java.util.Map;import java.util.Properties;import mons.codec.digest.DigestUtils;import mons.Env;import mons.HTTPClient;/**** 网银接口服务的代理** @author longgangbai**/public class ChinaPayProxy {* 在下訂單時采用的的Md5加密的信息: MD5校验串生成方法:当消费者在商户端生成最终订单的时候,将订单中的v_amount* v_moneytype v_oid v_mid v_url key六个参数的value值拼成一个无间隔的字符串(顺序不要改变)。
* 参数key是商户的MD5密钥(该密匙可在登陆商户管理界面后自行更改。
)** @param v_amount* @param v_moneytype* @param v_oid* @param v_mid* @param v_url* @param key* @return*/private static String getMd5Sign(String v_amount, String v_moneytype,String v_oid, String v_mid, String v_url, String key) {StringBuffer sb = new StringBuffer();sb.append(v_amount);sb.append(v_moneytype);sb.append(v_oid);sb.append(v_mid);sb.append(v_url);sb.append(key);byte[] bytes = DigestUtils.md5(sb.toString());String md5info = new String(bytes).toUpperCase();return md5info;}/*** 调用支付网关接口网址银行结帐的接口代理(本人习惯采用Commons-httpclient实现)* 用途:用来接受商户发给网银在线服务支付的订单信息** @param v_mid* 商户编号(非空)* @param v_oid* 订单编号(非空)(格式:订单生成日期(yyyymmdd)-商户编号-商户流水号)字段不可超过64位* @param v_amount* 订单总金额(非空)* @param v_moneytype* 货币类型(非空) 0:RMB1美元* @param v_url* (非空) 支付的动作完成时返回的该url,支付结果以post方式* @param v_md5info* 订单md5校验码* @param remark1* 备注字段1(可选字段)* @param remark2* 备注字段2(可选字段)* @param v_vmd* yyyymmdd 备注字段2(不可为空字段)* @param v_rcvname* 收货人姓名(自定义非网银必须字段)* @param v_rcvaddr* 收货人地址(自定义非网银必须字段)* @param v_rcvtel* 收货人电话(自定义非网银必须字段)* @param v_rcpost* 收货人邮编(自定义非网银必须字段)* @param v_orderstatus* 商品信息(自定义非网银必须字段)* @param v_ordername* 订货人姓名(自定义非网银必须字段)* @param v_orderemail* 订货人邮件(自定义非网银必须字段)* @return*/public static boolean chinaBankPayCheck(String v_mid, String v_oid, String v_amount, String v_moneytype, String v_url, String remark1, String remark2, String v_rcvname, String v_rcvaddr,String v_rcvtel, String v_rcpost, String v_orderstatus,String v_ordername, String v_orderemail) {Properties p = Env.getEnv().getProperties();String md5key = p.getProperty(CHINABANK_PAY_MD5_KEY);String v_md5info = getMd5Sign(v_amount, v_moneytype, v_oid, v_mid, v_url, md5key);Map<String, String> paramMaps = new HashMap<String, String>(); paramMaps.put("v_mid", v_mid);paramMaps.put("v_oid", v_oid);paramMaps.put("v_amount", v_amount);paramMaps.put("v_moneytype", v_moneytype);paramMaps.put("v_url",p.getProperty(CHINABANK_NOTIFY_URL_HTTP));paramMaps.put("v_md5info", v_md5info);paramMaps.put("remark1", remark1);paramMaps.put("remark2", remark2);paramMaps.put("v_rcvname", v_rcvname);paramMaps.put("v_rcvaddr", v_rcvaddr);paramMaps.put("v_rcvtel", v_rcvtel);paramMaps.put("v_rcpost", v_rcpost);paramMaps.put("v_orderstatus", v_orderstatus);paramMaps.put("v_ordername", v_ordername);paramMaps.put("v_orderemail", v_orderemail);return HTTPClient.executeHttp(CHINABANK_PAY_HTTPS, paramMaps, null);}/*** result为支付完毕接受的结果的map 校验检测在网银支付数据是否被拦截的** @param v_oid* 获取结果中的訂單编号* @param v_pstatus* 获取訂單的支付状态* @param v_pstring* 支付的结果* @param v_amount* 实际支付的金额* @param v_moneytype* 实际支付的币种* @param v_md5str* 获取訂單校验的MD5验证* @return*/public static boolean checkPayOff(String v_oid, String v_pstatus,String v_pstring, String v_amount, String v_moneytype,String v_md5str) {Properties p = Env.getEnv().getProperties();String md5key = p.getProperty(CHINABANK_PAY_MD5_KEY);String checkmd5 = getCheckMd5(v_oid, v_pstatus, v_amount, v_moneytype, md5key);if (checkmd5.equals(v_md5str)) {return true;}return false;}/*** 得到网银訂單付款后Md5加密检查** @param v_oid* @param v_pstatus* @param v_amount* @param v_moneytype* @param key* @return*/private static String getCheckMd5(String v_oid, String v_pstatus, String v_amount, String v_moneytype, String key) {StringBuffer sb = new StringBuffer();sb.append(v_oid);sb.append(v_pstatus);sb.append(v_amount);sb.append(v_moneytype);sb.append(key);byte[] bytes = DigestUtils.md5(sb.toString());String md5info = new String(bytes).toUpperCase();return md5info;}}来自/blog/4978722010-02-09建设银行对接(一)文章分类:Java编程这几天项目需要对接建设银行的支付和查询功能,在支付和查询的时候将系统链接到建行指定的页面上,由于这些页面是基于互联网的,开放的,所以需要对数据加密和数字签名。