热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

财付通第三方支付即时到帐支付接口

TenpayUtil.javapackagecom.test.util.tenpay.util;importjava.text.SimpleDateFormat;importjava.util.

TenpayUtil.java

package com.test.util.tenpay.util;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TenpayUtil {
    
    /**
     * 把对象转换成字符串
     * @param obj
     * @return String 转换成字符串,若对象为null,则返回空字符串.
     */
    public static String toString(Object obj) {
        if(obj == null)
            return "";
        
        return obj.toString();
    }
    
    /**
     * 把对象转换为int数值.
     *
     * @param obj  包含数字的对象.
     * @return int  转换后的数值,对不能转换的对象返回0。
     */
    public static int toInt(Object obj) {
        int a = 0;
        try {
            if (obj != null)
                a = Integer.parseInt(obj.toString());
        } catch (Exception e) {

        }
        return a;
    }
    
    /**
     * 获取当前时间 yyyyMMddHHmmss
     * @return String
     */
    public static String getCurrTime() {
        Date now = new Date();
        SimpleDateFormat outFormat = new SimpleDateFormat("yyyyMMddHHmmss");
        String s = outFormat.format(now);
        return s;
    }
    
    /**
     * 获取当前日期 yyyyMMdd
     * @param date
     * @return String
     */
    public static String formatDate(Date date) {
        SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
        String strDate = formatter.format(date);
        return strDate;
    }
    
    /**
     * 取出一个指定长度大小的随机正整数.
     * @param length   int 设定所取出随机数的长度。length小于11
     * @return int 返回生成的随机数。
     */
    public static int buildRandom(int length) {
        int num = 1;
        double random = Math.random();
        if (random <0.1) {
            random = random + 0.1;
        }
        for (int i = 0; i             num = num * 10;
        }
        return (int) ((random * num));
    }
    
    /**
     * 获取编码字符集
     * @param request
     * @param response
     * @return String
     */
    public static String getCharacterEncoding(HttpServletRequest request,
            HttpServletResponse response) {
        
        if(null == request || null == response) {
            return "gbk";
        }
        
        String enc = request.getCharacterEncoding();
        if(null == enc || "".equals(enc)) {
            enc = response.getCharacterEncoding();
        }
        
        if(null == enc || "".equals(enc)) {
            enc = "gbk";
        }
        
        return enc;
    }
    
    /**
     * 获取unix时间,从1970-01-01 00:00:00开始的秒数
     * @param date
     * @return long
     */
    public static long getUnixTime(Date date) {
        if( null == date ) {
            return 0;
        }
        
        return date.getTime()/1000;
    }
        
}

MD5Util.java

package com.test.util.tenpay.util;

import java.security.MessageDigest;

public class MD5Util {

    private static String byteArrayToHexString(byte b[]) {
        StringBuffer resultSb = new StringBuffer();
        for (int i = 0; i             resultSb.append(byteToHexString(b[i]));

        return resultSb.toString();
    }

    private static String byteToHexString(byte b) {
        int n = b;
        if (n <0)
            n += 256;
        int d1 = n / 16;
        int d2 = n % 16;
        return hexDigits[d1] + hexDigits[d2];
    }

    public static String MD5Encode(String origin, String charsetname) {
        String resultString = null;
        try {
            resultString = new String(origin);
            MessageDigest md = MessageDigest.getInstance("MD5");
            if (charsetname == null || "".equals(charsetname))
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes()));
            else
                resultString = byteArrayToHexString(md.digest(resultString
                        .getBytes(charsetname)));
        } catch (Exception exception) {
        }
        return resultString;
    }

    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

}

package com.test.util.tenpay;

import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.test.util.tenpay.util.MD5Util;
import com.test.util.tenpay.util.TenpayUtil;


/**
 * 即时到帐请求类
 * api说明:
 * init(),初始化函数,默认给一些参数赋值,如cmdno,date等。
 * getGateURL()/setGateURL(),获取/设置入口地址,不包含参数值
 * getKey()/setKey(),获取/设置密钥
 * getParameter()/setParameter(),获取/设置参数值
 * getAllParameters(),获取所有参数
 * getRequestURL(),获取带参数的请求URL
 * doSend(),重定向到财付通支付
 * getDebugInfo(),获取debug信息
 *
 */
