这是服务端支付的主要类 (未封装的类)

package com.admin.util.pay;
 
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.SortedMap;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.json.JSONObject;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
 
import com.admin.pay.ClientRequestHandler;
import com.admin.pay.PackageRequestHandler;
import com.admin.pay.PrepayIdRequestHandler;
import com.admin.pay.RequestHandler;
import com.admin.pay.ResponseHandler;
import com.admin.pay.client.ClientResponseHandler;
import com.admin.pay.client.TenpayHttpClient;
import com.admin.pay.util.ConstantUtil;
import com.admin.pay.util.JsonUtil;
import com.admin.pay.util.ResponsePage;
import com.admin.pay.util.TenpayUtil;
import com.admin.pay.util.WXUtil;
import com.admin.pay.util.XMLUtil;
 
@Controller
@RequestMapping("/payForJuFu")
public class PayForJuFuUtil extends ResponsePage {
//应用ID
private final static String WEIXIN_APPID="";
//微信支付商户号
private final static String WEIXIN_MCH_ID="";
//设备号
//private final static String WEIXIN_DEVICE_INFO="";
//商品描述
private final static String WEIXIN_BODY="ads";
//交易类型
private final static String WEIXIN_TRADE_TYPE="APP";
//随机字符串
private static String WEIXIN_NONCE_STR="";
//通知地址
private final static String WEIXIN_NOTIFY_URL="回调地址";
//商户订单号
private static String WEIXIN_OUT_TRADE_NO="";
//总金额
private final static String WEIXIN_TOTAL_FEE="1";
//用户标识
private final static String WEIXIN_OPENID="";
//签名
private static String WEIXIN_SIGN="";
//key
// private final static String WEIXIN_KEY="21232f297a57a5a743894a0e4a801fc3";
private final static String WEIXIN_KEY="k669YxjqG91yKO5HvCeqR676zeEhcsoZ";
 
private final static String tyUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder";
 
@RequestMapping(value = "/weixinPay")
@ResponseBody
public String weixinPay(HttpServletRequest request,HttpServletResponse response) throws Exception {
 
//---------------生成随机字符串
WEIXIN_NONCE_STR = WXUtil.getNonceStr();
 
//---------------生成订单号 开始------------------------
//当前时间 yyyyMMddHHmmss
String currTime = TenpayUtil.getCurrTime();
//8位日期
String strTime = currTime.substring(8, currTime.length());
//四位随机数
String strRandom = TenpayUtil.buildRandom(4) + "";
//10位序列号,可以自行调整。
String strReq = strTime + strRandom;
//订单号,此处用时间加随机数生成,商户根据自己情况调整,只要保持全局唯一就行
WEIXIN_OUT_TRADE_NO = strReq;
//---------------生成订单号 结束------------------------
 
 
PackageRequestHandler header = new PackageRequestHandler(request, response);
// PrepayIdRequestHandler prepayReqHandler = new PrepayIdRequestHandler(request, response);
ClientRequestHandler clientHandler = new ClientRequestHandler(request, response);
Object ip = request.getParameter("userIp");
String userIp = null;
if(request.getParameter("userIp") != null) {
userIp = ip.toString();
}
header.setParameter("appid", WEIXIN_APPID);
header.setParameter("mch_id", WEIXIN_MCH_ID);
//header.setParameter("device_info", WEIXIN_DEVICE_INFO);
header.setParameter("nonce_str", WEIXIN_NONCE_STR);
header.setParameter("body", WEIXIN_BODY);
header.setParameter("out_trade_no", WEIXIN_OUT_TRADE_NO);
header.setParameter("total_fee", WEIXIN_TOTAL_FEE);
// header.setParameter("spbill_create_ip", request.getRemoteAddr());
// header.setParameter("spbill_create_ip", userIp);
header.setParameter("spbill_create_ip", "118.89.109.154");
header.setParameter("notify_url", WEIXIN_NOTIFY_URL);
header.setParameter("trade_type", WEIXIN_TRADE_TYPE);
//header.setParameter("openid", WEIXIN_OPENID);
 
String signStr = createSign("UTF-8", header.getAllParameters());
System.out.println("统一下单signStr:" + signStr);
//header.setParameter("sign", signStr);
 
String xmlBody = buildXML(header.getAllParameters(), signStr);
System.out.println("统一下单xmlBody:" + xmlBody);
 
TenpayHttpClient hc = new TenpayHttpClient();
hc.setReqContent(tyUrl);
String resContent = null;
String prepayid = null;
if(hc.callHttpPost(tyUrl, xmlBody)) {
resContent = hc.getResContent();
if (resContent.indexOf("prepay_id") > -1) {
// prepayid = JsonUtil.getJsonValue(resContent, "prepay_id");
Map map = XMLUtil.doXMLParse(resContent);
prepayid = map.get("prepay_id").toString();
}
}
 
System.out.println("统一下单resContent:" + resContent);
System.out.println("统一下单prepayid:" + prepayid);
 
String noncestr = WXUtil.getNonceStr();
String timestamp = WXUtil.getTimeStamp();
 
Map<Object,Object> resInfo = new HashMap<Object, Object>();
int retcode = 0;
String retmsg = null;
 
//返回给客户端的参数
if (null != prepayid && !"".equals(prepayid)) {
//输出参数列表
clientHandler.setParameter("appid", WEIXIN_APPID);
clientHandler.setParameter("noncestr", noncestr);
clientHandler.setParameter("package", "Sign=WXPay");
clientHandler.setParameter("partnerid", WEIXIN_MCH_ID);
clientHandler.setParameter("prepayid", prepayid);
clientHandler.setParameter("timestamp", timestamp);
//生成签名
signStr = createSign("UTF-8", clientHandler.getAllParameters());
clientHandler.removeParameter("package");
clientHandler.setParameter("packagevalue", "Sign=WXPay");
 
xmlBody = buildXML(clientHandler.getAllParameters(), signStr);
 
System.out.println("返回APP的signStr参数:" + signStr);
System.out.println("返回APP的xmlBody参数:" + xmlBody);
 
//加入单号
clientHandler.setParameter("mch_id", WEIXIN_MCH_ID);
clientHandler.setParameter("out_trade_no", WEIXIN_OUT_TRADE_NO);
//验证参数
check(request,response,clientHandler);
 
Map map = XMLUtil.doXMLParse(xmlBody);
resInfo.put("entity", map);
retcode = 0;
retmsg = "OK";
} else {
retcode = -2;
retmsg = "错误:获取prepayId失败";
}
resInfo.put("retcode", retcode);
resInfo.put("retmsg", retmsg);
return new JSONObject(resInfo).toString();
}
 
/**
* 微信支付签名算法sign
* @param characterEncoding
* @param parameters
* @return
*/
public static String createSign(String characterEncoding,SortedMap<Object,Object> parameters){
StringBuffer sb = new StringBuffer();
Set es = parameters.entrySet();//所有参与传参的参数按照accsii排序(升序)
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
Object v = entry.getValue();
if(null != v && !"".equals(v)
&& !"sign".equals(k) && !"key".equals(k)) {
sb.append(k + "=" + v + "&");
}
}
 
sb.append("key=" + WEIXIN_KEY);
System.out.println("签名字符串:"+sb.toString());
System.out.println("签名MD5未变大写:" + MD5Util.MD5Encode(sb.toString(), characterEncoding));
String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase();
return sign;
}
 
