(Notice:以下所有经验也是我根据网上的经验整理的,如有侵权可以联系我删除,Wx:IT_Ezra,QQ 654303408。 有问题讨论也可联系我,QQ同上。)
(Tips:我是第一次开发,一个刚毕业的java工程师,我觉得我并非天赋异禀,我能学会,相信聪敏的你,一定可以)
(PS:2019-03-27 代码已经更新。更加优化了。根据业内人士称,支付过程应该下沉到service层。代码目前更新了。回调目前没有下沉。可以加我QQ或者维信沟通,完善后会通知大家)
Controller类
@RestController
@RequestMapping("/pay")
public class PayController {
@RequestMapping(value = "/wxPay", method = RequestMethod.POST)
public String wxPay(String openId, String orderNumber ,HttpServletRequest request) {
Object result = new Object();
try {
//获取自己的openId,可以找前端要
// String openId = "xxx";
//订单号,自己的订单设计,最好用固定长度 20位等等。
// String orderNumber = "xxxx";
//获取客户端的ip地址
String spbill_create_ip = getIpAddr(request);
//将支付业务下沉到service层
result = OrderService.wxPay(spbill_create_ip, openId, orderNumber );
} catch (Exception e) {
e.printStackTrace();
}
return PayUtil.toJson(result);
}
//这里是支付回调接口,微信支付成功后会自动调用
@RequestMapping(value = "/wxNotify", method = RequestMethod.POST)
public void wxNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(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 = "";
Map map = PayUtil.doXMLParse(notityXml);
String returnCode = (String) map.get("return_code");
if ("SUCCESS".equals(returnCode)) {
//验证签名是否正确
Map<String, String> validParams = PayUtil.paraFilter(map); //回调验签时需要去除sign和空值参数
String prestr = PayUtil.createLinkString(validParams);
//根据微信官网的介绍,此处不仅对回调的参数进行验签,还需要对返回的金额与系统订单的金额进行比对等
if (PayUtil.verify(prestr, (String) map.get("sign"), WechatConfig.key, "utf-8")) {
/**此处添加自己的业务逻辑代码start**/
//注意要判断微信支付重复回调,支付成功后微信会重复的进行回调
/**此处添加自己的业务逻辑代码end**/
//通知微信服务器已经支付成功
resXml = "<xml>" + "<return_code><![CDATA[SUCCESS]]></return_code>"
+ "<return_msg><![CDATA[OK]]></return_msg>" + "</xml> ";
}
} else {
resXml = "<xml>" + "<return_code><![CDATA[FAIL]]></return_code>"
+ "<return_msg><![CDATA[报文为空]]></return_msg>" + "</xml> ";
}
BufferedOutputStream out = new BufferedOutputStream(
response.getOutputStream());