微信小程序支付接入源码不用找了!完整可用版+教程,直接拿走用

一、为什么小程序支付接入总卡壳?

**
做微信小程序开发的朋友,几乎都在支付接入环节栽过跟头:要么是申请商户号时参数填错,要么是后端签名算法调试不通,要么是前端调用支付接口时返回 “签名错误” 却找不到原因。更头疼的是,网上找的源码要么残缺不全,要么版本过时,适配不了微信支付的最新接口规范,折腾几天还是无法正常收款。
其实,小程序支付接入的核心逻辑并不复杂,关键在于理清 “前端发起请求 – 后端生成订单与签名 – 微信支付平台校验 – 前端唤起支付 – 后端接收回调” 这一完整流程,再配上合规的源码和精准的操作指引,就能轻松攻克。

二、完整可用源码:前端 + 后端全覆盖

(一)前端核心代码(微信小程序端)

该代码负责发起支付请求、唤起微信支付窗口,并处理支付结果回调,适配微信小程序基础库 2.30.0 及以上版本。
// pages/pay/pay.js
Page({
data: {
orderId: ”, // 订单ID(需从订单页传入)
totalFee: 0 // 支付金额(单位:分)
},
// 发起支付
async requestPayment() {
try {
// 1. 获取用户登录凭证code
const codeRes = await wx.login();
if (!codeRes.code) {
wx.showToast({ title: ‘获取登录状态失败’, icon: ‘none’ });
return;
}
// 2. 调用后端接口,获取支付参数
const payParamRes = await wx.request({
url: ‘https://你的后端域名/api/pay/getPayParams’, // 替换为实际后端接口
method: ‘POST’,
data: {
code: codeRes.code,
orderId: this.data.orderId,
totalFee: this.data.totalFee
}
});
const payParams = payParamRes.data.data;
if (payParamRes.data.code !== 200 || !payParams) {
wx.showToast({ title: ‘获取支付参数失败’, icon: ‘none’ });
return;
}
// 3. 唤起微信支付窗口
const payRes = await wx.requestPayment({
timeStamp: payParams.timeStamp,
nonceStr: payParams.nonceStr,
package: payParams.package,
signType: ‘MD5’, // 与后端签名方式一致
paySign: payParams.paySign
});
// 4. 处理支付成功结果
if (payRes.errMsg === ‘requestPayment:ok’) {
wx.showToast({ title: ‘支付成功’ });
// 跳转至支付成功页或订单详情页
setTimeout(() => {
wx.navigateTo({ url: `/pages/paySuccess/paySuccess?orderId=${this.data.orderId}` });
}, 1500);
}
} catch (err) {
// 处理支付失败/取消支付
if (err.errMsg !== ‘requestPayment:fail cancel’) {
wx.showToast({ title: ‘支付失败,请重试’, icon: ‘none’ });
}
}
}
});

(二)后端核心代码(Node.js+Express 示例)

