微信 JSAPI 支付流程

微信支付,开发文档地址:

https://pay.weixin.qq.com/wiki/doc/api/index.html

JSAPI支付文档地址:

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2

微信支付分为5种:
Jsapi支付,二维码支付,H5支付,小程序支付,App支付

Jsapi支付流程:

A:获取open_id

第一步:用户同意授权,获取code
在确保微信公众账号拥有授权作用域(scope参数)的权限的前提下(服务号获得高级接口后,默认拥有scope参数中的snsapi_base和snsapi_userinfo),引导关注者打开如下页面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
第二步:通过code换取授权access_token
首先请注意,这里通过code换取的是一个特殊的网页授权access_token,与基础支持中的access_token(该access_token用于调用其他接口)不同。获取code后,请求以下链接获取access_token:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

 B: 调用统一接口,预支付

必传参数:

#预支付接口
wx.uniformorder = https://api.mch.weixin.qq.com/pay/unifiedorder必传参数:
trade_type:jsapi,
open_id:用授权获取的open_id
Appid:企业号corpid即为此appId
Mch_id:微信支付分配的商户号
Notify_url:异步回调的url
nonce_str:随机字符串
Sign:签名
Body:商品描述
out_trade_no:商户订单号自己生成的(当前时间加时间戳)
total_fee:金额(分)

(3) 这些参数使用xml格式发送给微信的统一下单接口,并返回两个参数return_code为success时,微信端再次返回result_code为success时返回两个参数prepay_id,trade_type。
简单来说:微信给我们返回两个success时就会给我们返回prepay_id和trade_type。
(4) 返回的参数我们进行处理,处理成我们所需要的参数有:

    appId:商户注册具有支付权限的公众号成功后即可获得timeStamp:时间戳nonceStr:随机字符串Package:统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=*** signType:签名类型(HMAC-SHA256)这里的签名方式和统一下单方式一致Paysign:签名

(5) 微信支付界面调起配置分为两种:
a.一种是使用微信的内置对象WeixinJSBridge,把我们提前处理微信的返回参数放入getBrandWCPayRequest中

 b.另一种是调用jssdk包,但是前提需要配置jssdk包wx.config,再配置微信支付,把我们提前处理微信的返回参数放入wx.chooseWXPay,唤起微信支付页面。
发起一个微信支付请求

