JS通过调用微信API实现微信支付功能的方法示例


Posted in Javascript onJune 29, 2017

本文实例讲述了JS通过调用微信API实现微信支付功能的方法。分享给大家供大家参考,具体如下:

最近在做微信公众号开发,在微信支付上遇到一些问题,困惑了3天,今天终于搞定。期间要感谢一些大神的帮助,趁热下面分享一下我的经验。

在实现微信支付之前,需要到微信开发平台认证,这些认证和配置信息我就不多说了,这里主要从代码层面实现支付。

function onBridgeReady(){
  WeixinJSBridge.invoke(
    'getBrandWCPayRequest', {
      "appId" : "wx2421b1c4370ec43b",   //公众号名称,由商户传入
      "timeStamp":" 1395712654",     //时间戳,自1970年以来的秒数
      "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串
      "package" : "prepay_id=u802345jgfjsdfgsdg888",   //统一订单号
      "signType" : "MD5",     //微信签名方式:
      "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //支付签名
    },
    function(res){
      alert(res.err_msg);
      if(res.err_msg == "get_brand_wcpay_request:ok" ) {}   // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回  ok,但并不保证它绝对可靠。
    }
  );
}
if (typeof WeixinJSBridge == "undefined"){
  if( document.addEventListener ){
    document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
  }else if (document.attachEvent){
    document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
    document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
  }
}else{
  onBridgeReady();
}

上面的JS代码是官方文档上贴出来的,官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7。

下面对JS中的几个参数做主要的讲解:

在开发过程中,有4个非常重要的参数:一个是appid,AppSecret,apikey和商户号。上面js中的appID就是其中之一。timeStamp是一个时间戳,10位数,nonceStr是随机数,32位以内,这里最重要的两个参数,也是最容易出错的就是package和paySign了。我一一说来。先说package,这里需要用到prepay_id,这个参数是微信生成的订单号,需要我们调用统一订单接口来获取。官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1。可以从文档看到,要获取prepay_id,需要很多参数,这里面有一个非常重要的参数就是签名。注意:这里的签名和JS中的支付签名和不同的。 签名的算法文档里有,我只是强调两点。一个是参数的顺序,一定一定要按照ASCII从小到大拼接,二是apikey一定不能错,这个apikey在哪里呢?登入商户平台就可以设置了。

JS通过调用微信API实现微信支付功能的方法示例

拼接好签名需要的字符串后,进行MD5加密就可以得到签名了。然后把签名和前面所有的参数组合成xml格式的字符串,调用给的接口URL地址:https://api.mch.weixin.qq.com/pay/unifiedorder就可以返回一个xml结果,解析出其中的prepay_id,这样这个参数就成功获取到了。

下面再说JS中的最后一个参数PaySign:支付签名。支付签名的算法也是一样,把JS中的其他5个参数按照顺序拼接,加上apikey,MD5加密,ok。

签名的算法都是一样的,只是参数值不同而已。这里需要注意一点。在支付签名的时候,用到随机数nonceStr,时间戳timeStamp,而签名时使用的这两个参数和JS中的这两个参数的值要是一样的,是同一个随机数,同一个时间戳。为什么呢?虽然文档没说,但是我的理解是:支付签名是通过随机数和时间戳来生成的,然后在支付的时候,把随机数,时间戳,支付签名一起发送过去,那么在微信进行验证的时候,也会根基js中的随机数和时间戳生成签名和你发送的支付签名进行比较,如果你在js中重新获取新的随机数、时间戳,那么算出来的签名和你发送的签名就会不一样,就会报错:签名失败。

到此,代码层面的注意点就这些,当然,还有其他的一些注意点。比如其中有用的openid,这个参数也是需要调用接口获取到的,还有支付授权的目录是否配置正确。

最后一句总结:仔细看文档,最后问别人,可以找微信支付相关的群,里面很多大神的,我之前就是遇到一个问题纠结了2天没解决,(有时候光看文档也不行),

然后怒加了8个微信开发的群,最终在高人的指点下终于搞出来了。再次表示感谢。程序员是一个热爱分享的群体,他们非常乐意把自己知道的东西分享出去。所以不懂的时候,多问问。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
IE6 fixed的完美解决方案
Mar 31 Javascript
jQuery中dequeue()方法用法实例
Dec 29 Javascript
jQuery采用连缀写法实现的折叠菜单效果
Sep 18 Javascript
jqueryMobile 动态添加元素,展示刷新视图的实现方法
May 28 Javascript
深入理解JavaScript中的块级作用域、私有变量与模块模式
Oct 31 Javascript
BootStrap Fileinput初始化时的一些参数
Dec 30 Javascript
详解Javascript百度地图接口开发文档中的类和方法
Feb 07 Javascript
使用原生的javascript来实现轮播图
Feb 24 Javascript
使用AngularJS对表单提交内容进行验证的操作方法
Jul 12 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
May 15 Javascript
vue中使用protobuf的过程记录
Oct 26 Javascript
layui自己添加图片按钮并点击跳转页面的例子
Sep 14 Javascript
详解vue数据渲染出现闪烁问题
Jun 29 #Javascript
将angular.js项目整合到.net mvc中的方法详解
Jun 29 #Javascript
详解webpack和webpack-simple中如何引入css文件
Jun 28 #Javascript
基于jQuery实现的Ajax 验证用户名唯一性实例代码
Jun 28 #jQuery
VUE利用vuex模拟实现新闻点赞功能实例
Jun 28 #Javascript
Vuex利用state保存新闻数据实例
Jun 28 #Javascript
微信浏览器禁止页面下拉查看网址实例详解
Jun 28 #Javascript
You might like
PHP 程序员的调试技术小结
2009/11/15 PHP
php设计模式 Strategy(策略模式)
2011/06/26 PHP
php实现将Session写入数据库
2015/07/26 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
Javascript中valueOf与toString区别浅析
2013/03/19 Javascript
Js获取数组最大和最小值示例代码
2013/10/29 Javascript
js实现动态改变字体大小代码
2014/01/02 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
分享10个原生JavaScript技巧
2015/04/20 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
JavaScript模拟文件拖选框样式v1.0的实例
2017/08/04 Javascript
原生JS实现移动端web轮播图详解(结合Tween算法造轮子)
2017/09/10 Javascript
jQuery实现鼠标响应式透明度渐变动画效果示例
2018/02/13 jQuery
vue.js 嵌套循环、if判断、动态删除的实例
2018/03/07 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
JS写滑稽笑脸运动效果
2020/05/28 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
python正则匹配抓取豆瓣电影链接和评论代码分享
2013/12/27 Python
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
python的文件操作方法汇总
2017/11/10 Python
python3+dlib实现人脸识别和情绪分析
2018/04/21 Python
python tkinter组件使用详解
2019/09/16 Python
Python Tkinter模块 GUI 可视化实例
2019/11/20 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
Tensorflow与Keras自适应使用显存方式
2020/06/22 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
小学生田径运动会广播稿
2014/09/11 职场文书
抗洪救灾感谢信
2015/01/22 职场文书
财务会计岗位职责
2015/02/03 职场文书
2015年音乐教师个人工作总结
2015/05/20 职场文书
2016感恩母亲节校园广播稿
2015/12/17 职场文书