第一部分:
1.两种接入方案 a)直接与银行对接 b)通过中间公司间接与银行对接
2.中间支付的一些例子
第二部分:
1.使用yeepay支付的代码要求
第三部分:
1.创建一个前台提交订单号、金额、网上银行的前台页面
其中订单信息提交给servlet(其中用到了工具类)
request.setCharacterEncoding("GBK");
String orderid = request.getParameter("orderNumber");//订单号
String amount = request.getParameter("money");//支付金额
String pd_FrpId = request.getParameter("pd_FrpId");//选择的支付银行
String p1_MerId = ConfigInfo.getValue("p1_MerId");
String keyValue = ConfigInfo.getValue("keyValue");
String merchantCallbackURL = ConfigInfo.getValue("merchantCallbackURL");
String messageType = "Buy"; // 请求命令,在线支付固定为Buy
String currency = "CNY"; // 货币单位
String productDesc = ""; // 商品描述
String productCat = ""; // 商品种类
String productId = ""; // 商品ID
String addressFlag = "0"; // 需要填写送货信息 0:不需要 1:需要
String sMctProperties = ""; // 商家扩展信息
String pr_NeedResponse = "0"; // 应答机制
String md5hmac = PanymentUtil.buildHmac(messageType, p1_MerId, orderid, amount, currency,
productId, productCat, productDesc, merchantCallbackURL, addressFlag, sMctProperties,
pd_FrpId, pr_NeedResponse, keyValue);
request.setAttribute("messageType", messageType);
request.setAttribute("merchantID", p1_MerId);
request.setAttribute("orderId", orderid);
request.setAttribute("amount", amount);
request.setAttribute("currency", currency);
request.setAttribute("productId", productId);
request.setAttribute("productCat", productCat);
request.setAttribute("productDesc", productDesc);
request.setAttribute("merchantCallbackURL", merchantCallbackURL);
request.setAttribute("addressFlag", addressFlag);
request.setAttribute("sMctProperties", sMctProperties);
request.setAttribute("frpId", pd_FrpId);
request.setAttribute("pr_NeedResponse", pr_NeedResponse);
request.setAttribute("hmac", md5hmac);
request.getRequestDispatcher("/security/connection.jsp").forward(request, response);
注意,如上述参数不能为null,可以为为“”(空字符串)
2.请求转发页面的处理 connection.jsp
3.用户通过网上银行进行支付
4.配置路由器,转发支付结果的响应请求,注意此地址必须是针对互联网的
5.接收到用户请求的结果后,对结果进行显示
request.setCharacterEncoding("GBK");
String merchantID = ConfigInfo.getValue("p1_MerId"); // 商家ID
String keyValue = ConfigInfo.getValue("keyValue"); // 商家密钥
String sCmd = request.getParameter("r0_Cmd"); //业务类型
String sResultCode = request.getParameter("r1_Code"); //扣款结果,该字段值为1时表示扣款成功.
String sTrxId = request.getParameter("r2_TrxId"); //YeePay易宝交易订单号
String amount = request.getParameter("r3_Amt");//扣款金额,交易结束后,YeePay易宝交易系统将实际扣款金额返回给商户
String currency = request.getParameter("r4_Cur");//交易币种,人民币为CNY
String productId = request.getParameter("r5_Pid");//商品ID
String orderId = request.getParameter("r6_Order");//商户订单号
String userId = request.getParameter("r7_Uid");//YeePay易宝会员ID
String mp = request.getParameter("r8_MP");//商户扩展信息,可以任意填写1K 的字符串,交易返回时将原样返回
String bType = request.getParameter("r9_BType");//交易结果通知类型,1: 交易成功回调(浏览器重定向)2: 交易成功主动通知(服务器点对点通讯)
String rb_BankId = request.getParameter("rb_BankId");//支付银行
String rp_PayDate = request.getParameter("rp_PayDate");//在银行支付时的时间
String hmac = request.getParameter("hmac");//MD5交易签名
boolean result = PanymentUtil.verifyCallback(hmac, merchantID, sCmd, sResultCode, sTrxId, amount,
currency, productId, orderId, userId, mp, bType, keyValue);
if(result){
if("1".equals(sResultCode)){
//你们这个地方应该把数据库中订单的支付状态设置成已经支付.
String message = "订单号为:"+ orderId+ "的订单支付成功了";
message += ",用户支付了"+ amount +"元";
message +=",交易结果通知类型:";
if("1".equals(bType)){
message += "浏览器重定向";
}else if("2".equals(bType)){
message += "易宝支付网关后台程序通知";
}
message += ",易宝订单系统中的订单号为:"+ sTrxId;
request.setAttribute("message", message);
}else{
request.setAttribute("message", "用户支付失败");
}
}else{
request.setAttribute("message", "数据来源不合法");
}
request.getRequestDispatcher("/security/paymentResult.jsp").forward(request, response);
转到的paymentResult.jsp
${message }
6.其中用到的工具类
ConfigInfo.java 提取用户的商家的易宝商家账号和加密字符串,还有接收用户订单支付结果响应的网址,可以写在属性文件中便于修改
DigestUtil.java 核心加密工具类
PanymentUtil.java 加密原理