一:支付宝支付
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);// 构造 RequestParamRequestParam 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 {// 以支付通知回调为例,验签、解密并转换成 TransactionTransaction 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(); }