public class PayRequestHandler extends RequestHandler {

    public PayRequestHandler(HttpServletRequest request, HttpServletResponse response) {
        super(request, response);

        //支付网关地址
        this.setGateUrl("http://service.tenpay.com/cgi-bin/v3.0/payservice.cgi");
        
    }

    /**
     * @Override
     * 初始化函数,默认给一些参数赋值,如cmdno,date等。
     */
    public void init() {

        Date now = new Date();
        SimpleDateFormat dfDay = new SimpleDateFormat("yyyyMMdd");
        String strDay = dfDay.format(now);
        //任务代码
        this.setParameter("cmdno", "1");
        //日期
        this.setParameter("date",  strDay);
        //商户号
        this.setParameter("bargainor_id", "");
        //财付通交易单号
        this.setParameter("transaction_id", "");
        //商家订单号
        this.setParameter("sp_billno", "");
        //商品价格,以分为单位
        this.setParameter("total_fee", "");
        //货币类型
        this.setParameter("fee_type",  "1");
        //返回url
        this.setParameter("return_url",  "");
        //自定义参数
        this.setParameter("attach",  "");
        //用户ip
        this.setParameter("spbill_create_ip",  "");
        //商品名称
        this.setParameter("desc",  "");
        //银行编码
        this.setParameter("bank_type",  "0");
        //字符集编码
        this.setParameter("cs", "gbk");
        //摘要
        this.setParameter("sign", "");
    }

    /**
     * @Override
     * 创建签名
     */
    protected void createSign() {
        
        //获取参数
        String cmdno = this.getParameter("cmdno");
        String date = this.getParameter("date");
        String bargainor_id = this.getParameter("bargainor_id");
        String transaction_id = this.getParameter("transaction_id");
        String sp_billno = this.getParameter("sp_billno");
        String total_fee = this.getParameter("total_fee");
        String fee_type = this.getParameter("fee_type");
        String return_url = this.getParameter("return_url");
        String attach = this.getParameter("attach");
        String spbill_create_ip = this.getParameter("spbill_create_ip");
        String key = this.getKey();
        
        //组织签名
        StringBuffer sb = new StringBuffer();
        sb.append("cmdno=" + cmdno + "&");
        sb.append("date=" + date + "&");
        sb.append("bargainor_id=" + bargainor_id + "&");
        sb.append("transaction_id=" + transaction_id + "&");
        sb.append("sp_billno=" + sp_billno + "&");
        sb.append("total_fee=" + total_fee + "&");
        sb.append("fee_type=" + fee_type + "&");
        sb.append("return_url=" + return_url + "&");
        sb.append("attach=" + attach + "&");
        if(!"".equals(spbill_create_ip)) {
            sb.append("spbill_create_ip=" + spbill_create_ip + "&");
        }
        sb.append("key=" + key);
        
        String enc = TenpayUtil.getCharacterEncoding(this.getHttpServletRequest(), this.getHttpServletResponse());
        //算出摘要
        String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();  
        this.setParameter("sign", sign);
        //debug信息
        this.setDebugInfo(sb.toString() + " => sign:"  + sign);
        
    }
}

package com.test.util.tenpay;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.test.util.tenpay.util.MD5Util;
import com.test.util.tenpay.util.TenpayUtil;

/**
 * 即时到帐应答类
 * api说明:
 * getKey()/setKey(),获取/设置密钥
 * getParameter()/setParameter(),获取/设置参数值
 * getAllParameters(),获取所有参数
 * isTenpaySign(),是否财付通签名,true:是 false:否
 * doShow(),显示处理结果
 * getDebugInfo(),获取debug信息
 *
 */
public class PayResponseHandler extends ResponseHandler {

    public PayResponseHandler(HttpServletRequest request, HttpServletResponse response) {
        
        super(request, response);     
    }

