支付宝支付和微信支付大概记录

一:支付宝支付

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();
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值