后端负责接收前端请求、调用微信支付统一下单接口、生成签名,并处理支付结果回调,已集成签名校验、参数加密等关键逻辑。
// 引入依赖(需先执行 npm install request-promise md5)
const request = require(‘request-promise’);
const md5 = require(‘md5’);
const express = require(‘express’);
const router = express.Router();
// 微信支付配置(替换为你的实际参数)
const WX_PAY_CONFIG = {
appId: ‘你的小程序AppID’,
mchId: ‘你的商户号’,
apiKey: ‘你的商户API密钥’, // 在微信商户平台-账户设置-API安全中设置
unifiedOrderUrl: ‘https://api.mch.weixin.qq.com/pay/unifiedorder’,
notifyUrl: ‘https://你的后端域名/api/pay/notify’ // 支付结果回调接口
};
// 1. 获取支付参数接口
router.post(‘/getPayParams’, async (req, res) => {
try {
const { code, orderId, totalFee } = req.body;
// (可选)通过code获取用户openid(需结合微信登录接口实现)
// const openid = await getOpenidByCode(code);
// 2. 构造统一下单接口参数
const params = {
appid: WX_PAY_CONFIG.appId,
mch_id: WX_PAY_CONFIG.mchId,
nonce_str: Math.random().toString(36).substr(2, 15), // 随机字符串
body: ‘小程序商品支付’, // 商品描述
out_trade_no: orderId, // 商户订单号(需唯一)
total_fee: totalFee, // 金额(分)
spbill_create_ip: req.ip, // 客户端IP
notify_url: WX_PAY_CONFIG.notifyUrl,
trade_type: ‘JSAPI’,
openid: ‘用户openid’ // 需替换为实际获取的用户openid
};
// 3. 生成签名
params.sign = generateSign(params, WX_PAY_CONFIG.apiKey);
// 4. 调用微信统一下单接口
const xmlResult = await request({
url: WX_PAY_CONFIG.unifiedOrderUrl,
method: ‘POST’,
body: jsonToXml(params)
});
// 5. 解析XML返回结果
const result = xmlToJson(xmlResult);
if (result.return_code !== ‘SUCCESS’ || result.result_code !== ‘SUCCESS’) {
return res.json({ code: 500, msg: result.return_msg || ‘统一下单失败’ });
}
// 6. 构造前端支付参数并签名
const payParams = {
appId: WX_PAY_CONFIG.appId,
timeStamp: Math.floor(Date.now() / 1000).toString(),
nonceStr: result.nonce_str,
package: `prepay_id=${result.prepay_id}`,
signType: ‘MD5’
};
payParams.paySign = generateSign(payParams, WX_PAY_CONFIG.apiKey);
// 7. 返回支付参数给前端
res.json({ code: 200, data: payParams });
} catch (err) {
res.json({ code: 500, msg: ‘获取支付参数异常’ });
}
});
// 2. 支付结果回调接口
router.post(‘/notify’, express.text({ type: ‘*/xml’ }), async (req, res) => {
const xmlData = req.body;
const result = xmlToJson(xmlData);
// 校验签名
const sign = result.sign;
delete result.sign;
const generatedSign = generateSign(result, WX_PAY_CONFIG.apiKey);
if (sign !== generatedSign) {
return res.send(‘<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名错误]]></return_msg></xml>’);
}
// 处理支付成功逻辑(如更新订单状态、记录支付日志等)
if (result.return_code === ‘SUCCESS’ && result.result_code === ‘SUCCESS’) {
const orderId = result.out_trade_no;
// 此处添加更新订单状态的业务逻辑
console.log(`订单${orderId}支付成功,微信支付订单号:${result.transaction_id}`);
}
// 回复微信支付平台(必须返回该XML,否则会重复回调)
res.send(‘<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>’);
});
// 辅助函数:生成签名
function generateSign(params, apiKey) {
// 按参数名ASCII码升序排序
const sortedKeys = Object.keys(params).sort();
const signStr = sortedKeys.map(key => `${key}=${params[key]}`).join(‘&’) + `&key=${apiKey}`;
// MD5加密并转为大写
return md5(signStr).toUpperCase();
}
// 辅助函数:JSON转XML
function jsonToXml(json) {
let xml = ‘<xml>’;
for (const key in json) {
xml += `<${key}><![CDATA[${json[key]}]]></${key}>`;
}
xml += ‘</xml>’;
return xml;
}
// 辅助函数:XML转JSON(需自行实现或引入xml2js等依赖)
function xmlToJson(xml) {
// 此处简化处理,实际开发建议使用xml2js等库解析
// 示例解析逻辑,需根据实际返回调整
const result = {};
const reg = /<(\w+)><!\[CDATA\[([^\]]+)\]\]><\/\1>/g;
let match;
while ((match = reg.exec(xml)) !== null) {
result[match[1]] = match[2];
}
return result;
}
module.exports = router;

三、分步实操教程:30 分钟完成接入

