网站接入支付宝/微信支付教程:从零到成功收款
对于面向国内用户的网站,支付宝和微信支付是必不可少的支付方式。相比 Stripe 等国际支付平台,国内支付的接入流程稍复杂,但一旦配置完成,支付体验非常流畅。
一、接入前的准备工作
1.1 所需资质
| 支付方式 | 所需资质 | 说明 |
|---|---|---|
| 支付宝 | 企业营业执照(或个体工商户) | 个人版功能受限 |
| 微信支付 | 企业营业执照(或个体工商户) | 个人版部分功能不可用 |
注意:2026 年支付宝和微信支付均已收紧个人商户的申请条件,建议使用企业资质申请。
1.2 网站要求
- 已完成 ICP 备案
- 已启用 HTTPS
- 有完整的商品/服务页面
- 有明确的退款和售后政策
二、支付宝接入
2.1 注册与认证
- 登录 支付宝开放平台
- 创建应用 → 选择"网页/移动应用"
- 填写应用基本信息(应用名称、应用图标等)
- 配置接口加签方式(推荐 RSA2)
- 提交审核(通常 1-3 个工作日)
2.2 获取关键参数
// 支付宝关键配置参数
$config = [
'app_id' => '202100...',
'merchant_private_key' => 'MIIEv...', // 商户私钥
'alipay_public_key' => 'MIIBI...', // 支付宝公钥
'notify_url' => 'https://yourdomain.com/alipay/notify',
'return_url' => 'https://yourdomain.com/alipay/return',
'charset' => 'UTF-8',
'sign_type' => 'RSA2',
'gateway_url' => 'https://openapi.alipay.com/gateway.do',
];
2.3 发起支付请求
// 使用支付宝 SDK(PHP 示例)
$aop = new AopClient();
$aop->gatewayUrl = $config['gateway_url'];
$aop->appId = $config['app_id'];
$aop->rsaPrivateKey = $config['merchant_private_key'];
$aop->alipayrsaPublicKey = $config['alipay_public_key'];
$request = new AlipayTradePagePayRequest();
$request->setNotifyUrl($config['notify_url']);
$request->setReturnUrl($config['return_url']);
$request->setBizContent(json_encode([
'out_trade_no' => 'ORDER_' . time(),
'product_code' => 'FAST_INSTANT_TRADE_PAY',
'total_amount' => '99.99',
'subject' => '商品名称',
]));
$result = $aop->pageExecute($request);
// 输出 $result,用户会被重定向到支付宝收银台
三、微信支付接入
3.1 注册与认证
- 登录 微信支付商户平台
- 提交商户资料(营业执照、法人身份证、银行账户信息)
- 完成账户验证(打款验证或法人人脸识别)
- 签署协议后获得商户号
3.2 配置参数
微信支付比支付宝多一个 APIv3 密钥的配置:
// 微信支付 Node.js 示例
const wechatPay = {
appid: 'wx...', // 公众号/小程序 AppID
mchid: '123000...', // 商户号
apiV3Key: '...', // APIv3 密钥
serialNo: '...', // 证书序列号
notifyUrl: 'https://yourdomain.com/wechat/notify',
};
3.3 Native 支付(适用于 PC 网站)
// 生成支付二维码
const { code_url } = await wechatPay.native({
description: '商品名称',
out_trade_no: 'ORDER_' + Date.now(),
amount: {
total: 9999, // 金额单位:分(¥99.99)
currency: 'CNY',
},
});
// 前端展示二维码
// 使用 qrcode.js 将 code_url 转为二维码展示
// 轮询查询支付状态
3.4 JSAPI 支付(适用于移动端)
// 获取用户的 openid(需要 OAuth2 授权)
// 然后发起 JSAPI 支付
const payment = await wechatPay.jsapi({
description: '商品名称',
out_trade_no: 'ORDER_' + Date.now(),
amount: { total: 9999, currency: 'CNY' },
payer: { openid: userOpenId },
});
// 前端调起支付
WeixinJSBridge.invoke('getBrandWCPayRequest', payment, (res) => {
if (res.err_msg === 'get_brand_wcpay_request:ok') {
// 支付成功
}
});
四、支付通知处理
4.1 支付宝异步通知
// 验证通知签名
$aop = new AopClient();
$result = $aop->rsaCheckV1($_POST, $config['alipay_public_key'], 'RSA2');
if ($result && $_POST['trade_status'] == 'TRADE_SUCCESS') {
// 更新订单状态
$orderId = $_POST['out_trade_no'];
updateOrderStatus($orderId, 'paid');
echo 'success'; // 告诉支付宝已收到通知
}
4.2 微信支付回调
app.post('/wechat/notify', async (req, res) => {
try {
const { id, event_type, resource } = req.body;
if (event_type === 'TRANSACTION.SUCCESS') {
const orderId = resource.out_trade_no;
updateOrderStatus(orderId, 'paid');
}
res.json({ code: 'SUCCESS', message: '成功' });
} catch (error) {
res.status(500).json({ code: 'FAIL', message: error.message });
}
});
五、费用对比
| 项目 | 支付宝 | 微信支付 |
|---|---|---|
| 费率 | 0.6%-1.2% | 0.6%-1.0% |
| 行业标准费率 | 0.6%(多数行业) | 0.6%(多数行业) |
| 提现手续费 | 免费 | 免费 |
| 退款手续费 | 不退 | 不退 |
| 结算周期 | T+1 | T+1 |
六、常见问题
申请被拒的原因
最常见的原因:营业执照信息不完整、网站未备案、经营范围与申请类型不匹配。建议仔细阅读平台要求,确保资质齐全。
支付回调没有收到
- 检查 notify_url 是否可以公网访问
- 确认没有 IP 白名单限制
- 查看服务器日志,确保能正常接收 POST 请求
- 在支付宝/微信商户后台查看回调记录
双通道同时集成
建议同时在网站提供支付宝和微信支付选项。也可以使用第三方聚合支付(如收钱吧、利楚扫呗)一次对接支持两个渠道。
七、总结
国内支付接入虽然流程上比 Stripe 繁琐,但对于面向国内用户的网站是必须的。建议同时接入支付宝和微信支付,覆盖超过 95% 的国内移动支付用户。如果技术资源有限,也可以考虑使用第三方支付服务商提供的聚合支付 SDK,一次接入即可支持多个支付渠道。