| | |
| | | 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 lombok.extern.slf4j.Slf4j; |
| | | 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.annotation.Resource; |
| | | import javax.servlet.http.HttpServletRequest; |
| | | import javax.servlet.http.HttpServletResponse; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | @CrossOrigin //跨域 |
| | | @RestController |
| | | @AllArgsConstructor |
| | | @RequestMapping("/wxpay") |
| | | @Api(value = "微信支付接口", tags = "微信支付接口") |
| | | public class WxPayController extends BladeController { |
| | | @RequestMapping("/wxPay") |
| | | @Api(tags = "网站微信支付APIv3") |
| | | @Slf4j |
| | | public class WxPayController { |
| | | |
| | | private static final Logger logger = LoggerFactory.getLogger(WxPayController.class); |
| | | |
| | | @Resource |
| | | private IWxPayService wxPayService; |
| | | |
| | | |
| | | @PostMapping("/save") |
| | | public R save(@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 |
| | | * @param properChargeRecordId |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | @ApiOperation("调用jsapi统一下单API") |
| | | @GetMapping("/jsapiPay") |
| | | public R jsapiPay(@RequestParam("productId") Long productId) throws Exception { |
| | | public R jsapiPay(@RequestParam("properChargeRecordId") Long properChargeRecordId) throws Exception { |
| | | |
| | | logger.info("发起支付请求 v3"); |
| | | log.info("发起支付请求 v3"); |
| | | |
| | | //返回支付二维码连接和订单号 |
| | | Map<String, String> map = wxPayService.jsapiPay(productId); |
| | | Map<String, String> map = wxPayService.jsapiPay(properChargeRecordId); |
| | | |
| | | return R.data(map); |
| | | } |
| | |
| | | @ApiOperation("支付通知") |
| | | @PostMapping("/native/notify") |
| | | public String nativeNotify(HttpServletRequest request, HttpServletResponse response) { |
| | | return wxPayService.nativeNotify(request, response); |
| | | } |
| | | |
| | | Gson gson = new Gson(); |
| | | Map<String, String> map = new HashMap<>();//应答对象 |
| | | /** |
| | | * 用户取消订单 |
| | | * |
| | | * @param orderNo |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | @ApiOperation("用户取消订单") |
| | | @PostMapping("/cancel/{orderNo}") |
| | | public R cancel(@PathVariable String orderNo) throws Exception { |
| | | |
| | | try { |
| | | log.info("取消订单"); |
| | | |
| | | //处理通知参数 |
| | | String body = HttpUtils.readData(request); |
| | | Map<String, Object> 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.cancelOrder(orderNo); |
| | | return R.data("订单已取消"); |
| | | } |
| | | |
| | | //处理订单 |
| | | wxPayService.processOrder(bodyMap); |
| | | /** |
| | | * 查询订单 |
| | | * |
| | | * @param orderNo |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | @ApiOperation("查询订单") |
| | | @GetMapping("/query/{orderNo}") |
| | | public R queryOrder(@PathVariable String orderNo) throws Exception { |
| | | |
| | | //应答超时 |
| | | //模拟接收微信端的重复通知 |
| | | // TimeUnit.SECONDS.sleep(5); |
| | | log.info("查询订单"); |
| | | |
| | | //成功应答 |
| | | response.setStatus(200); |
| | | map.put("code", "SUCCESS"); |
| | | map.put("message", "成功"); |
| | | return gson.toJson(map); |
| | | String result = wxPayService.queryOrder(orderNo); |
| | | return R.data("result", result); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | //失败应答 |
| | | response.setStatus(500); |
| | | map.put("code", "ERROR"); |
| | | map.put("message", "失败"); |
| | | return gson.toJson(map); |
| | | } |
| | | } |
| | | |
| | | |
| | | @ApiOperation("申请退款") |
| | | @PostMapping("/refunds/{orderNo}/{reason}") |
| | | public R refunds(@PathVariable String orderNo, @PathVariable String reason) throws Exception { |
| | | |
| | | log.info("申请退款"); |
| | | wxPayService.refund(orderNo, reason); |
| | | return R.success("退款申请成功"); |
| | | } |
| | | |
| | | /** |
| | | * 查询退款 |
| | | * |
| | | * @param refundNo |
| | | * @return |
| | | * @throws Exception |
| | | */ |
| | | @ApiOperation("查询退款") |
| | | @GetMapping("/query-refund/{refundNo}") |
| | | public R queryRefund(@PathVariable String refundNo) throws Exception { |
| | | |
| | | log.info("查询退款"); |
| | | |
| | | String result = wxPayService.queryRefund(refundNo); |
| | | return R.data("result", result); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * 退款结果通知 |
| | | * 退款状态改变后,微信会把相关退款结果发送给商户。 |
| | | */ |
| | | @ApiOperation("退款结果通知") |
| | | @PostMapping("/refunds/notify") |
| | | public String refundsNotify(HttpServletRequest request, HttpServletResponse response) { |
| | | |
| | | log.info("退款通知执行"); |
| | | return wxPayService.refundsNotify(request, response); |
| | | } |
| | | |
| | | |