微信 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
签名算法
wx.config({debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。appId: '', // 必填,公众号的唯一标识timestamp: , // 必填,生成签名的时间戳nonceStr: '', // 必填,生成签名的随机串signature: '',// 必填,签名jsApiList: [] // 必填,需要使用的JS接口列表
});
微信 JSAPI 支付流程相关推荐
- H5微信jsapi支付流程
<div :class="pay sele" @click="accreditWeChat()"><p>微信支付</p>&l ...
- jsapi支付签名_PHP实现微信支付(jsapi支付)流程步骤详解
最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路. 前期准备: 1.微信认证服务号,并且开通了微 ...
- 微信JSAPI支付对接流程及支付接口设计
文章目录 前言 一.JSAPI支付场景及逻辑 二.开发步骤 1.设置支付目录 2.设置授权域名 3.业务流程 三.代码设计 1. 支付页面 2. Controller 3. JS调起支付 4. 工具类 ...
- ThinkPHP中实现微信支付(jsapi支付)流程
之前写过一篇文章讲了 PHP实现微信支付(jsapi支付)流程 ,详见文章: PHP实现微信支付(jsapi支付)流程. 当时的环境是没有使用框架的,直接在一个域名指向的目录下边新建目录之后访问该目录 ...
- php微信支付jsapi,ThinkPHP中实现微信支付(jsapi支付)流程
之前写过一篇文章讲了 PHP实现微信支付(jsapi支付)流程 ,详见文章:PHP实现微信支付(jsapi支付)流程. 当时的环境是没有使用框架的,直接在一个域名指向的目录下边新建目录之后访问该目录实 ...
- php微信jsapi支付小结,ThinkPHP接入微信支付 - JSAPI支付
一.支付准备 二.获取用户openid 首先,到微信公众平台后台 - 设置 - 网页授权域名(别忘了添加开发者) // 在头部引入WechatPubService.php文件,见附录一 use app ...
- 关于微信JSAPI支付成功后,点击完成后没有返回值并且页面被自动关闭问题
微信JSAPI支付成功后,点击完成后没有返回值并且页面被自动关闭 简介 解决方式 错误的处理方式 总结 简介 最近很多人可能都遇到一个问题,在使用微信JSAPI支付成功后,不走成功的回调方法,只有支付 ...
- php接入微信JSAPI支付,微信内拉起支付,基于thinkPHP框架 WeChatDeveloper支付类包
文章:php接入微信支付,扫码支付和H5支付(非微信浏览器),基于thinkPHP框架 WeChatDeveloper支付类包 踩坑指南 文章:php快速接入支付宝即时支付,PC网站支付和手机网站支付 ...
- C# .NETMVC 微信JSAPI支付
C# .NET MVC微信JSAPI支付 经过本人不断翻找资料和百度终于结合一些大佬的经验和思路弄出来一个MVC的微信支付了. 再弄微信支付之前我们需要先有一个商户号,并且开通了微信支付的JSAPI支 ...
- 微信JSAPI支付 跟 所遇到的那些坑
首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senp ...
最新文章
- Read correction for non-uniform coverages 读校正非均匀覆盖
- BZOJ2115: [Wc2011] Xor
- android 判断有线耳机、蓝牙耳机连接
- Hadoop hdfs 使用流来下载文件数据代码示例
- hadoop 配置文件简析
- JavaScript 中 obj.hasOwnProperty(prop) 方法
- git 拉取远程其他分支代码_【记录】git 拉取远程分支代码,同步到另一个git上...
- weblogic domain creation
- java tlv协议_看懂通信协议:自定义通信协议设计之TLV编码应用
- (转)JVM中的OopMap(zz)
- Linux下opendir、readdir使用小结
- 尚硅谷_宋红康_JDBC
- vue 基于 Ant Design 实现表格序号
- [ZJOI2018]保镖
- java workflow 教程_Java工作流引擎jflow对流程的结束大总结
- OpenResty安装、启停止_linux
- 形态学 - 膨胀和腐蚀
- 第五讲—按键控制LED
- 笔试题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。该题有三种解法:递归的方法求解斐波那契数列、用概率与统计的数学方法解决,3.动态规划
- 答读者问(2):有关研究生论文及实习等问题