    /**
     * 是否财付通签名
     * @Override
     * @return boolean
     */
    public boolean isTenpaySign() {
        
        //获取参数
        String cmdno = this.getParameter("cmdno");
        String pay_result = this.getParameter("pay_result");
        String date = this.getParameter("date");
        String transaction_id = this.getParameter("transaction_id");
        String sp_billno = this.getParameter("sp_billno");
        String total_fee = this.getParameter("total_fee");        
        String fee_type = this.getParameter("fee_type");
        String attach = this.getParameter("attach");
        String key = this.getKey();
        String tenpaySign = this.getParameter("sign").toLowerCase();
        
        //组织签名串
        StringBuffer sb = new StringBuffer();
        sb.append("cmdno=" + cmdno + "&");
        sb.append("pay_result=" + pay_result + "&");
        sb.append("date=" + date + "&");
        sb.append("transaction_id=" + transaction_id + "&");
        sb.append("sp_billno=" + sp_billno + "&");
        sb.append("total_fee=" + total_fee + "&");
        sb.append("fee_type=" + fee_type + "&");
        sb.append("attach=" + attach + "&");
        sb.append("key=" + key);
        
        String enc = TenpayUtil.getCharacterEncoding(this.getHttpServletRequest(), this.getHttpServletResponse());
        //算出摘要
        String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
        //debug信息
        this.setDebugInfo(sb.toString() + " => sign:" + sign + " tenpaySign:" + tenpaySign);
        return tenpaySign.equals(sign);
    }
}
PayResponseHandler.java

package com.test.util.tenpay;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.test.util.tenpay.util.MD5Util;
import com.test.util.tenpay.util.TenpayUtil;

/**
 * 即时到帐应答类
 * api说明:
 * getKey()/setKey(),获取/设置密钥
 * getParameter()/setParameter(),获取/设置参数值
 * getAllParameters(),获取所有参数
 * isTenpaySign(),是否财付通签名,true:是 false:否
 * doShow(),显示处理结果
 * getDebugInfo(),获取debug信息
 *
 */
public class PayResponseHandler extends ResponseHandler {

    public PayResponseHandler(HttpServletRequest request, HttpServletResponse response) {
       
        super(request, response);
        
    }

    /**
     * 是否财付通签名
     * @Override
     * @return boolean
     */
    public boolean isTenpaySign() {
        
        //获取参数
        String cmdno = this.getParameter("cmdno");
        String pay_result = this.getParameter("pay_result");
        String date = this.getParameter("date");
        String transaction_id = this.getParameter("transaction_id");
        String sp_billno = this.getParameter("sp_billno");
        String total_fee = this.getParameter("total_fee");        
        String fee_type = this.getParameter("fee_type");
        String attach = this.getParameter("attach");
        String key = this.getKey();
        String tenpaySign = this.getParameter("sign").toLowerCase();
        
        //组织签名串
        StringBuffer sb = new StringBuffer();
        sb.append("cmdno=" + cmdno + "&");
        sb.append("pay_result=" + pay_result + "&");
        sb.append("date=" + date + "&");
        sb.append("transaction_id=" + transaction_id + "&");
        sb.append("sp_billno=" + sp_billno + "&");
        sb.append("total_fee=" + total_fee + "&");
        sb.append("fee_type=" + fee_type + "&");
        sb.append("attach=" + attach + "&");
        sb.append("key=" + key);
        
        String enc = TenpayUtil.getCharacterEncoding(
                this.getHttpServletRequest(), this.getHttpServletResponse());
        //算出摘要
        String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
        
        //debug信息
        this.setDebugInfo(sb.toString() + " => sign:" + sign +
                " tenpaySign:" + tenpaySign);
        
        return tenpaySign.equals(sign);
    }
    
}

RequestHandler.java
package com.test.util.tenpay;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.test.util.tenpay.util.MD5Util;
import com.test.util.tenpay.util.TenpayUtil;
/**
 * 请求处理类
 * 请求处理类继承此类,重写createSign方法即可。
 * @author miklchen
 */
public class RequestHandler {
 
 /** 网关url地址 */
 private String gateUrl;
 /** 密钥 */
 private String key;
 /** 请求的参数 */
 private SortedMap parameters;
 /** debug信息 */
 private String debugInfo;
 private HttpServletRequest request;
 private HttpServletResponse response;
 /**
  * 构造函数
  * @param request
  * @param response
  */
 public RequestHandler(HttpServletRequest request, HttpServletResponse response) {
  this.request = request;
  this.respOnse= response;
  
  this.gateUrl = "http://service.tenpay.com/cgi-bin/v3.0/payservice.cgi";
  this.key = "";
  this.parameters = new TreeMap();
  this.debugInfo = "";
 }
 
 /**
 *初始化函数。
 */
 public void init() {
  //nothing to do
 }

