当前位置: 首页 > article >正文

uniapp 微信小程序 微信支付

本章的内容我尽量描述的细致一些,哪里看不懂给我评论就可以,我看到进行回复

微信支付大致分为4步,具体看后端设计

1. 获取code

2. 根据code获取openid

3. 根据openid,以及部分订单相关数据,生成prepayId (预支付交易会话ID)

4. 通过prepayId调用支付api,并让后端在支付api中返回支付相关配置参数,然后前端将支付配置参数设置到微信支付api上,进行支付拉起

(第3步和第4步 后端可以合成1步,生成prepayId的同时,并执行支付然后将支付配置返回给前端)

本章主要核心介绍就是: 通过第1步,第2步的结合取出openid,以及第4步中的使用uni.requestPayment(OBJECT) 方法,拉起微信支付api的使用以及参数配置,其他可具体结合自己的项目。

1. 获取code

首先要清楚,code是啥?怎么取?取到它用来干啥?

说明:调用接口获取临时登录凭证(code)。通过凭证进而换取用户登录态信息,包括用户在当前小程序的唯一标识(openid)、微信开放平台账号下的唯一标识(unionid,若当前小程序已绑定到微信开放平台账号)及本次登录的会话密钥(session_key)等。

通过这个说明可以知道:code是临时登录凭证(有效期五分钟),我们可以通过这个code在第二步拿到openid,unionid,session_key 这三个参数

怎么取到code:这里需要使用uniapp官方提供的api uni.login(OBJECT)


uni.login({
    provider: 'weixin', // 使用微信登录
	success: (res) => {
		const { code } = res;
		console.log('code =>', code) 
		// code => 0e1MTrFa1eDx9I0bRpJa1Mqfwf4MTrFJ
	}
});

2. 根据code获取openid

openid是啥?怎么取?取到它用来干啥?

说明:openid是微信用户在公众帐号(包括小程序)、H5、APP下的唯一标识。每个应用都有一个appid,不同的appid,对应的openid不同。

用来干啥:因为涉及到支付,那么业务中肯定的需要知道是谁支付了,这个谁就通过openid界定

怎么取:调用微信api【GET https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code】

const toggleExecutePay = (param) => {
  return new Promise((resolve) => {
    uni.showLoading({
      title: '加载中',
      mask: true
    });

    uni.login({
      provider: 'weixin', // 使用微信登录
      success: (loginRes) => {
        // 取得 code
        const { code } = loginRes;

        // 该api的功能:校验临时登录凭证。通过临时登录凭证完成登录流程,并且返回 openid, unionid, session_key。
        // 需要注意:某些场景下 在前端代码里直接调用这个api的话,会报错request:fail url not in domain list (url不在域列表中),
        // 在微信公众平台里面也没办法将这个域名配置到合法域名内
        // 所以就不能在前端代码里直接调用这个api,让后端新增一个接口,在新增的接口里面调用这个api,然后将openid进行返回
        // uni.request({
        //   // 微信官网api 携带参数(小程序appId、小程序appSecret、通过wx.login获取的code、授权类型:此处只需填写 authorization_code)
        //   url: `https://api.weixin.qq.com/sns/jscode2session?appid=xxx&secret=xxx&js_code=${code}&grant_type=authorization_code`,
        //   method: 'GET',
        //   success: function (jscodeRes) {
        //     const { openid, unionid, session_key } = jscodeRes.data;
        //   }
        // });

        // 调用后端接口 获取openid (只传code就行了,其他三个参数让后端在后台自己写)
        getUserOpenId({ code: code }).then(async (res) => {
          const { success, data, message } = res;
          if (success) {
            // 执行第3步 创建订单 获取prepayid(统一下单订单号)
            const prepayId = await toggleCreateOrder(data.openid, param).then(
              (res) => res
            );
            // 执行第4步 获取支付配置 并拉起支付
            await toggleGetPayConfig(prepayId);
            
            resolve(true);
          } else {
            // 加载弹窗隐藏
            uni.hideLoading();
            // 弹起错误信息
            uni.showToast({
              icon: 'none',
              title: `${message}`,
              mask: true,
              position: 'top'
            });
            resolve(false);
          }
        });
      }
    });
  });
};

