java 支付模块_java网上图书商城(9)支付模块

本文详细介绍了如何在Java中实现网上商城的支付模块,包括支付准备、支付方法和回馈方法。通过加载配置文件获取参数,计算HMAC并重定向至支付网关,以及验证回调信息来确保交易安全。此外,还展示了支付页面的部分JavaScript交互代码。
摘要由CSDN通过智能技术生成

本文实例为大家分享了java网上商城支付模块的具体代码,供大家参考,具体内容如下

c3a9e0c27382f9c9f3f6ce6050adff0a.png

1.支付准备

public String paymentPre(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

req.setAttribute("order", orderService.load(req.getParameter("oid")));

return "f:/jsps/order/pay.jsp";

}

2.支付方法

public String payment(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

Properties props = new Properties();

props.load(this.getClass().getClassLoader().getResourceAsStream("payment.properties"));

/*

* 1. 准备13个参数

*/

String p0_Cmd = "Buy";//业务类型,固定值Buy

String p1_MerId = props.getProperty("p1_MerId");//商号编码,在易宝的唯一标识

String p2_Order = req.getParameter("oid");//订单编码

String p3_Amt = "0.01";//支付金额

String p4_Cur = "CNY";//交易币种,固定值CNY

String p5_Pid = "";//商品名称

String p6_Pcat = "";//商品种类

String p7_Pdesc = "";//商品描述

String p8_Url = props.getProperty("p8_Url");//在支付成功后,易宝会访问这个地址。

String p9_SAF = "";//送货地址

String pa_MP = "";//扩展信息

String pd_FrpId = req.getParameter("yh");//支付通道

String pr_NeedResponse = "1";//应答机制,固定值1

/*

* 2. 计算hmac

* 需要13个参数

* 需要keyValue

* 需要加密算法

*/

String keyValue = props.getProperty("keyValue");

String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt,

p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP,

pd_FrpId, pr_NeedResponse, keyValue);

/*

* 3. 重定向到易宝的支付网关

*/

StringBuilder sb = new StringBuilder("https://www.yeepay.com/app-merchant-proxy/node");

sb.append("?").append("p0_Cmd=").append(p0_Cmd);

sb.append("&").append("p1_MerId=").append(p1_MerId);

sb.append("&").append("p2_Order=").append(p2_Order);

sb.append("&").append("p3_Amt=").append(p3_Amt);

sb.append("&").append("p4_Cur=").append(p4_Cur);

sb.append("&").append("p5_Pid=").append(p5_Pid);

sb.append("&").append("p6_Pcat=").append(p6_Pcat);

sb.append("&").append("p7_Pdesc=").append(p7_Pdesc);

sb.append("&").append("p8_Url=").append(p8_Url);

sb.append("&").append("p9_SAF=").append(p9_SAF);

sb.append("&").append("pa_MP=").append(pa_MP);

sb.append("&").append("pd_FrpId=").append(pd_FrpId);

sb.append("&").append("pr_NeedResponse=").append(pr_NeedResponse);

sb.append("&").append("hmac=").append(hmac);

resp.sendRedirect(sb.toString());

return null;

}

3.回馈方法

当支付成功时,易宝会访问这里

用两种方法访问:

1. 引导用户的浏览器重定向(如果用户关闭了浏览器,就不能访问这里了)

2. 易宝的服务器会使用点对点通讯的方法访问这个方法。(必须回馈success,不然易宝服务器会一直调用这个方法)

public String back(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

/*

* 1. 获取12个参数

*/

String p1_MerId = req.getParameter("p1_MerId");

String r0_Cmd = req.getParameter("r0_Cmd");

String r1_Code = req.getParameter("r1_Code");

String r2_TrxId = req.getParameter("r2_TrxId");

String r3_Amt = req.getParameter("r3_Amt");

String r4_Cur = req.getParameter("r4_Cur");

String r5_Pid = req.getParameter("r5_Pid");

String r6_Order = req.getParameter("r6_Order");

String r7_Uid = req.getParameter("r7_Uid");

String r8_MP = req.getParameter("r8_MP");

String r9_BType = req.getParameter("r9_BType");

String hmac = req.getParameter("hmac");

/*

* 2. 获取keyValue

*/

Properties props = new Properties();

props.load(this.getClass().getClassLoader().getResourceAsStream("payment.properties"));

String keyValue = props.getProperty("keyValue");

/*

* 3. 调用PaymentUtil的校验方法来校验调用者的身份

* >如果校验失败:保存错误信息,转发到msg.jsp

* >如果校验通过:

* * 判断访问的方法是重定向还是点对点,如果要是重定向

* 修改订单状态,保存成功信息,转发到msg.jsp

* * 如果是点对点:修改订单状态,返回success

*/

boolean bool = PaymentUtil.verifyCallback(hmac, p1_MerId, r0_Cmd, r1_Code, r2_TrxId,

r3_Amt, r4_Cur, r5_Pid, r6_Order, r7_Uid, r8_MP, r9_BType,

keyValue);

if(!bool) {

req.setAttribute("code", "error");

req.setAttribute("msg", "无效的签名,支付失败!(你不是好人)");

return "f:/jsps/msg.jsp";

}

if(r1_Code.equals("1")) {

orderService.updateStatus(r6_Order, 2);

if(r9_BType.equals("1")) {

req.setAttribute("code", "success");

req.setAttribute("msg", "恭喜,支付成功!");

return "f:/jsps/msg.jsp";

} else if(r9_BType.equals("2")) {

resp.getWriter().print("success");

}

}

return null;

}

4.pay.jsp

pay.jsp

$(function() {

$("img").click(function() {

$("#" + $(this).attr("name")).attr("checked", true);

});

});

支付金额:¥${order.total }

编号:${order.oid }

选择网上银行

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

>

payment.properties

p1_MerId=10001126856

keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl

p8_Url=http\://localhost\:8080/goods/OrderServlet?method\=back

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值