小程序的支付功能实现

小程序的支付功能实现

小程序的支付功能实现一、引言支付功能是小程序开发中最重要的功能之一,尤其在电商、外卖、在线教育等场景中广泛应用。微信小程序提供了 微信支付(WeChat Pay) 作为官方支付方案,使开发者能够集成安全、便捷的支付能力。本文将详细讲解小程序支付的实现流程,包括 支付流程、服务器端接口、前端调用支付API,并结合示例代码进行分析。

二、小程序支付的实现流程微信支付在小程序中的实现一般涉及 小程序前端 和 服务器端 两部分:

用户在小程序端发起支付请求,获取 prepay_id(预支付订单)。服务器调用微信支付 API 生成支付订单,返回给小程序端。小程序调用 wx.requestPayment 进行支付。支付成功后,微信服务器通知服务器端,完成订单更新。三、申请微信支付权限在使用微信支付前,开发者需要:

注册微信支付商户号(MCH ID): 登录 微信支付商户平台 进行注册,并完成实名认证。获取商户密钥(API Key): 在商户平台 API安全 选项下,生成 API 密钥。在小程序后台配置支付权限: 登录 微信公众平台 → 开发管理 → 开发设置 → 服务器域名,配置支付相关域名。四、支付功能的实现4.1 后端生成预支付订单后端需要调用 统一下单 API (https://api.mch.weixin.qq.com/pay/unifiedorder),生成 prepay_id,返回给小程序端。

示例(Node.js 后端)

代码语言:javascript复制const crypto = require('crypto');

const axios = require('axios');

const xml2js = require('xml2js');

const generateNonceStr = () => Math.random().toString(36).substr(2, 15);

const createSign = (params, key) => {

let stringA = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&');

let stringSignTemp = `${stringA}&key=${key}`;

return crypto.createHash('md5').update(stringSignTemp, 'utf8').digest('hex').toUpperCase();

};

async function createOrder(openid, total_fee) {

const appid = '你的小程序AppID';

const mch_id = '你的商户号';

const key = '你的API密钥';

const notify_url = 'https://你的服务器地址/notify';

const nonce_str = generateNonceStr();

const orderParams = {

appid,

mch_id,

nonce_str,

body: '商品描述',

out_trade_no: '订单号' + Date.now(),

total_fee, // 单位:分

spbill_create_ip: '用户IP',

notify_url,

trade_type: 'JSAPI',

openid

};

orderParams.sign = createSign(orderParams, key);

const builder = new xml2js.Builder({ rootName: 'xml', headless: true });

const xmlData = builder.buildObject(orderParams);

const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', xmlData, {

headers: { 'Content-Type': 'text/xml' }

});

const parser = new xml2js.Parser({ explicitArray: false, ignoreAttrs: true });

const result = await parser.parseStringPromise(response.data);

return result.xml.prepay_id;

}

module.exports = createOrder;4.2 小程序端发起支付请求前端拿到 prepay_id 后,使用 wx.requestPayment 调用支付功能。

示例(小程序端支付请求)

代码语言:javascript复制wx.login({

success(loginRes) {

wx.request({

url: 'https://你的服务器地址/createOrder',

method: 'POST',

data: { openid: loginRes.code, total_fee: 100 }, // 金额单位:分

success(res) {

const prepay_id = res.data.prepay_id;

wx.requestPayment({

timeStamp: String(Date.now()),

nonceStr: res.data.nonce_str,

package: `prepay_id=${prepay_id}`,

signType: 'MD5',

paySign: res.data.sign,

success() {

wx.showToast({ title: '支付成功', icon: 'success' });

},

fail(err) {

console.error('支付失败:', err);

}

});

}

});

}

});4.3 处理支付成功回调(服务器端)微信支付成功后,会向后端 notify_url 发送支付结果通知。后端需要验证支付结果,并更新订单状态。

示例(Node.js 处理支付回调)

代码语言:javascript复制const express = require('express');

const xml2js = require('xml2js');

const app = express();

app.use(express.text({ type: 'text/xml' }));

app.post('/notify', async (req, res) => {

const parser = new xml2js.Parser({ explicitArray: false, ignoreAttrs: true });

const result = await parser.parseStringPromise(req.body);

if (result.xml.return_code === 'SUCCESS' && result.xml.result_code === 'SUCCESS') {

console.log('支付成功:', result.xml);

// 更新数据库订单状态

res.send(``);

} else {

console.error('支付失败:', result.xml);

res.send(``);

}

});

app.listen(3000, () => console.log('服务器运行中'));五、支付优化与最佳实践使用订单号确保支付唯一性:每次支付必须生成唯一的 out_trade_no,避免重复支付。做好超时处理:如果用户未完成支付,应提供重新支付或取消订单的功能。安全处理: 在后端校验 total_fee,避免前端篡改支付金额。使用 HTTPS 确保数据传输安全。六、推荐参考文章 微信官方支付文档

微信支付官方文档

详细介绍了小程序支付的各个 API 接口及参数说明。 Node.js + 小程序支付实践

小程序支付全流程解析

介绍如何使用 Node.js 进行支付处理,并包含完整代码示例。 支付成功回调处理

小程序支付成功后处理逻辑

讲解支付回调的处理细节,避免支付成功后订单状态未更新的问题。七、总结本文介绍了 微信小程序支付功能的完整流程,包括:

如何申请微信支付权限后端生成预支付订单前端调用支付 API后端处理支付回调支付优化与最佳实践