首先是微信支付的配置类:WxPayConfig
public class WxPayConfig {
public static final String appid = "wx9eb0dffa5de476ba";
public static final String mch_id = "xxxxxx";
public static final String key = "xxxxxxxxxxxxxxxxxxxx";
public static final String notify_url = "https://live.tinyshark.com.cn/wxNotify";
public static final String SIGNTYPE = "MD5";
public static final String TRADETYPE = "jsAPI";
public static final String pay_url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
}
然后写我们微信支付的接口和回调函数的接口:PayController
package com.lbm.controller
import com.lbm.config.WxPayConfig
import com.lbm.pojo.Invite
import com.lbm.pojo.Order
import com.lbm.pojo.YuZhiFu
import com.lbm.service.Impl.InviteServiceImpl
import com.lbm.service.Impl.OrderServiceImpl
import com.lbm.service.Impl.YuZhiFuServiceImpl
import com.lbm.utils.*
import org.springframework.beans.factory.annotation.Autowired
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.ResponseBody
import javax.servlet.ServletInputStream
import javax.servlet.http.HttpServletRequest
import javax.servlet.http.HttpServletResponse
import java.io.BufferedOutputStream
import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.Date
import java.util.HashMap
import java.util.List
import java.util.Map
@Controller
public class PayController {
@Autowired
YuZhiFuServiceImpl yuZhiFuService
YuZhiFu yuZhiFu=new YuZhiFu()
@Autowired
InviteServiceImpl inviteService
Invite invite=new Invite()
@RequestMapping("wxPay")
@ResponseBody
//这里面的参数都是我需要的参数你们可以不要(只要HttpServletRequest request)
public Map wxPay(String money,String oldtoken,String openid, HttpServletRequest request,String kname,String bname,String times,String bsex,String phone){
try{
//微信里面的价格是以分为单位
//生成的随机字符串
String nonce_str = StringUtils.getRandomStringByLength(32)
//商户订单号
String out_trade_no= new RandomUtil().getRandomCode(10)
//商品名称
String body = "寒假钜惠抢先购"
//获取客户端的ip地址
String spbill_create_ip = IpUtils.getIpAddr(request)
//组装参数,用户生成统一下单接口的签名
Map packageParams = new HashMap()
packageParams.put("appid", WxPayConfig.appid)
packageParams.put("mch_id", WxPayConfig.mch_id)
packageParams.put("nonce_str", nonce_str)
packageParams.put("body", body)
packageParams.put("out_trade_no", out_trade_no)
packageParams.put("total_fee", money)
packageParams.put("spbill_create_ip", spbill_create_ip)
packageParams.put("notify_url", WxPayConfig.notify_url)
packageParams.put("trade_type", WxPayConfig.TRADETYPE)
packageParams.put("openid", openid)
String prestr = PayUtil.createLinkString(packageParams)
//MD5运算生成签名,这里是第一次签名,用于调用统一下单接口
String mysign = PayUtil.sign(prestr, WxPayConfig.key, "utf-8").toUpperCase()
//拼接统一下单接口使用的xml数据,要将上一步生成的签名一起拼接进去
String xml = "" + "" + WxPayConfig.appid + ""
+ " + body + "]]>"
+ "" + WxPayConfig.mch_id + ""
+ "" + nonce_str + ""
+ "" + WxPayConfig.notify_url + ""
+ "" + openid + ""
+ "" + out_trade_no + ""
+ "" + spbill_create_ip + ""
+ "" + money + ""
+ "" + WxPayConfig.TRADETYPE + ""
+ "" + mysign + ""
+ ""
System.out.println("调试模式_统一下单接口 请求XML数据:" + xml)
//调用统一下单接口,并接受返回的结果
String result = PayUtil.httpRequest(WxPayConfig.pay_url, "POST", xml)
//这里是我处理的一些逻辑(你们可以自己写自己的逻辑,这里也可以不写)————将预支付状态存入数据库,等支付成功后改支付状态为已支付。这里面的参数就对应上面那些可以不用的参数
Date date = new Date()
String trackTime = DateUtils.formateTrackTime(date)
yuZhiFu.setBody(body)
yuZhiFu.setOldtoken(oldtoken)
yuZhiFu.setKname(kname)
yuZhiFu.setBname(bname)
yuZhiFu.setTimes(times)
yuZhiFu.setBsex(bsex)
yuZhiFu.setStatus("0")
yuZhiFu.setPhone(phone)
yuZhiFu.setToken(openid)
yuZhiFu.setOut_trade_no(out_trade_no)
yuZhiFu.setBuytime(trackTime)
yuZhiFu.setTotal_fee(Integer.parseInt(money)/100+"")
yuZhiFuService.insertYuZhiFu(yuZhiFu)
System.out.println("调试模式_统一下单接口 返回XML数据:" + result)
// 将解析结果存储在HashMap中
Map map = PayUtil.doXMLParse(result)
System.out.println(map)
String return_code = (String) map.get("return_code")
Map response = new HashMap()
if(return_code.equals("SUCCESS")){
String prepay_id = String.valueOf(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 + "")
//拼接签名需要的参数
String stringSignTemp = "appId=" + WxPayConfig.appid + "&nonceStr=" + nonce_str + "&package=prepay_id=" + prepay_id+ "&signType=MD5&timeStamp=" + timeStamp
//再次签名,这个签名用于小程序端调用wx.requesetPayment方法
String paySign = PayUtil.sign(stringSignTemp, WxPayConfig.key, "utf-8").toUpperCase()
response.put("paySign", paySign)
}
response.put("appid", WxPayConfig.appid)
return response
}catch(Exception e){
e.printStackTrace()
}
return null
}
@RequestMapping("wxNotify")
@ResponseBody
public String wxNotify(HttpServletRequest request, HttpServletResponse response) throws Exception{
System.out.println("进入了回调》》》》》》》》》》》》》》》》》》》》》》》》")
BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream)request.getInputStream()))
String line = null
StringBuilder sb = new StringBuilder()
while((line = br.readLine()) != null){
sb.append(line)
}
br.close()
//sb为微信返回的xml
String notityXml = sb.toString()
String resXml = ""
System.out.println("接收到的报文:" + notityXml)
Map map = PayUtil.doXMLParse(notityXml)
String returnCode = (String) map.get("return_code")
if("SUCCESS".equals(returnCode)){
//验证签名是否正确
Map validParams = PayUtil.paraFilter(map)
String validStr = PayUtil.createLinkString(validParams)
String sign = PayUtil.sign(validStr, WxPayConfig.key, "utf-8").toUpperCase()
//根据微信官网的介绍,此处不仅对回调的参数进行验签,还需要对返回的金额与系统订单的金额进行比对等
if(sign.equals(map.get("sign"))){
System.out.println("开始=================")
String out_trade_no=(String) map.get("out_trade_no")
String transaction_id=(String) map.get("transaction_id")
//买的人token
String token=(String) map.get("openid")
Date date = new Date()
String time_end = DateUtils.formateTrackTime(date)
HashMap stringHashMap = new HashMap<>()
stringHashMap.put("status","已支付")
stringHashMap.put("buytime",time_end)
stringHashMap.put("transaction_id",transaction_id)
stringHashMap.put("out_trade_no",out_trade_no)
yuZhiFuService.updateYuZhiFu(stringHashMap)
List orders = yuZhiFuService.queryByTokenCourse(stringHashMap)
for (Order order : orders) {
String oldtoken = order.getOldtoken()
String buytime = order.getBuytime()
invite.setOldtoken(oldtoken)
invite.setToken(token)
invite.setBuytime(buytime)
invite.setTransaction_id(order.getTransaction_id())
inviteService.insert(invite)
}
System.out.println("结束=============================")
//通知微信服务器已经支付成功
resXml = "" + ""
+ "" + " "
}
}else{
resXml = "" + ""
+ "" + " "
}
System.out.println(resXml)
System.out.println("微信支付回调数据结束")
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream())
out.write(resXml.getBytes())
out.flush()
out.close()
Map maps = PayUtil.doXMLParse(resXml)
String returnCodes = (String) maps.get("return_code")
return returnCodes
}
}
工具类仅展示获取IP地址
package com.lbm.utils;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
public class IpUtils {
/**
* IpUtils工具类方法
* 获取真实的ip地址
* @param request
* @return
*/
public static String getIpAddr(HttpServletRequest request) {
String ip = request.getHeader("X-Forwarded-For");
if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
int index = ip.indexOf(",");
if(index != -1){
return ip.substring(0,index);
}else{
return ip;
}
}
ip = request.getHeader("X-Real-IP");
if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
return ip;
}
return request.getRemoteAddr();
}
}
0条评论