java实现支付充值的通用流程

/*支付流程*/

/****Controller.java 代码如下:*/

@RequestMapping(value = "/paySubmit.htm", method = RequestMethod.POST)
public ModelAndView paySubmit(HttpServletRequest request,
        HttpServletResponse response, @RequestParam Map<String, Object> maps){
        ModelAndView model = new ModelAndView("***/submit");
        /**
        * 代码块
        */
        return model;
}


/*submit.jsp 代码如下:*/


<%@ page contentType="text/html;charset=UTF-8" language="java" trimDirectiveWhitespaces="true" %>
<%@ page import="com.***.util.PayUtil" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>支付</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
  </head>
  
  <body>

  <%
      request.setCharacterEncoding("UTF-8");
      String type =  (String) request.getAttribute("type");
      String sHtmlText = "";
      if ("1".equals(type)){
          sHtmlText = PayUtil.buildForm(
                  (String) request.getAttribute("orderNo"),
                  (String) request.getAttribute("amt"),type);
      }else{
          sHtmlText = PayUtil.allInPaybuildForm(
                  (String) request.getAttribute("orderNo"),
                  (String) request.getAttribute("amt"),type,request);
      }
      out.println(sHtmlText);
  %>

  </body>

</html>


/* PayUtil.java 代码如下:*/

/**
 * 生成页面数据
 * @param url 三方支付的URL
 * @param sPara
 * @param strMethod
 * @return
 */
public static String buildRequest(String url, Map<String, String> sPara, String strMethod) {
    ArrayList keys = new ArrayList(sPara.keySet());
    StringBuffer sbHtml = new StringBuffer();
    sbHtml.append("<form id=\"paySubForm\" name=\"paySubForm\" action=\"" + url + "\" method=\"" + strMethod + "\">");

    for(int i = 0; i < keys.size(); ++i) {
        String name = (String)keys.get(i);
        String value = (String)sPara.get(name);
        sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");
    }

    sbHtml.append("<input type=\"submit\" name=\"b1\" value=\"确认\" style=\"display:none;\"></form>");
    sbHtml.append("<script>document.forms[\'paySubForm\'].submit();</script>");
    return sbHtml.toString();
}


/**
 * 以民生支付为例
 * @param orderNo
 * @param amt
 * @param type
 * @return
 */