 /**
 *获取入口地址,不包含参数值
 */
 public String getGateUrl() {
  return gateUrl;
 }

 /**
 *设置入口地址,不包含参数值
 */
 public void setGateUrl(String gateUrl) {
  this.gateUrl = gateUrl;
 }

 /**
 *获取密钥
 */
 public String getKey() {
  return key;
 }

 /**
 *设置密钥
 */
 public void setKey(String key) {
  this.key = key;
 }
 
 /**
  * 获取参数值
  * @param parameter 参数名称
  * @return String 
  */
 public String getParameter(String parameter) {
  String s = (String)this.parameters.get(parameter); 
  return (null == s) ? "" : s;
 }
 
 /**
  * 设置参数值
  * @param parameter 参数名称
  * @param parameterValue 参数值
  */
 public void setParameter(String parameter, String parameterValue) {
  String v = "";
  if(null != parameterValue) {
   v = parameterValue.trim();
  }
  this.parameters.put(parameter, v);
 }
 
 /**
  * 返回所有的参数
  * @return SortedMap
  */
 public SortedMap getAllParameters() {  
  return this.parameters;
 }

 /**
 *获取debug信息
 */
 public String getDebugInfo() {
  return debugInfo;
 }
 
 /**
  * 获取带参数的请求URL
  * @return String
  * @throws UnsupportedEncodingException 
  */
 public String getRequestURL() throws UnsupportedEncodingException {
  
  this.createSign();
  
  StringBuffer sb = new StringBuffer();
  String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
  Set es = this.parameters.entrySet();
  Iterator it = es.iterator();
  while(it.hasNext()) {
   Map.Entry entry = (Map.Entry)it.next();
   String k = (String)entry.getKey();
   String v = (String)entry.getValue();
   sb.append(k + "=" + URLEncoder.encode(v, enc) + "&");
  }
  
  //去掉最后一个&
  String reqPars = sb.substring(0, sb.lastIndexOf("&"));
  
  return this.getGateUrl() + "?" + reqPars;
  
 }
 
 public void doSend() throws UnsupportedEncodingException, IOException {
  this.response.sendRedirect(this.getRequestURL());
 }
 
 /**
  * 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  */
 protected void createSign() {
  StringBuffer sb = new StringBuffer();
  Set es = this.parameters.entrySet();
  Iterator it = es.iterator();
  while(it.hasNext()) {
   Map.Entry entry = (Map.Entry)it.next();
   String k = (String)entry.getKey();
   String v = (String)entry.getValue();
   if(null != v && !"".equals(v) 
     && !"sign".equals(k) && !"key".equals(k)) {
    sb.append(k + "=" + v + "&");
   }
  }
  sb.append("key=" + this.getKey());
  
  String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
  String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
  
  this.setParameter("sign", sign);
  
  //debug信息
  this.setDebugInfo(sb.toString() + " => sign:" + sign);
  
 }
 
 /**
 *设置debug信息
 */
 protected void setDebugInfo(String debugInfo) {
  this.debugInfo = debugInfo;
 }
 
 protected HttpServletRequest getHttpServletRequest() {
  return this.request;
 }
 
 protected HttpServletResponse getHttpServletResponse() {
  return this.response;
 }
  
}

ResponseHandler.java
package com.test.util.tenpay;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.test.util.tenpay.util.MD5Util;
import com.test.util.tenpay.util.TenpayUtil;

/**
 * 应答处理类
 * 应答处理类继承此类,重写isTenpaySign方法即可。
 * @author miklchen
 *
 */
public class ResponseHandler { 
 
 /** 密钥 */
 private String key;
 
 /** 应答的参数 */
 private SortedMap parameters; 
 
 /** debug信息 */
 private String debugInfo;
 
 private HttpServletRequest request;
 
 private HttpServletResponse response;
 
 private String uriEncoding;
 
 /**
  * 构造函数
  * 
  * @param request
  * @param response
  */
 public ResponseHandler(HttpServletRequest request,
   HttpServletResponse response)  {
  this.request = request;
  this.respOnse= response;

  this.key = "";
  this.parameters = new TreeMap();
  this.debugInfo = "";
  
  this.uriEncoding = "";

  Map m = this.request.getParameterMap();
  Iterator it = m.keySet().iterator();
  while (it.hasNext()) {
   String k = (String) it.next();
   String v = ((String[]) m.get(k))[0];   
   this.setParameter(k, v);
  }

 }
 