wx.chooseWXPay({timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符nonceStr: '', // 支付签名随机串,不长于 32 位package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'paySign: '', // 支付签名success: function (res) {// 支付成功后的回调函数}});

备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。

(6) 用户支付成功微信端会向我们填写的异步回调地址发起请求,给我们提示支付状态。我们需要返回一个success

<xml> <return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>

让微信端知道我们知道的微信支付成功了。

如果我们没给微信端返回success或超时,微信会判定本次通知失败,重新发送通知,直到成功为止

(在通知一直不成功的情况下,微信总共会发起10次通知,通知频率为15s/15s/30s/3m/10m/20m/30m/30m/30m/60m/3h/3h/3h/6h/6h - 总计 24h4m),

但微信不保证通知最终一定能成功。


(7) 当然我不能相信微信给我们的支付状态,因为这个回调url,别人可以模拟出一个url,微信端就会向模拟出来的回调地址发送请求,会发生用户付过钱了但是没有订单的情况,这是很不安全的。所以我们不能相信微信给我们返回的,我们需要异步向微信查询订单接口,查询订单的支付状态
(8) 如果我们使用jssdk包,那么我们还需要通过配置wx.config。而wx.config的参数signature是通过。

参考:
概述 | 微信开放文档
a. 第一步获取access_token
https请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
b. 第二步获取jsapi_ticket
用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):
https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
c. 第三步生成signature

签名算法

签名生成规则如下:参与签名的字段包括noncestr(随机字符串), 有效的jsapi_ticket, timestamp(时间戳), url(当前网页的URL,不包含#及其后面部分) 。对所有待签名参数按照字段名的ASCII 码从小到大排序(字典序)后,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串string1。这里需要注意的是所有参数名均为小写字符。对string1作sha1加密,字段名和字段值都采用原始值,不进行URL 转义。即signature=sha1(string1)。

wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', // 必填,公众号的唯一标识timestamp: , // 必填,生成签名的时间戳nonceStr: '', // 必填,生成签名的随机串signature: '',// 必填,签名jsApiList: [] // 必填,需要使用的JS接口列表
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/254423.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

android 仿微信demo————注册功能完善添加头像功能(移动端)

android 仿微信demo————微信启动界面实现 android 仿微信demo————注册功能实现&#xff08;移动端&#xff09; android 仿微信demo————注册功能实现&#xff08;服务端&#xff09; android 仿微信demo————登录功能实现&#xff08;移动端&#xff09; an…

微信支付APIv3

文章目录 微信支付之前我的密钥啥的都是放到配置文件里面以后可以再写一个文件基础支付APIv3介绍获取验签和HttpClientAPIv3证书与密钥使用说明 微信支付的SDK工具Native支付流程我们程序运行时的日志也可以使用log.debug在方法堆栈里面查看我们程序执行的方法调用顺序内网穿透…

在线支付系列【8】微信支付之注册商户号

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录 前言注册商户号1. 微信扫码登录2. 创建申请单2.1 基本信息2.2 主体身份2.3 法人信息及受益人信息2.4 经营与行业信息2.5 结算账户2.6 补充信息2.7 查看申请单 签约方式一&#xff1a;手机签约方…

Scala函数

1.基本语法 解析main方法 def main(args: Array[String]): Unit {函数体}*def 关键字&#xff0c;声明一个函数 * main 方法名 * args 参数名称 * Array[String] 参数的类型 * Unit 返回值类型&#xff0c;相当于Java中的void&#xff0c;没有返回值 * {} 函数体函数省略规则 …

微信公众号注册时提示该主体注册数量已超过上限怎么办?

很多用户在注册或认证微信公众号时&#xff0c;遇到“该主体注册数量已超过上限”的问题&#xff0c;这是怎么回事呢&#xff1f; 原因是2018年11月16日微信官方对公众号注册数量做了调整&#xff1a; 1.个人主体注册公众号数量上限由2个调整为1个&#xff1b; 2.企业类主体注…

开通微信公众号流程所需资料及时间

2019独角兽企业重金招聘Python工程师标准>>> 序号 阶段 所需资料 所需时间 一、&#xff08;企业&#xff09;注册公众平台 使用未注册过微信公众号的邮箱注册、验证激活 即时二、 选择帐号类型 详情查看服务号、订阅号、企业号区别后选择类型 即时三、信息登记 选择…

支付宝、微信注册时间,轻松查看!

早几天分享过与微信年度报告查询微信使用多少天&#xff0c;朋友圈传播非常火爆&#xff0c;今天教大家一招如何查询支付宝使用多少天。 看到上图还能回想到当时的激动吗&#xff1f; 马上进入正题&#xff0c;不啰嗦&#xff0c;查看支付宝注册日期的方法&#xff0c;也超级简…

车载ECU休眠唤醒-TJA1145

前言 首先&#xff0c;请教大家几个小小问题&#xff0c;你清楚&#xff1a; 什么是TJA1145吗&#xff1f;你知道休眠唤醒控制基本逻辑是怎么样的吗&#xff1f;TJA1145又是如何控制ECU进行休眠唤醒的呢&#xff1f;使用TJA1145时有哪些注意事项呢&#xff1f; 今天&#xff…

oppor15x支持html吗,oppor15x配置参数详情 r15和17的亲儿子

oppor15x虽然看上去和oppor15这款手机比较相似&#xff0c;但是实际上&#xff0c;作为oppo的最新款手机&#xff0c;oppor15x的发布时间是在oppor17之后的&#xff0c;不仅如此&#xff0c;在外观方面&#xff0c;oppor15x和oppor17会更为相似&#xff0c;在配置方面却更偏向o…

oppo r15 android 8,OPPO R15体验:基于安卓8.1,ColorOS 5.0更好用

当目前智能手机硬件性能普遍过剩&#xff0c;越来越多的人们开始逐渐意识到&#xff0c;参数并不等于体验&#xff0c;反而是依附于硬件之上的操作系统很大程度上直接决定了一款智能手机的使用体验。 在当前智能手机市场&#xff0c;虽然说安卓系统占据了绝大部分市场份额&…

android 汇编 参数,安卓ARM汇编基础知识

ARM 是 Advanced RISC Machine 的缩写&#xff0c;可以理解为一种处理器的架构&#xff0c;还可以将它作为一套完整的处理器指令集。RISC(Reduced Instruction Set Computing) 精简指令集计算机&#xff1a;一种执行较少类型计算机指令的微处理器。 处理器指令集: 计算机处理命…

linux x64 寄存器 传参,Linux X86架构参数传递规则

背景 突然好奇x86架构下函数参数怎么传递的,之前只是听别人说过通过寄存器,但是怎么传,什么顺序都没有仔细研究过,也没有实际测试过,因此就想着用实践来检验一下咯。 传参顺序 在32位和64位机器上,寄存器名称不同,64位机器为rxx,32位机器为exx。传参顺序如下, 64位系统…

linux控制协程参数,Linux高性能网络:协程系列06-协程实现之切换-Go语言中文社区...

目录 6.协程实现之切换 问题&#xff1a;协程的上下文如何切换&#xff1f;切换代码如何实现&#xff1f; 首先来回顾一下x86_64寄存器的相关知识。x86_64 的寄存器有16个64位寄存器&#xff0c;分别是&#xff1a;%rax, %rbx, %rcx, %esi, %edi, %rbp, %rsp, %r8, %r9, %r10, …

陶瓷气体放电管参数含义详解

​很多客户反应&#xff0c;不太明白陶瓷气体放电管产品手册中的参数含义。不可否认&#xff0c;电路保护器件产品规格书手册用的语言大部分都是英文&#xff0c;没有一定的英文基础&#xff0c;还真消化不了。有时候&#xff0c;就算能看得懂&#xff0c;但是面对枯燥无味的参…

ARM寄存器及功能介绍/R0-R15寄存器

1、ARM 寄存器组介绍 ARM 处理器一般共有 37 个寄存器&#xff0c;其中包括&#xff1a; &#xff08;1&#xff09; 31 个通用寄存器&#xff0c;包括 PC&#xff08;程序计数器&#xff09;在内&#xff0c;都是 32 位的寄存器。 &#xff08;2&#xff09; 6 个状态寄存器…

x64 汇编 参数传递

参数传递在不同的系统上是不一样的 称作 calling convention 调用约定 windows rcx,rdx,r8,r9 用来存储整数或指针参数&#xff0c;按照从左到右的顺序 xmm0,1,2,3 用来存储浮点参数 其余参数会压入栈中。 linux 当参数在 6 个以内&#xff0c;参数从左到右依次放入寄存器:…

汇编和c语言函数的参数,C函数与汇编函数之间参数及返回值传递方法

AAPCS对ARM结构的一些标准做了定义,在这里我们只重点介绍函数调用部分,如图8所示,AAPCS为ARM的R0~R15寄存器做了定义,明确了它们在函数中的职责: 图 8 AAPCS关于ARM寄存器的定义 一、函数调用时的规则如下: 1、 父函数与子函数间的入口参数依次通过R0~R3这4个寄存器传递。…

台式计算机配置参数,整机配置参数以及性能测试_台式电脑评测-中关村在线

我们首先来看一看同方E500的硬件配置情况。 根据AIDA64所示,同方E500搭载了i5-7400处理器、8GB内存、128GB建兴固态硬盘以及1TB西部数据机械硬盘。这个配置对于商务办公机来讲是非常合理的,在性能与成本之间得到了最佳的平衡。那么具体性能表现又是如何呢?我们来继续往下看。…

此计算机核心参数,买电脑如何选CPU?这三个参数一定要看!

原标题&#xff1a;买电脑如何选CPU&#xff1f;这三个参数一定要看! CPU是电脑中的核心&#xff0c;也可以说是电脑的大脑&#xff0c;一直以来CPU与GPU那个重要都是争论不休的话题&#xff0c;四月份升级九代酷睿处理器的机械师笔记本拥有怎样的升级体验呢?高性能玩家该通过…

5G NR首版标准R15解读

5G定义了增强型移动宽带&#xff08;eMBB&#xff09;、超可靠低延迟通信&#xff08;URLLC&#xff09;、大规模机器类型通信&#xff08;mMTC&#xff09; 三大场景。针对这三大场景&#xff0c;在2018年6月已完成的3GPP R15标准不仅定义了5G NR&#xff08;新无线&#xff0…