1.介绍

JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付。
应用场景有:
    ◆ 用户在微信公众账号内进入商家公众号,打开某个主页面,完成支付
    ◆ 用户的好友在朋友圈、聊天窗口等分享商家页面连接,用户点击链接打开商家页面,完成支付
    ◆ 将商户页面转换成二维码,用户扫描二维码后在微信浏览器中打开页面后完成支付
 JSAPI支付只能用微信浏览器打开

2.商户号配置

  在微信商户平台(pay.weixin.qq.com)设置您的JSAPI支付支付目录,设置路径:商户平台-->产品中心-->开发配置
  JSAPI支付在请求支付的时候会校验请求来源是否有在商户平台做了配置,所以必须确保支付目录已经正确的被配置,否则将验证失败,
请求支付不成功。

3.在微信公众平台设置授权域名

开发JSAPI支付时,在统一下单接口中要求必传用户openid,而获取openid则需要您在公众平台设置获取openid的域名
只有被设置过的域名才是一个有效的获取openid的域名,否则将获取失败。

注:使用微信jsapi支付必须先配置好以上信息,不然开发过程成中会有很多页面错误提示报错,为了避免,先配置好所需要的信息,

网页授权域名是用来向微信获取code

4.微信网页授权

如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑
关于网页授权的两种scope的区别说明
    1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)
    2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息。
    3、用户管理类接口中的“获取用户基本信息接口”,是在用户和公众号产生消息交互或关注后事件推送后,才能根据用户OpenID来获取用户基本信息。这个接口,包括其他微信接口,都是需要该用户(即openid)关注了公众号后,才能调用成功的。
官方链接:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

由于我们公司只需要获取code调取后台接口换取openid,并且不需要获取用户昵称,头像等信息,所以我只需要使用第一种方式即可

方法如下:

用户同意授权,获取code

  1. https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“该链接无法访问”,请检查参数是否填写错误,是否拥有scope参数对应的授权作用域权限。

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

注意 代码需要放到线上去运行,才能真的调取成功,在本地运行会报redirect_uri错误 提示

注意:code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期

5. 网页授权成功了,那接下来就可以使用支付了

微信JS-SDK是微信公众平台 面向网页开发者提供的基于微信内的网页开发工具包。
通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

由于jsapi支付是微信JS-SDK工具包的一种方式,所以我们先安装JS-SDK工具包才能使用

第一步:绑定域名 由于之前我们已经在微信公众号平台设置了js接口安全域名,故已经绑定成功

第二步:引入js文件

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.4.0.js
如需进一步提升服务稳定性,当上述资源不可访问时,可改访问:http://res2.wx.qq.com/open/js/jweixin-1.4.0.js (支持https)。
备注:支持使用 AMD/CMD 标准模块加载方法加载
第三步 :通过config接口注入权限验证配置

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

6.最后可以发起微信支付了

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

