具体要实现的功能:手机支付宝或微信扫描同一个二维码,跳转各自的支付
微信使用: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带上,其他的就没什么了,相对于微信,支付宝还是简单很多,其他的代码就是自己项目上逻辑的差异