微信小程序实现微信支付(代码和注释很详细)

简介: 微信小程序实现微信支付(代码和注释很详细)

实现微信小程序的微信支付功能涉及多个步骤,包括配置开发环境、获取支付权限、调用微信支付接口等。以下是一个详细的步骤指南,并附带代码示例和注释。

步骤 1:配置微信小程序开发环境

1.1 注册并创建微信小程序

首先,你需要在微信公众平台上注册并创建一个微信小程序。如果你已经有小程序,请跳过这一步。

1.2 获取微信支付权限

在微信公众平台上,你需要开通微信支付功能,并获取相应的商户号和密钥。这些信息将在支付过程中使用。

步骤 2:前端代码实现

2.1 调用后端获取支付参数

在微信小程序前端,你需要调用你的后端接口,以获取支付参数。假设你的后端接口为/api/getPayParams,以下是一个示例代码:

// pages/pay/pay.js
Page({
  data: {
    orderId: '', // 订单ID
  },
 
  onLoad: function (options) {
    // 从页面参数中获取订单ID
    this.setData({
      orderId: options.orderId
    });
  },
 
  initiatePayment: function () {
    const that = this;
    wx.request({
      url: 'https://your-backend.com/api/getPayParams',
      method: 'POST',
      data: {
        orderId: that.data.orderId,
      },
      success: function (res) {
        const payParams = res.data;
        that.wxPay(payParams);
      },
      fail: function (error) {
        console.error('Failed to get payment parameters:', error);
      }
    });
  },
 
  wxPay: function (payParams) {
    wx.requestPayment({
      timeStamp: payParams.timeStamp,
      nonceStr: payParams.nonceStr,
      package: payParams.package,
      signType: payParams.signType,
      paySign: payParams.paySign,
      success: function (res) {
        console.log('Payment success:', res);
        // 处理支付成功的逻辑
      },
      fail: function (error) {
        console.error('Payment failed:', error);
        // 处理支付失败的逻辑
      }
    });
  }
});

2.2 用户点击支付按钮

在小程序页面中,你需要添加一个支付按钮,当用户点击按钮时触发支付过程:

<!-- pages/pay/pay.wxml -->
<view class="container">
  <button bindtap="initiatePayment">支付</button>
</view>

2.3 样式调整

为支付页面添加样式:

/* pages/pay/pay.wxss */
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}
 
button {
  padding: 10px 20px;
  background-color: #1aad19;
  color: white;
  border: none;
  border-radius: 5px;
  font-size: 16px;
}

步骤 3:后端代码实现

后端需要处理获取支付参数的请求,并调用微信支付接口生成支付参数。

3.1 安装微信支付SDK

在后端项目中安装微信支付SDK。以Node.js为例,安装wechat-pay

// config/wechatPayConfig.js
const wechatPay = require('wechat-pay');
const Payment = wechatPay.Payment;
 
const initConfig = {
  partnerKey: 'YOUR_PARTNER_KEY',
  appId: 'YOUR_APP_ID',
  mchId: 'YOUR_MCH_ID',
  notifyUrl: 'https://your-backend.com/api/payNotify',
};
 
const payment = new Payment(initConfig);
 
module.exports = payment;

3.2 创建获取支付参数的接口

实现后端接口,生成支付参数并返回给前端:

// routes/payment.js
const express = require('express');
const router = express.Router();
const payment = require('../config/wechatPayConfig');
 
router.post('/getPayParams', async (req, res) => {
  const { orderId } = req.body;
 
  const order = {
    body: 'Product description',
    attach: 'Additional data',
    out_trade_no: orderId,
    total_fee: 100, // 金额,单位为分
    spbill_create_ip: req.ip,
    notify_url: 'https://your-backend.com/api/payNotify',
    trade_type: 'JSAPI',
    openid: 'USER_OPENID', // 从前端获取用户的openid
  };
 
  try {
    const payParams = await payment.getBrandWCPayRequestParams(order);
    res.json(payParams);
  } catch (error) {
    console.error('Failed to generate payment parameters:', error);
    res.status(500).send('Error generating payment parameters');
  }
});
 
module.exports = router;

3.3 处理支付结果通知

微信支付成功后会发送异步通知到你的服务器,你需要处理这个通知:

// routes/payment.js
router.post('/payNotify', async (req, res) => {
  const xmlData = req.body;
 
  payment.validate(xmlData, (err, result) => {
    if (err) {
      console.error('Payment notification validation failed:', err);
      res.status(400).send('Validation failed');
      return;
    }
 
    // 处理支付结果
    const { out_trade_no, result_code } = result;
 
    if (result_code === 'SUCCESS') {
      // 更新订单状态
      console.log(`Order ${out_trade_no} payment success`);
      res.send('SUCCESS');
    } else {
      console.error(`Order ${out_trade_no} payment failed`);
      res.send('FAIL');
    }
  });
});
 
module.exports = router;

3.4 后端服务入口文件

最后,确保你的后端服务入口文件正确配置了路由:

// app.js
const express = require('express');
const bodyParser = require('body-parser');
const paymentRoutes = require('./routes/payment');
 
const app = express();
app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());
 
app.use('/api', paymentRoutes);
 
app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

总结

以上内容涵盖了在微信小程序中实现微信支付的完整流程,包括前端代码和后端代码的详细示例和注释。通过这些步骤,你可以成功地在微信小程序中集成微信支付功能。

如果你在实施过程中遇到问题,建议查阅微信支付官方文档或相关社区寻求帮助。


相关文章
|
1月前
|
JSON 小程序 JavaScript
uni-app开发微信小程序的报错[渲染层错误]排查及解决
uni-app开发微信小程序的报错[渲染层错误]排查及解决
477 7
|
1月前
|
小程序 JavaScript 前端开发
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
uni-app开发微信小程序:四大解决方案,轻松应对主包与vendor.js过大打包难题
529 1
|
1月前
|
存储 JSON 小程序
微信小程序入门之新建并认识小程序结构
微信小程序入门之新建并认识小程序结构
50 1
ly~
|
2月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
78 6
适用于alist的微信遮罩代码
最近在研究alist网盘工具,终于找到了适用于alist的微信遮罩代码。代码如下:``` ```。下面是示例图片,可根据需要自行替换。![点击查看示例图片](https://ucc.alicdn.com/pic/developer-ecology/ms7h4bs4k7hme_1a36659fd3054e508107f6c764c6f0d3.jpg)
|
1月前
|
开发框架 小程序 JavaScript
小程序代码丢失!反编译找回
小程序源代码的容易获取问题确实存在一些潜在的安全隐患。然而,现在的小程序开发框架采用像 Babel 这样的打包工具,将 JavaScript 逻辑代码混合在一个文件中并进行转编译,使其变得难以理解。
37 0
小程序代码丢失!反编译找回
|
1月前
|
缓存 小程序 索引
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
uni-app开发微信小程序时vant组件van-tabs的使用陷阱及解决方案
189 1
|
1月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
536 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
1月前
|
JavaScript 小程序 开发者
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
uni-app开发实战:利用Vue混入(mixin)实现微信小程序全局分享功能,一键发送给朋友、分享到朋友圈、复制链接
316 0
|
1月前
|
小程序
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
474 0