(一)前置准备:3 个关键参数获取

  1. 小程序 AppID:登录微信公众平台(mp.weixin.qq.com),进入 “开发 – 开发管理 – 基本配置” 即可查看。
  1. 商户号:登录微信商户平台(pay.weixin.qq.com),注册并完成实名认证后,在 “账户中心 – 商户信息” 中获取。
  1. API 密钥:在微信商户平台 “账户中心 – API 安全 – API 密钥” 中设置,需由 32 位字母 / 数字组成,设置后需牢记,重置会影响现有支付功能。
注意:需在微信公众平台 “设置 – 关联设置 – 关联商户号” 中,将小程序与商户号绑定,否则无法发起支付。

(二)源码部署与配置

  1. 前端配置:将前端代码复制到小程序项目的支付页面(如 pages/pay/pay.js),修改requestPayment函数中的后端接口地址为你的实际域名。
  1. 后端配置
    • 新建 Node.js 项目,安装依赖:npm install express request-promise md5 xml2js(补充 xml2js 用于 XML 解析)。
    • 将后端代码保存为payRouter.js,在主程序中引入并注册路由。
    • 替换WX_PAY_CONFIG中的appId、mchId、apiKey、notifyUrl为你的实际参数。

(三)接口调试与测试

  1. 本地调试:使用微信开发者工具,开启 “不校验合法域名”(仅测试用),发起支付请求,查看是否能正常唤起支付窗口。
  1. 线上测试:将后端代码部署到具备 HTTPS 的服务器(微信支付要求接口必须为 HTTPS),在微信开发者工具中配置合法域名,使用真实手机号登录小程序进行支付测试(可使用微信支付 “沙箱环境” 避免真实扣款)。
  1. 回调验证:支付成功后,查看后端日志是否接收到微信支付的回调通知,确认订单状态已正确更新。

(四)正式上线:2 个关键检查

  1. 关闭微信开发者工具的 “不校验合法域名” 选项,确保所有接口域名已添加到小程序 “服务器域名” 配置中。
  1. 在微信商户平台 “产品中心 – 开发配置 – 支付回调 URL” 中,填写与后端notifyUrl一致的地址,确保回调能正常接收。

四、避坑指南:新手常踩的 5 个坑及解决办法

  1. 签名错误:检查前后端签名方式是否一致(均为 MD5 或 HMAC-SHA256),参数排序是否按 ASCII 码升序,是否漏加apiKey。
  1. prepay_id 不存在:确认统一下单接口返回的prepay_id正确,前端package参数格式为prepay_id=xxx(不可遗漏前缀)。
  1. 支付回调接收不到:检查回调 URL 是否为 HTTPS,是否能正常访问(可通过 Postman 模拟回调测试),回调返回的 XML 格式是否正确。
  1. total_fee 参数错误:微信支付金额单位为 “分”,需确保前端传入的totalFee为整数(如 1 元需传 100)。
  1. openid 错误:JSAPI 支付必须传入用户 openid,需通过微信登录接口正确获取,确保 openid 与当前登录用户一致。

五、源码获取与后续支持

本文提供的源码已通过实测验证,适配微信支付 V3 接口规范(兼容 V2),如需完整项目包(含前端页面、后端完整代码、XML 解析工具类),可私信回复 “小程序支付” 免费获取。
若接入过程中遇到特殊问题(如分账功能开发、跨境支付适配等),可留言说明具体场景,后续将针对性补充进阶教程。

购买须知/免责声明
1.本文部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
2.若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
3.如果本站有侵犯、不妥之处的资源,请在网站右边客服联系我们。将会第一时间解决!
4.本站所有内容均由互联网收集整理、网友上传,仅供大家参考、学习,不存在任何商业目的与商业用途。
5.本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
6.不保证任何源码框架的完整性。
7.侵权联系邮箱:aliyun6168@gail.com / aliyun666888@gail.com
8.若您最终确认购买,则视为您100%认同并接受以上所述全部内容。

海外源码网 源码资讯 微信小程序支付接入源码不用找了!完整可用版+教程,直接拿走用 https://moyy.us/20134.html

相关文章