要将网站与微信支付连接,需遵循微信支付官方流程,完成技术对接、配置及测试,确保支付功能安全稳定,以下是详细步骤及注意事项:

准备工作:注册与资质审核
-
注册微信支付商户号
访问微信支付官网(pay.weixin.qq.com),点击“立即注册”,选择“企业账号”或“个体工商户账号”(个人暂不支持直接开通网站支付),填写企业基本信息、营业执照、法人身份证等材料,提交审核,审核通过后,获取商户号(mch_id)和API密钥(APIv3密钥,用于签名验证)。 -
开通产品与配置密钥
登录微信支付商户平台,进入“产品中心”->“开发配置”,开通“Native支付”或“H5支付”(根据网站类型选择:PC端选Native,移动端选H5),在“API安全”中设置APIv3密钥,并下载证书(用于回调数据解密)。 -
获取必要参数
记录以下关键信息:商户号(mch_id)、APIv3密钥、应用ID(APPID,需与公众号或小程序关联,若未关联需先注册并绑定)、支付密钥(API Key,部分接口需使用)。
技术对接:支付流程实现
网站对接微信支付的核心流程为:用户下单→网站发起支付请求→微信支付生成支付链接/二维码→用户扫码支付→微信异步通知→网站确认订单并更新状态,以下是分步实现方案:

生成支付订单(后端实现)
网站用户选择商品后,后端需调用微信支付“统一下单接口”(UnifiedOrder),构造请求参数并提交至微信支付服务器,关键参数如下(以JSON格式为例):
| 参数名 | 必填 | 说明 |
|---|---|---|
| appid | 是 | 应用ID(需与商户号关联) |
| mch_id | 是 | 商户号 |
| out_trade_no | 是 | 网站订单号(需保证唯一) |
| body | 是 | 商品描述(如“网站订单-商品名称”) |
| total_fee | 是 | 订单金额(单位:分,1元=100分) |
| spbill_create_ip | 是 | 用户终端IP(需真实IP,可获取用户请求的IP地址) |
| notify_url | 是 | 异步通知地址(微信支付结果回调的URL,需公网可访问) |
| trade_type | 是 | 交易类型:网站支付PC端选NATIVE,移动端选MWEB(H5支付) |
示例请求代码(Node.js):
const axios = require('axios');
const crypto = require('crypto');
const appid = 'your_appid';
const mch_id = 'your_mch_id';
const apiKey = 'your_api_key';
const notifyUrl = 'https://yourdomain.com/notify';
async function createOrder(outTradeNo, totalFee, body) {
const params = {
appid,
mch_id,
out_trade_no: outTradeNo,
body,
total_fee: totalFee,
spbill_create_ip: '127.0.0.1',
notify_url: notifyUrl,
trade_type: 'NATIVE' // PC端用NATIVE,移动端用MWEB
};
// 生成签名(MD5,参数按ASCII码排序+key)
const sortedParams = Object.keys(params).sort().map(key => `${key}=${params[key]}`).join('&');
const sign = crypto.createHash('md5').update(sortedParams + `&key=${apiKey}`).digest('hex').toUpperCase();
params.sign = sign;
// 请求微信支付统一下单接口
const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', params, {
headers: { 'Content-Type': 'application/xml' }
});
return response.data;
}
前端展示支付方式
根据trade_type返回结果,前端展示支付链接或二维码:
- NATIVE支付(PC端):返回
code_url,前端使用二维码生成库(如qrcode.js)将code_url转为二维码,用户微信扫码支付。 - MWEB支付(移动端):返回
mweb_url,前端通过window.location.href跳转至该URL,用户在微信内完成支付。
处理异步通知(核心安全环节)
用户支付成功后,微信支付服务器会向notify_url发送POST请求(XML格式),网站需验证通知的真实性并处理订单。

验证步骤:
- 接收XML数据,解析出
sign(签名)、out_trade_no(订单号)、transaction_id(微信支付单号)、result_code(业务结果)等字段。 - 使用APIv3密钥重新生成签名(需按微信签名规则处理,如使用SHA256+RSA签名)。
- 对比签名是否一致,若一致则验证订单状态:若
result_code为SUCCESS,则更新网站订单为“已支付”状态,并返回<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>;若不一致,则忽略通知。
示例代码(Node.js处理通知):
const xml2js = require('xml2js');
async function handleNotify(req, res) {
const xmlData = req.body;
const parser = new xml2js.Parser();
const result = await parser.parseStringPromise(xmlData);
const params = result.xml;
// 验证签名(此处简化,实际需按微信V3签名规则)
const sign = params.sign[0];
const sortedParams = Object.keys(params).filter(key => key !== 'sign').sort().map(key => `${key}=${params[key][0]}`).join('&');
const newSign = crypto.createHash('sha256').update(sortedParams + '&key=' + apiKey).digest('hex');
if (sign === newSign && params.result_code[0] === 'SUCCESS') {
// 更新订单状态(根据out_trade_no查询订单并修改)
await updateOrderStatus(params.out_trade_no[0], 'paid');
res.send('<xml><return_code><![CDATA[SUCCESS]]></return_code></xml>');
} else {
res.send('<xml><return_code><![CDATA[FAIL]]></return_code></xml>');
}
}
查询订单与退款
- 查询订单:若异步通知未收到,可通过“订单查询API”(OrderQuery)主动查询订单状态,参数需传入
out_trade_no或transaction_id。 - 退款:调用“退款API”(Refund),需填写
out_refund_no(退款单号)、total_fee(原订单金额)、refund_fee(退款金额),退款成功后微信会异步通知退款结果。
测试与上线
-
测试环境调试
在微信支付商户平台开通“测试商户号”,使用微信提供的沙箱环境(接口地址为https://api.mch.weixin.qq.com/sandboxnew/pay/unifiedorder)测试支付流程,确保统一下单、回调、查询等功能正常。 -
生产环境配置
测试通过后,切换至生产环境接口,关闭沙箱模式,确保API密钥、证书等配置正确。 -
安全加固
- 所有支付相关接口需使用HTTPS(SSL证书)加密。
- 避免在前端代码中暴露API密钥或商户敏感信息。
- 异步通知需验证签名,防止伪造通知。
常见问题与注意事项
- 交易类型选择错误:PC端网站必须使用
NATIVE,移动端H5页面使用MWEB,否则无法唤起微信支付。 - 异步通知地址不可访问:
notify_url需为公网可访问的URL,且不能携带参数(如?key=value),否则微信无法回调。 - 签名错误:确保签名算法正确(统一下单用MD5,V3接口用SHA256+RSA),参数排序按ASCII码从小到大,且key值准确。
- 订单号重复:
out_trade_no需保证唯一且可查询,重复会导致支付失败。
相关问答FAQs
Q1:网站对接微信支付是否需要备案域名?
A1:是的,微信支付要求网站域名已完成ICP备案,且备案主体与商户号主体一致,未备案的域名无法通过微信支付审核,也无法接收异步通知。
Q2:用户支付成功后,订单状态未更新怎么办?
A2:首先检查异步通知地址notify_url是否可访问,且是否正确处理了微信的回调数据(如验证签名、更新订单状态),若通知正常,可主动调用“订单查询API”查询订单状态;若仍异常,需联系微信支付客服排查,并提供商户号、订单号等信息以便定位问题。
