首页 > 编程语言 >uniapp之微信小程序 支付

uniapp之微信小程序 支付

时间:2023-10-27 10:34:58浏览次数:49  
标签:uniapp code res 微信 程序 接口 之微信 调用 支付

  一、注册微信支付商户号(由上级或法人注册)

    注册链接:https://pay.weixin.qq.com/index.php/apply/applyment_home/guide_normal#none,如图

    

    

      注意:需要由主管及更上级领导进行注册,成为公司收款账户 (企业注册需要材料:营业执照、对公银行账户信息,法人身份证

  二、注册小程序账号(由上及或者领导注册)

    企业一般注册为企业小程序,非个人。地址链接:https://mp.weixin.qq.com/wxopen/waregister?action=step1

  三、登录商户号绑定小程序

    当小程序ID绑定至此商户,就可以调用此商户支付的相关接口,地址链接:https://pay.weixin.qq.com/index.php/core/home/login

  四、后端写接口

    根据前端传入数据,返回微信支付核心数据

    

  五、前端调用接口

    ① 获取openid(当前用户真实id)

      openid为当前用户真实id,无法直接用任何接口获得,需要先调用微信login接口登录,获取登录凭证code,再通过此code(登录凭证,5分钟有效),向微信服务器换取用户openid。

      uniapp官方文档地址链接:https://uniapp.dcloud.net.cn/api/plugins/login.html#login

uni.login({
  provider: 'weixin',
  success (res) {
    if (res.code) {
     //code: 用户登录凭证(有效期五分钟)使用 code 可以换取 openid、unionid、session_key 等核心信息
    } else {
      console.log('登录失败!' + res.errMsg)
    }
  }
})

      发送请求调用微信官方接口,用code凭证换取用户openid(真实用户id)

uni.request({
  url: `https://api.weixin.qq.com/sns/jscode2session`, //微信官方接口
  data: {
    appid: '小程序appId',
    secret: '小程序密钥,在小程序appId下一行,放一块在',
    js_code: '刚才获取的code', 
    grant_type: 'authorization_code' //固定值
  },
  success: (res) => {
    //获取openid:用户真实唯一id
    console.log(res.data.openid);
  }
})

    ② 调用公司后端接口,获取支付核心数据

// 调用接口
uni.request({
  url: '调用你们公司的后端接口地址,获取支付核心数据',
  method: 'POST',
  data: { 接口需要什么参数就传给接口,包含扣款金额,订单id等 },
  success(obj) {
    console.log(obj)
  }
})

    该接口必须返回以下6个核心数据,都是由后台计算生成。

      "appId": "xxxx",

           "nonceStr": "xxxx",

           "packageValue": "prepay_id=xxxxx",

             "paySign": "xxxxxx",

             "signType": "MD5",

                     "timeStamp": "xxxxxx"

    ③ 调用微信官方支付接口,弹出支付界面

uni.request({
  url: '调用后端接口地址,获取支付核心数据',
  method: 'POST',
  data: { 接口需要什么参数就传给接口,包含扣款金额,订单id等 },
  success(obj) {

    //调用微信官方支付接口弹出付款界面,输入密码扣款
    wx.requestPayment({
      timeStamp: obj.xxxx.timeStamp,  //后端返回的时间戳
      nonceStr:  obj.xxxx.nonceStr,   //后端返回的随机字符串
      package:  obj.xxxx.packageValue, //后端返回的prepay_id
      signType: 'MD5', //后端签名算法,根据后端来,后端MD5这里即为MD5
      paySign:  obj.xxxx.paySign,  //后端返回的签名
      success (res) {
        console.log('用户支付扣款成功', res)
      },
      fail (res) { 
        console.log('用户支付扣款失败', res)
      }
     })

  }
})

      调用后,弹出付款界面,模拟器需要扫码支付。

      点击真机调试会直接弹出微信付款界面。

  六、项目中的微信支付

    一般情况下,支付界面都是在用户登录后,但是在我们开发微信小程序的支付功能时,到支付的时候用户已经登录该小程序,所以我们不需要从uni.login去获取code,再拿code获取openid,这个时候后端在登录的时候已经可以保存用户的登录信息,前端只需要调用后端接口,传商品id去获取所需要的的五个核心参数及需要的信息   

    uniapp官方文档链接:https://uniapp.dcloud.net.cn/api/plugins/payment.html#requestpayment

async confirmPayment() {
	let res = await postPrepayReq({goodsId: this.payId})   // 调用后端接口去获取所需要的的数据
	
	if (res.code == 0) {
		let tempObj = {
			...res.data
		}
     // 处理后端返回数据为JSON字符串转为对象 for (let key in tempObj) { if (key == 'payData') { tempObj[key] = JSON.parse(tempObj[key]) } } console.log(698, tempObj);
     // 解构所需要的的数据 let {   appId, nonceStr, paySign, signType, timeStamp, packageValue } = tempObj.payData
     // 调用微信支付 uni.requestPayment({ provider: 'wxpay', // 支付服务提供商,此处为微信支付 timeStamp, nonceStr, package: packageValue, signType, paySign, prepayid: tempObj.mchOrderNo, success: payRes => { console.log("支付成功", payRes); }, fail: payErr => { console.log("支付失败", payErr); } }) } },

  七、支付过程图

  

 

     注:该文档为个人理解所写,有误可建议修改

 

标签:uniapp,code,res,微信,程序,接口,之微信,调用,支付
From: https://www.cnblogs.com/persistIn/p/17791185.html

相关文章

  • 指定文件夹内删下划线程序(输入数字为需要保留的下划线)
    importosdefrename_files_in_directory(directory_path,underscore_input):try:#如果是范围输入,则解析范围的结束数字if'-'inunderscore_input:start,end=map(int,underscore_input.split('-'))underscore_count......
  • uniapp的easycom模式
    uniapp的easycom模式,无需import和注册components,即可在页面使用固定目录下的组件。这个目的是简化引用,其实还挺坑的。1.直接使用组件,全局又搜索不到引用,第一感觉让人摸不着头脑2.不引用组件,文件下放了多个组件,不知道到底使用了哪个3.进行组件优化,要删除或提取某些组件的时......
  • 如何才能从程序员到架构师?
    1引言小团队一般10人左右,其中常常是技术最牛的人做架构师(或TL)。所以,架构师在广大码农中的占比大概平均不到10%。而架构师也可以分为初级、中级、高级三档,江湖上真正高水平的软件架构师就更少了。所以,大部分(超过九成的)码农干上许多年,还是做不了架构师,这是什么原因造成的呢?2......
  • #yyds干货盘点# LeetCode程序员面试金典:生命游戏
    题目根据百度百科,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在1970年发明的细胞自动机。给定一个包含m×n个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1即为活细胞(live),或0即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂......
  • #yyds干货盘点# LeetCode程序员面试金典:最小操作次数使数组元素相等 II
    题目给你一个长度为n的整数数组nums,返回使所有数组元素相等需要的最小操作数。在一次操作中,你可以使数组中的一个元素加1或者减1。 示例1:输入:nums=[1,2,3]输出:2解释:只需要两次操作(每次操作指南使一个元素加1或减1):[1,2,3] => [2,2,3] => [2,2,2]示......
  • go--第一个 go 程序、注释
    第一个go程序前面已经搭建好了go的开发环境,这里来写一个helloworld的程序,创建一个main.go的文件,代码如下packagemainimport"fmt"funcmain(){ /*这是我的第一个简单的程序*/ fmt.Println("Hello,World!")}代码解释:第一行代码 packagemain 定义了包......
  • ORBSLAM3+ROS2foxy 调用笔记本摄像头跑单目相机程序 (Ubuntu20.04)
    环境要求:Ubuntu20.04、ROS2foxy、OpenCV4.4.01.安装ORB_SLAM3首先安装ORB_SLAM3:https://github.com/zang09/ORB-SLAM3-STEREO-FIXED。安装方法参考:https://www.cnblogs.com/xiaoaug/p/17766112.html安装完成并且测试数据集也能够跑通后即可。2.下载ROS2foxy版ORB_......
  • playwright -启动本地chrome浏览器-启动扩展程序-插件
    fromplaywright.sync_apiimportsync_playwrightimportosclassTool:def__init__(self,user_data_dir,executable_path):playwright=sync_playwright().start()#启动扩展程序-开启影刀插件path_to_extension=r"D:\data\google\Ch......
  • 码住!双11支付宝小程序云云市集,享骨折优惠最强购物清单,抽奖赢iPhone 15 Pro!一年一度的
    如今的双11不仅是清空购物车的年度盛宴对于个人开发者和企业来说也是采购云产品的绝佳时机!今年有什么需要抄作业的购物清单呢?支付宝小程序云的首次大规模促销活动必须码住!这里有超低的折扣和丰富的热销产品更有奖品超丰厚的抽奖活动,100%中奖哦还有不熟悉支付宝小程序云的朋友,简单介......
  • 2023-2024 20231313《计算机基础与程序设计》第五周学习总结
    2023-202420231313《计算机基础与程序设计》第五周学习总结作业速达作业课程班级链接作业要求计算机基础与程序设计第五周学习总结作业内容计算机科学概论第6章、《C语言程序设计》第4章并完成云班课测试————>Pep/9虚拟机、机器语言与汇编语言、算法与伪......