我这里指的是微信工作号中打开支付宝支付
上面文档一定要仔细阅读
[快速接入](https://docs.open.alipay.com/203/105285/)
@RequestMapping("/alipay")
public void alipay(@RequestParam("orderNumber") String orderNumber, HttpServletRequest request, HttpServletResponse response) throws Exception{
OrderInfo info = orderInfoService.selectOne(new EntityWrapper<OrderInfo>()
.eq("order_number",orderNumber));
orderInfoService.updateById(info);
String orderNo = (System.currentTimeMillis()+"").substring(1)+(System.nanoTime()+"").substring(7,8);
String totalAmount = info.getOrderMoney().toString();
String subject = info.getOrderProject();
//封装请求客户端
AlipayClient client = new
DefaultAlipayClient (url,app_id,private_key,format,charset,
public_key,signtype );
//支付请求
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
alipayRequest.setReturnUrl("http://XXXX.com/xxxx/api/returnUrl?orderNumber="+orderNumber);
alipayRequest.setNotifyUrl("http://xxxx.com/xxxx/api/notifyUrl");
AlipayTradeWapPayModel model = new AlipayTradeWapPayModel();
model.setProductCode("QUICK_WAP_PAY");
model.setOutTradeNo(orderNo);
model.setSubject(subject);
model.setTotalAmount(totalAmount);
model.setBody(info.getOrderProject());
alipayRequest.setBizModel(model);
String form = client.pageExecute(alipayRequest).getBody();
response.setContentType("text/html;charset="+charset);
response.getWriter().write(form);
response.getWriter().flush();
response.getWriter().close();
}
这里有点像老式的servlet渲染界面
这里的参数,请根据官方的指引
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", APP_ID, APP_PRIVATE_KEY, "json", CHARSET, ALIPAY_PUBLIC_KEY, "RSA2"); //获得初始化的AlipayClient
私钥,公钥,阿里公钥,根据官方提供的工具,生成,上面代码中需要的是私钥,还有阿里公钥
AlipayTradeWapPayRequest alipayRequest = new AlipayTradeWapPayRequest();
AlipayTradeWapPayRequest这个类是渲染手机界面,而AlipayTradePagePayRequest渲染PC端
model.setProductCode("QUICK_WAP_PAY");
注意此处的productCode,不要写错了
支付宝同步跳转
/**
* 支付宝同步跳转
* */
@RequestMapping("/returnUrl")
public void returnUrl(HttpServletRequest request, HttpServletResponse response) throws Exception{
String orderNumber = request.getParameter("orderNumber");
// 获取支付宝GET过来反馈信息(官方固定代码)
OrderInfo info = orderInfoService.selectOne(new EntityWrapper<OrderInfo>()
.eq("order_number",orderNumber));
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> 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] + ",";
}
params.put(name, valueStr);
}
params.remove("orderNumber");
//注意,我这里remove map中的orderNumber,是因为如果加入orderNumber,下面这个对signVerified的判断会有有印象
boolean signVerified = AlipaySignature.rsaCheckV1(params, public_key, charset, signtype);
// 返回界面
//if (signVerified) {
// info.setOrderState(1);
//orderInfoService.updateById(info);
//}
response.sendRedirect("http://m.xxxx.com/orderDetail.html?orderNum="+orderNumber);
}
支付宝服务器异步通知
/**
* 支付宝服务器异步通知
*
* @param request
* @throws Exception
*/
@RequestMapping("/notifyUrl")
public void notifyUrl(HttpServletRequest request, PrintWriter out) throws Exception {
// 获取支付宝GET过来反馈信息
Map<String, String> params = new HashMap<String, String>();
Map<String, String[]> requestParams = request.getParameterMap();
for (Iterator<String> 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] + ",";
}
params.put(name, valueStr);
}
boolean signVerified = AlipaySignature.rsaCheckV1(params, public_key, charset, signtype); // 调用SDK验证签名
if (signVerified) { // 验证成功 更新订单信息
System.out.println("异步通知成功");
// 商户订单号
String out_trade_no = request.getParameter("out_trade_no");
// 交易状态
String trade_status = request.getParameter("trade_status");
// 修改数据库
//获取out_trade_no,获取orderNumber,进行修改
out.println("success");
out.flush();
} else {
System.out.println("异步通知失败");
out.println("fail");
}
}
这里通知支付宝,我收到了,返回success
还有一个重要问题,那就是微信公众号里面对支付宝支付是拦截
将html文件和js文件放入项目中。