要为个人网站接入微信和支付宝支付功能,并实现实时回调以开通会员或充值,可以按照以下步骤进行实现:

要为个人网站接入微信和支付宝支付功能,并实现实时回调以开通会员或充值,可以按照以下步骤进行实现:

1. 选择支付接口

个人开发者可以通过以下几种方式接入微信和支付宝支付:
  • 官方支付接口:通过注册成为支付宝或微信支付的商户,获取API密钥和相关凭证。
  • 第三方聚合支付平台:如GOGO支付,提供免签约的支付接口,支持实时回调。

2. 接入支付宝支付

2.1 引入依赖

在项目中引入支付宝SDK。如果是Maven项目,可以在pom.xml中添加以下依赖:
xml复制
<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java</artifactId>
    <version>4.15.95.ALL</version>
</dependency>

2.2 配置参数

配置支付宝的AppId、私钥、公钥等参数:
java复制
public class AliPayConfig {
    public static final String APP_ID = "你的AppId";
    public static final String APP_PRIVATE_KEY = "你的应用私钥";
    public static final String ALIPAY_PUBLIC_KEY = "支付宝公钥";
    public static final String GATEWAY_URL = "https://openapi.alipay.com/gateway.do";
    public static final String NOTIFY_URL = "https://你的域名/notify";
    public static final String CHARSET = "UTF-8";
    public static final String SIGN_TYPE = "RSA2";
}

2.3 构建支付请求

通过支付宝SDK构建支付请求,并跳转到支付宝支付页面:
java复制
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.AlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;

public class AliPayService {
    public String createPayOrder(String orderId, String amount, String subject) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient(
                AliPayConfig.GATEWAY_URL,
                AliPayConfig.APP_ID,
                AliPayConfig.APP_PRIVATE_KEY,
                "json",
                AliPayConfig.CHARSET,
                AliPayConfig.ALIPAY_PUBLIC_KEY,
                AliPayConfig.SIGN_TYPE
        );

        AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
        request.setReturnUrl("https://你的域名/return");
        request.setNotifyUrl(AliPayConfig.NOTIFY_URL);
        request.setBizContent("{"
                + "\"out_trade_no\":\"" + orderId + "\","
                + "\"total_amount\":\"" + amount + "\","
                + "\"subject\":\"" + subject + "\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\""
                + "}");

        return alipayClient.pageExecute(request).getBody();
    }
}

2.4 处理支付回调

创建一个Servlet或Controller来处理支付宝的异步通知:
java复制
import com.alipay.api.AlipaySignature;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public class AliPayNotifyController {
    public String handleNotify(HttpServletRequest request) throws Exception {
        Map<String, String> params = request.getParameterMap().entrySet().stream()
                .collect(Collectors.toMap(Map.Entry::getKey, e -> e.getValue()[0]));

        boolean verifyResult = AlipaySignature.rsaCheckV1(params, AliPayConfig.ALIPAY_PUBLIC_KEY, AliPayConfig.CHARSET, AliPayConfig.SIGN_TYPE);
        if (verifyResult) {
            String outTradeNo = params.get("out_trade_no");
            String totalAmount = params.get("total_amount");
            // 处理业务逻辑,如开通会员或充值
            return "success";
        } else {
            return "fail";
        }
    }
}

3. 接入微信支付

3.1 配置微信支付参数

java复制
public class WxPayConfig {
    public static final String APP_ID = "你的AppId";
    public static final String MCH_ID = "你的商户号";
    public static final String KEY = "你的API密钥";
    public static final String NOTIFY_URL = "https://你的域名/notify/wxpay";
}

3.2 构建支付请求

java复制
import com.github.wxpay.sdk.WXPay;

public class WxPayService {
    public String createPayOrder(BigDecimal amount) throws Exception {
        WXPay wxpay = new WXPay(new WXPayConfig() {
            @Override
            public String getAppID() {
                return WxPayConfig.APP_ID;
            }

            @Override
            public String getMchID() {
                return WxPayConfig.MCH_ID;
            }

            @Override
            public String getKey() {
                return WxPayConfig.KEY;
            }
        });

        Map<String, String> data = new HashMap<>();
        data.put("body", "会员充值");
        data.put("out_trade_no", UUID.randomUUID().toString());
        data.put("total_fee", String.valueOf(amount.multiply(new BigDecimal(100)).intValue()));
        data.put("spbill_create_ip", "127.0.0.1");
        data.put("notify_url", WxPayConfig.NOTIFY_URL);
        data.put("trade_type", "NATIVE");

        Map<String, String> resp = wxpay.unifiedOrder(data);
        return resp.get("code_url");
    }
}

3.3 处理支付回调

java复制
import com.github.wxpay.sdk.WXPayUtil;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

public class WxPayNotifyController {
    public String handleNotify(HttpServletRequest request) throws Exception {
        InputStream inputStream = request.getInputStream();
        String xml = new String(inputStream.readAllBytes(), StandardCharsets.UTF_8);
        Map<String, String> params = WXPayUtil.xmlToMap(xml);

        boolean verifyResult = WXPayUtil.isSignatureValid(params, WxPayConfig.KEY, WXPayConstants.SignType.MD5);
        if (verifyResult) {
            String outTradeNo = params.get("out_trade_no");
            String totalFee = params.get("total_fee");
            // 处理业务逻辑,如开通会员或充值
            return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
        } else {
            return "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名验证失败]]></return_msg></xml>";
        }
    }
}

4. 业务逻辑处理

在支付回调中,根据订单号out_trade_no查询订单状态,确认支付成功后,执行以下操作:
  • 会员开通:更新用户会员状态,设置会员有效期。
  • 充值:将金额添加到用户的账户余额。

5. 测试与优化

  • 在沙箱环境中测试支付流程,确保支付成功、失败、退款等场景都能正确处理。
  • 确保回调接口的安全性,防止恶意请求。
通过以上步骤,你可以为个人网站接入微信和支付宝支付功能,并实现实时回调以开通会员或充值。