转自:http://blog.csdn.net/u012552275/article/details/78320051
后台基本需要到以下几个参数,我都将他们写在了properties文件中:
支付宝参数
AliPay.payURL = https://openapi.alipay.com/gateway.do
商户公钥
AliPay.publicKey = xxx
AliPay.appId = xxx APPid
AliPay.timeoutExpress = xxx 超时时间
AliPay.notifyUrl = http://xxx 异步通知
获取支付宝预付单
/** * 拉取支付宝预付单 */ @ValidatePermission(value = PermissionValidateType.Validate) @Override public BaseResult<Orders> getAliPay(BaseRequest<Orders> baseRequest) { LogUtil.debugLog(logger, baseRequest); BaseResult<Orders> baseResult = new BaseResult<>(); Orders orders = baseRequest.getData(); try { AlipayClient alipayClient = PayCommonUtil.getAliClient(); AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest(); AlipayTradeAppPayModel model = new AlipayTradeAppPayModel(); model.setOutTradeNo(orders.getId() + ""); model.setTimeoutExpress(PropertyUtil.getInstance().getProperty("AliPay.timeoutExpress")); model.setTotalAmount("0.01"); model.setProductCode("QUICK_MSECURITY_PAY"); request.setBizModel(model); request.setNotifyUrl(PropertyUtil.getInstance().getProperty("AliPay.notifyUrl")); model.setBody(xxx); model.setSubject("商品的标题/交易标题/订单标题/订单关键字等"); break; AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request); orders.setAliPayOrderString(response.getBody()); baseResult.setData(orders); } catch (Exception e) { e.printStackTrace(); baseResult.setState(-999); baseResult.setMsg("程序异常!"); baseResult.setSuccess(false); logger.error(e.getMessage()); } return baseResult; }
在上面一段代码中,我们已经将支付宝服务端生成的预付单信息返回给了客户端,至此,客户端已经可以支付。支付结果支付宝将会异步给后台通知,下面是异步通知的代码:
@ValidatePermission @RequestMapping(value = "/notify/ali", method = RequestMethod.POST, consumes = "application/json", produces = "text/html;charset=UTF-8") @ResponseBody public String aLiNotify(HttpServletRequest request, HttpServletResponse response) throws IOException { logger.debug("支付宝回调"); Map requestParams = request.getParameterMap(); logger.debug("支付宝回调结果:" + requestParams.toString()); Map<String, String> params = new HashMap<String, String>(); 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] + ","; } params.put(name, valueStr); } try { String alipay_public_key = PropertyUtil.getInstance().getProperty("AliPay.AliPay.publicKey"); boolean flag = AlipaySignature.rsaCheckV1(params, alipay_public_key, "utf-8", "RSA2"); if(flag){ if("TRADE_SUCCESS".equals(params.get("trade_status"))){ String amount = params.get("buyer_pay_amount"); String out_trade_no = params.get("out_trade_no"); String trade_no = params.get("trade_no"); String passback_params = URLDecoder.decode(params.get("passback_params")); } } else { logger.debug("签名验证失败!"); } } catch (AlipayApiException e) { e.printStackTrace(); } return "success"; }
至此,支付宝支付的核心代码已完成。
本文用到的工具类地址: