调起微信支付 – 统一下单接口的一个方法封装。需要的同学们可以参考下。
调第三方接口用到了 restTemplate , 需要先进行注入。
注:用到的工具类,放到了文章后面。
/**
* @title 微信支付:统一下单接口调用
* @param goodsName 商品描述
* @param orderCode 商品订单号(可用于支付成功回调方法的查询)
* @param buyCost 标价金额
* @param notifyUrl 支付成功通知回调地址
* @param openId 会员openid
* @param appId 公众号appid
* @param mchId 商户平台id
* @remark body的传输字符编码:把tomcat中server.xml文件中的URIEncoding改为 UTF-8
<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
* @return
*/
@SuppressWarnings({
"rawtypes", "unchecked" })
protected Map<String,Object> wechatUnifiedOrder(String goodsName, String orderCode, String buyCost, String notifyUrl, String openId, String appId, String mchId,String mchKey){
Map<String,Object> response = new HashMap<String,Object>();
try {
//生成的随机字符串
String nonce_str = WXPayUtil.generateNonceStr();
//商品描述
String body = goodsName;
//商户订单号
String out_trade_no = orderCode;
//标价价额
String total_fee = MoneyUtils.moneyMul(buyCost, "100");
//终端Ip
String spbill_create_ip = IpUtils.getIpAddr(getRequest());
//通知地址
String notify_url = notifyUrl;
//交易类型
String trade_type = "JSAPI";
//OpenId
String openid = openId;
//商户key
String mch_key = mchKey;
//1.参数封装
Map<String,String> packageParams = new HashMap<String,String>();
//公众账号ID
packageParams.put("appid", appId);
//商户号
packageParams.put("mch_id", mchId);
//随机字符串
packageParams.put("nonce_str", nonce_str);
packageParams.put("body", new String(body.getBytes(),"utf-8"));
//交易订单号
packageParams.put("out_trade_no", out_trade_no);
//金额(分)
packageParams.put("total_fee", total_fee);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("notify_url", notify_url);
//交易类型
packageParams.put("trade_type", trade_type);
//用户标示
packageParams.put("openid", openid);
String xmlParam = WXPayUtil.generateSignedXml(packageParams, mch_key);
/** 建立编码请求头 */
HttpHeaders headers = new HttpHeaders();
MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
headers.setContentType(type);
headers.add("Accept", MediaType.APPLICATION_JSON.toString());
HttpEntity formEntity = new HttpEntity(xmlParam ,headers);
System.out.println("调试模式_统一下单接口 请求XML数据:" + formEntity);
//调用统一下单接口 WechatConstants.API_PAY_UNIFIEDORDER :https://api.mch.weixin.qq.com/pay/unifiedorder
String result = new String(restTemplate.postForObject(WechatConstants.API_PAY_UNIFIEDORDER, formEntity, String.class).getBytes(),"UTF-8");
System.out.println("调试模式_统一下单接口 返回XML数据:" + result);
//将解析结果存储在HashMap中
Map map = WechatPayUtils.doXMLParse(result);
String return_code = (String) map.get("return_code");//返回状态码
if(return_code.equals("SUCCESS")){
response.put("return_code", "SUCCESS");
//业务结果
String prepay_id = (String) map.get("prepay_id");//返回的预付单信息
response.put("nonceStr", nonce_str);
response.put("package", "prepay_id=" + prepay_id);
Long timeStamp = System.currentTimeMillis() / 1000;
response.put("timeStamp", timeStamp + "");//这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
String stringSignTemp = "appId=" + appId + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id+ "&signType=" + "MD5" + "&timeStamp=" + timeStamp;
//再次签名,1. 用于小程序端调用wx.requesetPayment方法 2.用于微信网页js-api的wx.chooseWXPay方法
String paySign = WechatPayUtils.sign(stringSignTemp, mchKey, "utf-8").toUpperCase();
logger.info("=======================第二次签名:" + paySign + "=====================");
response.put("paySign", paySign);
response.put("appid", appId);
}else {
response.put("return_code", "ERROR");
response.put("msg", "统一下单接口调用失败 "+(String) map.get("return_msg"));
}
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
用户下单成功后 – 回调接口:
public void wechatPayFastConCallBack(HttpServletRequest request,HttpServletResponse response) {
logger.info("微信回调接口方法start");
logger.info("微信回调接口操作逻辑start");
String inputLine = "";
String notifyXml = "";
try {
while((inputLine = request.getReader().readLine()) != null) {
notifyXml += inputLine;
}
request.getReader().close();
logger.info("微信回调内容信息:" + notifyXml);
@SuppressWarnings("unchecked")
Map<String,String> map = WechatPayUtils.doXMLParse(notifyXml);
if("SUCCESS".equals(map.get("result_code"))) {
//支付成功
logger.info("微信回调返回是否支付成功:是");
String outTradeNo = map.get("out_trade_no");
logger.info("微信回调返回商户订单号:" + outTradeNo);
//你的支付成功后的相关逻辑
}
}catch(IOException e) {
e.printStackTrace();
}catch(Exception e) {
e.getMessage