package org.springblade.modules.pay.controller; import com.google.gson.Gson; import com.wechat.pay.contrib.apache.httpclient.auth.ScheduledUpdateCertificatesVerifier; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.AllArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springblade.common.config.WxPayConfig; import org.springblade.common.utils.HttpUtils; import org.springblade.common.utils.WechatPay2ValidatorForRequest; import org.springblade.core.boot.ctrl.BladeController; import org.springblade.core.tool.api.R; import org.springblade.modules.pay.entity.WxPayInfo; import org.springblade.modules.pay.service.IWxPayService; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; @RestController @AllArgsConstructor @RequestMapping("/wxpay") @Api(value = "微信支付接口", tags = "微信支付接口") public class WxPayController extends BladeController { private static final Logger logger = LoggerFactory.getLogger(WxPayController.class); private IWxPayService wxPayService; @PostMapping("/save") public R save(@RequestBody WxPayInfo wxPayInfo) { return R.status(wxPayService.save(wxPayInfo)); } @PostMapping("/update") public R update(@RequestBody WxPayInfo wxPayInfo) { return R.status(wxPayService.updateById(wxPayInfo)); } @PostMapping("saveOrUpdate") public R saveOrUpdate(@RequestBody WxPayInfo wxPayInfo) { return R.status(wxPayService.saveOrUpdate(wxPayInfo)); } /** * 获取openId * * @param code * @return */ @PostMapping("getOpenId") public R getOpenId(String code) { return R.data(wxPayService.getOpenId(code)); } /** * jsapi下单 * * @param productId * @return * @throws Exception */ @ApiOperation("调用jsapi统一下单API") @GetMapping("/jsapiPay") public R jsapiPay(@RequestParam("productId") Long productId) throws Exception { logger.info("发起支付请求 v3"); //返回支付二维码连接和订单号 Map map = wxPayService.jsapiPay(productId); return R.data(map); } /** * 支付通知 * 微信支付通过支付通知接口将用户支付成功消息通知给商户 */ @ApiOperation("支付通知") @PostMapping("/native/notify") public String nativeNotify(HttpServletRequest request, HttpServletResponse response) { Gson gson = new Gson(); Map map = new HashMap<>();//应答对象 try { //处理通知参数 String body = HttpUtils.readData(request); Map bodyMap = gson.fromJson(body, HashMap.class); String requestId = (String) bodyMap.get("id"); logger.info("支付通知的id ===> {}", requestId); logger.info("支付通知的完整数据 ===> {}", body); //int a = 9 / 0; ScheduledUpdateCertificatesVerifier verifier = new WxPayConfig().getVerifier("111", "111", "111", "111"); //签名的验证 WechatPay2ValidatorForRequest wechatPay2ValidatorForRequest = new WechatPay2ValidatorForRequest(verifier, requestId, body); if (!wechatPay2ValidatorForRequest.validate(request)) { logger.error("通知验签失败"); //失败应答 response.setStatus(500); map.put("code", "ERROR"); map.put("message", "通知验签失败"); return gson.toJson(map); } logger.info("通知验签成功"); //处理订单 wxPayService.processOrder(bodyMap); //应答超时 //模拟接收微信端的重复通知 // TimeUnit.SECONDS.sleep(5); //成功应答 response.setStatus(200); map.put("code", "SUCCESS"); map.put("message", "成功"); return gson.toJson(map); } catch (Exception e) { e.printStackTrace(); //失败应答 response.setStatus(500); map.put("code", "ERROR"); map.put("message", "失败"); return gson.toJson(map); } } }