 /**
 *获取密钥
 */
 public String getKey() {
  return key;
 }

 /**
 *设置密钥
 */
 public void setKey(String key) {
  this.key = key;
 }

 /**
  * 获取参数值
  * @param parameter 参数名称
  * @return String 
  */
 public String getParameter(String parameter) {
  String s = (String)this.parameters.get(parameter); 
  return (null == s) ? "" : s;
 }
 
 /**
  * 设置参数值
  * @param parameter 参数名称
  * @param parameterValue 参数值
  */
 public void setParameter(String parameter, String parameterValue) {
  String v = "";
  if(null != parameterValue) {
   v = parameterValue.trim();
  }
  this.parameters.put(parameter, v);
 }
 
 /**
  * 返回所有的参数
  * @return SortedMap
  */
 public SortedMap getAllParameters() {
  return this.parameters;
 }
 
 /**
  * 是否财付通签名,规则是:按参数名称a-z排序,遇到空值的参数不参加签名。
  * @return boolean
  */
 public boolean isTenpaySign() {
  StringBuffer sb = new StringBuffer();
  Set es = this.parameters.entrySet();
  Iterator it = es.iterator();
  while(it.hasNext()) {
   Map.Entry entry = (Map.Entry)it.next();
   String k = (String)entry.getKey();
   String v = (String)entry.getValue();
   if(!"sign".equals(k) && null != v && !"".equals(v)) {
    sb.append(k + "=" + v + "&");
   }
  }
  
  sb.append("key=" + this.getKey());
  
  //算出摘要
  String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
  String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
  
  String tenpaySign = this.getParameter("sign").toLowerCase();
  
  //debug信息
  this.setDebugInfo(sb.toString() + " => sign:" + sign +
    " tenpaySign:" + tenpaySign);
  
  return tenpaySign.equals(sign);
 }
 
 /**
  * 显示处理结果。
  * @param show_url 显示处理结果的url地址,绝对url地址的形式(http://www.xxx.com/xxx.jsp)。
  * @throws IOException 
  */
 public void doShow(String show_url) throws IOException {
  String strHtml = "\r\n" +
    "\r\n" +
    "\r\n" +
    "";
  PrintWriter out = this.getHttpServletResponse().getWriter();
  out.println(strHtml);
  out.flush();
  out.close();

 }
 
 /**
  * 获取uri编码
  * @return String
  */
 public String getUriEncoding() {
  return uriEncoding;
 }

 /**
  * 设置uri编码
  * @param uriEncoding
  * @throws UnsupportedEncodingException
  */
 public void setUriEncoding(String uriEncoding)
   throws UnsupportedEncodingException {
  if (!"".equals(uriEncoding.trim())) {
   this.uriEncoding = uriEncoding;

   // 编码转换
   String enc = TenpayUtil.getCharacterEncoding(request, response);
   Iterator it = this.parameters.keySet().iterator();
   while (it.hasNext()) {
    String k = (String) it.next();
    String v = this.getParameter(k);
    v = new String(v.getBytes(uriEncoding.trim()), enc);
    this.setParameter(k, v);
   }
  }
 }

 /**
 *获取debug信息
 */
 public String getDebugInfo() {
  return debugInfo;
 }
 
 /**
 *设置debug信息
 */
 protected void setDebugInfo(String debugInfo) {
  this.debugInfo = debugInfo;
 }
 
 protected HttpServletRequest getHttpServletRequest() {
  return this.request;
 }
 
 protected HttpServletResponse getHttpServletResponse() {
  return this.response;
 }
 
 /**
  * 是否财付通签名
  * @param signParameterArray 签名的参数数组
  * @return boolean
  */
 protected boolean isTenpaySign(String signParameterArray[]) {

  StringBuffer signPars = new StringBuffer();
  for(int index = 0; index    String k = signParameterArray[index];
   String v = this.getParameter(k);
   if(null != v && !"".equals(v)) {
    signPars.append(k + "=" + v + "&");
   }
  }
  
  signPars.append("key=" + this.getKey());
    
  String enc = TenpayUtil.getCharacterEncoding(
    this.getHttpServletRequest(), this.getHttpServletResponse());
  //算出摘要
  String sign = MD5Util.MD5Encode(signPars.toString(), enc).toLowerCase();
  
  String tenpaySign = this.getParameter("sign").toLowerCase();
  
  //debug信息
  this.setDebugInfo(signPars.toString() + " => sign:" + sign +
    " tenpaySign:" + tenpaySign);
  
  return tenpaySign.equals(sign);
 }
 
}


