在线支付代码

来源:互联网 发布:淘宝望远镜 编辑:程序博客网 时间:2024/06/05 00:44
package cn.itcast.shop.util;import java.io.UnsupportedEncodingException;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Arrays;/** * 易支付hmac加密算法 *  */public class PaymentUtil {private static String encodingCharset = "UTF-8";/** * 生成hmac方法 *  * @param p0_Cmd *            业务类型 * @param p1_MerId *            商户编号 * @param p2_Order *            商户订单号 * @param p3_Amt *            支付金额 * @param p4_Cur *            交易币种 * @param p5_Pid *            商品名称 * @param p6_Pcat *            商品种类 * @param p7_Pdesc *            商品描述 * @param p8_Url *            商户接收支付成功数据的地址 * @param p9_SAF *            送货地址 * @param pa_MP *            商户扩展信息 * @param pd_FrpId *            银行编码 * @param pr_NeedResponse *            应答机制 * @param keyValue *            商户密钥 * @return */public static String buildHmac(String p0_Cmd, String p1_MerId, String p2_Order, String p3_Amt, String p4_Cur, String p5_Pid, String p6_Pcat, String p7_Pdesc, String p8_Url,String p9_SAF, String pa_MP, String pd_FrpId, String pr_NeedResponse, String keyValue) {StringBuilder sValue = new StringBuilder();// 业务类型sValue.append(p0_Cmd);// 商户编号sValue.append(p1_MerId);// 商户订单号sValue.append(p2_Order);// 支付金额sValue.append(p3_Amt);// 交易币种sValue.append(p4_Cur);// 商品名称sValue.append(p5_Pid);// 商品种类sValue.append(p6_Pcat);// 商品描述sValue.append(p7_Pdesc);// 商户接收支付成功数据的地址sValue.append(p8_Url);// 送货地址sValue.append(p9_SAF);// 商户扩展信息sValue.append(pa_MP);// 银行编码sValue.append(pd_FrpId);// 应答机制sValue.append(pr_NeedResponse);return PaymentUtil.hmacSign(sValue.toString(), keyValue);}/** * 返回校验hmac方法 *  * @param hmac *            支付网关发来的加密验证码 * @param p1_MerId *            商户编号 * @param r0_Cmd *            业务类型 * @param r1_Code *            支付结果 * @param r2_TrxId *            易宝支付交易流水号 * @param r3_Amt *            支付金额 * @param r4_Cur *            交易币种 * @param r5_Pid *            商品名称 * @param r6_Order *            商户订单号 * @param r7_Uid *            易宝支付会员ID * @param r8_MP *            商户扩展信息 * @param r9_BType *            交易结果返回类型 * @param keyValue *            密钥 * @return */public static boolean verifyCallback(String hmac, String p1_MerId, String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt, String r4_Cur, String r5_Pid,String r6_Order, String r7_Uid, String r8_MP, String r9_BType, String keyValue) {StringBuilder sValue = new StringBuilder();// 商户编号sValue.append(p1_MerId);// 业务类型sValue.append(r0_Cmd);// 支付结果sValue.append(r1_Code);// 易宝支付交易流水号sValue.append(r2_TrxId);// 支付金额sValue.append(r3_Amt);// 交易币种sValue.append(r4_Cur);// 商品名称sValue.append(r5_Pid);// 商户订单号sValue.append(r6_Order);// 易宝支付会员IDsValue.append(r7_Uid);// 商户扩展信息sValue.append(r8_MP);// 交易结果返回类型sValue.append(r9_BType);String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);return sNewString.equals(hmac);}/** * HMAC签名加密 *  * @param aValue * @param aKey * @return */public static String hmacSign(String aValue, String aKey) {byte k_ipad[] = new byte[64];byte k_opad[] = new byte[64];byte keyb[];byte value[];try {keyb = aKey.getBytes(encodingCharset);value = aValue.getBytes(encodingCharset);} catch (UnsupportedEncodingException e) {keyb = aKey.getBytes();value = aValue.getBytes();}Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);Arrays.fill(k_opad, keyb.length, 64, (byte) 92);for (int i = 0; i < keyb.length; i++) {k_ipad[i] = (byte) (keyb[i] ^ 0x36);k_opad[i] = (byte) (keyb[i] ^ 0x5c);}MessageDigest md = null;try {md = MessageDigest.getInstance("MD5");} catch (NoSuchAlgorithmException e) {return null;}md.update(k_ipad);md.update(value);byte dg[] = md.digest();md.reset();md.update(k_opad);md.update(dg, 0, 16);dg = md.digest();return toHex(dg);}public static String toHex(byte input[]) {if (input == null)return null;StringBuffer output = new StringBuffer(input.length * 2);for (int i = 0; i < input.length; i++) {int current = input[i] & 0xff;if (current < 16)output.append("0");output.append(Integer.toString(current, 16));}return output.toString();}/** *  * @param args * @param key * @return */public static String getHmac(String[] args, String key) {if (args == null || args.length == 0) {return (null);}StringBuffer str = new StringBuffer();for (int i = 0; i < args.length; i++) {str.append(args[i]);}return (hmacSign(str.toString(), key));}/** * @param aValue * @return */public static String digest(String aValue) {aValue = aValue.trim();byte value[];try {value = aValue.getBytes(encodingCharset);} catch (UnsupportedEncodingException e) {value = aValue.getBytes();}MessageDigest md = null;try {md = MessageDigest.getInstance("SHA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}return toHex(md.digest(value));}// public static void main(String[] args) {// System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp杩?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t"));// }}


package cn.itcast.shop.action;import java.io.IOException;import java.util.Date;import javax.annotation.Resource;import org.apache.struts2.ServletActionContext;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import cn.itcast.shop.service.OrderService;import cn.itcast.shop.util.PageBean;import cn.itcast.shop.util.PaymentUtil;import cn.itcast.shop.vo.Order;import cn.itcast.shop.vo.OrderItem;import cn.itcast.shop.vo.User;import cn.itcast.shop.vo.cart.Cart;import cn.itcast.shop.vo.cart.CartItem;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;/** * 订单模块Action类 *  * @author 吕小刚 * @version V1.0 */@Controller("orderAction")@Scope("prototype")@SuppressWarnings("serial")public class OrderAction extends ActionSupport implements ModelDriven<Order> {// =================== Service实例@Resource// 没注入(页面报错,无任何提示)private OrderService orderService;// ==================== 模型驱动对象private Integer page;// 接收页码private String pd_FrpId;// 接收支付通道编码(所属银行)// 接收付款成功后的响应数据:private String r6_Order;// 订单号private String r3_Amt;// 付款金额private Order model = new Order();public Order getModel() {return model;}public void setR6_Order(String r6_Order) {this.r6_Order = r6_Order;}public void setR3_Amt(String r3_Amt) {this.r3_Amt = r3_Amt;}public void setPd_FrpId(String pd_FrpId) {this.pd_FrpId = pd_FrpId;}public Integer getPage() {return page;}public void setPage(Integer page) {this.page = page;}// 订单页面跳转执行方法public String save() {// 1,保存数据到数据库// 订单数据补全model.setOrderTime(new Date());// 订单生成时间model.setState(1);// 1,未付款 --> 2,付款成功,未发货 --> 3,已发货,没确认收货 --> 4,交易完成// 总计的数据是购物车中的信息:Cart cart = (Cart) ServletActionContext.getRequest().getSession().getAttribute("cart");if (cart == null) {ActionContext.getContext().getSession().put("message", "亲!你没有购物!请去购物!");return "msg";// 返到购物车并在购物车页面提示}model.setTotal(cart.getTotal());// 订单总金额(购物车中)// 订单项(在购物车中购物项,然后添加到订单项中)for (CartItem cartItem : cart.getCartItems()) {OrderItem orderItem = new OrderItem();orderItem.setCount(cartItem.getCount());// 总数量orderItem.setSubtotal(cartItem.getSubtotal());// 商品小计orderItem.setProduct(cartItem.getProduct());// 商品信息orderItem.setOrder(model);// 订单model.getOrderItems().add(orderItem);}// 获取用户User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");if (user == null) {this.addFieldError("loginError", "亲!你还没有登录,请先登录!");return "login";}model.setUser(user);// 订单用户(在session中)orderService.save(model);cart.clearCart();// 清空购物车ServletActionContext.getRequest().getSession().removeAttribute("cart");// 2,将订单对象显示到页面上:// 把订单信息放入值栈中ActionContext.getContext().getValueStack().set("model", model);return "saveSuccess";}// 我的订单显示执行方法public String findByUserId() {// 跟据用户的id查询User user = (User) ServletActionContext.getRequest().getSession().getAttribute("user");// 调用servicePageBean<Order> pageBean = orderService.findByPageUserId(user.getId(), page);// 将分页的信息显示到页面上:ActionContext.getContext().getValueStack().set("pageBean", pageBean);return "findByUserIdSuccess";}// 要据订单id查询订单public String findByOrderId() {model = orderService.findByOrderId(model.getId());return "findByOrderId";}// 为订单付款的方法public String payOrder() throws IOException {// 修改订单Order currentOrder = orderService.findByOrderId(model.getId());currentOrder.setAddress(model.getAddress());// 地址currentOrder.setName(model.getName());// 姓名currentOrder.setPhone(model.getPhone());// 电话// 更新订单信息orderService.update(currentOrder);// 为订单付款String p0_Cmd = "Buy";// 业务类型String p1_MerId = "10001126856";// 商户编号String p2_Order = model.getId().toString();// 商户订单号String p3_Amt = "0.01";// 支付金额String p4_Cur = "CNY";// 交易币种String p5_Pid = "";// 商品名称String p6_Pcat = "";// 商品种类String p7_Pdesc = "";// 商品描述String p8_Url = "http://localhost:8080/shop/order_callBack.action";// 支付成功后跳转的页面路径String p9_SAF = "0";// 送货地址String pa_MP = "";// 商户扩展信息String pd_FrpId = this.pd_FrpId;// 支付通道编码String pr_NeedResponse = "1";// 应答机制String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";// 支付密钥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);// 签名数据// 向易支付出发:StringBuffer stringBuffer = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");stringBuffer.append("p0_Cmd=").append(p0_Cmd).append("&");stringBuffer.append("p1_MerId=").append(p1_MerId).append("&");stringBuffer.append("p2_Order=").append(p2_Order).append("&");stringBuffer.append("p3_Amt=").append(p3_Amt).append("&");stringBuffer.append("p4_Cur=").append(p4_Cur).append("&");stringBuffer.append("p5_Pid=").append(p5_Pid).append("&");stringBuffer.append("p6_Pcat=").append(p6_Pcat).append("&");stringBuffer.append("p7_Pdesc=").append(p7_Pdesc).append("&");stringBuffer.append("p8_Url=").append(p8_Url).append("&");stringBuffer.append("p9_SAF=").append(p9_SAF).append("&");stringBuffer.append("pa_MP=").append(pa_MP).append("&");stringBuffer.append("pd_FrpId=").append(pd_FrpId).append("&");stringBuffer.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");stringBuffer.append("keyValue=").append(keyValue).append("&");stringBuffer.append("hmac=").append(hmac);// 重定向到易宝支付:ServletActionContext.getResponse().sendRedirect(stringBuffer.toString());return NONE;}// 付款成功后的转向public String callBack() {// 修改订单状态:修改状态为已付款(1,未付款 --> 2,付款成功,未发货 --> 3,已发货 --> 4,交易完成)Order currentOrder = orderService.findByOrderId(Long.parseLong(r6_Order));currentOrder.setState(2);orderService.update(currentOrder);// 在页面显示付款成功信息ActionContext.getContext().getSession().put("message", " 付款成功:" + r6_Order + "付款金额:" + r3_Amt);return "msg";}}

<!-- 订单模块Action --><action name="order_*" class="orderAction" method="{1}"><result name="saveSuccess">/WEB-INF/jsp/order.jsp</result><result name="findByUserIdSuccess">/WEB-INF/jsp/orderList.jsp</result><result name="findByOrderId">/WEB-INF/jsp/order.jsp</result></action>


<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!-- saved from url=(0043)http://localhost:8080/mango/cart/list.jhtml --><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>订单页面</title><link href="${pageContext.request.contextPath}/css/common.css" rel="stylesheet" type="text/css"/><link href="${pageContext.request.contextPath}/css/cart.css" rel="stylesheet" type="text/css"/></head><body><div class="container header"><div class="span5"><div class="logo"><a href="${pageContext.request.contextPath}/网上商城/index.htm"><img src="${pageContext.request.contextPath}/image/r___________renleipic_01/logo.gif" alt="传智播客"/></a></div></div><div class="span9"><div class="headerAd"><img src="${pageContext.request.contextPath}/image/header.jpg" width="320" height="50" alt="正品保障" title="正品保障"/></div></div><%@ include file="meun.jsp" %></div><div class="container cart"><div class="span24"><div class="step step1"><ul><li  class="current"></li><li  >生成订单成功</li></ul></div><table><tbody><tr><th colspan="5">订单编号:${model.id}</th></tr><tr><th>图片</th><th>商品</th><th>价格</th><th>数量</th><th>小计</th></tr><s:iterator var="orderItems" value="model.orderItems"><tr><td width="60"><input type="hidden" name="id" value="22"/><img src="${pageContext.request.contextPath }/<s:property value="#orderItems.product.image"/>"/></td><td><s:a action="product_findById.action?id=%{#orderItems.product.id}" target="_blank"><s:property value="#orderItems.product.name"/></s:a></td><td><s:property value="#orderItems.product.shop_price"/></td><td class="quantity" width="60"><input type="text" name="count" value="<s:property value="#orderItems.count"/>" maxlength="4" onpaste="return false;"/><div><span class="increase"> </span><span class="decrease"> </span></div></td><td width="140"><span class="subtotal">¥<s:property value="#orderItems.subtotal"/></span></td></tr></s:iterator></tbody></table><dl id="giftItems" class="hidden" style="display: none;"></dl><div class="total"><em id="promotion"></em>商品金额: <strong id="effectivePrice">¥<s:property value="model.total"/>元</strong></div><form id="orderForm" action="${pageContext.request.contextPath}/order_payOrder.action" method="post"><s:hidden name="id" value="%{model.id}"/><div class="span24"><p>收货地址:<input name="address" type="text" value="<s:property value="model.user.address"/>" style="width:350px" /><br />收货人   :<input name="name" type="text" value="<s:property value="model.user.name"/>" style="width:150px" /><br /> 联系方式:<input name="phone" type="text"value="<s:property value="model.user.phone"/>" style="width:150px" /></p><hr /><p>选择银行:<br/><input type="radio" name="pd_FrpId" value="ICBC-NET-B2C" checked="checked"/>工商银行<img src="${pageContext.request.contextPath}/bank_img/icbc.bmp" align="middle"/>    <input type="radio" name="pd_FrpId" value="BOC-NET-B2C"/>中国银行<img src="${pageContext.request.contextPath}/bank_img/bc.bmp" align="middle"/>    <input type="radio" name="pd_FrpId" value="ABC-NET-B2C"/>农业银行<img src="${pageContext.request.contextPath}/bank_img/abc.bmp" align="middle"/><br/><input type="radio" name="pd_FrpId" value="BOCO-NET-B2C"/>交通银行<img src="${pageContext.request.contextPath}/bank_img/bcc.bmp" align="middle"/>    <input type="radio" name="pd_FrpId" value="PINGANBANK-NET"/>平安银行<img src="${pageContext.request.contextPath}/bank_img/pingan.bmp" align="middle"/>    <input type="radio" name="pd_FrpId" value="CCB-NET-B2C"/>建设银行<img src="${pageContext.request.contextPath}/bank_img/ccb.bmp" align="middle"/><br/><input type="radio" name="pd_FrpId" value="CEB-NET-B2C"/>光大银行<img src="${pageContext.request.contextPath}/bank_img/guangda.bmp" align="middle"/>    <input type="radio" name="pd_FrpId" value="CMBCHINA-NET-B2C"/>招商银行<img src="${pageContext.request.contextPath}/bank_img/cmb.bmp" align="middle"/></p><hr /><p style="text-align:right"><a href="javascript:document.getElementById('orderForm').submit();"><img src="${pageContext.request.contextPath}/images/finalbutton.gif" width="204" height="51" border="0" /></a></p></div></form></div></div><div class="container footer"><div class="span24"><div class="footerAd"><img src="image\r___________renleipic_01/footer.jpg" alt="我们的优势" title="我们的优势" height="52" width="950"></div></div><div class="span24"><ul class="bottomNav"><li><a href="#">关于我们</a>|</li><li><a href="#">联系我们</a>|</li><li><a href="#">诚聘英才</a>|</li><li><a href="#">法律声明</a>|</li><li><a>友情链接</a>|</li><li><a target="_blank">支付方式</a>|</li><li><a target="_blank">配送方式</a>|</li><li><a >SHOP++官网</a>|</li><li><a>SHOP++论坛</a></li></ul></div><div class="span24"><div class="copyright">Copyright © 2005-2015 网上商城 版权所有</div></div></div></body></html>



<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%><%@ taglib uri="/struts-tags" prefix="s"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><!-- saved from url=(0043)http://localhost:8080/mango/cart/list.jhtml --><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/><title>我的订单页面</title><link href="${pageContext.request.contextPath}/css/common.css" rel="stylesheet" type="text/css"/><link href="${pageContext.request.contextPath}/css/cart.css" rel="stylesheet" type="text/css"/></head><body><div class="container header"><div class="span5"><div class="logo"><a href="${pageContext.request.contextPath}/网上商城/index.htm"><img src="${pageContext.request.contextPath}/image/r___________renleipic_01/logo.gif" alt="传智播客"/></a></div></div><div class="span9"><div class="headerAd"><img src="${pageContext.request.contextPath}/image/header.jpg" width="320" height="50" alt="正品保障" title="正品保障"/></div></div><%@ include file="meun.jsp" %></div><div class="container cart"><div class="span24"><div class="step step1"><ul><li  class="current"></li><li>我的订单显示</li></ul></div><table><tbody><%-- 订单信息 --%><s:iterator var="order" value="pageBean.list"><tr><th colspan="5">订单编号:<s:property value="#order.id"/>   <s:if test="#order.state == 1">订单状态:<s:a action="order_findByOrderId.action?id=%{#order.id}"><font color="red">未付款</font></s:a> </s:if><s:if test="#order.state == 2">订单状态:付款成功,等待发货</s:if><s:if test="#order.state == 3">订单状态:已发货</s:if><s:if test="#order.state == 4">订单状态:<s:a action="#"><font color="red">确认收货</font></s:a> </s:if></th></tr><tr><th>图片</th><th>商品</th><th>价格</th><th>数量</th><th>小计</th></tr><%-- 订单项信息 --%><s:iterator var="orderItems" value="#order.orderItems"><tr><td width="60"><input type="hidden" name="id" value="22"/><img src="${pageContext.request.contextPath }/<s:property value="#orderItems.product.image"/>"/></td><td><s:a action="product_findById.action?id=%{#orderItems.product.id}" target="_blank"><s:property value="#orderItems.product.name"/></s:a></td><td><s:property value="#orderItems.product.shop_price"/></td><td class="quantity" width="60"><input type="text" name="count" value="<s:property value="#orderItems.count"/>" maxlength="4" onpaste="return false;"/><div><span class="increase"> </span><span class="decrease"> </span></div></td><td width="140"><span class="subtotal">¥<s:property value="#orderItems.subtotal"/></span></td></tr></s:iterator></s:iterator></tbody></table></div><div class="pagination"><span>第<s:property value="pageBean.page"/>/<s:property value="pageBean.totalPage"/>页</span><s:if test="pageBean.page!=1"><s:a class="firstPage" action="order_findByUserId.action?page=1"> </s:a><!-- 返回第一页 --><s:a class="previousPage" action="order_findByUserId.action?page=%{pageBean.page-1}"> </s:a><!-- 返回上一页 --></s:if><s:iterator var="i" begin="1" end="pageBean.totalPage"><s:if test="pageBean.page != #i"><s:a action="order_findByUserId.action?page=%{i}"><s:property value="#i"/></s:a></s:if><s:else><span class="currentPage"><s:property value="#i"/> </span></s:else></s:iterator><s:if test="pageBean.page!=pageBean.totalPage"><s:a class="nextPage" action="order_findByUserId.action?page=%{pageBean.page+1}"> </s:a><!-- 下一页 --><s:a class="lastPage" action="order_findByUserId.action?page=%{pageBean.totalPage}"> </s:a><!-- 最后一页 --></s:if></div></div><div class="container footer"><div class="span24"><div class="footerAd"><img src="image\r___________renleipic_01/footer.jpg" alt="我们的优势" title="我们的优势" height="52" width="950"></div></div><div class="span24"><ul class="bottomNav"><li><a href="#">关于我们</a>|</li><li><a href="#">联系我们</a>|</li><li><a href="#">诚聘英才</a>|</li><li><a href="#">法律声明</a>|</li><li><a>友情链接</a>|</li><li><a target="_blank">支付方式</a>|</li><li><a target="_blank">配送方式</a>|</li><li><a >SHOP++官网</a>|</li><li><a>SHOP++论坛</a></li></ul></div><div class="span24"><div class="copyright">Copyright © 2005-2015 网上商城 版权所有</div></div></div></body></html>