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 相关文章推荐
Json对象替换字符串占位符实现代码
Nov 17 Javascript
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
Jan 17 Javascript
jquery中的事件处理详细介绍
Jun 24 Javascript
window.location不跳转的问题解决方法
Apr 17 Javascript
JavaScript将取代AppleScript?
Sep 18 Javascript
探究JavaScript函数式编程的乐趣
Dec 14 Javascript
详解Angular.js的$q.defer()服务异步处理
Nov 06 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
Jul 20 jQuery
js 函数性能比较方法
Aug 24 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
Oct 09 Javascript
echarts饼图各个板块之间的空隙如何实现
Dec 01 Javascript
JS中forEach()、map()、every()、some()和filter()的用法
May 11 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
全国FM电台频率大全 - 26 西藏自治区
2020/03/11 无线电
PHP实现QQ登录实例代码
2016/01/14 PHP
Firefox 无法获取cssRules 的解决办法
2006/10/11 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
详解JavaScript RegExp对象
2017/02/04 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
Nodejs中Express 常用中间件 body-parser 实现解析
2017/05/22 NodeJs
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
js+html5实现侧滑页面效果
2017/07/15 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
JavaScript 类的封装操作示例详解
2020/05/16 Javascript
vue 页面跳转的实现方式
2021/01/12 Vue.js
简介二分查找算法与相关的Python实现示例
2015/08/26 Python
python读取excel表格生成erlang数据
2017/08/26 Python
Python GUI布局尺寸适配方法
2018/10/11 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
简单了解python高阶函数map/reduce
2019/06/28 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
python中什么是面向对象
2020/06/11 Python
canvas仿写贝塞尔曲线的示例代码
2017/12/29 HTML / CSS
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
2019年分享net面试的经历和题目
2016/08/07 面试题
Unix控制后台进程都有哪些进程
2016/09/22 面试题
学前教育教师求职自荐信
2013/09/22 职场文书
庆八一活动方案
2014/01/25 职场文书
班级德育工作实施方案
2014/02/21 职场文书
社团招新宣传语
2015/07/13 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书
团干部培训班心得体会
2016/01/06 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书