//以上都是一些财付通的基础类,可以拿过来直接用。

//下面是设置商户信息,也可写到到配置文件里,这里为了简单、方便起见,这里把原先写在TenpayConfig下的,直接写在支付中心的action里了。

//商户号
String bargainor_id = "1900000109";

//密钥
String key = "8934e7d15453e97507ef794cf7b0519d";

//回调通知URL,让财付通回调使用
//String return_url = "http://localhost:8080/tenpay/return_url.jsp";
String return_url=http:www.xxx.com:8080/myProject/caiftTrade.action

//当前时间 yyyyMMddHHmmss
String currTime = TenpayUtil.getCurrTime();

//8位日期
String strDate = currTime.substring(0, 8);

//6位时间
String strTime = currTime.substring(8, currTime.length());

//四位随机数
String strRandom = TenpayUtil.buildRandom(4) + "";

//10位序列号,可以自行调整。
String strReq = strTime + strRandom;

//商家订单号,长度若超过32位,取前32位。财付通只记录商家订单号,不保证唯一。
String sp_billno = strReq;

//财付通交易单号,规则为:10位商户号+8位时间(YYYYmmdd)+10位流水号
String transaction_id = bargainor_id + strDate + strReq;

//在业务逻辑层里,可以做一些订单处理,例如:商品名称,编号,价格,订单号,财付通交易单号
//从前台用户请求的信息,进行设置,这里就不再进行重复了,各位可以自己处理自己的商品信息
int totalmOney= 0.01;
String subject = "购买的商品名称";

 

// 订单表
OrderForm of = new OrderForm();
of.setOutTradeNo(sp_billno);// 订单号
of.setTradeNo(transaction_id);// 财付通交易单号
of.setUserId(Long.valueOf(userId));
of.setTradeStatus(0);// 表示未完成
of.setCreateTime(new Date());// 订单创建时间
of.setTotalFee(BigDecimal.valueOf(totalmoney));// 此次交易的总金额
of.setPayType(payType);
// 保存订单信息
orderFormService.save(of);

//之后,将提交本次的订单请求
getRequest().setAttribute("totalMoney",String.valueOf(totalmoney));
getRequest().setAttribute("out_trade_no", sp_billno);
getRequest().setAttribute("transaction_id", transaction_id);
getRequest().setAttribute("subject", subject);
//跳转到JSP,让JSP提交订单请求  tenpay.jsp

//import org.apache.struts2.ServletActionContext;
protected HttpServletRequest getRequest() {
  return ServletActionContext.getRequest();
 }


tenpay.jsp
<%@ page language="java" cOntentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%@ page import="java.text.SimpleDateFormat" %>    
<%@ page import="java.util.Date" %>
<%@ page import="com.test.util.tenpay.util.TenpayUtil" %>
<%@ page import="com.test.util.tenpay.PayRequestHandler"%>
<%@ page import="com.test.constants.TenpayConfig"%>


 
  
  
  
 

<%

//创建PayRequestHandler实例
PayRequestHandler reqHandler = new PayRequestHandler(request, response);

//设置密钥
reqHandler.setKey(TenpayConfig.key);

//初始化
reqHandler.init();
//设置编码方式,否则如果是中文的商品名称时,财付通会出现乱码
reqHandler.setParameter("cs", "UTF-8");

//设置支付参数
//商家订单号,长度若超过32位,取前32位。财付通只记录商家订单号,不保证唯一。
String out_trade_no = (String)request.getAttribute("out_trade_no");
//商品金额,以分为单位
String total_fee = (String)request.getAttribute("totalMoney");
//财付通交易单号,规则为:10位商户号+8位时间(YYYYmmdd)+10位流水号
String transaction_id = (String)request.getAttribute("transaction_id");
String subject = (String)request.getAttribute("subject");