public static String buildXML(SortedMap<Object,Object> parameters, String sign) {
StringBuffer sb = new StringBuffer("<xml>\n");
Set es = 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 (!"appkey".equals(k)) {
sb.append("<" + k + ">" + v + "</" + k + ">" + "\r\n");
}
}
if(sign != null && sign != "") {
sb.append("<sign>" + sign + "</sign>" + "\r\n");
}
sb.append("</xml>");
return sb.toString();
}
 
/**
* 验证参数
* @param request
* @param response
* @param clientHandler
*/
public void check(HttpServletRequest request,HttpServletResponse response, ClientRequestHandler clientHandler) {
 
String noncestr = WXUtil.getNonceStr();
 
String checkUrl = "https://api.mch.weixin.qq.com/pay/orderquery";
ClientRequestHandler clientHeader = new ClientRequestHandler(request, response);
clientHeader.setParameter("appid", clientHandler.getParameter("appid"));
clientHeader.setParameter("mch_id", clientHandler.getParameter("mch_id"));
clientHeader.setParameter("out_trade_no", clientHandler.getParameter("out_trade_no"));
clientHeader.setParameter("nonce_str", noncestr);
// clientHeader.setParameter("sign", clientHandler.getParameter("sign"));
String signStr = createSign("UTF-8", clientHeader.getAllParameters());
System.out.println("验证signStr:" + signStr);
 
String xmlBody = buildXML(clientHeader.getAllParameters(), signStr);
System.out.println("验证xmlBody:" + xmlBody);
 
String resContent = null;
 
TenpayHttpClient hc = new TenpayHttpClient();
hc.setReqContent(checkUrl);
if(hc.callHttpPost(tyUrl, xmlBody)) {
resContent = hc.getResContent();
// if (resContent.indexOf("prepay_id") > -1) {
// Map map = XMLUtil.doXMLParse(resContent);
// prepayid = map.get("prepay_id").toString();
 
// }
int rspCode = hc.getResponseCode();
System.out.println("验证code:" + rspCode);
System.out.println("验证参数:" + resContent);
}
 
}
/*
public void check(HttpServletRequest request,HttpServletResponse response) {
//---------------------------------------------------------
//财付通支付通知(后台通知)示例,商户按照此文档进行开发即可
//---------------------------------------------------------
//商户号
String partner = "";
 
//密钥
String key = "";
 
//创建支付应答对象
ResponseHandler resHandler = new ResponseHandler(request, response);
resHandler.setKey(key);
 
//判断签名
if(resHandler.isTenpaySign()) {
 
//通知id
String notify_id = resHandler.getParameter("notify_id");
 
//创建请求对象
RequestHandler queryReq = new RequestHandler(null, null);
//通信对象
TenpayHttpClient httpClient = new TenpayHttpClient();
//应答对象
ClientResponseHandler queryRes = new ClientResponseHandler();
 
//通过通知ID查询,确保通知来至财付通
queryReq.init();
queryReq.setKey(key);
queryReq.setGateUrl("https://gw.tenpay.com/gateway/verifynotifyid.xml");
queryReq.setParameter("partner", partner);
queryReq.setParameter("notify_id", notify_id);
 
//通信对象
httpClient.setTimeOut(5);
//设置请求内容
httpClient.setReqContent(queryReq.getRequestURL());
System.out.println("queryReq:" + queryReq.getRequestURL());
//后台调用
if(httpClient.call()) {
//设置结果参数
queryRes.setContent(httpClient.getResContent());
System.out.println("queryRes:" + httpClient.getResContent());
queryRes.setKey(key);
 
 
//获取返回参数
String retcode = queryRes.getParameter("retcode");
String trade_state = queryRes.getParameter("trade_state");
 
String trade_mode = queryRes.getParameter("trade_mode");
 
//判断签名及结果
if(queryRes.isTenpaySign()&& "0".equals(retcode) && "0".equals(trade_state) && "1".equals(trade_mode)) {
System.out.println("订单查询成功");
//取结果参数做业务处理
System.out.println("out_trade_no:" + queryRes.getParameter("out_trade_no")+
" transaction_id:" + queryRes.getParameter("transaction_id"));
System.out.println("trade_state:" + queryRes.getParameter("trade_state")+
" total_fee:" + queryRes.getParameter("total_fee"));
//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
System.out.println("discount:" + queryRes.getParameter("discount")+
" time_end:" + queryRes.getParameter("time_end"));
//------------------------------
//处理业务开始
//------------------------------
 
//处理数据库逻辑
//注意交易单不要重复处理
//注意判断返回金额
 
//------------------------------
//处理业务完毕
//------------------------------
resHandler.sendToCFT("Success");
}
else{
//错误时,返回结果未签名,记录retcode、retmsg看失败详情。
System.out.println("查询验证签名失败或业务错误");
System.out.println("retcode:" + queryRes.getParameter("retcode")+
" retmsg:" + queryRes.getParameter("retmsg"));
}
 
} else {
 
System.out.println("后台调用通信失败");
 
System.out.println(httpClient.getResponseCode());
System.out.println(httpClient.getErrInfo());
//有可能因为网络原因,请求已经处理,但未收到应答。
}
}
else{
System.out.println("通知签名验证失败");
}
}*/
}
 
posted @ 2017-09-19 10:13  移动的130  阅读(193)  评论(0编辑  收藏  举报