package com.xy.controller;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
/**
* 支付接口
*
* @author zcw 2017-10-26
*/
@Controller
@Scope("prototype")
@Path("/pay")
public class PayController {
private static Logger log = LoggerFactory.getLogger(PayController.class);
@Context
HttpServletRequest request;
@Context
HttpServletResponse response;
@GET
@Path("/oautinfo")
@Produces(MediaType.APPLICATION_JSON)
public void oautinfo() throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
// 用户同意授权后,能获取到code
String code = request.getParameter("code");
String state = request.getParameter("state");
System.out.println(code+"codecodecodecodecodecode");
// 用户同意授权
SNSUserInfo snsUserInfo = null ;
if (!"authdeny".equals(code)) {
// 获取网页授权access_token
WeixinOauth2Token weixinOauth2Token = AdvancedUtil.getOauth2AccessToken(WxPayConstants.APPID, WxPayConstants.APP_SECRET, code);
// 网页授权接口访问凭证
String accessToken = weixinOauth2Token.getAccessToken();
// 用户标识
String openId = weixinOauth2Token.getOpenId();
// 获取用户信息
snsUserInfo = AdvancedUtil.getSNSUserInfo(accessToken, openId);
// 设置要传递的参数
request.setAttribute("snsUserInfo", snsUserInfo);
request.setAttribute("state", state);
// Redis.c.setnx(Redis.K.CODE.to(code),snsUserInfo.getOpenId() );
// response.sendRedirect(WeixinPayConfig.server_url+"?code="+code+"&openId="+openId+"&state=STATE#index");
}
}
@GET
@Path("/{code}/getOpenid")
@Produces(MediaType.APPLICATION_JSON)
public DataBean getOpenid(@PathParam("code") String code){
String openid = "";//Redis.c.get(Redis.K.CODE.to(code));
return new DataBean(200, openid, "查询返回OpenId");
}
@POST
@Path("/submitWXOrderForm")
@Produces(MediaType.APPLICATION_JSON)
public DataBean submitWXOrderForm(JSONObject param){
System.out.println("--------------------------------预支付回调-------------------------------------------------");
WxPayData result = new WxPayData();
try {
if (!parse(param) || this.fields == null) {
log.info("请求参数格式错误!");
return new DataBean(400,new JSONObject(),"请求参数格式错误!");
}
//商户订单号
String outTradeNo = this.fields.getString("outTradeNo").trim(); //WxPayUtil.getOrderFormNumber();
System.out.println(outTradeNo+"outTradeNo------------------------------------------------------");
//商品价格
int totalFee = (int) (Double.parseDouble((this.fields.getString("totalFee").trim()))*100) ;
System.out.println("totalFee----------------------->>"+totalFee);
//客户端ip
String createIp = request.getHeader("X-Real-IP");
//用户标识
String openId = this.fields.getString("openId").trim();
//回调url
//http://ts.chukeyunxing.com/ecar/r/pay/returnInfo
String notifyUrl = "";
String nonceStr = UUID.randomUUID().toString().replace("-", "").toUpperCase();
String timeStamp = TimeUtil.getTimeStamp();
String s= "订单号"+outTradeNo+"|openId"+openId+"|notifyUrl"+notifyUrl+"|totalFee"+totalFee;
// writeFile(AlipayConfig.log_path+"1.txt",s,true);
WxPayData wxReturnData = WxPayUtil.release(outTradeNo,totalFee,createIp,openId,notifyUrl,nonceStr);
result.setResult_code(wxReturnData.getResult_code());
result.setAppid(WxPayConstants.APPID);
result.setTimeStamp(timeStamp);
result.setNonce_str(nonceStr);
result.setPackageStr("prepay_id="+wxReturnData.getPrepay_id());
result.setSignType("MD5");
//两者都为SUCCESS才能获取prepay_id
if( wxReturnData.getResult_code().equals("SUCCESS") && wxReturnData.getReturn_code().equals("SUCCESS") ){
//第二次签名,将微信返回的数据再进行签名
SortedMap<String,String> signMap = new TreeMap<String,String>();
signMap.put("appId", WxPayConstants.APPID);
signMap.put("timeStamp", timeStamp);
signMap.put("nonceStr", nonceStr);
signMap.put("package", "prepay_id="+wxReturnData.getPrepay_id()); //注:看清楚,值为:prepay_id=xxx,别直接放成了wxReturnData.getPrepay_id()
signMap.put("signType", "MD5");
String paySign = WechatUtils.buildRequestSign(signMap,WxPayConstants.KEY);//支付签名
log.info("paySign = {}",paySign);
result.setSign(paySign);
}else{
result.setResult_code("fail");
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("生成预付订单异常!!!!!!!!!!!!!!!!");
}
System.out.println("result---------------------->>"+result.toString());
return new DataBean(500, result,"生成与支付订单!");
}
@POST
@Path("/returnInfo")
public void returnInfo(){
try {
InputStream is = request.getInputStream();
String result = IOUtils.toString(is, "UTF-8");
if("".equals(result)){
response.getWriter().write("<xm><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[参数错误!]]></return_msg></xml>");
return ;
}
log.info("接收的数据 xml:{}"+result.toString());
WxPayData wxPayReq = WechatUtils.convertXmlToObject(WxPayData.class,result);
log.info("接收的数据Object:{}"+wxPayReq.toString());
String appid = wxPayReq.getAppid();
String mch_id =wxPayReq.getMch_id();
String nonce_str = wxPayReq.getNonce_str();
//ordernum
String out_trade_no = wxPayReq.getOut_trade_no();
System.out.println("orderNo+______________________"+out_trade_no);
int total_fee = wxPayReq.getTotal_fee();
String trade_type = wxPayReq.getTrade_type();
String openid =wxPayReq.getOpenid();
String return_code = wxPayReq.getReturn_code();
String result_code = wxPayReq.getResult_code();
String bank_type = wxPayReq.getBank_type();
Integer cash_fee = wxPayReq.getCash_fee();
String fee_type = wxPayReq.getFee_type();
String is_subscribe = wxPayReq.getIs_subscribe();
String time_end = wxPayReq.getTime_end();
String transaction_id = wxPayReq.getTransaction_id();
String sign = wxPayReq.getSign();
/