com.xnx3.weixin.weixinPay.v2.Pay Maven / Gradle / Ivy
The newest version!
package com.xnx3.weixin.weixinPay.v2;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import com.xnx3.BaseVO;
import com.xnx3.Log;
import com.xnx3.weixin.SignUtil;
import com.xnx3.weixin.XmlUtil;
import com.xnx3.weixin.weixinPay.PayCallBackParamsVO;
/**
* JSAPIPay、NativePay、AppPay 等支付的父类
* @author 管雷鸣
*/
public class Pay {
public static String UNIFIED_ORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
/**
* 微信支付的商户号,格式如:1581125900 ,登录 https://pay.weixin.qq.com/ 取得
*/
public String mch_id = "";
/**
* 微信支付的API密钥,32位字符串。登录 https://pay.weixin.qq.com/ 在 [账户中心] - [API安全] - [设置API密钥]
*/
public String mch_key = "";
/**
* 微信公众号的appid,格式如 wx07f3db3a6bbexxxx
*/
public String gongzhonghao_appid = "";
/**
* 微信公众号的 appsecret ,格式如 b067bdd3935962ff8262f51fe5054xxx
*/
public String gongzhonghao_appsecret = "";
/**
* 微信支付成功后,微信服务器会将支付结果异步通知我们的服务器。这里是异步通知的url。传入如 http://xxx.zvo.cn/weixin.do
* 异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 公网域名必须为https,如果是走专线接入,使用专线NAT IP或者私有回调域名可使用http
*/
public String notify_url = ""; //支付成功的通知地址
/**
* 支付类型
* JSAPI -JSAPI支付
* NATIVE -Native支付
* APP -APP支付
*/
String trade_type = "JSAPI";
/**
* 微信支付成功的回调,自动验证签名,并检查是不是支付成功的回调,拿到支付成功通知的订单号no
* @return
* - result=BaseVO.SUCCESS 是支付成功,可以用 getInfo() 拿到支付成功的订单号,也就是createPayOrder方法中传入的no订单号
* - result=BaseVO.FAILURE 失败,异常,理论上应该不会这样,开发阶段会碰到,可以直接通过 info 来看失败原因
*
*/
public PayCallBackParamsVO callback(HttpServletRequest request){
PayCallBackParamsVO vo = new PayCallBackParamsVO();
String inputLine = "";
String notityXml = "";
try {
while((inputLine = request.getReader().readLine()) != null){
notityXml += inputLine;
}
//关闭流
request.getReader().close();
Log.debug("微信回调内容信息:"+notityXml+" 可设置 com.xnx3.Log.debug = false; 关闭信息打印");
} catch (IOException e) {
e.printStackTrace();
}
if(notityXml.length() > 0){
//有信息
Map map;
try {
map = XmlUtil.stringToMap(notityXml);
} catch (Exception e) {
e.printStackTrace();
vo.setBaseVO(BaseVO.FAILURE, e.getMessage());
return vo;
}
String no = map.get("out_trade_no"); //取到订单号
if(no == null){
vo.setBaseVO(BaseVO.FAILURE, "out_trade_no not find");
return vo;
}
//回调验签、以及看其是否是支付成功
if(map.get("result_code") != null && "SUCCESS".equals(map.get("result_code"))){
/*
* 签名校验
*/
String signStr = map.get("sign");
map.remove("sign");
// //调用逻辑传入参数按照字段名的 ASCII 码从小到大排序(字典序)
// String stringA = formatUrlMap(map, false, false);
// //第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。(签名)
// String nSign = MD5Util.MD5(stringA+"&key="+shanghu_key).toUpperCase();
String sign = SignUtil.generateSign(map, this.mch_key);
Log.debug("sign: "+sign+", param Sign:"+signStr);
if(sign.equalsIgnoreCase(signStr)){
//成功
Log.debug("微信回调返回是否支付成功:是");
vo.setParams(map);
//通知微信服务器,已经成功处理,这个数据不要在请求了
vo.setInfo(" ");
vo.setResult(BaseVO.SUCCESS);
return vo;
}else{
//签名对比出错,警报!可能有人利用接口攻击了
// debug("签名对比出错,警报!可能有人利用接口攻击了-->"+map.toString());
vo.setBaseVO(BaseVO.FAILURE, "签名对比出错");
return vo;
}
}else{
vo.setBaseVO(BaseVO.FAILURE, notityXml);
return vo;
}
}
vo.setBaseVO(BaseVO.FAILURE, "failure");
return vo;
}
/**
* 支付回调中,通知微信服务器,执行成功,不要再给我发这个订单支付成功的消息了
* @return
*
*
*/
public static String callbackExecuteSuccess() {
return " ";
}
}