支付API官方文档
alipay.trade.page.pay(统一收单下单并支付页面接口)
先创建应用
调用下单支付接口
调用该API时按照文档传入相应参数
公共请求参数相当于支付宝帮我们写好了,就是我们创建应用时的一些数据
这里的biz_content就是我们下单的业务参数等
请求下单
AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",AliPayConfig.app_id,AliPayConfig.merchant_private_key,
AliPayConfig.format,AliPayConfig.char_set,AliPayConfig.alipay_public_key,AliPayConfig.sign_type);
AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
alipayTradePagePayRequest.setReturnUrl(AliPayConfig.return_url);
alipayTradePagePayRequest.setNotifyUrl(AliPayConfig.notify_url);
AlipayTradePagePayModel model = new AlipayTradePagePayModel();
model.setOutTradeNo(outTradeNo);//商户自己的订单号
model.setProductCode("FAST_INSTANT_TRADE_PAY");
model.setTotalAmount(totalAmount);
model.setSubject(subject);
model.setBody(productBody);
model.setPassbackParams(URLEncoder.encode(String.valueOf(loginid),"utf-8"));//回传参数是商户传给支付宝,支付宝在通知商户时会原封不动返回该参数(文档要求该参数要进行URL编码)
alipayTradePagePayRequest.setBizModel(model);
String form = "";
try {
form = alipayClient.pageExecute(alipayTradePagePayRequest).getBody();
} catch (AlipayApiException e) {
e.printStackTrace();
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(form);//直接将完整的表单html输出到页面
response.getWriter().flush();
response.getWriter().close();
alipayClient实例化是注册支付宝支付功能
调用完成后支付宝会跳转到登录界面,将响应数据直接输出到页面
同步通知
代码中的alipayTradePagePayRequest.setReturnUrl(AliPayConfig.return_url);return_url是用户支付成功后支付宝同步返回信息的地址,只会通知一次,支付宝不推荐将此通知作为最终支付结果。需要商户以异步通知为准。
在支付完成后,支付宝通知商户服务器上的该url,可以在该url方法里进行轮询或者返回一个页面在页面内进行轮询得到最终支付结果,然后再进行页面的重定向,实现页面完成的跳转
异步通知
代码中的alipayTradePagePayRequest.setNotifyUrl(AliPayConfig.notify_url);设置了支付宝要进行异步通知商户时的地址,这个通知会发生多次,所以需要商户自行处理。对于支付完成后的业务逻辑处理也应该在此通知的url方法里写。
这两个通知的url都必须是放在公网上的url,不然你放自己电脑服务器上支付宝当然通知不到你了。
对支付完成后支付宝的通知是需要做签名验证的
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] + ",";
}
//乱码解决,这段代码在出现乱码时使用。
//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "utf-8");
params.put(name, valueStr);
}
Boolean isSignured = AlipaySignature.rsaCheckV1(params, AliPayConfig.alipay_public_key, AliPayConfig.char_set, AliPayConfig.sign_type);