- pom导包
<!-- 支付宝--><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-easysdk</artifactId><version>${alipay.version}</version></dependency><dependency><groupId>com.alipay.sdk</groupId><artifactId>alipay-sdk-java</artifactId><version>4.11.66.ALL</version><scope>compile</scope></dependency>
- yaml配置,这些参数都是自己申请时给的参数
ali:#应用ID ,APPIDappId: protocol: https#接口加密encryptKey: encryptType: #应用私钥 RSA2私钥merchantPrivateKey: #支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。alipayPublicKey: #应用公钥keyappPublicKey: # 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数 用来支付宝回调notifyUrl: # 支付完成后需要跳转的页面地址returnUrl: # 签名方式signType: RSA2# 字符编码格式charset: utf-8# 支付宝网关gatewayUrl: https://openapi.alipay.com/gateway.do
- 请求参数
- 根据自己的业务需求,一般都是往订单表里去更新数据
首先:获取订单编号和需要支付的金额,带着参数去发起支付请求@Overridepublic ResultInfo<?> postOrder(PayParam payParam){Orders orders = new Orders();orders.setClasscode(payParam.getCode) //订单编号,唯一.setPayAmount(payParam.getPayAmount()); //支付金额this.save(orders);SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");Date now = new Date();Date afterDate = new Date(now .getTime() + 900000);//支付超时时间15分钟//发起支付 参数全是stringString Out_trade_no = orders.getCode; //商户订单号String Subject = "购买服务"; //订单标题String Total_amount = String.valueOf(payParam.getPayAmount()); //支付金额String Product_code = "FAST_INSTANT_TRADE_PAY"; //产品码String time_expire = sdf.format(afterDate); //订单绝对超时时间String result = pay(Out_trade_no,Subject,Total_amount,Product_code,Body,time_expire);return ResultInfo.success(result,"新建成功");}
- 封装参数去发起请求,然后调用SDK生成的表单,这个表单是返回给前端用的
@Value("${ali.appId}")private String alipayAppId;@Value("${ali.signType}")private String signType;@Value("${ali.gatewayUrl}")private String gatewayHost;@Value("${ali.notifyUrl}")private String aliPayNotifyUrl;@Value("${ali.returnUrl}")private String returnUrl;@Value("${ali.encryptKey}")private String encryptKey;@Value("${ali.encryptType}")private String encryptType;@Value("${ali.merchantPrivateKey}")private String merchantPrivateKey;@Value("${ali.alipayPublicKey}")private String alipayPublicKey;@Value("${ali.charset}")private String charset;private final String format = "json";public String pay(String out_trade_no, String subject, String total_amount, String product_code, String time_expire) {AlipayClient alipayClient = new DefaultAlipayClient(gatewayHost, alipayAppId, merchantPrivateKey, format, charset, alipayPublicKey, signType,encryptKey,encryptType);//PC网页支付使用AlipayTradePagePayRequest传参,下面调用的是pageExecute方法AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();alipayRequest.setReturnUrl(returnUrl);alipayRequest.setNotifyUrl(aliPayNotifyUrl);JSONObject bizContent = new JSONObject();bizContent.put("out_trade_no", out_trade_no);bizContent.put("total_amount", total_amount);bizContent.put("subject", subject);bizContent.put("product_code", product_code);bizContent.put("time_expire", time_expire);alipayRequest.setBizContent(bizContent.toString());log.info("封装请求支付宝付款参数为:{}", bizContent.toString());// 调用SDK生成表单String result = null;try {result = alipayClient.pageExecute(alipayRequest).getBody();} catch (AlipayApiException e) {log.info("调用失败!!");return result;}log.info("请求支付宝付款返回参数为:{}", result);return result;}
- 支付宝回调,回调的接口地址一定是和配置的一样,主要是拿到支付端返回的支付状态,以及交易流水号等等可以更新订单表
public Object alipayNotify(HttpServletRequest request) {log.info("------------------------------支付宝回调开始----------------------------------------");Map<String, String> params = new HashMap<>();Map requestParams = request.getParameterMap();for (Object o : requestParams.keySet()) {String name = (String) o;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);}log.info("params = " + params);String tradeStatus = params.get("trade_status");boolean signVerified = "TRADE_SUCCESS".equals(tradeStatus) || "TRADE_FINISHED".equals(tradeStatus);//失败成功都要更新订单表if (signVerified) {//更新订单boolean byOutTradeNo=ordersService.putOrder(params);AssertUtil.isTrue(!byOutTradeNo, "修改支付宝支付状态失败");log.info("------------------------------支付宝回调结束----------------------------------------");return "success";}return "failure";}
这样整个代码流程就结束啦
分享的只是非常简单支付流程,像发票之类的可以根据自己的业务需求