package org.andy.wxpay.controller;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.andy.wxpay.model.JsonResult;
import org.andy.wxpay.model.ResponseData;
import org.andy.wxpay.utils.CollectionUtil;
import org.andy.wxpay.utils.ConfigUtil;
import org.andy.wxpay.utils.FileUtil;
import org.andy.wxpay.utils.HttpUtils;
import org.andy.wxpay.utils.PayUtil;
import org.andy.wxpay.utils.SerializerFeatureUtil;
import org.andy.wxpay.utils.StringUtil;
import org.andy.wxpay.utils.WebUtil;
import org.andy.wxpay.utils.XmlUtil;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.alibaba.fastjson.JSON;
/**
* 创建时间:2016年11月2日 下午4:16:32
*
* @author andy
* @version 2.2
*/
@Controller
@RequestMapping("/order")
public class PayController {
private static final Logger LOG = Logger.getLogger(PayController.class);
private static final String ORDER_PAY = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 统一下单
private static final String ORDER_PAY_QUERY = "https://api.mch.weixin.qq.com/pay/orderquery"; // 支付订单查询
private static final String ORDER_REFUND = "https://api.mch.weixin.qq.com/secapi/pay/refund"; // 申请退款
private static final String ORDER_REFUND_QUERY = "https://api.mch.weixin.qq.com/pay/refundquery"; // 申请退款
private static final String APP_ID = ConfigUtil.getProperty("wx.appid");
private static final String MCH_ID = ConfigUtil.getProperty("wx.mchid");
private static final String API_SECRET = ConfigUtil.getProperty("wx.api.secret");
/**
* 支付下订单
*
* @param request
* @param response
* @param cashnum
* 支付金额
* @param mercid
* 商品id
* @param callback
*/
@RequestMapping(value = "/pay", method = RequestMethod.POST)
public void orderPay(HttpServletRequest request, HttpServletResponse response,
@RequestParam(required = false, defaultValue = "0") Double cashnum, String mercid, String callback) {
LOG.info("[/order/pay]");
if (!"001".equals(mercid)) {
WebUtil.response(response, WebUtil.packJsonp(callback, JSON
.toJSONString(new JsonResult(-1, "商品不存在", new ResponseData()), SerializerFeatureUtil.FEATURES)));
}
Map<String, String> restmap = null;
boolean flag = true; // 是否订单创建成功
try {
String total_fee = BigDecimal.valueOf(cashnum).multiply(BigDecimal.valueOf(100))
.setScale(0, BigDecimal.ROUND_HALF_UP).toString();
Map<String, String> parm = new HashMap<String, String>();
parm.put("appid", APP_ID);
parm.put("mch_id", MCH_ID);
parm.put("device_info", "WEB");
parm.put("nonce_str", PayUtil.getNonceStr());
parm.put("body", "测试付费");
parm.put("attach", "Andy");
parm.put("out_trade_no", PayUtil.getTradeNo());
parm.put("total_fee", total_fee);
parm.put("spbill_create_ip", PayUtil.getRemoteAddrIp(request));
parm.put("notify_url", "https://www.andy.co/wxpay/order/pay/notify.shtml"); //微信服务器异步通知支付结果地址 下面的order/notify 方法
parm.put("trade_type", "APP");
parm.put("sign", PayUtil.getSign(parm, API_SECRET));
String restxml = HttpUtils.post(ORDER_PAY, XmlUtil.xmlFormat(parm, false));
restmap = XmlUtil.xmlParse(restxml);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
Map<String, String> payMap = new HashMap<String, String>();
if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
payMap.put("appid", APP_ID);
payMap.put("partnerid", MCH_ID);
payMap.put("prepayid", restmap.get("prepay_id"));
payMap.put("package", "Sign=WXPay");
payMap.put("noncestr", PayUtil.getNonceStr());
payMap.put("timestamp", PayUtil.payTimestamp());
try {
payMap.put("sign", PayUtil.getSign(payMap, API_SECRET));
} catch (Exception e) {
flag = false;
}
}
if (flag) {
WebUtil.response(response,
WebUtil.packJsonp(callback,
JSON.toJSONString(new JsonResult(1, "订单获取成功", new ResponseData(null, payMap)),
SerializerFeatureUtil.FEATURES)));
} else {
if (CollectionUtil.isNotEmpty(restmap)) {
LOG.info("订单创建失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
}
WebUtil.response(response, WebUtil.packJsonp(callback, JSON
.toJSONString(new JsonResult(-1, "订单获取失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));
}
}
/**
* 查询支付结果
*
* @param request
* @param response
* @param tradeid 微信交易订单号
* @param tradeno 商品订单号
* @param callback
*/
@RequestMapping(value = "/pay/query", method = RequestMethod.POST)
public void orderPayQuery(HttpServletRequest request, HttpServletResponse response, String tradeid, String tradeno,
String callback) {
LOG.info("[/order/pay/query]");
if (StringUtil.isEmpty(tradeno) && StringUtil.isEmpty(tradeid)) {
WebUtil.response(response, WebUtil.packJsonp(callback, JSON
.toJSONString(new JsonResult(-1, "订单号不能为空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
}
Map<String, String> restmap = null;
try {
Map<String, String> parm = new HashMap<String, String>();
parm.put("appid", APP_ID);
parm.put("mch_id", MCH_ID);
parm.put("transaction_id", tradeid);
parm.put("out_trade_no", tradeno);
parm.put("nonce_str", PayUtil.getNonceStr());
parm.put("sign", PayUtil.getSign(parm, API_SECRET));
String restxml = HttpUtils.post(ORDER_PAY_QUERY, XmlUtil.xmlFormat(parm, false));
restmap = XmlUtil.xmlParse(restxml);
} catch (Exception e) {
LOG.error(e.getMessage(), e);
}
if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
// 订单查询成功 处理业务逻辑
LOG.info("订单查询:订单" + restmap.get("out_trade_no") + "支付成功");
WebUtil.response(response, WebUtil.packJsonp(callback, JSON
.toJSONString(new JsonResult(1, "订单支付成功", new ResponseData()), SerializerFeatureUtil.FEATURES)));
} else {
if (CollectionUtil.isNotEmpty(restmap)) {
LOG.info("订单支付失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
}
WebUtil.response(response, WebUtil.packJsonp(callback, JSON
.toJSONString(new JsonResult(-1, "订单支付失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));
}
}
/**
* 订单支付微信服务器异步通知
*
* @param request
* @param response
*/
@RequestMapping("/pay/notify")
public void orderPayNotify(HttpServletRequest request, HttpServletResponse response) {
LOG.info("[/order/pay/notify]");
response.setCharacterEncoding("UTF-8");
response.setContentType("text/xml");
try {
ServletInputStream in = request.getInputStream();
String resxml = FileUtil.readInputStream2String(in);
Map<String, String> restmap = XmlUtil.xmlParse(resxml);
LOG.info("支付结果通知:" + restmap);
if ("SUCCESS".equals(restmap.get("return_code"))) {
// 订单支付成功 业务处理
String out_trade_no = restmap.get("out_trade_no"); // 商户订单号
// 通过商户订单判断是否该订单已经处理 如果处理跳过 如果未处理先校验sign签名 再进行订单业务相关的处理
String sing = restmap.get("sign"); // 返回的签名
restmap.remove("sign");
String signnow = PayUtil.getSign(restmap, API_SECRET);
if (signno
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
wxpay.zip (24个子文件)
wxpay
pom.xml 6KB
src
test
resources
java
org
andy
wxpay
test
HttpTest.java 3KB
main
resources
config.properties 140B
log4j.properties 1KB
rest-servlet.xml 1KB
wx_apiclient_cert.p12 98B
applicationContext.xml 572B
java
org
andy
wxpay
utils
WebUtil.java 902B
MD5Utils.java 3KB
RandomUtil.java 2KB
ConfigUtil.java 1KB
SerializerFeatureUtil.java 655B
HttpUtils.java 9KB
StringUtil.java 8KB
DatetimeUtil.java 4KB
FileUtil.java 2KB
PayUtil.java 3KB
XmlUtil.java 3KB
CollectionUtil.java 1KB
HttpKit.java 6KB
model
JsonResult.java 967B
ResponseData.java 783B
controller
PayController.java 14KB
webapp
WEB-INF
web.xml 2KB
共 24 条
- 1
Andyzty
- 粉丝: 808
- 资源: 13
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Video_1713625590376.mp4
- 数码管循环右移1_单片机C语言实例(纯C语言源代码).zip
- FeasyBlog V1.0_feasyblog_博客论坛网站开发模板(使用说明+源代码+html).zip
- 软件开发:C++技术实现KTV点歌系统设计与交互体验
- [交友会员]PHPLove交友系统 v 1.0 BETA_phplove1.0beta.rar
- [影音娱乐]VGPortal v2.6_vgportal.rar
- 开机次数记忆_单片机C语言实例(纯C语言源代码).zip
- [信息办公]点易网络智能办公系统v3.2_dyoa32.rar
- JSP计算机等级考试查询系统(源代码+论文+答辩PPT).rar
- 1602液晶显示的计算器_单片机C语言实例(纯C语言源代码).zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页