3. 根据openid,以及部分订单相关数据,生成prepayId (预支付交易会话ID)

这一步对于后端来说,只是单纯的通过openid,以及订单相关参数,像微信要了一个prepayId,然后创建了一个订单,并且给前端返回prepayId

// 创建订单 获取 prepayid(统一下单订单号)
const toggleCreateOrder = (openid, param) => {
  return new Promise((resolve) => {
    const payParam = {
      openId: openid,
      amount: param.amount
      // ... 如果生成订单后端还需要其他参数(如商品名称,商品id等等),在这里追加就行
    };
    createOrder(payParam).then(async (res) => {
      const { success, data } = res;
      if (success) {
        resolve(data.prepayId);
      } else {
        // 加载弹窗隐藏
        uni.hideLoading();
        resolve(false);
      }
    });
  });
};

4. 通过prepayId 调用支付api,并让后端在支付api中返回支付相关配置参数,然后前端将支付配置参数设置到微信支付api上,进行支付拉起

这一步对于后端来说,通过prepayId将刚刚生成的订单设置成待支付,并且将支付参数返回给前端,前端拉起微信支付,支付成功后,后端应该会监听回调,监听到微信支付成功了,就把订单设置成支付成功

前端调用拉起微信支付api:uni.requestPayment(OBJECT)

// 获取支付配置
const toggleGetPayConfig = (prepayId) => {
  return new Promise((resolve) => {
    getPayConfig({
      prepayId: prepayId
    }).then((res) => {
      // 这些参数都让后端返回,前端就不维护像appid这些固定值了
      const { appid, nonceStr, signature, timestamp, signType, partnerid } =
        res;

      // 加载弹窗隐藏
      uni.hideLoading();

      uni.requestPayment({
        provider: 'wxpay', // 固定传wxpay
        appid: appid, // 微信开放平台 - 应用 - AppId
        timeStamp: `${timestamp}`, // 时间戳(单位:秒)
        package: 'prepay_id=' + prepayId, // 'prepay_id=' + prepayId
        paySign: signature, // 签名
        signType: signType, // 签名算法,这里用的 MD5/RSA 签名
        nonceStr: nonceStr, // 随机字符串
        partnerid: partnerid, // 微信支付商户号
        success(res) {
          resolve(true);
        },
        fail(err) {
          console.log('支付异常 =>', err);
        }
      });
    });
  });
};


http://www.kler.cn/news/327951.html

相关文章:

  • 张量、框架
  • 选择与运用合适工具提升编程效率的秘诀
  • uboot笔记(一):概括/移植等
  • Lagent 自定义你的 Agent 智能体
  • k8s 部署 prometheus
  • Android中级控件
  • Fivetran+Milvus:AI搜索新时代的数据迁移利器
  • 学习记录:js算法(五十):二叉树的右视图
  • 【Preference Learning】Reasoning with Language Model is Planning with World Model
  • mysql学习教程,从入门到精通,SQL 表、列别名(Aliases)(30)
  • Spring Boot框架在甘肃非遗文化网站设计中的运用
  • ubuntu配置python环境
  • 深度学习基础及技巧
  • Linux性能调优技巧
  • 汽车零部件开发流程关键阶段
  • PowerShell无法执行yarn命令
  • Qt_线程介绍与使用
  • Wpf Image 展示方式 图片处理 显示
  • 828华为云征文|华为云 Flexus X 实例初体验
  • 选择更轻松:山海鲸可视化与PowerBI的深度对比
  • MATLAB在无线通信标准与协议支持中的作用
  • 打造未来社交:区块链社交DAO的颠覆性开发之路
  • 2.1 HuggingFists系统架构(一)
  • Go 项目开发常用设计模式
  • OpenCV图像文件读写(1)检查 OpenCV 是否支持某种图像格式的读取功能函数haveImageReader()的使用
  • Python FFmpeg 安装使用教程
  • SQL第10课挑战题
  • C# 泛型使用案例_C# 泛型使用整理
  • vue 项目打包更新后,界面未刷新时js与css资源加载404,监听资源文件404后自动重新加载页面。
  • 解决 Macos下 Orbstack docker网络问题