public class PayAction extends BaseAction {
public String JsapiPay(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response)throws Exception {
PrintWriter out = response.getWriter();
//商品描述 商品或支付单简要描述
String body = request.getParameter("body");
//商户订单号 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
String out_trade_no = request.getParameter("out_trade_no");
//总金额 订单总金额,只能为整数,详见支付金额 注意:金额不带小数点,最小为分,即1元=100分,传数据即可
String total_fee = request.getParameter("total_fee");
//用户标识 trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识
String openid = request.getParameter("openid");
String MCH_ID = PropUtil.getPropertyValue("wx.sz.mchid", "").replace("\"","");
//接收微信支付异步通知回调地址
String NOTIFY_URL = PropUtil.getPropertyValue("wx.sz.notify.url", "").replace("\"","");
//String openid=request.getParameter("openid");
SortedMap<Object,Object> parameters = new TreeMap<Object,Object>();
//公众账号ID 微信分配的公众账号ID(企业号corpid即为此appId)
parameters.put("appid", GetTokenUtil.appid);
//商户号 微信支付分配的商户号
parameters.put("mch_id", MCH_ID);
//随机字符串 随机字符串,不长于32位。推荐随机数生成算法
parameters.put("nonce_str", GetTokenUtil.noncestr);
//商品描述 商品或支付单简要描述
parameters.put("body", body);
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
/*//生成商品订单号 测试用时间作为订单号,具体的业务中请传入订单号,并且保持唯一性
Calendar start1=Calendar.getInstance();
String time_start1 =sdf.format(start1.getTimeInMillis());*/
//商户订单号 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
parameters.put("out_trade_no", out_trade_no);
//总金额 订单总金额,只能为整数,详见支付金额
parameters.put("total_fee", total_fee);
//终端IP APP和网页支付提交用户端ip,Native支付填调用微信支付API的机器IP。
parameters.put("spbill_create_ip",request.getRemoteHost());
System.out.println("用户ip地址为:"+request.getRemoteHost());
//通知地址 接收微信支付异步通知回调地址
parameters.put("notify_url", NOTIFY_URL);
//当前时间
Calendar start=Calendar.getInstance();
String time_start =sdf.format(start.getTimeInMillis());
//交易起始时间 订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。其他详见时间规则
parameters.put("time_start", time_start);
//订单失效时间 订单失效时间为下单后30分钟,30分钟未支付则一律作废,如果有需求可以调整时间
Calendar expire=Calendar.getInstance();
int cont = Integer.parseInt(PropUtil.getPropertyValue("wx.sz.pay.out.of.time", "30").replace("\"",""));
expire.add(Calendar.MINUTE,cont);
String time_expire=sdf.format(expire.getTimeInMillis());
//交易结束时间 订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。其他详见时间规则注意:最短失效时间间隔必须大于5分钟
parameters.put("time_expire", time_expire);
//交易类型 取值如下:JSAPI,NATIVE,APP,WAP,详细说明见参数规定
parameters.put("trade_type", "JSAPI");
//用户标识 trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识。
//openid如何获取,可参考【获取openid】
parameters.put("openid", openid);
String sign = SignUtil.createSign("UTF-8", parameters);
parameters.put("sign", sign);
System.out.println("===========微信支付签名===========为:"+sign);
String requestXML = SignUtil.getRequestXml(parameters);
String unify_url = PropUtil.getPropertyValue("wx.sz.pay.unify", "https://api.mch.weixin.qq.com/pay/unifiedorder").replace("\"","");
String retxml = HttpsUtil.httpsReq(unify_url, "POST", requestXML);
Map<String, String> map = MessageUtil.parsePayXml(retxml);
String prepay_id = null;
String return_code = null;
String result_code = null;
if (map.size()>0) {
return_code =map.get("return_code");
result_code =map.get("result_code");
if ("SUCCESS".equals(return_code)&&"SUCCESS".equals(result_code)) {
System.out.println("下单成功!");
prepay_id =map.get("prepay_id");
System.out.println("生成预订单的id:"+prepay_id);
//获取版本号
String userAgent = request.getHeader("user-agent");
System.out.println("");
//"Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X) AppleWebKit/534.46(KHTML,like Geocko) Mobile/9B206 MicroMessenger/5.0";
char agent = userAgent.charAt(userAgent.indexOf("MicroMessenger")+15);
if (prepay_id!=""||prepay_id!=null) {
//生成时间戳
String timestamp=Long.toString(new Date().getTime()).substring(0, 10);
SortedMap<Object,Object> params = new TreeMap<Object,Object>();
params.put("appId", GetTokenUtil.appid);
params.put("timeStamp", timestamp);
params.put("nonceStr", GetTokenUtil.noncestr);
params.put("package", "prepay_id="+prepay_id);
params.put("signType", "MD5");
String paySign = SignUtil.createSign("UTF-8", params);
params.put("packageValue", "prepay_id="+prepay_id); //这里用packageValue是预防package是关键字在js获取值出错
params.put("paySign", paySign); //paySign的生成规则和Sign的生成规则一致
params.put("agent", agent);//微信版本号,用于前面提到的判断用户手机微信的版本是否是5.0以上版本。
String ret = JSONObject.fromObject(params).toString();
out.println(ret);
}else {
out.println("");
}
}else {
out.println("");
}
}else {
out.println("");
}
return null;
}
}
版权声明:本文为博主原创文章,未经博主允许不得转载。