String temp_total_fee =(Integer.parseInt(total_fee)*100)+"";  //让用户看到以元为单位金额
reqHandler.setParameter("bargainor_id", bargainor_id);   //商户号
reqHandler.setParameter("sp_billno", out_trade_no);   //商家订单号
reqHandler.setParameter("transaction_id", transaction_id);  //财付通交易单号
reqHandler.setParameter("return_url", return_url);   //支付通知url
reqHandler.setParameter("desc", subject);    //商品名称
//设置金额
reqHandler.setParameter("total_fee", temp_total_fee);   //商品金额,以分为单位,财付通规定不能出现任何字付,包括小数点

//用户ip,测试环境时不要加这个ip参数,正式环境再加此参数
reqHandler.setParameter("spbill_create_ip",request.getRemoteAddr());

//获取请求带参数的url
String requestUrl = reqHandler.getRequestURL();

//获取debug信息
String debuginfo = reqHandler.getDebugInfo();

//System.out.println("requestUrl:" + requestUrl);
System.out.println("debuginfo:" + debuginfo);

%>
       


           
               
           
           
               
               
           
           
               
               
           
           
               
               
           
           
               
           
       
订单确认
商品名称:<%=subject%>
订单号:<%=out_trade_no%>
付款总金额:<%=total_fee%>元
财付通支付

 

注:
几个问题说明一下:
一、在JSP提交订单请求的时候,如果没有设置reqHandler.setParameter("cs", "UTF-8");会出现乱码,加上编码方式就可以了。
二、在支付时,当交易金额>=1元时,如果报支付失败,出现:“支付失败,您的资金未被扣除,原因可能是:您所下单网站链接有更新或者存在风险,请您稍后尝试或者与该网站客服联系”。
出现这种情况的主要原因是:
1.如果是本地调试,请务必输入支付金额<1元,比如:0.01元,这样就可以了。

2.在申请的域名下测试,也就是正式环境,可以自由输入金额,不受相关限制。也就是不会有类似的错误。
也可以直接去看它的解释:从:http://support.qq.com/cgi-bin/content_new?tid=13037268950282884&num=10&order=0&fid=565&dispn,可以看到。

//一切都成功之后,写一个让财付通回调的,同时,也做一些我们自己的业务逻辑处理。
struts.xml

/page/payment/cftsuccess.jsp
/page/payment/cftfailure.jsp

// 处理财付通传过来的参数信息
public String caiftTrade() throws Exception {
//密钥
String key = "8934e7d15453e97507ef794cf7b0519d";

//创建PayResponseHandler实例
PayResponseHandler resHandler = new PayResponseHandler(request, response);

resHandler.setKey(key);

//判断签名
if(resHandler.isTenpaySign()) {
 // 订单号
 String out_trade_no = resHandler.getParameter("sp_billno");

 //交易单号
 String transaction_id = resHandler.getParameter("transaction_id");
 
 //金额金额,以分为单位
 String total_fee = resHandler.getParameter("total_fee");
 
 //支付结果
 String pay_result = resHandler.getParameter("pay_result");
 
 if( "0".equals(pay_result) ) {
  //处理业务开始
  
  //注意交易单不要重复处理
  //注意判断返回金额
  OrderForm of = (OrderForm) orderFormService.findOrderFormsByOut_trade_no(out_trade_no);
  of.setTradeStatus(1);
  of.setTradeNo(trade_no);
  of.setNotifyTime(new Date());
  orderFormService.updateOldModel(of); // 更新

  //其它的一些处理

  //处理业务完毕
  return SUCCESS;
 } else {
  //当做不成功处理("支付失败");
  return "failure";
 }
 
} else {
 //("认证签名失败");
 //String debugInfo = resHandler.getDebugInfo();
 //System.out.println("debugInfo:" + debugInfo);
 return "failure";
}

cftsuccess.jsp  和  cftfailure.jsp
这两个JSP只是一个显示成为与失败的作用,这里就不再多说了。


推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • (三)多表代码生成的实现方法
    本文介绍了一种实现多表代码生成的方法,使用了java代码和org.jeecg框架中的相关类和接口。通过设置主表配置,可以生成父子表的数据模型。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 开发笔记:Java是如何读取和写入浏览器Cookies的
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Java是如何读取和写入浏览器Cookies的相关的知识,希望对你有一定的参考价值。首先我 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
author-avatar
err2356267
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有