1. 服务端生成欠费订单:
- 在服务端,当用户欠费时,生成欠费订单,并将相关信息存储在数据库中。
2. 调用微信支付接口获取支付参数:
- 在服务端调用微信支付接口,获取支付参数,包括预支付订单号(prepay_id)、签名等信息。
// 示例中的 Node.js Express 框架代码
const express = require('express');
const bodyParser = require('body-parser');
const axios = require('axios');
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
app.post('/createOrder', async (req, res) => {
// 在这里生成欠费订单并保存到数据库
// 调用微信支付统一下单接口获取预支付订单信息
const wxPayOrderInfo = await getWxPayOrderInfo();
// 返回预支付订单信息给小程序
res.json({ success: true, data: wxPayOrderInfo });
});
async function getWxPayOrderInfo() {
// 调用微信支付统一下单接口
const response = await axios.post('https://api.mch.weixin.qq.com/pay/unifiedorder', {
// 构造请求参数,包括商品描述、订单金额、用户openid等信息
appid: 'your_appid',
mch_id: 'your_mch_id',
nonce_str: 'random_nonce_str',
body: '欠费支付',
out_trade_no: 'your_out_trade_no', // 替换为实际的订单号
total_fee: 1, // 替换为实际的订单金额,单位为分
spbill_create_ip: 'user_client_ip',
notify_url: 'https://your-server.com/notify', // 替换为实际的支付回调地址
trade_type: 'JSAPI',
openid: 'user_openid', // 替换为实际的用户openid
});
// 解析微信支付返回的预支付订单信息
const wxPayOrderInfo = parseWxPayOrderInfo(response.data);
return wxPayOrderInfo;
}
function parseWxPayOrderInfo(xmlData) {
// 解析 XML 数据为对象
// 实际项目中可以使用第三方库来解析 XML
// 这里仅做示例,实际项目中应当更加健壮
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(xmlData, 'text/xml');
const result = {};
result.prepay_id = xmlDoc.getElementsByTagName('prepay_id')[0].textContent;
result.nonce_str = xmlDoc.getElementsByTagName('nonce_str')[0].textContent;
result.sign = xmlDoc.getElementsByTagName('sign')[0].textContent;
result.time_stamp = Math.floor(new Date().getTime() / 1000);
return result;
}
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
3. 小程序调用支付接口完成支付:
- 在小程序中调用微信支付接口,完成欠费支付。
// pay.js
Page({
payOrder: function () {
// 向服务端发送创建订单请求
wx.request({
url: 'https://your-server.com/createOrder',
method: 'POST',
data: {
// 传递必要的订单信息,如用户ID、商品描述等
},
success: function (res) {
if (res.data.success) {
// 获取服务端返回的预支付订单信息
const wxPayOrderInfo = res.data.data;
// 调用微信支付接口
wx.requestPayment({
timeStamp: wxPayOrderInfo.time_stamp.toString(),
nonceStr: wxPayOrderInfo.nonce_str,
package: `prepay_id=${wxPayOrderInfo.prepay_id}`,
signType: 'MD5',
paySign: wxPayOrderInfo.sign,
success: function (payRes) {
console.log('支付成功', payRes);
// 处理支付成功的逻辑
},
fail: function (payRes) {
console.log('支付失败', payRes);
// 处理支付失败的逻辑
},
});
} else {
wx.showToast({
title: '订单创建失败',
icon: 'none',
duration: 2000,
});
}
},
fail: function (err) {
console.error('创建订单请求失败', err);
},
});
},
});
请注意,这只是一个简单的示例,实际项目中需要考虑更多的安全性和错误处理。确保微信支付的相关配置正确,并遵循微信支付的开发规范和安全要求。在服务端的实现中,建议使用持久化存储(如数据库)来保存欠费订单信息。
转载请注明出处:http://www.pingtaimeng.com/article/detail/746/微信小程序