完整实例如下:

  1. var appid = 'appid';//appid为公众号appid
  2. var local = window.location.href ;//当前跳转路径
  3. var code = getParam('code');//获取地址栏参数code
  4. if (code === null || code === '') {
  5. // 跳转至授权地址,该地址只支持微信浏览器打开
  6. location.replace("https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + encodeURIComponent(local) + "&response_type=code&scope=snsapi_base#wechat_redirect")
  7. }else{
  8. getOpenId(code);//拿到了code 找后台换取openid
  9. }
  10. //为避免网页授权会刷新界面,ios微信浏览器会出现白条切换按钮会导致支付出错 ,建议将以上方法写在首页中,不要写在支付页面
  11. getConfig()//授权方法应放在支付页面加载的时候。进入支付页面就执行授权
  12. wx.chooseWXPay({ //此方法应放在调用后台统一下单接口成功后回调里面,接口返回 timeStamp,nonceStr,package,paySign等参数
  13. timestamp: res.data.timeStamp,
  14. nonceStr: res.data.nonceStr,
  15. package: res.data.package,
  16. signType: 'MD5',
  17. paySign: res.data.paySign,
  18. appId:res.data.appId, //此参数可不用
  19. success: function (r) {
  20. // 支付成功后的回调函数
  21.   if (r.errMsg == "chooseWXPay:ok") {
  22. //支付成功
  23.     } else {
  24.     location.reload();//支付失败 刷新界面
  25.   }
  26.   },
  27.   cancel: function(r) {
  28. //支付取消
  29. }
  30. });
  31. //以下方法可以放在common.js中
  32. //获取地址栏 指定参数名参数
  33. function GetQueryString(name) {
  34. var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
  35. var r = window.location.search.substr(1).match(reg); //获取url中"?"符后的字符串并正则匹配
  36. var context = "";
  37. if (r != null)
  38. context = r[2];
  39. reg = null;
  40. r = null;
  41. return context == null || context == "" || context == "undefined" ? "" : context;
  42. }
  43. function getOpenId(code) {//我们公司获取openid接口
  44. $.ajax({
  45. type: "POST",
  46. url: window.baseurl+"/miniprogram/user/getOpenId?code="+code+"&type=2",//1 微信 2公众号
  47. cache: false,
  48. processData: false,
  49. contentType: false,
  50. dataType: "json",
  51. success: function (res) {
  52. if (res.msgCode==0) {//成功
  53. localStorage.setItem('openId',res.data.openid)//将openid存入缓存
  54. } else {
  55. // alert('openid获取失败')
  56. }
  57. },
  58. error: function (res) {
  59.  
  60. },
  61. })
  62. }
  63.  
  64. function getConfig(){
  65. //获取后台签名,向微信获取授权
  66. $.ajax({
  67. type: "POST",
  68. url: window.baseurl+"/miniprogram/user/getTicket",
  69. data:{"url":location.href.split("#")[0]},
  70. dataType: "json",
  71. success: function (data) {
  72. if (data.msgCode==0) {//成功
  73. wxConfig(data.data.timestamp,data.data.nonceStr,data.data.signature)
  74. } else {
  75.  
  76. }
  77. },
  78. error: function (res) {
  79.  
  80. },
  81.  
  82. })
  83. }
  84. //获取微信授权
  85. function wxConfig(Timestamp,NonceStr,Signature){
  86. //通过config接口注入权限验证配置
  87. wx.config({
  88. debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
  89. appId: 'wx840b32f985622d8e', // 必填,公众号的唯一标识
  90. timestamp: Timestamp, // 必填,生成签名的时间戳
  91. nonceStr: NonceStr, // 必填,生成签名的随机串
  92. signature: Signature,// 必填,签名
  93. jsApiList: ['chooseWXPay','scanQRCode'] // 必填,需要使用的JS接口列表 这里是使用的是微信支付接口
  94. });
  95. //通过ready接口处理成功验证
  96. wx.ready(function(){
  97. console.log('ready接口处理成功验证')
  98.  
  99. });
  100. //通过error接口处理失败验证
  101. wx.error(function(res){
  102. console.log('error接口处理失败验证')
  103. });
  104. }

最后注意:(以下都是本人踩过的坑!!!)

1.由于网页授权会二次刷新页面,ios手机微信底部会出现白条,故跳转页面方法最好使用window,location.replace()   可以避免支付错误,比如  提示:调用支付jsapi缺少参数: $key0$  这是由于没拿到openid导致

2.调用支付时,错误提示为: 支付返回签名错误  可能是由于后台生成签名时参数大小写没有按照官方文档大小写来生成签名。故一定要严格按照官方文档要求开发

3.如果signature签名和微信校验工具签名一致,但是还是报config:invalid signature 错误,可能是公众号后台ip白名单没有设置当前使用环境的ip

微信支付JSAPI支付的更多相关文章

  1. ThinkPHP中实现微信支付(jsapi支付)流程

    https://blog.csdn.net/sinat_35861727/article/details/72783988 之前写过一篇文章讲了 PHP实现微信支付(jsapi支付)流程 ,详见文章: ...

  2. Core3.1 微信v3 JSAPI支付 退款

    1.前言 上一篇写了<Core3.1 微信v3 JSAPI支付>,这个属于v3的接口规则,现在研究了下退款的接口我写的时候它属于v2接口规则文档.但凡微信支付文档里面写清楚点我也不会在这里 ...

  3. Core3.1 微信v3 JSAPI支付

    1.前言 "小魏呀,这个微信支付还要多久?","快了快了老板,就等着最后一步了...","搞快点哈,就等着上线呢","...... ...

  4. 微信h5支付/jsapi支付/小程序支付

    一. 介绍------------------------------------------------------------------ 微信支付官方开发文档:  https://pay.wei ...

  5. 微信支付-JSAPI支付V3-查询退款

    接口地址 接口链接:https://api.mch.weixin.qq.com/pay/refundquery 是否需要证书 不需要. 请求参数 字段名 变量名 必填 类型 示例值 描述 公众账号ID ...

  6. 微信JSApi支付~集成到MVC环境后的最后一个坑(网上没有这种解决方案)

    返回目录 大叔第一人 之前写了关于微信的坑<微信JSApi支付~坑和如何填坑>,今天将微信的jsapi支付封装到了MVC环境里,当然也出现了一些新的坑,如支付参数应该是Json对象而不是J ...

  7. asp.net微信jsapi支付

    1.前台页面: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"><head ru ...

  8. 微信公众号配置及微信jsAPI支付

    公众号配置 一.基本配置 首先登陆微信公众平台,在开发--->配置--->公众号开发信息,获取到AppId,开发者秘钥是后台需要的,给到后台,IP白名单配置就是你服务器的IP地址写到里面就 ...

  9. 【weixi】微信支付---微信公众号JSAPI支付

    一.JSAPI支付 JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付.应用场景有: ◆ 用户在微信公众账号内进入商家公众号,打 ...

随机推荐

  1. 查看centos中的用户和用户组和修改密码

    查看centos中的用户和用户组 1.用户列表文件: vim /etc/passwd/ 2.用户组列表文件: vim /etc/group 3.查看系统中有哪些用户: cut -d : -f /etc ...

  2. DC-2靶机渗透

    靶场下载链接: Download: http://www.five86.com/downloads/DC-2.zip Download (Mirror): https://download.vulnh ...

  3. VSCode 使用Settings Sync同步配置(最新版教程,非常简单)

    VSCode 使用Settings Sync同步配置(最新版教程,非常简单) 之前无意中听到有人说,vsCode最大的缺点就是每次换个电脑或者临时去个新环境,就要配置一下各种插件,好不麻烦,以至于面试 ...

  4. c++json构建与解析组件 RapidJSON 没用过永远不会知道有多好用

    参考资料: 官方文档 推荐[腾讯RapidJSON]学习笔记 原理请参考以上资料 构建json Document doc; Document::AllocatorType &allocator ...

  5. Redis学习总结(一)--Redis入门

    Redis 概念 1.Redis 是什么 Redis 是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. 2.Redis 能干什么 Redis 支持字符串.哈希 ...

  6. Codeforces 1006E

    #include<bits/stdc++.h> using namespace std; ; int dfn[maxn],rdfn[maxn],children[maxn]; vector ...

  7. Web前端安全分析

    随着互联网高速的发展,信息安全已经成为企业重点关注焦点之一,而前端又是引发安全问题的高危据点,所以,作为一个前端开发人员,需要了解前端的安全问题,以及如何去预防.修复安全漏洞. 一.XSSS攻击 1. ...

  8. NLP(二十一)根据已有文本LSTM自动生成文本

    根据已有文本LSTM自动生成文本 原理 与股票预测类似,用前面的n个字符预测下一个字符 https://www.cnblogs.com/peng8098/p/keras_5.html 代码 from ...

  9. 牛客暑假多校第五场 I vcd

    这个题目一个队友没读懂, 然后我读错了题目, 还让他堆了半天的公式写了半天的代码, 交上去一直0.0, 另一队友问题目有没有读错, 我坚持没有读错, 然后坑了2个小时的时间,不然应该会早一点做出来. ...

  10. CF1025B Weakened Common Divisor 数学

    Weakened Common Divisor time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...