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

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

实现 Uniapp 的微信支付功能需要经过以下几个步骤:


获取微信支付参数:从服务器获取支付所需的参数,例如 appId、timeStamp、nonceStr、package、signType、paySign 等。

调用微信支付接口:使用 uni.requestPayment 方法调用微信支付接口。

支付结果处理:处理支付结果,展示支付成功或失败的提示。

以下是一个完整的代码示例和详细的注释说明。

第一步:服务器端获取微信支付参数

服务器端代码(例如使用 Node.js + Koa):

const Koa = require('koa');
const Router = require('koa-router');
const request = require('request');
const crypto = require('crypto');
 
const app = new Koa();
const router = new Router();
 
router.post('/getWxPayParams', async (ctx) => {
  const { openid, total_fee } = ctx.request.body;
 
  const appid = '你的微信公众平台应用ID';
  const mch_id = '你的商户号';
  const nonce_str = Math.random().toString(36).substr(2, 15);
  const body = '商品描述';
  const out_trade_no = '订单号';
  const spbill_create_ip = '用户IP';
  const notify_url = '回调通知地址';
  const trade_type = 'JSAPI';
  const key = '你的API密钥';
 
  const sign = createSign({
    appid,
    mch_id,
    nonce_str,
    body,
    out_trade_no,
    total_fee,
    spbill_create_ip,
    notify_url,
    trade_type,
    openid,
  }, key);
 
  const formData = `<xml>
    <appid>${appid}</appid>
    <mch_id>${mch_id}</mch_id>
    <nonce_str>${nonce_str}</nonce_str>
    <sign>${sign}</sign>
    <body>${body}</body>
    <out_trade_no>${out_trade_no}</out_trade_no>
    <total_fee>${total_fee}</total_fee>
    <spbill_create_ip>${spbill_create_ip}</spbill_create_ip>
    <notify_url>${notify_url}</notify_url>
    <trade_type>${trade_type}</trade_type>
    <openid>${openid}</openid>
  </xml>`;
 
  const result = await new Promise((resolve, reject) => {
    request({
      url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
      method: 'POST',
      body: formData
    }, (error, response, body) => {
      if (!error && response.statusCode === 200) {
        resolve(body);
      } else {
        reject(error);
      }
    });
  });
 
  const parseString = require('xml2js').parseString;
  let res;
  parseString(result, (err, json) => {
    if (err) {
      throw err;
    }
    res = json.xml;
  });
 
  const timeStamp = Math.floor(Date.now() / 1000).toString();
  const nonceStr = res.nonce_str[0];
  const prepay_id = res.prepay_id[0];
  const paySign = createSign({
    appId: appid,
    timeStamp,
    nonceStr,
    package: `prepay_id=${prepay_id}`,
    signType: 'MD5'
  }, key);
 
  ctx.body = {
    appId: appid,
    timeStamp,
    nonceStr,
    package: `prepay_id=${prepay_id}`,
    signType: 'MD5',
    paySign,
  };
});
 
function createSign(params, key) {
  const string = Object.keys(params).sort().map(k => `${k}=${params[k]}`).join('&') + `&key=${key}`;
  return crypto.createHash('md5').update(string).digest('hex').toUpperCase();
}
 
app.use(router.routes());
app.listen(3000);

第二步:客户端调用微信支付接口

// 在你的uniapp项目中,创建一个支付页面,例如pay.vue
 
<template>
  <view>
    <button @click="pay">微信支付</button>
  </view>
</template>
 