public static String buildForm(String orderNo, String amt,String type) {

    //商户编号
    String merchantid = PropertiesRead.use_classLoador().getProperty("CMBC.pay.id");
    //订单编号 商户的交易定单号,由商户网站生成,最大长度30
    String merorderid = orderNo;
    //金  额
    String amountsum = amt;
    //商品种类
    String subject = PropertiesRead.use_classLoador().getProperty("CMBC.pay.type");//"empty";
    //币  种 01 为cny
    String currencytype = "01";
    //自动调转取货页面0→不跳转;1→跳转
    String autojump = "1";
    //跳转等待时间
    String waittime    = "0";
    
    //商户取货URL    
    String merurl = PropertiesRead.use_classLoador().getProperty("CMBC.pay.return.page.url");      
    //是否通知商户: 0→不通知;1→通知
    String informmer = "1";
    //商户通知URL
    String informurl = PropertiesRead.use_classLoador().getProperty("CMBC.pay.return.notify.url");
    
    /**
     *  商户返回确认:    0→不返回;1→返回
    */
    String confirm = "1";
    
    //支付银行
    String merbank = "empty";
    //支付类型 0→即时到账;1→担保交易
    String tradetype = "0";

    //是否在商户端选择银行:0→其他;1→在商户端选择银行
    String bankInput = "0";
    //接口版本
    String strInterface = "5.00";
    
    //备  注 (可选) 支付备注信息,最大长度50
    String remark = "充值";
    //支付银行卡类型 00→借贷混合;01→纯借记
    String bankcardtype = "00";
    
    //商品描述
    String pdtdnm = "虚拟商品";
    //商品描述地址
    String pdtdetailurl = PropertiesRead.use_classLoador().getProperty("CMBC.pay.return.detail.url");
    //支付密钥(必填): 需在支付平台进行设置,可登录商户管理系统进行维护,用于上送商户支付及下传支付结果加密
    String MD5key = PropertiesRead.use_classLoador().getProperty("CMBC.pay.pwd");
    
   //拼接加密的源字符串
   String mac_src="merchantid="+merchantid+"&merorderid="+merorderid
                +"&amountsum="+amountsum+"&subject="+subject
                +"&currencytype="+currencytype+"&autojump="+autojump
                + "&waittime=" + waittime +"&merurl="+merurl
                + "&informmer=" + informmer +"&informurl=" +informurl
                + "&confirm=" + confirm + "&merbank=" + merbank
                + "&tradetype=" + tradetype + "&bankInput=" + bankInput
                + "&interface=" + strInterface + "&bankcardtype=" + bankcardtype
                + "&pdtdetailurl=" + pdtdetailurl + "&merkey="+MD5key;
   
   
    String mac = Crypto.GetMessageDigest(mac_src);
    
    // 把请求参数打包成map
    Map<String, String> sParaTemp = new HashMap<String,String>();
    sParaTemp.put("merchantid", merchantid);
    sParaTemp.put("merorderid", merorderid);
    sParaTemp.put("amountsum", amountsum);
    sParaTemp.put("subject", subject);
    sParaTemp.put("currencytype", currencytype);
    sParaTemp.put("autojump", autojump);
    sParaTemp.put("waittime", waittime);
    sParaTemp.put("merurl", merurl);
    sParaTemp.put("informmer", informmer);
    sParaTemp.put("informurl", informurl);
    sParaTemp.put("confirm", confirm);
    sParaTemp.put("merbank", merbank);
    sParaTemp.put("tradetype", tradetype);
    sParaTemp.put("bankInput", bankInput);
    sParaTemp.put("interface", strInterface);
    sParaTemp.put("remark", remark);
    sParaTemp.put("bankcardtype", bankcardtype);
    sParaTemp.put("pdtdnm", pdtdnm);
    sParaTemp.put("pdtdetailurl", pdtdetailurl);
    sParaTemp.put("mac", mac);

    //建立请求
    String sHtmlText = buildRequest(PropertiesRead.use_classLoador().getProperty("CMBC.pay.url"), sParaTemp, "post");

    logger.info("McPay request: {}", sHtmlText);

    return sHtmlText;
}

/" Crypto.java 代码如下 "/
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * <p>Title: MD5加密算法</p>
 * <p>Description: 商户不需要进行修改</p>
 * <p>******科技发展公司 2009. All rights reserved.</p>
 */
public class Crypto {

    /**
     * 功能:MD5加密
     * @param strSrc 加密的源字符串
     * @return 加密串 长度32位
     */
    public static String GetMessageDigest(String strSrc) {
        MessageDigest md = null;
        String strDes = null;
        final String ALGO_MD5 = "MD5";

        byte[] bt = strSrc.getBytes();
        try {
            md = MessageDigest.getInstance(ALGO_MD5);
            md.update(bt);
            strDes = bytes2Hex(md.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new IllegalStateException(
                "系统不支持的MD5算法!");
        }
        return strDes;
    }

    /**
     * 将字节数组转为HEX字符串(16进制串)
     * @param bts 要转换的字节数组
     * @return 转换后的HEX串
     */
    public static String bytes2Hex(byte[] bts) {
        String des = "";
        String tmp = null;
        for (int i = 0; i < bts.length; i++) {
            tmp = (Integer.toHexString(bts[i] & 0xFF));
            if (tmp.length() == 1) {
                des += "0";
            }
            des += tmp;
        }
        return des;
    }

}

    
    /**
     * 支付返回调用url(返回页面)
     * @param session
     * @param request
     * @return
     */
    @RequestMapping(value = "/allPayReturn.htm", method = RequestMethod.POST)
    public ModelAndView allInPayReturnCall(HttpServletRequest request,
            HttpServletResponse response, @RequestParam Map<String, Object> maps){
        ModelAndView model = new ModelAndView("***/payReturn");
        /**
        * 代码块
        */
        return model;
    }
    
    
 

转载于:https://my.oschina.net/u/727394/blog/678446

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值