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

uniapp-微信公众号之微信支付流程

文章目录

    • 支付前置条件
    • 微信支付流程
    • 关键代码
      • 一、获取微信用户唯一标识openId
        • 第一步:用户同意授权,获取code
        • 第二步:通过code换取网页授权access_token
        • 第三步:通过access_token获取用户的openId
      • 一、微信公众号支付
        • 第一步:安装jweixin-module模块
        • 第二步:调用后台创建微信支付订单接口,并支付

支付前置条件

` 要在微信公众号中实现微信支付的功能,需要的条件包括:
1、在微信公众平台申请一个微信公众号(服务号)微信公众平台官网地址
2、在微信支付平台开通支付功能微信支付平台地址,建议jsapi微信支付
3、接着在公众号中绑定该商户号
4、申请https域名,并且域名需要备案通过
5、在微信公众平台设置域名的相关信息

提示:这些是在公众号实现微信支付的前提条件,缺一不可,尤其要注意,域名必须是备案通过的

微信支付流程

在这里插入图片描述

关键代码

一、获取微信用户唯一标识openId

微信官网api参考地址

第一步:用户同意授权,获取code
mounted() {this.getCode();
},
getCode() {let local = window.location.href;this.code = this.getUrlCode().code; // 截取code	if (this.code == null || this.code == '') {location.href = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxbb3a1ff0e1be2c71&redirect_uri=${encodeURIComponent(local)}&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect`}else{this.$refs.uToast.show({type: res.success ===  true ? 'success' : 'error',icon: false,message: this.code,});}},// 截取url中的code方法getUrlCode() { var url = location.search;var theRequest = new Object()if (url.indexOf("?") != -1) {var str = url.substr(1)var strs = str.split("&")for (var i = 0; i < strs.length; i++) {theRequest[strs[i].split("=")[0]] = (strs[i].split("=")[1])}}return theRequest
},

尤其注意:跳转回调redirect_uri,应当使用https链接来确保授权code的安全性。

第二步:通过code换取网页授权access_token

在前端通过第一步获取code后,需要后台调用如下接口,获取access_token
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

尤其注意:此接口只能后台调用,前端需将第一步获取的code传递给后台接口

第三步:通过access_token获取用户的openId

在获取到了access_token的前提下,后台通过调用https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN,来获取用户的openId,并将获取到的openId返回给前端

一、微信公众号支付

第一步:安装jweixin-module模块
npm install jweixin-module
第二步:调用后台创建微信支付订单接口,并支付

微信官方参考地址

var wx = require('jweixin-module');let params = {amount: 30, // 支付金额openId : uni.getStorageSync('openId')  // 前面获取的openId
};
// 调用后台下单接口,下单成功则弹起微信支付输入密码框
this.$getData.Getwxpay(params).then((res) => {// 如果下单失败if(!res.success){this.$refs.uToast.show({type: 'warning',icon: false,message: res.message,});return;}wx.config({debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: 'wxbb3a1ff0e1be2c71', // 必填,公众号的唯一标识timestamp: res.result.timestamp, // 必填,生成签名的时间戳nonceStr: res.result.nonce_str, // 必填,生成签名的随机串signature: res.result.sign, // 必填,签名jsApiList: ['chooseWXPay'] // 必填,需要使用的JS接口列表})wx.ready(function() {wx.chooseWXPay({timestamp: res.result.timestamp, // 时间戳nonceStr: res.result.nonce_str, // 随机数package: `prepay_id=${res.result.prepay_id}`, //signType: 'MD5',paySign: res.result.sign, // 签名success: function() {uni.showToast({  title:'支付成功' });setTimeout(() => {uni.navigateTo({url: `/pages_pay/cxjf/index?userCode=${that.userCode}`});},2000);},cancel: function() {uni.showToast({ title:'取消支付',  icon:'none' });setTimeout(() => {uni.navigateTo({url: `/pages_pay/dzf/index`});},2000);},fail: function() {uni.showToast({title:'支付失败',icon:'none'});setTimeout(() => {uni.navigateTo({url: `/pages_pay/dzf/index`});},2000);}})})});
},

相关文章:

  • 51单片机电子钟闹钟温度LCD1602液晶显示设计( proteus仿真+程序+原理图+设计报告+讲解视频)
  • 38天录用!新增6本EI、ESCI!11月SCI/SSCI/EI刊源表已更新!
  • geoserver 的跨域问题怎么解决
  • 公会发展计划(GAP):经过实战考验的 Web3 任务模式
  • SAP HANA数据库创建触发器监控表的新增操作
  • 全球互联网信息,中文内容只占1.3%,学好英语,这几条路子让你赚认知外的钱
  • 【电路笔记】-相量图和相量代数
  • vue3命令-01
  • CI523电动车NFC一键启动
  • 时间复杂度为 O(nlogn) 的排序算法
  • 配置git并把本地项目连接github
  • 虹科案例 | AR内窥镜手术应用为手术节约45分钟?
  • C# Winform串口助手
  • java连接zookeeper
  • 【计算机网络】同源策略及跨域问题
  • __proto__ 和 prototype的关系
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 2017届校招提前批面试回顾
  • 77. Combinations
  • Java Agent 学习笔记
  • java8 Stream Pipelines 浅析
  • Java小白进阶笔记(3)-初级面向对象
  • js继承的实现方法
  • laravel 用artisan创建自己的模板
  • leetcode讲解--894. All Possible Full Binary Trees
  • QQ浏览器x5内核的兼容性问题
  • Spring Cloud Feign的两种使用姿势
  • Spring Cloud(3) - 服务治理: Spring Cloud Eureka
  • 安卓应用性能调试和优化经验分享
  • 和 || 运算
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • Prometheus VS InfluxDB
  • #laravel 通过手动安装依赖PHPExcel#
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #常见电池型号介绍 常见电池尺寸是多少【详解】
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言)逆序输出字符串
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (TipsTricks)用客户端模板精简JavaScript代码
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (六)软件测试分工
  • (四)Linux Shell编程——输入输出重定向
  • (原創) 如何安裝Linux版本的Quartus II? (SOC) (Quartus II) (Linux) (RedHat) (VirtualBox)
  • (转)ORM
  • (转)关于多人操作数据的处理策略
  • (转载)深入super,看Python如何解决钻石继承难题
  • .net MySql
  • .net web项目 调用webService
  • .NET下的多线程编程—1-线程机制概述
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • [ vulhub漏洞复现篇 ] Grafana任意文件读取漏洞CVE-2021-43798
  • [AutoSar]BSW_OS 01 priority ceiling protocol(PCP)
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [C/C++]数据结构----顺序表的实现(增删查改)