一:支付宝支付
1.准备基础参数
appid(应用appid)、private_key(私钥)、public_key(公钥)、sign_type(加密方式)、charset(字符类型)、notify_url(回调地址-公网可访问)
其中公钥、私钥需要下载支付宝证书生成工具生成
2.添加依赖
<dependency> <groupId>com.alipay.sdk</groupId> <artifactId>alipay-sdk-java</artifactId> <version>4.38.85.ALL</version> </dependency>
3.配置config
public AlipayConfig config(String url) { AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.setServerUrl(url); alipayConfig.setAppId(appid); alipayConfig.setPrivateKey(private_key); alipayConfig.setFormat("json"); alipayConfig.setCharset(charset); alipayConfig.setAlipayPublicKey(public_key); alipayConfig.setSignType(sign_type); return alipayConfig; }
4.根据官网调起支付
5.支付宝回调
public void pay_notify(HttpServletRequest request) { //返回值示例 //str="you_notify_urlnotify_type=trade_status_sync&sign_type=RSA2&fund_bill_list=null&receipt_amount=null&invoice_amount=null; if (request.getParameter("trade_status").equals("TRADE_SUCCESS")) { // 验证签名 boolean verifyResult = AlipaySignature.rsaCheckV1(convertParamsToMap(request), public_key, charset, sign_type); if (verifyResult) { // 验证成功 String outTradeNo = request.getParameter("out_trade_no"); String tradeStatus = request.getParameter("trade_status"); System.out.println("交易名称: " + request.getParameter("subject")); System.out.println("交易状态: " + request.getParameter("trade_status")); System.out.println("交易凭证号: " + request.getParameter("trade_no")); System.out.println("订单号: " + request.getParameter("out_trade_no")); System.out.println("交易金额: " + request.getParameter("total_amount")); System.out.println("买家在支付宝唯一id: " + request.getParameter("buyer_id")); System.out.println("付款时间: " + request.getParameter("gmt_payment")); System.out.println("付款金额: " + request.getParameter("buyer_pay_amount")); // 更新订单状态或其他业务处理 System.out.println("success"); } else { // 验证失败 System.out.println("验证失败"); } }
6.将支付宝返回串,转为Map
private Map<String, String> convertParamsToMap(HttpServletRequest request) { Map<String, String> params = new HashMap<>(); Enumeration<String> parameterNames = request.getParameterNames(); while (parameterNames.hasMoreElements()) { String paramName = parameterNames.nextElement(); String paramValue = request.getParameter(paramName); params.put(paramName, paramValue); } return params; }
二:微信支付
1.准备基础参数
merchantId(商户号)、appid(商户appid)、apikey(商户密钥)、merchantSerialNumber(商户证书序列号)、privateKeyPath(商户API私钥路径文件名路径)、notify_url(回调地址-公网可访问)
下载微信证书生成工具、下载证书到本地并记录证书编号
2.添加依赖
<dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-java</artifactId> <version>0.2.11</version> </dependency>
3.配置config
public Config config() { Config config = new RSAAutoCertificateConfig.Builder() .merchantId(merchantId) .privateKeyFromPath(privateKeyPath) .merchantSerialNumber(merchantSerialNumber) .apiV3Key(apiV3Key) .build(); return config; }
4.根据官网生成订单
5.微信回调
public void pay_notify(HttpServletRequest request) { // 从请求头中获取信息 // 这是微信回调固定在请求头里的参数,验签要用 String wechatTimestamp = request.getHeader("Wechatpay-Timestamp"); String wechatpayNonce = request.getHeader("Wechatpay-Nonce"); String wechatSignature = request.getHeader("Wechatpay-Signature"); String singType = request.getHeader("Wechatpay-Signature-Type"); String wechatPaySerial = request.getHeader("Wechatpay-Serial"); String requestBody = readBody(request); // 构造 RequestParam RequestParam requestParam = new RequestParam.Builder() .serialNumber(wechatPaySerial) .nonce(wechatpayNonce) .signature(wechatSignature) .timestamp(wechatTimestamp) .body(requestBody) .build(); // 如果已经初始化了 RSAAutoCertificateConfig,可直接使用 // 没有的话,则构造一个 NotificationConfig config = new RSAAutoCertificateConfig.Builder() .merchantId(merchantId) .privateKeyFromPath(privateKeyPath) .merchantSerialNumber(merchantSerialNumber) .apiV3Key(apiV3Key) .build(); NotificationParser parser = new NotificationParser(config); try { // 以支付通知回调为例,验签、解密并转换成 Transaction Transaction transaction = parser.parse(requestParam, Transaction.class); if (HttpStatus.OK.equals("200") || HttpStatus.OK.equals("ok")) { if (Transaction.TradeStateEnum.SUCCESS.equals(transaction.getTradeState())) { // 下面就是做支付成功的逻辑 String openid=transaction.getPayer().getOpenid(); String tradeState= transaction.getTradeState(); } else { } } } } catch (ValidationException e) { // 签名验证失败,返回 401 UNAUTHORIZED 状态码 //logger.error("sign verification failed", e); System.out.println("签名验证失败" + HttpStatus.UNAUTHORIZED); } }
6.读取微信回调数据
private String readBody(HttpServletRequest request) { StringBuffer sb = new StringBuffer(); try (ServletInputStream inputStream = request.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); ) { String line; while ((line = reader.readLine()) != null) { sb.append(line); } } catch (IOException e) { System.out.println("读取数据流异常:{}" + e); } return sb.toString(); }