具体要实现的功能:手机支付宝或微信扫描同一个二维码,跳转各自的支付
微信使用:jsapi支付
支付宝:wappay
上篇已写了如何实现内网穿透调试就不多叙述
1.判断客户端类型,从request的中将user-agent拉取下来,用contains查看userAgent中是否包含支付宝或者微信的关键字
HttpServletRequest request = ServletUtils.getRequest();String userAgent = request.getHeader("user-agent");
/*** 支付宝支付头*/
String ALI_PAY_CLIENT = "AlipayClient";/*** 微信支付头*/
String MICRO_MESSENGER = "MicroMessenger";
判断成功后直接相应的代码逻辑,我这边支付是另外一个平台所以要使用response.sendRedirect,必须使用这个去跳转不能使用什么restTemplate不然会报环境错误
2.微信上篇文章写的很清楚了这边着重说支付宝wapwap,手机电脑支付,支付宝相对于微信要简单很多demo如下:
public Map<String, Object> gotoWAPPay(Map<String, Object> map) {log.info("获取到支付参数====={}",map);AlipayClient alipayClient = AlipayConfiguration.alipayClient(map);log.info("支付客户端信息====={}",alipayClient);// 订单模型String productCode = "QUICK_WAP_WAY";String orderNo = map.get(PayConstants.ORDERNO).toString();BigDecimal amount = new BigDecimal(map.get(PayConstants.AMOUNT).toString());BigDecimal divide = new BigDecimal("100");String remark = map.get(PayConstants.REMARK).toString();AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();model.setOutTradeNo(orderNo);model.setSubject(remark);model.setTotalAmount(amount.divide(divide).toString());model.setBody("支付测试,共需支付" + (amount.divide(divide).toString()) + "元");model.setProductCode(productCode);//model.setQrPayMode("0");AlipayTradeWapPayRequest wapPayRequest = new AlipayTradeWapPayRequest();wapPayRequest.setReturnUrl("");log.info("异步通知荔付地址为:{}", payProperties.getAliNotifyUrl()+orderNo);wapPayRequest.setNotifyUrl(payProperties.getAliNotifyUrl()+orderNo);wapPayRequest.setBizModel(model);wapPayRequest.setNeedEncrypt(PayConstants.NEED_ENCRYPT);String form = null;try {form = alipayClient.pageExecute(wapPayRequest,"GET").getBody();} catch (AlipayApiException e) {// Handle the exception appropriately, e.g., log or throw a custom exception.e.printStackTrace();}log.info("支付宝手机电脑支付下单回调===={}", form);Map<String, Object> resultMap = new HashMap<>();
// try {
// response.sendRedirect(form);
// } catch (IOException e) {
// e.printStackTrace();
// }resultMap.put("url",form);return resultMap;}
这边有个坑,官方说get和post方法都可以,我们是直接让客户端跳转到支付,所以不需要前端,所以必须用get方法,返回的则是一个链接
form = alipayClient.pageExecute(wapPayRequest,"GET").getBody();
拿到链接后直接response.sendRedirect跳转过去即可
3.回调:
记得在之前填参数的时候将订单id带上,其他的就没什么了,相对于微信,支付宝还是简单很多,其他的代码就是自己项目上逻辑的差异