<script>
export default {
  methods: {
    async pay() {
      try {
        // 向服务器请求微信支付参数
        const { data } = await uni.request({
          url: 'http://你的服务器地址/getWxPayParams',
          method: 'POST',
          data: {
            openid: '用户的openid',
            total_fee: 1 // 订单总金额,单位为分
          }
        });
 
        // 调用uni.requestPayment发起微信支付
        await uni.requestPayment({
          provider: 'wxpay',
          timeStamp: data.timeStamp,
          nonceStr: data.nonceStr,
          package: data.package,
          signType: data.signType,
          paySign: data.paySign,
          success(res) {
            // 支付成功后的逻辑
            uni.showToast({
              title: '支付成功',
              icon: 'success'
            });
          },
          fail(err) {
            // 支付失败后的逻辑
            uni.showToast({
              title: '支付失败',
              icon: 'none'
            });
          }
        });
      } catch (error) {
        console.error('请求支付参数失败', error);
      }
    }
  }
};
</script>
 
<style>
/* 样式代码 */
</style>

第三步:处理支付结果

在支付成功和失败的回调函数中,你可以根据业务逻辑进行相应的处理,例如跳转到订单详情页面、显示支付结果等。

注意事项

确保服务端和客户端的安全性:服务器端获取微信支付参数时,需要确保参数的真实性和安全性,防止被篡改。客户端调用支付接口时,也需要做好错误处理和安全验证。


处理支付回调:微信支付成功后,会向你设置的 notify_url 发送支付结果通知,你需要在服务器端处理该通知,更新订单状态等。


调试:在开发过程中,可以使用微信支付的沙盒环境进行调试,避免真实支付操作对用户造成影响。


相关文章
|
10天前
|
人工智能 移动开发 JavaScript
如何用uniapp打包桌面客户端exe包,vue或者uni项目如何打包桌面客户端之electron开发-优雅草央千澈以开源蜻蜓AI工具为例子演示完整教程-开源代码附上
如何用uniapp打包桌面客户端exe包,vue或者uni项目如何打包桌面客户端之electron开发-优雅草央千澈以开源蜻蜓AI工具为例子演示完整教程-开源代码附上
|
4月前
|
定位技术 开发工具 Python
代码让微信开屏地球转起来
这段内容介绍了如何使用Python制作一个动态旋转的地球图像,类似于微信启动画面中的地球。文章详细描述了所需准备的三个素材(地球表面、云图和微信地球的抠图),并解释了通过调整云层和地面的旋转速度来实现自然的相对运动效果的基本原理。文中还提供了一个GIF压缩工具的链接,以及部分代码示例。此外,文章最后提到了一些Python学习资源,包括学习路线、开发工具、视频教程、实战案例、练习题和面试资料。
53 0
适用于alist的微信遮罩代码
最近在研究alist网盘工具,终于找到了适用于alist的微信遮罩代码。代码如下:``` ```。下面是示例图片,可根据需要自行替换。![点击查看示例图片](https://ucc.alicdn.com/pic/developer-ecology/ms7h4bs4k7hme_1a36659fd3054e508107f6c764c6f0d3.jpg)
|
3月前
|
移动开发 小程序 数据可视化
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
基于npm CLI脚手架的uniapp项目创建、运行与打包全攻略(微信小程序、H5、APP全覆盖)
443 3
|
3月前
|
移动开发 小程序 数据可视化
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
一招学会DIY官网可视化设计支持导出微擎、UNIAPP、H5、微信小程序源码
61 2
|
3月前
|
存储 移动开发 小程序
uniapp富文本editor输入二次扩展兼容微信小程序
uniapp富文本editor输入二次扩展兼容微信小程序
116 0
|
3月前
|
小程序
uniapp实现微信小程序隐私协议组件封装
uniapp实现微信小程序隐私协议组件封装
63 0
|
4月前
|
小程序 JavaScript Go
代码总有一个是你想要的分享63个微信小程序源
分享63个微信小程序源代码,包括电商系统、同城拼车、博客等多种应用,涵盖C#、Node.js、Golang等技术栈。每个项目附带源码和示例,适合初学者和开发者参考学习。提取码:8888,代码效果参考:http://www.603393.com/sitemap.xml。
122 2
|
5月前
|
移动开发 小程序 前端开发
|
5月前
|
小程序 前端开发