微信支付和支付宝支付接口笔记
分类: ssm 专栏: 爱旅行项目 标签: 支付宝和微信支付
2023-02-28 10:58:53 777浏览
微信支付和支付宝支付接口笔记
支付宝的4个接口
@Controller public class AlipayController { @Autowired OrderService orderService; //写一个确认订单信息的页面 @GetMapping("/api/prepay/{orderNo}") public String prepay(@PathVariable String orderNo, Model model){ try { ItripHotelOrder order= orderService.prepay(orderNo); model.addAttribute("order",order); } catch (Exception e) { e.printStackTrace(); } return "pay"; } //确认订单信息之后去付款 跳到支付宝的页面 @PostMapping("/api/pay") public void pay(HttpServletRequest request, HttpServletResponse response){ if(request.getParameter("WIDout_trade_no")!=null){ // 商户订单号,商户网站订单系统中唯一订单号,必填 String out_trade_no = request.getParameter("WIDout_trade_no"); // 订单名称,必填 String subject = request.getParameter("WIDsubject"); System.out.println(subject); // 付款金额,必填 String total_amount=request.getParameter("WIDtotal_amount"); // 商品描述,可空 String body = request.getParameter("WIDbody"); // 超时时间 可空 String timeout_express="2m"; // 销售产品码 必填 String product_code="QUICK_WAP_WAY"; /**********************/ // SDK 公共请求类,包含公共请求参数,以及封装了签名与验签,开发者无需关注签名与验签 //调用RSA签名方式 AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID, AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET, AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE); AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest(); // 封装请求支付信息 AlipayTradeWapPayModel model=new AlipayTradeWapPayModel(); model.setOutTradeNo(out_trade_no); model.setSubject(subject); model.setTotalAmount(total_amount); model.setBody(body); model.setTimeoutExpress(timeout_express); model.setProductCode(product_code); alipay_request.setBizModel(model); // 设置异步通知地址 alipay_request.setNotifyUrl(AlipayConfig.notify_url); // 设置同步地址 alipay_request.setReturnUrl(AlipayConfig.return_url); // form表单生产 String form = ""; try { // 调用SDK生成表单 form = client.pageExecute(alipay_request).getBody(); response.setContentType("text/html;charset=" + AlipayConfig.CHARSET); response.getWriter().write(form);//直接将完整的表单html输出到页面 response.getWriter().flush(); response.getWriter().close(); } catch (Exception e) { e.printStackTrace(); } } } //同步通知 究竟客户有没有付款成功 @GetMapping("/api/returnUrl") public String returnUrl(HttpServletRequest request) throws Exception { //获取支付宝GET过来反馈信息 Map<String,String> params = new HashMap<String,String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8"); params.put(name, valueStr); } //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)// //商户订单号 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //支付宝交易号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8"); //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)// //计算得出通知验证结果 //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2"); if(verify_result){//验证成功 //修改订单状态 改库存 跳转页面 ItripHotelOrder order= orderService.prepay(out_trade_no); if(order.getOrderStatus() ==0){ order.setTradeNo(trade_no); order.setPayType(1);//支付类型:1支付宝 2微信 orderService.updateOrderStatus(order); orderService.updateStore(order); } //跳转页面 return "redirect:"+"http://localhost:3000/#/orderpaystate"; }else{ return "redirect:"+"http://localhost:3000/#/orderpaystate?state=0"; } } //异步通知 究竟客户有没有付款成功 @PostMapping("/api/notifyUrl") @ResponseBody public String notifyUrl(HttpServletRequest request) throws Exception { //获取支付宝POST过来反馈信息 Map<String,String> params = new HashMap<String,String>(); Map requestParams = request.getParameterMap(); for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { String name = (String) iter.next(); String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); params.put(name, valueStr); } //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)// //商户订单号 String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8"); //支付宝交易号 String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8"); //交易状态 String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8"); //获取支付宝的通知返回参数,可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)// //计算得出通知验证结果 //boolean AlipaySignature.rsaCheckV1(Map<String, String> params, String publicKey, String charset, String sign_type) boolean verify_result = AlipaySignature.rsaCheckV1(params, AlipayConfig.ALIPAY_PUBLIC_KEY, AlipayConfig.CHARSET, "RSA2"); if(verify_result){//验证成功 ////////////////////////////////////////////////////////////////////////////////////////// //请在这里加上商户的业务逻辑程序代码 //——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— if(trade_status.equals("TRADE_FINISHED")){ } else if (trade_status.equals("TRADE_SUCCESS")){ //修改订单状态 改库存 跳转页面 ItripHotelOrder order= orderService.prepay(out_trade_no); if(order.getOrderStatus() ==0){ order.setTradeNo(trade_no); order.setPayType(1);//支付类型:1支付宝 2微信 orderService.updateOrderStatus(order); orderService.updateStore(order); } } return "success"; ////////////////////////////////////////////////////////////////////////////////////////// }else{//验证失败 return "fail"; } } }
微信的3个接口
@RestController public class WxPayController { @Autowired Wxconfig wxconfig; @Autowired OrderService orderService; /** * 生成付款二维码 * @param orderNo * @return * @throws Exception */ @GetMapping("/api/wxpay/createqccode/{orderNo}") public Dto createqccode(@PathVariable String orderNo) throws Exception { Map<String,String> map = new HashMap<>(); map.put("body","爱旅行房费"); map.put("out_trade_no",orderNo); map.put("total_fee","1"); map.put("spbill_create_ip","123.12.12.123"); map.put("notify_url","http://jmt759.natappfree.cc/trade/api/wxpay/notify"); map.put("trade_type","NATIVE"); WXPay wxPay = new WXPay(wxconfig); Map<String, String> stringMap = wxPay.unifiedOrder(map); if(stringMap.get("return_code").equals("SUCCESS")){ String codeUrl = stringMap.get("code_url"); Map<String,Object> newmap= new HashMap<>(); ItripHotelOrder order = orderService.prepay(orderNo); newmap.put("codeUrl",codeUrl); newmap.put("payAmount",order.getPayAmount()); newmap.put("count",order.getCount()); newmap.put("hotelName",order.getHotelName()); newmap.put("roomId",order.getRoomId()); return DtoUtil.returnDataSuccess(newmap); } return DtoUtil.returnFail("生成付款二维码失败", ErrorCode.AUTH_UNKNOWN); } /** *异步通知:微信回调,如果用户支付成功就修改订单状态和实时库存 * @param request * @throws Exception */ @RequestMapping("/api/wxpay/notify") public String notify(HttpServletRequest request) throws Exception { ServletInputStream inputStream = request.getInputStream(); String xmlStr = IOUtils.toString(inputStream, "utf-8"); Map<String, String> stringMap = WXPayUtil.xmlToMap(xmlStr); if (stringMap.get("return_code").equals("SUCCESS")) { //付款成功了 //修改订单状态 改库存 ItripHotelOrder order= orderService.prepay(stringMap.get("out_trade_no")); if(order.getOrderStatus() ==0){ order.setTradeNo(stringMap.get("transaction_id")); order.setPayType(2);//支付类型:1支付宝 2微信 orderService.updateOrderStatus(order); orderService.updateStore(order); } //告诉微信不需要再烦我了,我已经收到过通知了 Map<String,String> newmap = new HashMap<>(); newmap.put("return_code","SUCCESS"); newmap.put("return_msg","OK"); String toXml = WXPayUtil.mapToXml(newmap); return toXml; } return ""; } //刷新页面(一直查用户有没有付款这个订单,前端验证这个订单状态是不是2) @GetMapping("/api/wxpay/queryorderstatus/{orderNo}") public Dto queryorderstatus(@PathVariable String orderNo){ try { ItripHotelOrder order= orderService.prepay(orderNo); return DtoUtil.returnDataSuccess(order); } catch (Exception e) { e.printStackTrace(); return DtoUtil.returnFail("订单号错误",ErrorCode.AUTH_UNKNOWN); } } }
好博客就要一起分享哦!分享海报
此处可发布评论
评论(2)展开评论
他的专栏
他感兴趣的技术